feat: v1.0.0-beta.2 - ExtensionGetter integration, UI revamp, bug fixes

- Replace cross-ClassLoader reflection with ExtensionGetter.getEnabledExtension(AiModelService.class)
- Declare optional pluginDependencies (ai-foundation?: "*") and recommended-apps annotation
- Use OutputSpec.choice for structured classification (sentiment, review safety/quality)
- Use GenerateTextRequest with maxRetries=2 for reliable chat generation
- Add multi-turn conversation context (conversation_history placeholder)
- Fix RateLimitService thread leak (implement DisposableBean)
- Two-stage AI review: safety check + 1-5 quality score mapped to 0-100
- Remove redundant dashboard cards (sentiment distribution, 7-day trend, avg score)
- Redesign settings page with tabbed navigation (basic/persona/model/prompt/cleanup)
- Fix settings layout (move tab bar out of grid container)
- Fix button icon+text alignment via :deep(.btn-content) inline-flex
- Add review score grade labels (excellent/good/fair/poor) in logs
This commit is contained in:
sunny-335
2026-06-17 19:40:10 +08:00
parent bf989ca3f2
commit 767efdccbb
15 changed files with 811 additions and 817 deletions
+10 -1
View File
@@ -152,7 +152,8 @@
<div class="px-4 py-2.5 bg-gray-50 border-t border-gray-100 flex items-center justify-between">
<div class="flex items-center gap-4 text-xs text-gray-400">
<span>
评分 <span :class="getScoreClass(reply.spec.score)" class="font-medium text-gray-600">{{ reply.spec.score }}</span>
评分 <span :class="getScoreClass(reply.spec.score)" class="font-medium">{{ reply.spec.score }}</span>
<span class="text-gray-300 ml-0.5">{{ getScoreLabel(reply.spec.score) }}</span>
</span>
<span v-if="reply.spec.postSlug" class="flex items-center gap-1">
文章
@@ -508,6 +509,14 @@ const getScoreClass = (score: number) => {
return "text-red-600"
}
const getScoreLabel = (score: number) => {
if (score >= 85) return "优秀"
if (score >= 70) return "良好"
if (score >= 50) return "一般"
if (score > 0) return "较差"
return ""
}
const getStatusClass = (status: string) => {
switch (status) {
case "PASS":