view.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <el-dialog class="api-view" v-model="showDialog" title="API详情" width="800px" :close-on-click-modal="false" :close-on-press-escape="false">
  3. <el-descriptions :column="2" border>
  4. <el-descriptions-item label="API名称" :span="2">{{ apiData.name }}</el-descriptions-item>
  5. <el-descriptions-item label="API路径" :span="2">{{ apiData.path }}</el-descriptions-item>
  6. <el-descriptions-item label="请求方法">
  7. <el-tag :type="getMethodTagType(apiData.method)" size="small">{{ apiData.method }}</el-tag>
  8. </el-descriptions-item>
  9. <el-descriptions-item label="状态">
  10. <el-tag size="small" v-if="apiData.status === 'Draft'">草稿</el-tag>
  11. <el-tag size="small" type="success" v-else-if="apiData.status === 'Published'">已发布</el-tag>
  12. <el-tag size="small" type="info" v-else-if="apiData.status === 'Deprecated'">已废弃</el-tag>
  13. <span v-else>{{ apiData.status }}</span>
  14. </el-descriptions-item>
  15. <el-descriptions-item label="数据源">{{ apiData.dataSourceName }}</el-descriptions-item>
  16. <el-descriptions-item label="版本">{{ apiData.version }}</el-descriptions-item>
  17. <el-descriptions-item label="SQL类型">
  18. <el-tag size="small" type="info" v-if="apiData.sqlType === 'query'">查询</el-tag>
  19. <el-tag size="small" type="warning" v-else-if="apiData.sqlType === 'procedure'">存储过程</el-tag>
  20. <span v-else>{{ apiData.sqlType }}</span>
  21. </el-descriptions-item>
  22. <el-descriptions-item label="返回格式">{{ apiData.returnFormat }}</el-descriptions-item>
  23. <el-descriptions-item label="SQL内容" :span="2">
  24. <div class="code-block">{{ apiData.sqlContent }}</div>
  25. </el-descriptions-item>
  26. <el-descriptions-item label="描述" :span="2">{{ apiData.description || "暂无描述" }}</el-descriptions-item>
  27. <el-descriptions-item label="创建时间">{{ apiData.createdAt }}</el-descriptions-item>
  28. <el-descriptions-item label="更新时间">{{ apiData.updatedAt }}</el-descriptions-item>
  29. </el-descriptions>
  30. <div class="section-title">参数定义</div>
  31. <el-table :data="apiData.parameters || []" style="width: 100%" border v-if="apiData.parameters && apiData.parameters.length">
  32. <el-table-column prop="name" label="参数名" width="150"></el-table-column>
  33. <el-table-column prop="type" label="类型" width="100"></el-table-column>
  34. <el-table-column label="必填" width="80">
  35. <template #default="scope">
  36. <el-tag size="small" type="success" v-if="scope.row.required">是</el-tag>
  37. <el-tag size="small" type="info" v-else>否</el-tag>
  38. </template>
  39. </el-table-column>
  40. <el-table-column prop="defaultValue" label="默认值" width="120"></el-table-column>
  41. <el-table-column prop="description" label="描述"></el-table-column>
  42. </el-table>
  43. <el-empty description="暂无参数" v-else></el-empty>
  44. <div class="section-title" v-if="apiData.plugins && apiData.plugins.length">关联插件</div>
  45. <el-table :data="apiData.plugins || []" style="width: 100%" border v-if="apiData.plugins && apiData.plugins.length">
  46. <el-table-column prop="pluginId" label="插件ID" width="100"></el-table-column>
  47. <el-table-column prop="config" label="插件配置"></el-table-column>
  48. </el-table>
  49. <template #footer>
  50. <div class="dialog-footer">
  51. <el-button @click="closeDialog">关闭</el-button>
  52. <el-button type="primary" @click="testApi">测试API</el-button>
  53. </div>
  54. </template>
  55. </el-dialog>
  56. </template>
  57. <script lang="ts" setup>
  58. import { ref, reactive } from "vue";
  59. const emit = defineEmits(["test"]);
  60. const showDialog = ref(false);
  61. const apiData = reactive({
  62. id: undefined,
  63. name: "",
  64. path: "",
  65. method: "",
  66. dataSourceId: undefined,
  67. dataSourceName: "",
  68. sqlType: "",
  69. sqlContent: "",
  70. parameters: [],
  71. returnFormat: "",
  72. version: "",
  73. status: "",
  74. plugins: [],
  75. description: "",
  76. createdAt: "",
  77. updatedAt: "",
  78. });
  79. // 根据请求方法返回不同的标签类型
  80. const getMethodTagType = (method: string) => {
  81. switch (method?.toUpperCase()) {
  82. case "GET":
  83. return "success";
  84. case "POST":
  85. return "primary";
  86. case "PUT":
  87. return "warning";
  88. case "DELETE":
  89. return "danger";
  90. default:
  91. return "info";
  92. }
  93. };
  94. // 关闭对话框
  95. const closeDialog = () => {
  96. showDialog.value = false;
  97. };
  98. // 测试API
  99. const testApi = () => {
  100. closeDialog();
  101. emit("test", apiData);
  102. };
  103. // 打开对话框
  104. const open = async (row: any) => {
  105. // 清空数据
  106. Object.keys(apiData).forEach((key) => {
  107. apiData[key] = undefined;
  108. });
  109. showDialog.value = true;
  110. // 实际使用时,应该调用API获取详细信息
  111. // const res = await api.apihub.getDetail({ id: row.id })
  112. // Object.assign(apiData, res)
  113. // 这里模拟直接使用传入的行数据
  114. Object.assign(apiData, row);
  115. };
  116. defineExpose({ open });
  117. </script>
  118. <style scoped>
  119. .dialog-footer {
  120. display: flex;
  121. justify-content: flex-end;
  122. }
  123. .section-title {
  124. font-weight: bold;
  125. margin: 20px 0 10px;
  126. font-size: 16px;
  127. border-left: 4px solid #409eff;
  128. padding-left: 10px;
  129. }
  130. .code-block {
  131. background-color: #f5f7fa;
  132. border: 1px solid #e4e7ed;
  133. border-radius: 4px;
  134. padding: 10px;
  135. font-family: monospace;
  136. white-space: pre-wrap;
  137. word-break: break-all;
  138. }
  139. </style>