guzhi/web/src/views/system/api/index.vue
2023-11-27 15:06:42 +08:00

271 lines
6.9 KiB
Vue

<script setup>
import { h, onMounted, ref, resolveDirective, withDirectives } from 'vue'
import { NButton, NForm, NFormItem, NInput, NPopconfirm } from 'naive-ui'
import CommonPage from '@/components/page/CommonPage.vue'
import QueryBarItem from '@/components/query-bar/QueryBarItem.vue'
import CrudModal from '@/components/table/CrudModal.vue'
import CrudTable from '@/components/table/CrudTable.vue'
import TheIcon from '@/components/icon/TheIcon.vue'
import { renderIcon } from '@/utils'
import { useCRUD } from '@/composables'
// import { loginTypeMap, loginTypeOptions } from '@/constant/data'
import api from '@/api'
defineOptions({ name: 'Api列表' })
const $table = ref(null)
const queryItems = ref({})
const vPermission = resolveDirective('permission')
const {
modalVisible,
modalTitle,
modalLoading,
handleSave,
modalForm,
modalFormRef,
handleEdit,
handleDelete,
handleAdd,
} = useCRUD({
name: 'API',
initForm: {},
doCreate: api.createApi,
doUpdate: api.updateApi,
doDelete: api.deleteApi,
refresh: () => $table.value?.handleSearch(),
})
const roleOption = ref([])
onMounted(() => {
$table.value?.handleSearch()
api.getRoleList({ page: 1, page_size: 9999 }).then((res) => (roleOption.value = res.data))
})
async function handleRefreshApi() {
await $dialog.confirm({
title: '提示',
type: 'warning',
content: '此操作会根据后端 app.routes 进行路由更新,确定继续刷新 API 操作?',
async confirm() {
await api.refreshApi()
$message.success('刷新完成')
$table.value?.handleSearch()
},
})
}
const addAPIRules = {
path: [
{
required: true,
message: '请输入API路径',
trigger: ['input', 'blur', 'change'],
},
],
method: [
{
required: true,
message: '请输入请求方式',
trigger: ['input', 'blur', 'change'],
},
],
summary: [
{
required: true,
message: '请输入API简介',
trigger: ['input', 'blur', 'change'],
},
],
tags: [
{
required: true,
message: '请输入Tags',
trigger: ['input', 'blur', 'change'],
},
],
}
const columns = [
{
title: 'API路径',
key: 'path',
width: 'auto',
align: 'center',
ellipsis: { tooltip: true },
},
{
title: '请求方式',
key: 'method',
align: 'center',
width: 'auto',
ellipsis: { tooltip: true },
},
{
title: 'API简介',
key: 'summary',
width: 'auto',
align: 'center',
ellipsis: { tooltip: true },
},
{
title: 'Tags',
key: 'tags',
width: 'auto',
align: 'center',
ellipsis: { tooltip: true },
},
{
title: '操作',
key: 'actions',
width: 'auto',
align: 'center',
fixed: 'right',
render(row) {
return [
withDirectives(
h(
NButton,
{
size: 'small',
type: 'primary',
style: 'margin-right: 8px;',
onClick: () => {
handleEdit(row)
modalForm.value.roles = row.roles.map((e) => (e = e.id))
},
},
{
default: () => '编辑',
icon: renderIcon('material-symbols:edit', { size: 16 }),
},
),
[[vPermission, 'post/api/v1/api/update']],
),
h(
NPopconfirm,
{
onPositiveClick: () => handleDelete({ api_id: row.id }, false),
onNegativeClick: () => {},
},
{
trigger: () =>
withDirectives(
h(
NButton,
{
size: 'small',
type: 'error',
},
{
default: () => '删除',
icon: renderIcon('material-symbols:delete-outline', { size: 16 }),
},
),
[[vPermission, 'delete/api/v1/api/delete']],
),
default: () => h('div', {}, '确定删除该API吗?'),
},
),
]
},
},
]
</script>
<template>
<!-- 业务页面 -->
<CommonPage show-footer title="API列表">
<template #action>
<div>
<NButton
v-permission="'post/api/v1/api/create'"
class="float-right mr-15"
type="primary"
@click="handleAdd"
>
<TheIcon icon="material-symbols:add" :size="18" class="mr-5" />新建API
</NButton>
<NButton
v-permission="'post/api/v1/api/refresh'"
class="float-right mr-15"
type="warning"
@click="handleRefreshApi"
>
<TheIcon icon="material-symbols:refresh" :size="18" class="mr-5" />刷新API
</NButton>
</div>
</template>
<!-- 表格 -->
<CrudTable
ref="$table"
v-model:query-items="queryItems"
:columns="columns"
:get-data="api.getApis"
>
<template #queryBar>
<QueryBarItem label="路径" :label-width="40">
<NInput
v-model:value="queryItems.path"
clearable
type="text"
placeholder="请输入API路径"
@keypress.enter="$table?.handleSearch"
/>
</QueryBarItem>
<QueryBarItem label="API简介" :label-width="70">
<NInput
v-model:value="queryItems.summary"
clearable
type="text"
placeholder="请输入API简介"
@keypress.enter="$table?.handleSearch"
/>
</QueryBarItem>
<QueryBarItem label="Tags" :label-width="40">
<NInput
v-model:value="queryItems.tags"
clearable
type="text"
placeholder="请输入API模块"
@keypress.enter="$table?.handleSearch"
/>
</QueryBarItem>
</template>
</CrudTable>
<!-- 新增/编辑 弹窗 -->
<CrudModal
v-model:visible="modalVisible"
:title="modalTitle"
:loading="modalLoading"
@save="handleSave"
>
<NForm
ref="modalFormRef"
label-placement="left"
label-align="left"
:label-width="80"
:model="modalForm"
:rules="addAPIRules"
>
<NFormItem label="API名称" path="path">
<NInput v-model:value="modalForm.path" clearable placeholder="请输入API路径" />
</NFormItem>
<NFormItem label="请求方式" path="method">
<NInput v-model:value="modalForm.method" clearable placeholder="请输入请求方式" />
</NFormItem>
<NFormItem label="API简介" path="summary">
<NInput v-model:value="modalForm.summary" clearable placeholder="请输入API简介" />
</NFormItem>
<NFormItem label="Tags" path="tags">
<NInput v-model:value="modalForm.tags" clearable placeholder="请输入Tags" />
</NFormItem>
</NForm>
</CrudModal>
</CommonPage>
</template>