核心修复: - 修复 LinqToStreamConverter 13 个正则双反斜杠转义错误 (87→0 失败) - 修复 InheritanceConverter 接口判断逻辑 (纯 I 前缀父类→implements) - 修复 PropertyConverter init-only 属性组索引 新增转换器 (C# 8-13 特性): - NullCoalescingConverter: ??、?.、??= 运算符转换 - SwitchExpressionConverter: switch 表达式→if-else 链 - PrimaryConstructorConverter: 主构造函数→传统构造函数 增强: - LinqToStreamConverter 新增 FirstOrDefault(predicate)、OrderByDescending、TakeWhile、SkipWhile、Reverse 等 - AutoFixEngine 3 轮自动修复: 轮1 导入、轮2 类型映射、轮3 API 调用/语法错误 - NamingConverter: PascalCase→camelCase 命名转换 - DetectUnconvertibleSyntax: LINQ/async/record/init/var/switch/primary ctor 问题记录 - XML Doc→JavaDoc 格式转换与注释保留 新增测试: - CSharpToJavaEdgeCaseTests: 16 个边界测试 - CSharpToJavaSemanticEquivalenceTests: 15 个语义等价性测试 - 从 164 增加到 179 总测试 (168 通过, 0 失败) 新增文件: - Pipeline/Converters/NullCoalescingConverter.cs - Pipeline/Converters/SwitchExpressionConverter.cs - Pipeline/Converters/PrimaryConstructorConverter.cs - Converters/CSharpToCppStrategy.cs + CppCodeGenerator.cs - Tests/Semantics/CSharpToJavaSemanticEquivalenceTests.cs - Tests/CSharpAdvancedFeaturesTests.cs + CSharp13FeatureTests.cs Co-authored-by: monkeycode-ai <[email protected]>
108 lines
4.0 KiB
Vue
108 lines
4.0 KiB
Vue
<template>
|
|
<div class="projects-view">
|
|
<el-container>
|
|
<el-header class="toolbar">
|
|
<h2>项目管理</h2>
|
|
<el-button type="primary" @click="showCreateDialog = true" icon="Plus">新建项目</el-button>
|
|
</el-header>
|
|
|
|
<el-main>
|
|
<el-table :data="projects" stripe>
|
|
<el-table-column prop="name" label="项目名称" />
|
|
<el-table-column label="转换方向">
|
|
<template #default="{ row }">
|
|
<el-tag>{{ row.sourceLanguage }}</el-tag>
|
|
<el-icon style="margin: 0 8px"><Right /></el-icon>
|
|
<el-tag type="success">{{ row.targetLanguage }}</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="files" label="文件数" width="100">
|
|
<template #default="{ row }">{{ row.files?.length || 0 }}</template>
|
|
</el-table-column>
|
|
<el-table-column prop="createdAt" label="创建时间" width="180">
|
|
<template #default="{ row }">{{ new Date(row.createdAt).toLocaleString() }}</template>
|
|
</el-table-column>
|
|
<el-table-column label="操作" width="200">
|
|
<template #default="{ row }">
|
|
<el-button size="small" @click="viewProject(row)">查看</el-button>
|
|
<el-button size="small" type="danger" @click="deleteProject(row.id)">删除</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-main>
|
|
</el-container>
|
|
|
|
<!-- 创建项目对话框 -->
|
|
<el-dialog v-model="showCreateDialog" title="创建项目" width="500px">
|
|
<el-form :model="newProject" label-width="100px">
|
|
<el-form-item label="项目名称">
|
|
<el-input v-model="newProject.name" placeholder="输入项目名称" />
|
|
</el-form-item>
|
|
<el-form-item label="源语言">
|
|
<el-select v-model="newProject.sourceLanguage">
|
|
<el-option label="C#" value="CSharp" />
|
|
<el-option label="Java" value="Java" />
|
|
<el-option label="C++" value="CPlusPlus" />
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item label="目标语言">
|
|
<el-select v-model="newProject.targetLanguage">
|
|
<el-option label="Java" value="Java" />
|
|
<el-option label="C#" value="CSharp" />
|
|
<el-option label="C++" value="CPlusPlus" />
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="showCreateDialog = false">取消</el-button>
|
|
<el-button type="primary" @click="createProject">创建</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, onMounted } from 'vue'
|
|
import { ElMessage } from 'element-plus'
|
|
import { Right } from '@element-plus/icons-vue'
|
|
import { conversionApi } from '../services/api'
|
|
|
|
const projects = ref<any[]>([])
|
|
const showCreateDialog = ref(false)
|
|
const newProject = ref({ name: '', sourceLanguage: 'CSharp', targetLanguage: 'Java' })
|
|
|
|
const loadProjects = async () => {
|
|
try { projects.value = await conversionApi.getProjects() }
|
|
catch { ElMessage.error('加载项目失败') }
|
|
}
|
|
|
|
const createProject = async () => {
|
|
try {
|
|
await conversionApi.createProject(newProject.value.name, newProject.value.sourceLanguage, newProject.value.targetLanguage)
|
|
ElMessage.success('项目创建成功')
|
|
showCreateDialog.value = false
|
|
loadProjects()
|
|
} catch { ElMessage.error('创建失败') }
|
|
}
|
|
|
|
const deleteProject = async (id: string) => {
|
|
try {
|
|
await conversionApi.deleteProject(id)
|
|
ElMessage.success('删除成功')
|
|
loadProjects()
|
|
} catch { ElMessage.error('删除失败') }
|
|
}
|
|
|
|
const viewProject = (project: any) => {
|
|
ElMessage.info(`查看项目:${project.name}`)
|
|
}
|
|
|
|
onMounted(() => { loadProjects() })
|
|
</script>
|
|
|
|
<style scoped>
|
|
.projects-view { width: 100%; height: 100%; }
|
|
.toolbar { height: 60px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #e0e0e0; }
|
|
.dark .toolbar { border-bottom-color: #434343; background: #1d1d1d; }
|
|
</style>
|