feat: Implement scheduled tasks management and budget archiving functionality
Some checks failed
Docker Build & Deploy / Build Docker Image (push) Failing after 6s
Docker Build & Deploy / Deploy to Production (push) Has been skipped
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 2s
Docker Build & Deploy / WeChat Notification (push) Successful in 2s

- Added BudgetArchiveJob for monthly budget archiving.
- Created BudgetArchive entity and BudgetArchiveRepository for managing archived budgets.
- Introduced JobController for handling job execution, pausing, and resuming.
- Developed ScheduledTasksView for displaying and managing scheduled tasks in the frontend.
- Updated PeriodicBillJob to improve scope handling.
- Enhanced OpenAiService with increased HTTP timeout.
- Added archiveBudgets API endpoint for archiving budgets by year and month.
- Refactored BudgetController to utilize new repository patterns and improved error handling.
- Introduced rich-content styles for better rendering of HTML content in Vue components.
- Updated various Vue components to support rich HTML content display.
This commit is contained in:
孙诚
2026-01-09 14:03:01 +08:00
parent c5363efc0e
commit ef4ed9fd57
22 changed files with 1129 additions and 459 deletions

View File

@@ -72,7 +72,7 @@
/>
</div>
<div ref="resultContainer" class="result-content">
<div ref="resultContainer" class="result-content rich-html-content">
<div v-html="resultHtml"></div>
<van-loading v-if="analyzing" class="result-loading">
AI正在分析中...
@@ -351,103 +351,12 @@ const startAnalysis = async () => {
padding: 20px;
}
/* 结果HTML样式 */
.result-content :deep(h1),
.result-content :deep(h2),
.result-content :deep(h3) {
color: var(--van-text-color);
margin: 16px 0 12px 0;
font-weight: 600;
}
.result-content :deep(h1) {
font-size: 20px;
}
.result-content :deep(h2) {
font-size: 18px;
}
.result-content :deep(h3) {
font-size: 16px;
}
.result-content :deep(p) {
margin: 8px 0;
color: var(--van-text-color);
}
.result-content :deep(ul),
.result-content :deep(ol) {
padding-left: 24px;
margin: 12px 0;
}
.result-content :deep(li) {
margin: 6px 0;
color: var(--van-text-color);
}
.result-content :deep(table) {
width: 100%;
border-collapse: collapse;
margin: 16px 0;
font-size: 14px;
}
.result-content :deep(th),
.result-content :deep(td) {
padding: 10px;
text-align: left;
border: 1px solid var(--van-border-color);
}
.result-content :deep(th) {
background: var(--van-background-2);
font-weight: 600;
color: var(--van-text-color);
}
.result-content :deep(td) {
color: var(--van-text-color);
}
.result-content :deep(strong) {
color: var(--van-text-color);
font-weight: 600;
}
.result-content :deep(.highlight) {
background: #fff3cd;
padding: 2px 6px;
border-radius: 4px;
color: #856404;
}
.result-content :deep(.expense-value) {
color: #ff6b6b;
font-weight: 600;
}
.result-content :deep(.income-value) {
color: #51cf66;
font-weight: 600;
}
.error-message {
color: #ff6b6b;
text-align: center;
padding: 20px;
}
/* 暗色模式适配 */
@media (prefers-color-scheme: dark) {
.result-content :deep(.highlight) {
background: rgba(255, 243, 205, 0.2);
color: #ffc107;
}
}
/* 设置页面容器背景色 */
:deep(.van-nav-bar) {
background: transparent !important;