|
@@ -1,16 +1,16 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="page-container">
|
|
<div class="page-container">
|
|
|
<div class="page-header">
|
|
<div class="page-header">
|
|
|
- <span class="page-title">Experience Library</span>
|
|
|
|
|
|
|
+ <span class="page-title">经验库</span>
|
|
|
<div class="header-controls">
|
|
<div class="header-controls">
|
|
|
<el-button type="success" size="small" @click="showImportDialog = true">
|
|
<el-button type="success" size="small" @click="showImportDialog = true">
|
|
|
- <el-icon><Upload /></el-icon> Import from Plan
|
|
|
|
|
|
|
+ <el-icon><Upload /></el-icon> 从方案导入
|
|
|
</el-button>
|
|
</el-button>
|
|
|
<el-button type="primary" size="small" @click="showSimilarDialog = true">
|
|
<el-button type="primary" size="small" @click="showSimilarDialog = true">
|
|
|
- <el-icon><Search /></el-icon> Find Similar
|
|
|
|
|
|
|
+ <el-icon><Search /></el-icon> 相似检索
|
|
|
</el-button>
|
|
</el-button>
|
|
|
<el-button size="small" @click="loadAll">
|
|
<el-button size="small" @click="loadAll">
|
|
|
- <el-icon><Refresh /></el-icon> Refresh
|
|
|
|
|
|
|
+ <el-icon><Refresh /></el-icon> 刷新
|
|
|
</el-button>
|
|
</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -19,7 +19,7 @@
|
|
|
<el-row :gutter="16" class="stats-row" v-if="stats">
|
|
<el-row :gutter="16" class="stats-row" v-if="stats">
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
<div class="stat-card">
|
|
<div class="stat-card">
|
|
|
- <div class="stat-label">Total Cases</div>
|
|
|
|
|
|
|
+ <div class="stat-label">案例总数</div>
|
|
|
<div class="stat-value">{{ stats.total }}</div>
|
|
<div class="stat-value">{{ stats.total }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
@@ -31,13 +31,13 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
<div class="stat-card stat-success">
|
|
<div class="stat-card stat-success">
|
|
|
- <div class="stat-label">Avg Rating</div>
|
|
|
|
|
|
|
+ <div class="stat-label">平均评分</div>
|
|
|
<div class="stat-value">{{ stats.avg_rating || 0 }}<span class="stat-sub">/5</span></div>
|
|
<div class="stat-value">{{ stats.avg_rating || 0 }}<span class="stat-sub">/5</span></div>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
<el-col :span="6">
|
|
|
<div class="stat-card">
|
|
<div class="stat-card">
|
|
|
- <div class="stat-label">Tracked Params</div>
|
|
|
|
|
|
|
+ <div class="stat-label">跟踪参数</div>
|
|
|
<div class="stat-value">{{ Object.keys(stats.param_coverage || {}).length }}</div>
|
|
<div class="stat-value">{{ Object.keys(stats.param_coverage || {}).length }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
</el-col>
|
|
</el-col>
|
|
@@ -45,20 +45,20 @@
|
|
|
|
|
|
|
|
<!-- Filters -->
|
|
<!-- Filters -->
|
|
|
<div class="card filter-bar">
|
|
<div class="card filter-bar">
|
|
|
- <el-input v-model="searchKeyword" placeholder="Search conclusion or tags..." style="width: 280px" clearable @input="loadExperience" :prefix-icon="Search" />
|
|
|
|
|
- <el-select v-model="topologyFilter" placeholder="Topology" style="width: 130px" clearable @change="loadExperience">
|
|
|
|
|
|
|
+ <el-input v-model="searchKeyword" placeholder="搜索结论或标签..." style="width: 280px" clearable @input="loadExperience" :prefix-icon="Search" />
|
|
|
|
|
+ <el-select v-model="topologyFilter" placeholder="拓扑结构" style="width: 130px" clearable @change="loadExperience">
|
|
|
<el-option label="SSSR" value="SSSR" />
|
|
<el-option label="SSSR" value="SSSR" />
|
|
|
<el-option label="DRSS" value="DRSS" />
|
|
<el-option label="DRSS" value="DRSS" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
- <el-select v-model="tagFilter" placeholder="Tag" style="width: 150px" clearable @change="loadExperience">
|
|
|
|
|
|
|
+ <el-select v-model="tagFilter" placeholder="标签" style="width: 150px" clearable @change="loadExperience">
|
|
|
<el-option v-for="t in allTags" :key="t" :label="t" :value="t" />
|
|
<el-option v-for="t in allTags" :key="t" :label="t" :value="t" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
- <el-select v-model="minRating" placeholder="Min Rating" style="width: 130px" clearable @change="loadExperience">
|
|
|
|
|
- <el-option label="1 star" :value="1" />
|
|
|
|
|
- <el-option label="2 stars" :value="2" />
|
|
|
|
|
- <el-option label="3 stars" :value="3" />
|
|
|
|
|
- <el-option label="4 stars" :value="4" />
|
|
|
|
|
- <el-option label="5 stars" :value="5" />
|
|
|
|
|
|
|
+ <el-select v-model="minRating" placeholder="最低评分" style="width: 130px" clearable @change="loadExperience">
|
|
|
|
|
+ <el-option label="1星" :value="1" />
|
|
|
|
|
+ <el-option label="2星" :value="2" />
|
|
|
|
|
+ <el-option label="3星" :value="3" />
|
|
|
|
|
+ <el-option label="4星" :value="4" />
|
|
|
|
|
+ <el-option label="5星" :value="5" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -66,81 +66,81 @@
|
|
|
<div class="card">
|
|
<div class="card">
|
|
|
<el-table :data="filteredCases" v-loading="loading" stripe @row-click="openDetail" highlight-current-row>
|
|
<el-table :data="filteredCases" v-loading="loading" stripe @row-click="openDetail" highlight-current-row>
|
|
|
<el-table-column prop="id" label="ID" width="60" />
|
|
<el-table-column prop="id" label="ID" width="60" />
|
|
|
- <el-table-column prop="topology" label="Topology" width="90">
|
|
|
|
|
|
|
+ <el-table-column prop="topology" label="拓扑" width="90">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag size="small" :type="row.topology === 'SSSR' ? 'primary' : 'success'">{{ row.topology }}</el-tag>
|
|
<el-tag size="small" :type="row.topology === 'SSSR' ? 'primary' : 'success'">{{ row.topology }}</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="source_plan_id" label="Source Plan" width="160" show-overflow-tooltip />
|
|
|
|
|
- <el-table-column label="Key Params" min-width="180">
|
|
|
|
|
|
|
+ <el-table-column prop="source_plan_id" label="来源方案" width="160" show-overflow-tooltip />
|
|
|
|
|
+ <el-table-column label="关键参数" min-width="180">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span v-for="(v, k) in row.params" :key="k" class="param-chip">
|
|
<span v-for="(v, k) in row.params" :key="k" class="param-chip">
|
|
|
{{ k }}={{ v }}
|
|
{{ k }}={{ v }}
|
|
|
</span>
|
|
</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="Metrics" min-width="220">
|
|
|
|
|
|
|
+ <el-table-column label="指标" min-width="220">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<div class="metrics-cell">
|
|
<div class="metrics-cell">
|
|
|
- <span class="metric-item"><strong>T:</strong> {{ row.metrics?.tavg_nm?.toFixed(3) }}Nm</span>
|
|
|
|
|
- <span class="metric-item"><strong>Eff:</strong> {{ row.metrics?.efficiency_pct?.toFixed(1) }}%</span>
|
|
|
|
|
- <span class="metric-item"><strong>Rip:</strong> {{ row.metrics?.ripple_pct?.toFixed(2) }}%</span>
|
|
|
|
|
|
|
+ <span class="metric-item"><strong>转矩:</strong> {{ row.metrics?.tavg_nm?.toFixed(3) }}Nm</span>
|
|
|
|
|
+ <span class="metric-item"><strong>效率:</strong> {{ row.metrics?.efficiency_pct?.toFixed(1) }}%</span>
|
|
|
|
|
+ <span class="metric-item"><strong>脉动:</strong> {{ row.metrics?.ripple_pct?.toFixed(2) }}%</span>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="conclusion" label="Conclusion" min-width="180" show-overflow-tooltip />
|
|
|
|
|
- <el-table-column label="Tags" width="120">
|
|
|
|
|
|
|
+ <el-table-column prop="conclusion" label="结论" min-width="180" show-overflow-tooltip />
|
|
|
|
|
+ <el-table-column label="标签" width="120">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag v-for="t in row.tags" :key="t" size="small" style="margin-right: 4px" type="info">{{ t }}</el-tag>
|
|
<el-tag v-for="t in row.tags" :key="t" size="small" style="margin-right: 4px" type="info">{{ t }}</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="rating" label="Rating" width="90">
|
|
|
|
|
|
|
+ <el-table-column prop="rating" label="评分" width="90">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-rate v-model="row.rating" disabled size="small" />
|
|
<el-rate v-model="row.rating" disabled size="small" />
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="created_at" label="Created" width="150">
|
|
|
|
|
|
|
+ <el-table-column prop="created_at" label="创建时间" width="150">
|
|
|
<template #default="{ row }">{{ formatDate(row.created_at) }}</template>
|
|
<template #default="{ row }">{{ formatDate(row.created_at) }}</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="Actions" width="120" fixed="right">
|
|
|
|
|
|
|
+ <el-table-column label="操作" width="120" fixed="right">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <el-button size="small" text type="primary" @click.stop="openEdit(row)">Edit</el-button>
|
|
|
|
|
- <el-button size="small" text type="danger" @click.stop="deleteCase(row)">Delete</el-button>
|
|
|
|
|
|
|
+ <el-button size="small" text type="primary" @click.stop="openEdit(row)">编辑</el-button>
|
|
|
|
|
+ <el-button size="small" text type="danger" @click.stop="deleteCase(row)">删除</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
|
- <div class="pagination-info">Showing {{ filteredCases.length }} of {{ totalCases }} cases</div>
|
|
|
|
|
|
|
+ <div class="pagination-info">共 {{ totalCases }} 条,显示 {{ filteredCases.length }} 条</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- Detail Dialog -->
|
|
<!-- Detail Dialog -->
|
|
|
- <el-dialog v-model="detailVisible" :title="`Experience Case #${selectedCase?.id}`" width="700px">
|
|
|
|
|
|
|
+ <el-dialog v-model="detailVisible" :title="`经验案例 #${selectedCase?.id}`" width="700px">
|
|
|
<div v-if="selectedCase" class="detail-content">
|
|
<div v-if="selectedCase" class="detail-content">
|
|
|
<el-descriptions :column="2" border size="small">
|
|
<el-descriptions :column="2" border size="small">
|
|
|
- <el-descriptions-item label="Topology">{{ selectedCase.topology }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="Source Plan">{{ selectedCase.source_plan_id || '-' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="Model Path" :span="2">{{ selectedCase.model_path || '-' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="Rating">
|
|
|
|
|
|
|
+ <el-descriptions-item label="拓扑">{{ selectedCase.topology }}</el-descriptions-item>
|
|
|
|
|
+ <el-descriptions-item label="来源方案">{{ selectedCase.source_plan_id || '-' }}</el-descriptions-item>
|
|
|
|
|
+ <el-descriptions-item label="模型路径" :span="2">{{ selectedCase.model_path || '-' }}</el-descriptions-item>
|
|
|
|
|
+ <el-descriptions-item label="评分">
|
|
|
<el-rate v-model="selectedCase.rating" disabled size="small" />
|
|
<el-rate v-model="selectedCase.rating" disabled size="small" />
|
|
|
</el-descriptions-item>
|
|
</el-descriptions-item>
|
|
|
- <el-descriptions-item label="Created">{{ formatDate(selectedCase.created_at) }}</el-descriptions-item>
|
|
|
|
|
|
|
+ <el-descriptions-item label="创建时间">{{ formatDate(selectedCase.created_at) }}</el-descriptions-item>
|
|
|
</el-descriptions>
|
|
</el-descriptions>
|
|
|
|
|
|
|
|
- <h4 class="detail-section">Parameters</h4>
|
|
|
|
|
|
|
+ <h4 class="detail-section">参数</h4>
|
|
|
<el-table :data="paramRows" size="small" border>
|
|
<el-table :data="paramRows" size="small" border>
|
|
|
<el-table-column prop="key" label="Parameter" width="180" />
|
|
<el-table-column prop="key" label="Parameter" width="180" />
|
|
|
<el-table-column prop="value" label="Value" />
|
|
<el-table-column prop="value" label="Value" />
|
|
|
</el-table>
|
|
</el-table>
|
|
|
|
|
|
|
|
- <h4 class="detail-section">Metrics</h4>
|
|
|
|
|
|
|
+ <h4 class="detail-section">指标</h4>
|
|
|
<el-table :data="metricRows" size="small" border>
|
|
<el-table :data="metricRows" size="small" border>
|
|
|
<el-table-column prop="key" label="Metric" width="180" />
|
|
<el-table-column prop="key" label="Metric" width="180" />
|
|
|
<el-table-column prop="value" label="Value" />
|
|
<el-table-column prop="value" label="Value" />
|
|
|
</el-table>
|
|
</el-table>
|
|
|
|
|
|
|
|
- <h4 class="detail-section">Conclusion</h4>
|
|
|
|
|
- <p class="conclusion-text">{{ selectedCase.conclusion || 'No conclusion recorded.' }}</p>
|
|
|
|
|
|
|
+ <h4 class="detail-section">结论</h4>
|
|
|
|
|
+ <p class="conclusion-text">{{ selectedCase.conclusion || '暂无结论记录。' }}</p>
|
|
|
|
|
|
|
|
- <h4 class="detail-section" v-if="selectedCase.tags?.length">Tags</h4>
|
|
|
|
|
|
|
+ <h4 class="detail-section" v-if="selectedCase.tags?.length">标签</h4>
|
|
|
<el-tag v-for="t in selectedCase.tags" :key="t" style="margin-right: 6px">{{ t }}</el-tag>
|
|
<el-tag v-for="t in selectedCase.tags" :key="t" style="margin-right: 6px">{{ t }}</el-tag>
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
@@ -173,70 +173,70 @@
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
<!-- Import Dialog -->
|
|
<!-- Import Dialog -->
|
|
|
- <el-dialog v-model="showImportDialog" title="Import from Simulation Plan" width="500px">
|
|
|
|
|
|
|
+ <el-dialog v-model="showImportDialog" title="从方案导入经验库" width="500px">
|
|
|
<el-form label-width="120px" size="small">
|
|
<el-form label-width="120px" size="small">
|
|
|
- <el-form-item label="Select Plan" required>
|
|
|
|
|
- <el-select v-model="importPlanId" placeholder="Choose a plan" style="width: 100%" filterable>
|
|
|
|
|
|
|
+ <el-form-item label="选择方案" required>
|
|
|
|
|
+ <el-select v-model="importPlanId" placeholder="请选择方案" style="width: 100%" filterable>
|
|
|
<el-option v-for="p in allPlans" :key="p.id" :label="`${p.name} (${p.plan_id})`" :value="p.id" />
|
|
<el-option v-for="p in allPlans" :key="p.id" :label="`${p.name} (${p.plan_id})`" :value="p.id" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="Tags">
|
|
|
|
|
- <el-select v-model="importTags" multiple filterable allow-create style="width: 100%" placeholder="Add tags...">
|
|
|
|
|
|
|
+ <el-form-item label="标签">
|
|
|
|
|
+ <el-select v-model="importTags" multiple filterable allow-create style="width: 100%" placeholder="添加标签...">
|
|
|
<el-option label="auto-imported" value="auto-imported" />
|
|
<el-option label="auto-imported" value="auto-imported" />
|
|
|
<el-option label="verified" value="verified" />
|
|
<el-option label="verified" value="verified" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="Rating">
|
|
|
|
|
|
|
+ <el-form-item label="评分">
|
|
|
<el-rate v-model="importRating" />
|
|
<el-rate v-model="importRating" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="Auto Conclusion">
|
|
|
|
|
|
|
+ <el-form-item label="自动结论">
|
|
|
<el-switch v-model="importAutoConclusion" />
|
|
<el-switch v-model="importAutoConclusion" />
|
|
|
- <span style="margin-left: 8px; font-size: 12px; color: #909399">Generate conclusion from metrics</span>
|
|
|
|
|
|
|
+ <span style="margin-left: 8px; font-size: 12px; color: #909399">根据指标自动生成结论</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
- <el-button @click="showImportDialog = false">Cancel</el-button>
|
|
|
|
|
- <el-button type="success" @click="doImport" :loading="importLoading" :disabled="!importPlanId">Import</el-button>
|
|
|
|
|
|
|
+ <el-button @click="showImportDialog = false">取消</el-button>
|
|
|
|
|
+ <el-button type="success" @click="doImport" :loading="importLoading" :disabled="!importPlanId">导入</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
<!-- Similar Case Search Dialog -->
|
|
<!-- Similar Case Search Dialog -->
|
|
|
- <el-dialog v-model="showSimilarDialog" title="Find Similar Cases" width="600px">
|
|
|
|
|
|
|
+ <el-dialog v-model="showSimilarDialog" title="相似案例检索" width="600px">
|
|
|
<div class="similar-form">
|
|
<div class="similar-form">
|
|
|
- <p class="form-hint">Enter parameter values to find similar experience cases. Leave empty to ignore a parameter.</p>
|
|
|
|
|
|
|
+ <p class="form-hint">输入参数值以检索相似经验案例,留空则忽略该参数。</p>
|
|
|
<el-form label-width="140px" size="small">
|
|
<el-form label-width="140px" size="small">
|
|
|
<el-form-item v-for="p in similarParams" :key="p.key" :label="p.key">
|
|
<el-form-item v-for="p in similarParams" :key="p.key" :label="p.key">
|
|
|
<el-input v-model.number="p.value" type="number" placeholder="value" clearable style="width: 200px" />
|
|
<el-input v-model.number="p.value" type="number" placeholder="value" clearable style="width: 200px" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="Topology">
|
|
|
|
|
- <el-select v-model="similarTopology" placeholder="All" clearable style="width: 200px">
|
|
|
|
|
|
|
+ <el-form-item label="拓扑">
|
|
|
|
|
+ <el-select v-model="similarTopology" placeholder="全部" clearable style="width: 200px">
|
|
|
<el-option label="SSSR" value="SSSR" />
|
|
<el-option label="SSSR" value="SSSR" />
|
|
|
<el-option label="DRSS" value="DRSS" />
|
|
<el-option label="DRSS" value="DRSS" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="Max Results">
|
|
|
|
|
|
|
+ <el-form-item label="结果数量">
|
|
|
<el-input-number v-model="similarTopK" :min="1" :max="20" style="width: 200px" />
|
|
<el-input-number v-model="similarTopK" :min="1" :max="20" style="width: 200px" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
- <el-button type="primary" @click="searchSimilar" :loading="similarLoading">Search</el-button>
|
|
|
|
|
|
|
+ <el-button type="primary" @click="searchSimilar" :loading="similarLoading">检索</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="similarResults.length > 0" class="similar-results">
|
|
<div v-if="similarResults.length > 0" class="similar-results">
|
|
|
- <el-divider>Results ({{ similarResults.length }})</el-divider>
|
|
|
|
|
- <el-table :data="similarResults" size="small" stripe @row-click="(row) => { selectedCase = row; detailVisible = true }">
|
|
|
|
|
|
|
+ <el-divider>检索结果 ({{ similarResults.length }})</el-divider>
|
|
|
|
|
+ <el-table :data="similarResults" size="small" stripe @row-click="(row: any) => { selectedCase = row; detailVisible = true }">
|
|
|
<el-table-column prop="id" label="ID" width="60" />
|
|
<el-table-column prop="id" label="ID" width="60" />
|
|
|
- <el-table-column prop="topology" label="Topo" width="70" />
|
|
|
|
|
- <el-table-column label="Similarity" width="100">
|
|
|
|
|
|
|
+ <el-table-column prop="topology" label="拓扑" width="70" />
|
|
|
|
|
+ <el-table-column label="相似度" width="100">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-progress :percentage="Math.round(row.similarity_score * 100)" :stroke-width="8" :color="row.similarity_score > 0.7 ? '#67c23a' : row.similarity_score > 0.5 ? '#e6a23c' : '#f56c6c'" />
|
|
<el-progress :percentage="Math.round(row.similarity_score * 100)" :stroke-width="8" :color="row.similarity_score > 0.7 ? '#67c23a' : row.similarity_score > 0.5 ? '#e6a23c' : '#f56c6c'" />
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="Shared Params" min-width="150">
|
|
|
|
|
|
|
+ <el-table-column label="共享参数" min-width="150">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag v-for="p in row.shared_params" :key="p" size="small" style="margin-right: 4px" type="info">{{ p }}</el-tag>
|
|
<el-tag v-for="p in row.shared_params" :key="p" size="small" style="margin-right: 4px" type="info">{{ p }}</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="conclusion" label="Conclusion" show-overflow-tooltip />
|
|
|
|
|
|
|
+ <el-table-column prop="conclusion" label="结论" show-overflow-tooltip />
|
|
|
</el-table>
|
|
</el-table>
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
@@ -245,7 +245,7 @@
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import { ref, computed, onMounted, reactive } from 'vue'
|
|
import { ref, computed, onMounted, reactive } from 'vue'
|
|
|
-import { ElMessage } from 'element-plus'
|
|
|
|
|
|
|
+import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
import { Search, Refresh, Upload } from '@element-plus/icons-vue'
|
|
import { Search, Refresh, Upload } from '@element-plus/icons-vue'
|
|
|
import { experienceApi, analyticsApi, planApi } from '@/api'
|
|
import { experienceApi, analyticsApi, planApi } from '@/api'
|
|
|
|
|
|
|
@@ -344,7 +344,7 @@ async function loadExperience() {
|
|
|
}
|
|
}
|
|
|
allTags.value = Array.from(tags)
|
|
allTags.value = Array.from(tags)
|
|
|
} catch (e: any) {
|
|
} catch (e: any) {
|
|
|
- ElMessage.error('Failed to load experience: ' + e.message)
|
|
|
|
|
|
|
+ ElMessage.error('加载经验库失败:' + e.message)
|
|
|
} finally {
|
|
} finally {
|
|
|
loading.value = false
|
|
loading.value = false
|
|
|
}
|
|
}
|
|
@@ -387,11 +387,11 @@ async function saveEdit() {
|
|
|
tags: editForm.tags,
|
|
tags: editForm.tags,
|
|
|
rating: editForm.rating
|
|
rating: editForm.rating
|
|
|
})
|
|
})
|
|
|
- ElMessage.success('Case updated successfully')
|
|
|
|
|
|
|
+ ElMessage.success('案例更新成功')
|
|
|
editVisible.value = false
|
|
editVisible.value = false
|
|
|
await loadAll()
|
|
await loadAll()
|
|
|
} catch (e: any) {
|
|
} catch (e: any) {
|
|
|
- ElMessage.error('Update failed: ' + e.message)
|
|
|
|
|
|
|
+ ElMessage.error('更新失败:' + e.message)
|
|
|
} finally {
|
|
} finally {
|
|
|
editLoading.value = false
|
|
editLoading.value = false
|
|
|
}
|
|
}
|
|
@@ -399,17 +399,17 @@ async function saveEdit() {
|
|
|
|
|
|
|
|
async function deleteCase(row: any) {
|
|
async function deleteCase(row: any) {
|
|
|
try {
|
|
try {
|
|
|
- await ElMessage.confirm(`Delete experience case #${row.id}?`, 'Confirm Delete', {
|
|
|
|
|
|
|
+ await ElMessageBox.confirm(`确定删除经验案例 #${row.id}?`, '确认删除', {
|
|
|
type: 'warning',
|
|
type: 'warning',
|
|
|
- confirmButtonText: 'Delete',
|
|
|
|
|
- cancelButtonText: 'Cancel'
|
|
|
|
|
|
|
+ confirmButtonText: '删除',
|
|
|
|
|
+ cancelButtonText: '取消'
|
|
|
})
|
|
})
|
|
|
} catch {
|
|
} catch {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
try {
|
|
try {
|
|
|
await experienceApi.delete(row.id)
|
|
await experienceApi.delete(row.id)
|
|
|
- ElMessage.success('Case deleted')
|
|
|
|
|
|
|
+ ElMessage.success('案例已删除')
|
|
|
await loadAll()
|
|
await loadAll()
|
|
|
} catch (e: any) {
|
|
} catch (e: any) {
|
|
|
ElMessage.error('Delete failed: ' + e.message)
|
|
ElMessage.error('Delete failed: ' + e.message)
|
|
@@ -453,7 +453,7 @@ async function searchSimilar() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (Object.keys(params).length === 0) {
|
|
if (Object.keys(params).length === 0) {
|
|
|
- ElMessage.warning('Please enter at least one parameter value')
|
|
|
|
|
|
|
+ ElMessage.warning('请至少输入一个参数值')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
similarLoading.value = true
|
|
similarLoading.value = true
|
|
@@ -461,10 +461,10 @@ async function searchSimilar() {
|
|
|
const res = await analyticsApi.experienceSimilar(params, similarTopology.value || undefined, similarTopK.value)
|
|
const res = await analyticsApi.experienceSimilar(params, similarTopology.value || undefined, similarTopK.value)
|
|
|
similarResults.value = res.data.items
|
|
similarResults.value = res.data.items
|
|
|
if (similarResults.value.length === 0) {
|
|
if (similarResults.value.length === 0) {
|
|
|
- ElMessage.info('No similar cases found. Try adjusting tolerance or parameters.')
|
|
|
|
|
|
|
+ ElMessage.info('未找到相似案例,请调整参数或容差。')
|
|
|
}
|
|
}
|
|
|
} catch (e: any) {
|
|
} catch (e: any) {
|
|
|
- ElMessage.error('Search failed: ' + e.message)
|
|
|
|
|
|
|
+ ElMessage.error('检索失败:' + e.message)
|
|
|
} finally {
|
|
} finally {
|
|
|
similarLoading.value = false
|
|
similarLoading.value = false
|
|
|
}
|
|
}
|