diff --git a/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts b/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts new file mode 100644 index 000000000..85352c516 --- /dev/null +++ b/apps/web-antd/src/api/infra/demo/demo03/inner/index.ts @@ -0,0 +1,76 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace Demo03StudentApi { + /** 学生课程信息 */ + export interface Demo03Course { + id: number; // 编号 + studentId?: number; // 学生编号 + name?: string; // 名字 + score?: number; // 分数 + } + /** 学生班级信息 */ + export interface Demo03Grade { + id: number; // 编号 + studentId?: number; // 学生编号 + name?: string; // 名字 + teacher?: string; // 班主任 + } + /** 学生信息 */ + export interface Demo03Student { + id: number; // 编号 + name?: string; // 名字 + sex?: number; // 性别 + birthday?: Date; // 出生日期 + description?: string; // 简介 + demo03courses?: Demo03Course[]; + demo03grade?: Demo03Grade; + } +} + +/** 查询学生分页 */ +export function getDemo03StudentPage(params: PageParam) { + return requestClient.get>('/infra/demo03-student/page', { params }); +} + +/** 查询学生详情 */ +export function getDemo03Student(id: number) { + return requestClient.get(`/infra/demo03-student/get?id=${id}`); +} + +/** 新增学生 */ +export function createDemo03Student(data: Demo03StudentApi.Demo03Student) { + return requestClient.post('/infra/demo03-student/create', data); +} + +/** 修改学生 */ +export function updateDemo03Student(data: Demo03StudentApi.Demo03Student) { + return requestClient.put('/infra/demo03-student/update', data); +} + +/** 删除学生 */ +export function deleteDemo03Student(id: number) { + return requestClient.delete(`/infra/demo03-student/delete?id=${id}`); +} + +/** 导出学生 */ +export function exportDemo03Student(params: any) { + return requestClient.download('/infra/demo03-student/export-excel', params); +} + +// ==================== 子表(学生课程) ==================== +/** 获得学生课程列表 */ +export function getDemo03CourseListByStudentId(studentId: number) { + return requestClient.get( + `/infra/demo03-student/demo03-course/list-by-student-id?studentId=${studentId}`, + ); +} + +// ==================== 子表(学生班级) ==================== +/** 获得学生班级 */ +export function getDemo03GradeByStudentId(studentId: number) { + return requestClient.get( + `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=${studentId}`, + ); +} diff --git a/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts b/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts new file mode 100644 index 000000000..85352c516 --- /dev/null +++ b/apps/web-antd/src/api/infra/demo/demo03/normal/index.ts @@ -0,0 +1,76 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace Demo03StudentApi { + /** 学生课程信息 */ + export interface Demo03Course { + id: number; // 编号 + studentId?: number; // 学生编号 + name?: string; // 名字 + score?: number; // 分数 + } + /** 学生班级信息 */ + export interface Demo03Grade { + id: number; // 编号 + studentId?: number; // 学生编号 + name?: string; // 名字 + teacher?: string; // 班主任 + } + /** 学生信息 */ + export interface Demo03Student { + id: number; // 编号 + name?: string; // 名字 + sex?: number; // 性别 + birthday?: Date; // 出生日期 + description?: string; // 简介 + demo03courses?: Demo03Course[]; + demo03grade?: Demo03Grade; + } +} + +/** 查询学生分页 */ +export function getDemo03StudentPage(params: PageParam) { + return requestClient.get>('/infra/demo03-student/page', { params }); +} + +/** 查询学生详情 */ +export function getDemo03Student(id: number) { + return requestClient.get(`/infra/demo03-student/get?id=${id}`); +} + +/** 新增学生 */ +export function createDemo03Student(data: Demo03StudentApi.Demo03Student) { + return requestClient.post('/infra/demo03-student/create', data); +} + +/** 修改学生 */ +export function updateDemo03Student(data: Demo03StudentApi.Demo03Student) { + return requestClient.put('/infra/demo03-student/update', data); +} + +/** 删除学生 */ +export function deleteDemo03Student(id: number) { + return requestClient.delete(`/infra/demo03-student/delete?id=${id}`); +} + +/** 导出学生 */ +export function exportDemo03Student(params: any) { + return requestClient.download('/infra/demo03-student/export-excel', params); +} + +// ==================== 子表(学生课程) ==================== +/** 获得学生课程列表 */ +export function getDemo03CourseListByStudentId(studentId: number) { + return requestClient.get( + `/infra/demo03-student/demo03-course/list-by-student-id?studentId=${studentId}`, + ); +} + +// ==================== 子表(学生班级) ==================== +/** 获得学生班级 */ +export function getDemo03GradeByStudentId(studentId: number) { + return requestClient.get( + `/infra/demo03-student/demo03-grade/get-by-student-id?studentId=${studentId}`, + ); +} diff --git a/apps/web-antd/src/router/routes/modules/infra.ts b/apps/web-antd/src/router/routes/modules/infra.ts index 0f32b8db6..1ff47cb3e 100644 --- a/apps/web-antd/src/router/routes/modules/infra.ts +++ b/apps/web-antd/src/router/routes/modules/infra.ts @@ -27,7 +27,7 @@ const routes: RouteRecordRaw[] = [ { path: '/codegen/edit', name: 'InfraCodegenEdit', - component: () => import('#/views/infra/codegen/edit.vue'), + component: () => import('#/views/infra/codegen/edit/index.vue'), meta: { title: '修改生成配置', activeMenu: '/infra/codegen', diff --git a/apps/web-antd/src/views/infra/codegen/data.ts b/apps/web-antd/src/views/infra/codegen/data.ts index 3952aee81..809441938 100644 --- a/apps/web-antd/src/views/infra/codegen/data.ts +++ b/apps/web-antd/src/views/infra/codegen/data.ts @@ -1,13 +1,13 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; import type { InfraCodegenApi } from '#/api/infra/codegen'; -import type { InfraDataSourceConfigApi } from '#/api/infra/data-source-config'; import type { SystemMenuApi } from '#/api/system/menu'; import type { Recordable } from '@vben/types'; +import type { ComputedRef } from 'vue'; import { IconifyIcon } from '@vben/icons'; -import { z } from '#/adapter/form'; +import { getDataSourceConfigList } from '#/api/infra/data-source-config'; import { getMenuList } from '#/api/system/menu'; import { getRangePickerDefaultProps } from '#/utils/date'; import { DICT_TYPE, getDictOptions } from '#/utils/dict'; @@ -20,24 +20,24 @@ import { $t } from '@vben/locales'; const { hasAccessByCodes } = useAccess(); /** 导入数据库表的表单 */ -export function useImportTableFormSchema( - dataSourceConfigList: InfraDataSourceConfigApi.InfraDataSourceConfig[], -): VbenFormSchema[] { +export function useImportTableFormSchema(): VbenFormSchema[] { return [ { fieldName: 'dataSourceConfigId', label: '数据源', - // TODO @puhui999:不确定使用 ApiSelect 的话,使用 afterEach,可以设置默认 defaultValue 不 - component: 'Select', + component: 'ApiSelect', componentProps: { - options: dataSourceConfigList.map((item) => ({ - label: item.name, - value: item.id, - })), + api: async () => { + const data = await getDataSourceConfigList(); + return data.map((item) => ({ + label: item.name, + value: item.id, + })); + }, + autoSelect: 'first', placeholder: '请选择数据源', }, - defaultValue: dataSourceConfigList[0]?.id, - rules: 'required', + rules: 'selectRequired', }, { fieldName: 'name', @@ -60,6 +60,15 @@ export function useImportTableFormSchema( ]; } +/** 导入数据库表表格列定义 */ +export function useImportTableColumns(): VxeTableGridOptions['columns'] { + return [ + { type: 'checkbox', width: 40 }, + { field: 'name', title: '表名称', minWidth: 200 }, + { field: 'comment', title: '表描述', minWidth: 200 }, + ]; +} + /** 基本信息表单的 schema */ export function useBasicInfoFormSchema(): VbenFormSchema[] { return [ @@ -124,7 +133,7 @@ export function useGenerationInfoBaseFormSchema(): VbenFormSchema[] { options: getDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_TYPE, 'number'), class: 'w-full', }, - rules: z.number().min(1, { message: '生成模板不能为空' }), + rules: 'selectRequired', }, { component: 'Select', @@ -134,8 +143,7 @@ export function useGenerationInfoBaseFormSchema(): VbenFormSchema[] { options: getDictOptions(DICT_TYPE.INFRA_CODEGEN_FRONT_TYPE, 'number'), class: 'w-full', }, - // todo @puhui999:1 可以是枚举么 - rules: z.number().min(1, { message: '前端类型不能为空' }), + rules: 'selectRequired', }, { component: 'Select', @@ -145,8 +153,7 @@ export function useGenerationInfoBaseFormSchema(): VbenFormSchema[] { options: getDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE, 'number'), class: 'w-full', }, - // todo @puhui999:1 可以是枚举么 - rules: z.number().min(1, { message: '生成场景不能为空' }), + rules: 'selectRequired', }, { fieldName: 'parentMenuId', @@ -199,36 +206,34 @@ export function useGenerationInfoBaseFormSchema(): VbenFormSchema[] { fieldName: 'moduleName', label: '模块名', help: '模块名,即一级目录,例如 system、infra、tool 等等', - // TODO @puhui999:这种 rules,可以使用 required - rules: z.string().min(1, { message: '模块名不能为空' }), + rules: 'required', }, { component: 'Input', fieldName: 'businessName', label: '业务名', help: '业务名,即二级目录,例如 user、permission、dict 等等', - rules: z.string().min(1, { message: '业务名不能为空' }), + rules: 'required', }, { component: 'Input', fieldName: 'className', label: '类名称', help: '类名称(首字母大写),例如SysUser、SysMenu、SysDictData 等等', - rules: z.string().min(1, { message: '类名称不能为空' }), + rules: 'required', }, { component: 'Input', fieldName: 'classComment', label: '类描述', help: '用作类描述,例如 用户', - rules: z.string().min(1, { message: '类描述不能为空' }), + rules: 'required', }, ]; } -// TODO @puhui999:是不是使用 useGenerationInfoTreeFormSchema,主要考虑对称 /** 树表信息 schema */ -export function useTreeTableFormSchema(columns: InfraCodegenApi.CodegenColumn[] = []): VbenFormSchema[] { +export function useGenerationInfoTreeFormSchema(columns: InfraCodegenApi.CodegenColumn[] = []): VbenFormSchema[] { return [ { component: 'Divider', @@ -276,9 +281,8 @@ export function useTreeTableFormSchema(columns: InfraCodegenApi.CodegenColumn[] ]; } -// TODO @puhui999:【类似】是不是使用 useGenerationInfoTreeFormSchema,主要考虑对称 /** 主子表信息 schema */ -export function useSubTableFormSchema( +export function useGenerationInfoSubTableFormSchema( columns: InfraCodegenApi.CodegenColumn[] = [], tables: InfraCodegenApi.CodegenTable[] = [], ): VbenFormSchema[] { @@ -387,17 +391,14 @@ export function useGridFormSchema(): VbenFormSchema[] { /** 列表的字段 */ export function useGridColumns( onActionClick: OnActionClickFn, - dataSourceConfigList: InfraDataSourceConfigApi.InfraDataSourceConfig[], + getDataSourceConfigName: ComputedRef<(cellValue: number) => string>, ): VxeTableGridOptions['columns'] { return [ { field: 'dataSourceConfigId', title: '数据源', minWidth: 120, - formatter: ({ cellValue }) => { - const config = dataSourceConfigList.find((item) => item.id === cellValue); - return config ? config.name : ''; - }, + formatter: ({ cellValue }) => getDataSourceConfigName.value(cellValue), }, { field: 'tableName', diff --git a/apps/web-antd/src/views/infra/codegen/edit.vue b/apps/web-antd/src/views/infra/codegen/edit/index.vue similarity index 89% rename from apps/web-antd/src/views/infra/codegen/edit.vue rename to apps/web-antd/src/views/infra/codegen/edit/index.vue index 1f268e3b7..e5038956a 100644 --- a/apps/web-antd/src/views/infra/codegen/edit.vue +++ b/apps/web-antd/src/views/infra/codegen/edit/index.vue @@ -1,10 +1,9 @@