feat: 新增api代码生成模板

This commit is contained in:
xlsea
2024-09-07 18:53:30 +08:00
parent c0ad0e4e4f
commit 7dec936b94
15 changed files with 178 additions and 15 deletions

36
docs/template/api/soy.api.ts.vm vendored Normal file
View File

@ -0,0 +1,36 @@
import { request } from '@/service/request';
/** 获取${functionName}列表 */
export function fetchGet${BusinessName}List(params?: Api.System.${BusinessName}SearchParams) {
return request<Api.${ModuleName}.${BusinessName}List>({
url: '/${moduleName}/${businessName}/list',
method: 'get',
params
});
}
/** 新增${functionName} */
export function fetchCreate${BusinessName}(data: Api.${ModuleName}.${BusinessName}OperateParams) {
return request<boolean>({
url: '/${moduleName}/${businessName}',
method: 'post',
data
});
}
/** 修改${functionName} */
export function fetchUpdate${BusinessName}(data: Api.${ModuleName}.${BusinessName}OperateParams) {
return request<boolean>({
url: '/${moduleName}/${businessName}',
method: 'put',
data
});
}
/** 批量删除${functionName} */
export function fetchDelete${BusinessName}(${pkColumn.javaField}s: CommonType.IdType[]) {
return request<boolean>({
url: `/${moduleName}/${businessName}/${${pkColumn.javaField}s.join(',')}`,
method: 'delete'
});
}

150
docs/template/soy.index.vue.vm vendored Normal file
View File

@ -0,0 +1,150 @@
<script setup lang="tsx">
import { NButton, NPopconfirm } from 'naive-ui';
import { fetchGet${BusinessName}List, fetchDelete${BusinessName}, fetchBatchDelete${BusinessName} } from '@/service/api';
import { $t } from '@/locales';
import { useAppStore } from '@/store/modules/app';
import { useTable, useTableOperate } from '@/hooks/common/table';
import ${BusinessName}OperateDrawer from './modules/${businessName}-operate-drawer.vue';
import ${BusinessName}Search from './modules/${businessName}-search.vue';
const appStore = useAppStore();
const {
columns,
columnChecks,
data,
getData,
getDataByPage,
loading,
mobilePagination,
searchParams,
resetSearchParams
} = useTable({
apiFn: fetchGet${BusinessName}List,
apiParams: {
current: 1,
size: 10,
// if you want to use the searchParams in Form, you need to define the following properties, and the value is null
// the value can not be undefined, otherwise the property in Form will not be reactive
#foreach ($column in $columns)
#if($column.query)
$column.javaField: null#if($foreach.hasNext),#end
#end
#end
},
columns: () => [
{
type: 'selection',
align: 'center',
width: 48
},
{
key: 'index',
title: $t('common.index'),
align: 'center',
width: 64
},
#foreach ($column in $columns)
#if($column.list)
{
key: '$column.javaField',
title: '$column.columnComment',
align: 'center',
minWidth: 120
},
#end
#end
{
key: 'operate',
title: $t('common.operate'),
align: 'center',
width: 130,
render: row => (
<div class="flex-center gap-8px">
<NButton type="primary" ghost size="small" onClick={() => edit(row.id)}>
{$t('common.edit')}
</NButton>
<NPopconfirm onPositiveClick={() => handleDelete(row.id)}>
{{
default: () => $t('common.confirmDelete'),
trigger: () => (
<NButton type="error" ghost size="small">
{$t('common.delete')}
</NButton>
)
}}
</NPopconfirm>
</div>
)
}
]
});
const {
drawerVisible,
operateType,
editingData,
handleAdd,
handleEdit,
checkedRowKeys,
onBatchDeleted,
onDeleted
} = useTableOperate(data, getData);
async function handleBatchDelete() {
// request
const { error } = await fetchDelete${BusinessName}(checkedRowKeys.value)
if (error) return;
onBatchDeleted();
}
async function handleDelete(id: number) {
// request
const { error } = await fetchBatchDelete${BusinessName}([id])
if (error) return;
onDeleted();
}
async function edit(id: number) {
handleEdit('#foreach($column in $columns)#if($column.isPk == '1')$column.javaField#end#end', id);
}
</script>
<template>
<div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
<${BusinessName}Search v-model:model="searchParams" @reset="resetSearchParams" @search="getDataByPage" />
<NCard title="${functionName}" :bordered="false" size="small" class="sm:flex-1-hidden card-wrapper">
<template #header-extra>
<TableHeaderOperation
v-model:columns="columnChecks"
:disabled-delete="checkedRowKeys.length === 0"
:loading="loading"
@add="handleAdd"
@delete="handleBatchDelete"
@refresh="getData"
/>
</template>
<NDataTable
v-model:checked-row-keys="checkedRowKeys"
:columns="columns"
:data="data"
size="small"
:flex-height="!appStore.isMobile"
:scroll-x="962"
:loading="loading"
remote
:row-key="row => row.id"
:pagination="mobilePagination"
class="sm:h-full"
/>
<${BusinessName}OperateDrawer
v-model:visible="drawerVisible"
:operate-type="operateType"
:row-data="editingData"
@submitted="getDataByPage"
/>
</NCard>
</div>
</template>
<style scoped></style>

39
docs/template/typings/soy.api.d.ts.vm vendored Normal file
View File

@ -0,0 +1,39 @@
#set($ModuleName=$moduleName.substring(0, 1).toUpperCase() + $moduleName.substring(1))
/**
* namespace ${ModuleName}
*
* backend api module: "${ModuleName}"
*/
namespace ${ModuleName} {
/** ${businessName} */
type ${BusinessName} = Common.CommonRecord<{
#foreach($column in $columns)#if($column.insert || $column.edit)
/** $column.columnComment */
$column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) CommonType.IdType; #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; #elseif($column.javaType == 'Boolean') boolean; #else string; #end
#end#end
}>;
/** ${businessName} search params */
type ${BusinessName}SearchParams = CommonType.RecordNullable<
Pick<
Api.${ModuleName}.${BusinessName},
#foreach($column in $columns)
#if($column.query)
#set($dictType=$column.dictType)
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#set($parentheseIndex=$column.columnComment.indexOf(""))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($foreach.hasNext) |#end '${column.javaField}'
#end
#end
> &
Common.CommonSearchParams
>;
/** ${businessName} list */
type ${BusinessName}List = Common.PaginatingQueryRecord<${BusinessName}>;
}