feat: 完善预算中心图表与确认对话框交互

后端预算服务增加汇总查询和辅助计算,前端预算中心优化趋
势图组件和数据展示,增强确认对话框通用性和样式,完善预
算编辑对话框布局,补充预算端点单元测试。
This commit is contained in:
caoxiaozhu
2026-05-26 20:07:56 +08:00
parent e7bef0883d
commit df49103f23
10 changed files with 716 additions and 153 deletions

View File

@@ -7,12 +7,13 @@
role="presentation"
@click.self="handleMaskClose"
>
<section
class="shared-confirm-card"
role="alertdialog"
aria-modal="true"
:aria-labelledby="titleId"
@click.stop
<section
class="shared-confirm-card"
:class="cardClasses"
role="alertdialog"
aria-modal="true"
:aria-labelledby="titleId"
@click.stop
>
<span v-if="badge" class="shared-confirm-badge" :class="badgeTone">
{{ badge }}
@@ -62,16 +63,22 @@ const props = defineProps({
cancelText: { type: String, default: '取消' },
confirmText: { type: String, default: '确认' },
busyText: { type: String, default: '处理中...' },
confirmTone: { type: String, default: 'primary' },
confirmIcon: { type: String, default: '' },
busy: { type: Boolean, default: false },
closeOnMask: { type: Boolean, default: true }
})
confirmTone: { type: String, default: 'primary' },
confirmIcon: { type: String, default: '' },
busy: { type: Boolean, default: false },
closeOnMask: { type: Boolean, default: true },
size: { type: String, default: 'default' },
actionsAlign: { type: String, default: 'end' }
})
const emit = defineEmits(['close', 'cancel', 'confirm'])
const instance = getCurrentInstance()
const titleId = computed(() => `shared-confirm-title-${instance?.uid || 'dialog'}`)
const titleId = computed(() => `shared-confirm-title-${instance?.uid || 'dialog'}`)
const cardClasses = computed(() => [
`shared-confirm-card--${props.size}`,
`shared-confirm-actions-${props.actionsAlign}`
])
function handleMaskClose() {
if (!props.closeOnMask || props.busy) {
@@ -163,16 +170,28 @@ function handleCancel() {
gap: 10px;
}
.shared-confirm-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
flex-wrap: wrap;
}
.shared-confirm-btn {
min-width: 140px;
min-height: 42px;
.shared-confirm-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
flex-wrap: wrap;
}
.shared-confirm-card.shared-confirm-actions-start .shared-confirm-actions {
justify-content: flex-start;
}
.shared-confirm-card.shared-confirm-actions-center .shared-confirm-actions {
justify-content: center;
}
.shared-confirm-card.shared-confirm-actions-end .shared-confirm-actions {
justify-content: flex-end;
}
.shared-confirm-btn {
min-width: 140px;
min-height: 42px;
display: inline-flex;
align-items: center;
justify-content: center;
@@ -233,12 +252,42 @@ function handleCancel() {
.shared-confirm-enter-from .shared-confirm-card,
.shared-confirm-leave-to .shared-confirm-card {
transform: translateY(8px) scale(0.98);
}
@media (max-width: 720px) {
.shared-confirm-mask {
padding: 18px;
transform: translateY(8px) scale(0.98);
}
.shared-confirm-card--compact {
width: min(360px, 100%);
gap: 8px;
padding: 16px;
border-radius: 12px;
background: #fff;
}
.shared-confirm-card--compact h4 {
font-size: 15px;
line-height: 1.35;
}
.shared-confirm-card--compact p {
font-size: 12px;
line-height: 1.55;
}
.shared-confirm-card--compact .shared-confirm-actions {
gap: 6px;
}
.shared-confirm-card--compact .shared-confirm-btn {
min-width: 76px;
min-height: 30px;
padding: 0 10px;
border-radius: 7px;
font-size: 12px;
}
@media (max-width: 720px) {
.shared-confirm-mask {
padding: 18px;
}
.shared-confirm-card {