Files
codeplay/CodePlay.Web/src/views/ProjectsView.vue
T
monkeycode-ai db536cfb2c feat: CodePlay 第二阶段优化 - 转换质量与特性完善
核心修复:
- 修复 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]>
2026-06-16 07:08:11 +00:00

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>