From b376524980fedf301bfe4dfc04e63b625840d546 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 7 Apr 2025 18:05:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/package.json | 1 + apps/web-antd/src/api/infra/codegen/index.ts | 145 +++++++ apps/web-antd/src/router/routes/index.ts | 12 +- .../src/router/routes/modules/local.ts | 49 +++ apps/web-antd/src/utils/date.ts | 26 +- apps/web-antd/src/utils/dict.ts | 216 ++++++----- .../codegen/components/BasicInfoForm.vue | 95 +++++ .../codegen/components/ColumInfoForm.vue | 150 ++++++++ .../codegen/components/GenerateInfoForm.vue | 355 ++++++++++++++++++ apps/web-antd/src/views/infra/codegen/data.ts | 178 +++++++++ .../web-antd/src/views/infra/codegen/edit.vue | 104 +++++ .../src/views/infra/codegen/index.vue | 204 ++++++++++ .../infra/codegen/modules/import-table.vue | 118 ++++++ .../infra/codegen/modules/preview-code.vue | 222 +++++++++++ 14 files changed, 1738 insertions(+), 137 deletions(-) create mode 100644 apps/web-antd/src/api/infra/codegen/index.ts create mode 100644 apps/web-antd/src/router/routes/modules/local.ts create mode 100644 apps/web-antd/src/views/infra/codegen/components/BasicInfoForm.vue create mode 100644 apps/web-antd/src/views/infra/codegen/components/ColumInfoForm.vue create mode 100644 apps/web-antd/src/views/infra/codegen/components/GenerateInfoForm.vue create mode 100644 apps/web-antd/src/views/infra/codegen/data.ts create mode 100644 apps/web-antd/src/views/infra/codegen/edit.vue create mode 100644 apps/web-antd/src/views/infra/codegen/index.vue create mode 100644 apps/web-antd/src/views/infra/codegen/modules/import-table.vue create mode 100644 apps/web-antd/src/views/infra/codegen/modules/preview-code.vue diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index ca88bf1ac..26f6e8d54 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -45,6 +45,7 @@ "dayjs": "catalog:", "pinia": "catalog:", "vue": "catalog:", + "vue-codemirror": "^6.1.1", "vue-router": "catalog:" } } diff --git a/apps/web-antd/src/api/infra/codegen/index.ts b/apps/web-antd/src/api/infra/codegen/index.ts new file mode 100644 index 000000000..49629b341 --- /dev/null +++ b/apps/web-antd/src/api/infra/codegen/index.ts @@ -0,0 +1,145 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace InfraCodegenApi { + /** 代码生成表定义 */ + export interface CodegenTable { + id: number; + tableId: number; + isParentMenuIdValid: boolean; + dataSourceConfigId: number; + scene: number; + tableName: string; + tableComment: string; + remark: string; + moduleName: string; + businessName: string; + className: string; + classComment: string; + author: string; + createTime: Date; + updateTime: Date; + templateType: number; + parentMenuId: number; + } + + /** 代码生成字段定义 */ + export interface CodegenColumn { + id: number; + tableId: number; + columnName: string; + dataType: string; + columnComment: string; + nullable: number; + primaryKey: number; + ordinalPosition: number; + javaType: string; + javaField: string; + dictType: string; + example: string; + createOperation: number; + updateOperation: number; + listOperation: number; + listOperationCondition: string; + listOperationResult: number; + htmlType: string; + } + + /** 数据库表定义 */ + export interface DatabaseTable { + name: string; + comment: string; + } + + /** 代码生成详情 */ + export interface CodegenDetail { + table: CodegenTable; + columns: CodegenColumn[]; + } + + /** 代码预览 */ + export interface CodegenPreview { + filePath: string; + code: string; + } + + /** 更新代码生成请求 */ + export interface CodegenUpdateReq { + table: any | CodegenTable; + columns: CodegenColumn[]; + } + + /** 创建代码生成请求 */ + export interface CodegenCreateListReq { + dataSourceConfigId: number; + tableNames: string[]; + } +} + +/** 查询列表代码生成表定义 */ +export function getCodegenTableList(dataSourceConfigId: number) { + return requestClient.get('/infra/codegen/table/list', { + params: { dataSourceConfigId }, + }); +} + +/** 查询列表代码生成表定义 */ +export function getCodegenTablePage(params: PageParam) { + return requestClient.get>('/infra/codegen/table/page', { params }); +} + +/** 查询详情代码生成表定义 */ +export function getCodegenTable(id: number) { + return requestClient.get('/infra/codegen/detail', { + params: { tableId: id }, + }); +} + +/** 新增代码生成表定义 */ +export function createCodegenTable(data: InfraCodegenApi.CodegenCreateListReq) { + return requestClient.post('/infra/codegen/create', data); +} + +/** 修改代码生成表定义 */ +export function updateCodegenTable(data: InfraCodegenApi.CodegenUpdateReq) { + return requestClient.put('/infra/codegen/update', data); +} + +/** 基于数据库的表结构,同步数据库的表和字段定义 */ +export function syncCodegenFromDB(id: number) { + return requestClient.put('/infra/codegen/sync-from-db', { + params: { tableId: id }, + }); +} + +/** 预览生成代码 */ +export function previewCodegen(id: number) { + return requestClient.get('/infra/codegen/preview', { + params: { tableId: id }, + }); +} + +/** 下载生成代码 */ +export function downloadCodegen(id: number) { + return requestClient.download('/infra/codegen/download', { + params: { tableId: id }, + }); +} + +/** 获得表定义 */ +export function getSchemaTableList(params: any) { + return requestClient.get('/infra/codegen/db/table/list', { params }); +} + +/** 基于数据库的表结构,创建代码生成器的表定义 */ +export function createCodegenList(data: InfraCodegenApi.CodegenCreateListReq) { + return requestClient.post('/infra/codegen/create-list', data); +} + +/** 删除代码生成表定义 */ +export function deleteCodegenTable(id: number) { + return requestClient.delete('/infra/codegen/delete', { + params: { tableId: id }, + }); +} diff --git a/apps/web-antd/src/router/routes/index.ts b/apps/web-antd/src/router/routes/index.ts index 4b5c0ecd3..4a290101e 100644 --- a/apps/web-antd/src/router/routes/index.ts +++ b/apps/web-antd/src/router/routes/index.ts @@ -23,11 +23,7 @@ const externalRoutes: RouteRecordRaw[] = []; /** 路由列表,由基本路由、外部路由和404兜底路由组成 * 无需走权限验证(会一直显示在菜单中) */ -const routes: RouteRecordRaw[] = [ - ...coreRoutes, - ...externalRoutes, - fallbackNotFoundRoute, -]; +const routes: RouteRecordRaw[] = [...coreRoutes, ...externalRoutes, fallbackNotFoundRoute]; /** 基本路由列表,这些路由不需要进入权限拦截 */ const coreRouteNames = traverseTreeValues(coreRoutes, (route) => route.name); @@ -36,12 +32,10 @@ const coreRouteNames = traverseTreeValues(coreRoutes, (route) => route.name); const accessRoutes = [...dynamicRoutes, ...staticRoutes]; // add by 芋艿:from https://github.com/vbenjs/vue-vben-admin/blob/main/playground/src/router/routes/index.ts#L38-L45 -const componentKeys: string[] = Object.keys( - import.meta.glob('../../views/**/*.vue'), -) +const componentKeys: string[] = Object.keys(import.meta.glob('../../views/**/*.vue')) .filter((item) => !item.includes('/modules/')) .map((v) => { const path = v.replace('../../views/', '/'); return path.endsWith('.vue') ? path.slice(0, -4) : path; }); -export { accessRoutes, coreRouteNames, routes, componentKeys }; +export { accessRoutes, componentKeys, coreRouteNames, routes }; diff --git a/apps/web-antd/src/router/routes/modules/local.ts b/apps/web-antd/src/router/routes/modules/local.ts new file mode 100644 index 000000000..999972ea2 --- /dev/null +++ b/apps/web-antd/src/router/routes/modules/local.ts @@ -0,0 +1,49 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + icon: 'ic:baseline-view-in-ar', + keepAlive: true, + order: 1000, + title: $t('demos.title'), + }, + name: 'Demos', + path: '/demos', + children: [ + { + meta: { + title: $t('demos.antd'), + }, + name: 'AntDesignDemos', + path: '/demos/ant-design', + component: () => import('#/views/demos/antd/index.vue'), + }, + ], + }, + { + path: '/codegen', + name: 'CodegenEdit', + meta: { + icon: 'ic:baseline-view-in-ar', + keepAlive: true, + order: 1000, + title: $t('demos.title'), + }, + children: [ + // { + // path: 'codegen/edit', + // name: 'InfraCodegenEdit', + // component: () => import('#/views/infra/codegen/edit.vue'), + // meta: { + // title: '修改生成配置', + // activeMenu: '/infra/codegen', + // }, + // }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antd/src/utils/date.ts b/apps/web-antd/src/utils/date.ts index c2704e1dd..9c8be81b4 100644 --- a/apps/web-antd/src/utils/date.ts +++ b/apps/web-antd/src/utils/date.ts @@ -2,36 +2,24 @@ import dayjs from 'dayjs'; // TODO @芋艿:后续整理下 -// TODO @puhui999:转成 function 方式哈 /** 时间段选择器拓展 */ -export const getRangePickerDefaultProps = () => { +export function getRangePickerDefaultProps() { return { showTime: { format: 'HH:mm:ss', - defaultValue: [ - dayjs('00:00:00', 'HH:mm:ss'), - dayjs('23:59:59', 'HH:mm:ss'), - ], + defaultValue: [dayjs('00:00:00', 'HH:mm:ss'), dayjs('23:59:59', 'HH:mm:ss')], }, valueFormat: 'YYYY-MM-DD HH:mm:ss', format: 'YYYY-MM-DD HH:mm:ss', placeholder: ['开始时间', '结束时间'], + // prettier-ignore ranges: { '今天': [dayjs().startOf('day'), dayjs().endOf('day')], - '昨天': [ - dayjs().subtract(1, 'day').startOf('day'), - dayjs().subtract(1, 'day').endOf('day'), - ], + '昨天': [dayjs().subtract(1, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')], '本周': [dayjs().startOf('week'), dayjs().endOf('day')], '本月': [dayjs().startOf('month'), dayjs().endOf('day')], - '最近 7 天': [ - dayjs().subtract(7, 'day').startOf('day'), - dayjs().endOf('day'), - ], - '最近 30 天': [ - dayjs().subtract(30, 'day').startOf('day'), - dayjs().endOf('day'), - ], + '最近 7 天': [dayjs().subtract(7, 'day').startOf('day'), dayjs().endOf('day')], + '最近 30 天': [dayjs().subtract(30, 'day').startOf('day'), dayjs().endOf('day')], }, transformDateFunc: (dates: any) => { if (dates && dates.length === 2) { @@ -40,4 +28,4 @@ export const getRangePickerDefaultProps = () => { return {}; }, }; -}; +} diff --git a/apps/web-antd/src/utils/dict.ts b/apps/web-antd/src/utils/dict.ts index 9ea9ef757..5b2412420 100644 --- a/apps/web-antd/src/utils/dict.ts +++ b/apps/web-antd/src/utils/dict.ts @@ -17,7 +17,7 @@ const dictStore = useDictStore(); */ function getDictLabel(dictType: string, value: any) { const dictObj = dictStore.getDictData(dictType, value); - return isObject(dictObj)? dictObj.label : ''; + return isObject(dictObj) ? dictObj.label : ''; } /** @@ -38,10 +38,7 @@ function getDictObj(dictType: string, value: any) { * @param dictType 字典类型 * @returns 字典数组 */ -function getDictOptions( - dictType: string, - valueType: 'boolean' | 'number' | 'string' = 'string', -) { +function getDictOptions(dictType: string, valueType: 'boolean' | 'number' | 'string' = 'string') { const dictOpts = dictStore.getDictOptions(dictType); const dictOptions: DefaultOptionType = []; if (dictOpts.length > 0) { @@ -72,137 +69,138 @@ function getDictOptions( } enum DICT_TYPE { - AI_GENERATE_MODE = 'ai_generate_mode', // AI 生成模式 - AI_IMAGE_STATUS = 'ai_image_status', // AI 图片状态 - AI_MUSIC_STATUS = 'ai_music_status', // AI 音乐状态 - // ========== AI - 人工智能模块 ========== - AI_PLATFORM = 'ai_platform', // AI 平台 + USER_TYPE = 'user_type', + COMMON_STATUS = 'common_status', + TERMINAL = 'terminal', // 终端 + DATE_INTERVAL = 'date_interval', // 数据间隔 + + // ========== SYSTEM 模块 ========== + SYSTEM_USER_SEX = 'system_user_sex', + SYSTEM_MENU_TYPE = 'system_menu_type', + SYSTEM_ROLE_TYPE = 'system_role_type', + SYSTEM_DATA_SCOPE = 'system_data_scope', + SYSTEM_NOTICE_TYPE = 'system_notice_type', + SYSTEM_LOGIN_TYPE = 'system_login_type', + SYSTEM_LOGIN_RESULT = 'system_login_result', + SYSTEM_SMS_CHANNEL_CODE = 'system_sms_channel_code', + SYSTEM_SMS_TEMPLATE_TYPE = 'system_sms_template_type', + SYSTEM_SMS_SEND_STATUS = 'system_sms_send_status', + SYSTEM_SMS_RECEIVE_STATUS = 'system_sms_receive_status', + SYSTEM_OAUTH2_GRANT_TYPE = 'system_oauth2_grant_type', + SYSTEM_MAIL_SEND_STATUS = 'system_mail_send_status', + SYSTEM_NOTIFY_TEMPLATE_TYPE = 'system_notify_template_type', + SYSTEM_SOCIAL_TYPE = 'system_social_type', + + // ========== INFRA 模块 ========== + INFRA_BOOLEAN_STRING = 'infra_boolean_string', + INFRA_JOB_STATUS = 'infra_job_status', + INFRA_JOB_LOG_STATUS = 'infra_job_log_status', + INFRA_API_ERROR_LOG_PROCESS_STATUS = 'infra_api_error_log_process_status', + INFRA_CONFIG_TYPE = 'infra_config_type', + INFRA_CODEGEN_TEMPLATE_TYPE = 'infra_codegen_template_type', + INFRA_CODEGEN_FRONT_TYPE = 'infra_codegen_front_type', + INFRA_CODEGEN_SCENE = 'infra_codegen_scene', + INFRA_FILE_STORAGE = 'infra_file_storage', + INFRA_OPERATE_TYPE = 'infra_operate_type', - AI_WRITE_FORMAT = 'ai_write_format', // AI 写作格式 - AI_WRITE_LANGUAGE = 'ai_write_language', // AI 写作语言 - AI_WRITE_LENGTH = 'ai_write_length', // AI 写作长度 - AI_WRITE_TONE = 'ai_write_tone', // AI 写作语气 - AI_WRITE_TYPE = 'ai_write_type', // AI 写作类型 - BPM_MODEL_FORM_TYPE = 'bpm_model_form_type', // ========== BPM 模块 ========== BPM_MODEL_TYPE = 'bpm_model_type', - BPM_OA_LEAVE_TYPE = 'bpm_oa_leave_type', + BPM_MODEL_FORM_TYPE = 'bpm_model_form_type', + BPM_TASK_CANDIDATE_STRATEGY = 'bpm_task_candidate_strategy', BPM_PROCESS_INSTANCE_STATUS = 'bpm_process_instance_status', + BPM_TASK_STATUS = 'bpm_task_status', + BPM_OA_LEAVE_TYPE = 'bpm_oa_leave_type', BPM_PROCESS_LISTENER_TYPE = 'bpm_process_listener_type', BPM_PROCESS_LISTENER_VALUE_TYPE = 'bpm_process_listener_value_type', - BPM_TASK_CANDIDATE_STRATEGY = 'bpm_task_candidate_strategy', - BPM_TASK_STATUS = 'bpm_task_status', - BROKERAGE_BANK_NAME = 'brokerage_bank_name', // 佣金提现银行 - BROKERAGE_BIND_MODE = 'brokerage_bind_mode', // 分销关系绑定模式 + // ========== PAY 模块 ========== + PAY_CHANNEL_CODE = 'pay_channel_code', // 支付渠道编码类型 + PAY_ORDER_STATUS = 'pay_order_status', // 商户支付订单状态 + PAY_REFUND_STATUS = 'pay_refund_status', // 退款订单状态 + PAY_NOTIFY_STATUS = 'pay_notify_status', // 商户支付回调状态 + PAY_NOTIFY_TYPE = 'pay_notify_type', // 商户支付回调状态 + PAY_TRANSFER_STATUS = 'pay_transfer_status', // 转账订单状态 + PAY_TRANSFER_TYPE = 'pay_transfer_type', // 转账订单状态 + + // ========== MP 模块 ========== + MP_AUTO_REPLY_REQUEST_MATCH = 'mp_auto_reply_request_match', // 自动回复请求匹配类型 + MP_MESSAGE_TYPE = 'mp_message_type', // 消息类型 + + // ========== Member 会员模块 ========== + MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型 + MEMBER_EXPERIENCE_BIZ_TYPE = 'member_experience_biz_type', // 会员经验业务类型 + + // ========== MALL - 商品模块 ========== + PRODUCT_SPU_STATUS = 'product_spu_status', //商品状态 + + // ========== MALL - 交易模块 ========== + EXPRESS_CHARGE_MODE = 'trade_delivery_express_charge_mode', //快递的计费方式 + TRADE_AFTER_SALE_STATUS = 'trade_after_sale_status', // 售后 - 状态 + TRADE_AFTER_SALE_WAY = 'trade_after_sale_way', // 售后 - 方式 + TRADE_AFTER_SALE_TYPE = 'trade_after_sale_type', // 售后 - 类型 + TRADE_ORDER_TYPE = 'trade_order_type', // 订单 - 类型 + TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态 + TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态 + TRADE_DELIVERY_TYPE = 'trade_delivery_type', // 配送方式 BROKERAGE_ENABLED_CONDITION = 'brokerage_enabled_condition', // 分佣模式 + BROKERAGE_BIND_MODE = 'brokerage_bind_mode', // 分销关系绑定模式 + BROKERAGE_BANK_NAME = 'brokerage_bank_name', // 佣金提现银行 + BROKERAGE_WITHDRAW_TYPE = 'brokerage_withdraw_type', // 佣金提现类型 BROKERAGE_RECORD_BIZ_TYPE = 'brokerage_record_biz_type', // 佣金业务类型 BROKERAGE_RECORD_STATUS = 'brokerage_record_status', // 佣金状态 BROKERAGE_WITHDRAW_STATUS = 'brokerage_withdraw_status', // 佣金提现状态 - BROKERAGE_WITHDRAW_TYPE = 'brokerage_withdraw_type', // 佣金提现类型 - COMMON_STATUS = 'common_status', + + // ========== MALL - 营销模块 ========== + PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型 + PROMOTION_PRODUCT_SCOPE = 'promotion_product_scope', // 营销的商品范围 + PROMOTION_COUPON_TEMPLATE_VALIDITY_TYPE = 'promotion_coupon_template_validity_type', // 优惠劵模板的有限期类型 + PROMOTION_COUPON_STATUS = 'promotion_coupon_status', // 优惠劵的状态 + PROMOTION_COUPON_TAKE_TYPE = 'promotion_coupon_take_type', // 优惠劵的领取方式 + PROMOTION_CONDITION_TYPE = 'promotion_condition_type', // 营销的条件类型枚举 + PROMOTION_BARGAIN_RECORD_STATUS = 'promotion_bargain_record_status', // 砍价记录的状态 + PROMOTION_COMBINATION_RECORD_STATUS = 'promotion_combination_record_status', // 拼团记录的状态 + PROMOTION_BANNER_POSITION = 'promotion_banner_position', // banner 定位 + // ========== CRM - 客户管理模块 ========== CRM_AUDIT_STATUS = 'crm_audit_status', // CRM 审批状态 CRM_BIZ_TYPE = 'crm_biz_type', // CRM 业务类型 CRM_BUSINESS_END_STATUS_TYPE = 'crm_business_end_status_type', // CRM 商机结束状态类型 + CRM_RECEIVABLE_RETURN_TYPE = 'crm_receivable_return_type', // CRM 回款的还款方式 CRM_CUSTOMER_INDUSTRY = 'crm_customer_industry', // CRM 客户所属行业 - CRM_CUSTOMER_LEVEL = 'crm_customer_level', // CRM 客户级别 CRM_CUSTOMER_SOURCE = 'crm_customer_source', // CRM 客户来源 - CRM_FOLLOW_UP_TYPE = 'crm_follow_up_type', // CRM 跟进方式 - CRM_PERMISSION_LEVEL = 'crm_permission_level', // CRM 数据权限的级别 CRM_PRODUCT_STATUS = 'crm_product_status', // CRM 商品状态 + CRM_PERMISSION_LEVEL = 'crm_permission_level', // CRM 数据权限的级别 CRM_PRODUCT_UNIT = 'crm_product_unit', // CRM 产品单位 - CRM_RECEIVABLE_RETURN_TYPE = 'crm_receivable_return_type', // CRM 回款的还款方式 - DATE_INTERVAL = 'date_interval', // 数据间隔 + CRM_FOLLOW_UP_TYPE = 'crm_follow_up_type', // CRM 跟进方式 // ========== ERP - 企业资源计划模块 ========== ERP_AUDIT_STATUS = 'erp_audit_status', // ERP 审批状态 ERP_STOCK_RECORD_BIZ_TYPE = 'erp_stock_record_biz_type', // 库存明细的业务类型 - // ========== MALL - 交易模块 ========== - EXPRESS_CHARGE_MODE = 'trade_delivery_express_charge_mode', // 快递的计费方式 - INFRA_API_ERROR_LOG_PROCESS_STATUS = 'infra_api_error_log_process_status', - // ========== INFRA 模块 ========== - INFRA_BOOLEAN_STRING = 'infra_boolean_string', - INFRA_CODEGEN_FRONT_TYPE = 'infra_codegen_front_type', - INFRA_CODEGEN_SCENE = 'infra_codegen_scene', - INFRA_CODEGEN_TEMPLATE_TYPE = 'infra_codegen_template_type', - INFRA_CONFIG_TYPE = 'infra_config_type', + // ========== AI - 人工智能模块 ========== + AI_PLATFORM = 'ai_platform', // AI 平台 + AI_MODEL_TYPE = 'ai_model_type', // AI 模型类型 + AI_IMAGE_STATUS = 'ai_image_status', // AI 图片状态 + AI_MUSIC_STATUS = 'ai_music_status', // AI 音乐状态 + AI_GENERATE_MODE = 'ai_generate_mode', // AI 生成模式 + AI_WRITE_TYPE = 'ai_write_type', // AI 写作类型 + AI_WRITE_LENGTH = 'ai_write_length', // AI 写作长度 + AI_WRITE_FORMAT = 'ai_write_format', // AI 写作格式 + AI_WRITE_TONE = 'ai_write_tone', // AI 写作语气 + AI_WRITE_LANGUAGE = 'ai_write_language', // AI 写作语言 - INFRA_FILE_STORAGE = 'infra_file_storage', - INFRA_JOB_LOG_STATUS = 'infra_job_log_status', - - INFRA_JOB_STATUS = 'infra_job_status', - - INFRA_OPERATE_TYPE = 'infra_operate_type', - IOT_DATA_FORMAT = 'iot_data_format', // IOT 数据格式 - IOT_DATA_TYPE = 'iot_data_type', // IOT 数据类型 - IOT_DEVICE_STATUS = 'iot_device_status', // IOT 设备状态 // ========== IOT - 物联网模块 ========== IOT_NET_TYPE = 'iot_net_type', // IOT 联网方式 - IOT_PRODUCT_DEVICE_TYPE = 'iot_product_device_type', // IOT 产品设备类型 - IOT_PRODUCT_FUNCTION_TYPE = 'iot_product_function_type', // IOT 产品功能类型 - IOT_PRODUCT_STATUS = 'iot_product_status', // IOT 产品状态 - IOT_PROTOCOL_TYPE = 'iot_protocol_type', // IOT 接入网关协议 - IOT_RW_TYPE = 'iot_rw_type', // IOT 读写类型 - IOT_UNIT_TYPE = 'iot_unit_type', // IOT 单位类型 IOT_VALIDATE_TYPE = 'iot_validate_type', // IOT 数据校验级别 - MEMBER_EXPERIENCE_BIZ_TYPE = 'member_experience_biz_type', // 会员经验业务类型 - // ========== Member 会员模块 ========== - MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型 - // ========== MP 模块 ========== - MP_AUTO_REPLY_REQUEST_MATCH = 'mp_auto_reply_request_match', // 自动回复请求匹配类型 - - MP_MESSAGE_TYPE = 'mp_message_type', // 消息类型 - // ========== PAY 模块 ========== - PAY_CHANNEL_CODE = 'pay_channel_code', // 支付渠道编码类型 - PAY_NOTIFY_STATUS = 'pay_notify_status', // 商户支付回调状态 - PAY_NOTIFY_TYPE = 'pay_notify_type', // 商户支付回调状态 - PAY_ORDER_STATUS = 'pay_order_status', // 商户支付订单状态 - PAY_REFUND_STATUS = 'pay_refund_status', // 退款订单状态 - PAY_TRANSFER_STATUS = 'pay_transfer_status', // 转账订单状态 - PAY_TRANSFER_TYPE = 'pay_transfer_type', // 转账订单状态 - // ========== MALL - 商品模块 ========== - PRODUCT_SPU_STATUS = 'product_spu_status', // 商品状态 - - PROMOTION_BANNER_POSITION = 'promotion_banner_position', // banner 定位 - PROMOTION_BARGAIN_RECORD_STATUS = 'promotion_bargain_record_status', // 砍价记录的状态 - PROMOTION_COMBINATION_RECORD_STATUS = 'promotion_combination_record_status', // 拼团记录的状态 - PROMOTION_CONDITION_TYPE = 'promotion_condition_type', // 营销的条件类型枚举 - PROMOTION_COUPON_STATUS = 'promotion_coupon_status', // 优惠劵的状态 - PROMOTION_COUPON_TAKE_TYPE = 'promotion_coupon_take_type', // 优惠劵的领取方式 - PROMOTION_COUPON_TEMPLATE_VALIDITY_TYPE = 'promotion_coupon_template_validity_type', // 优惠劵模板的有限期类型 - // ========== MALL - 营销模块 ========== - PROMOTION_DISCOUNT_TYPE = 'promotion_discount_type', // 优惠类型 - PROMOTION_PRODUCT_SCOPE = 'promotion_product_scope', // 营销的商品范围 - SYSTEM_DATA_SCOPE = 'system_data_scope', - SYSTEM_LOGIN_RESULT = 'system_login_result', - - SYSTEM_LOGIN_TYPE = 'system_login_type', - SYSTEM_MAIL_SEND_STATUS = 'system_mail_send_status', - - SYSTEM_MENU_TYPE = 'system_menu_type', - SYSTEM_NOTICE_TYPE = 'system_notice_type', - SYSTEM_NOTIFY_TEMPLATE_TYPE = 'system_notify_template_type', - SYSTEM_OAUTH2_GRANT_TYPE = 'system_oauth2_grant_type', - SYSTEM_ROLE_TYPE = 'system_role_type', - SYSTEM_SMS_CHANNEL_CODE = 'system_sms_channel_code', - SYSTEM_SMS_RECEIVE_STATUS = 'system_sms_receive_status', - SYSTEM_SMS_SEND_STATUS = 'system_sms_send_status', - SYSTEM_SMS_TEMPLATE_TYPE = 'system_sms_template_type', - - SYSTEM_SOCIAL_TYPE = 'system_social_type', - // ========== SYSTEM 模块 ========== - SYSTEM_USER_SEX = 'system_user_sex', - TERMINAL = 'terminal', // 终端 - TRADE_AFTER_SALE_STATUS = 'trade_after_sale_status', // 售后 - 状态 - TRADE_AFTER_SALE_TYPE = 'trade_after_sale_type', // 售后 - 类型 - TRADE_AFTER_SALE_WAY = 'trade_after_sale_way', // 售后 - 方式 - TRADE_DELIVERY_TYPE = 'trade_delivery_type', // 配送方式 - TRADE_ORDER_ITEM_AFTER_SALE_STATUS = 'trade_order_item_after_sale_status', // 订单项 - 售后状态 - TRADE_ORDER_STATUS = 'trade_order_status', // 订单 - 状态 - TRADE_ORDER_TYPE = 'trade_order_type', // 订单 - 类型 - USER_TYPE = 'user_type', + IOT_PRODUCT_STATUS = 'iot_product_status', // IOT 产品状态 + IOT_PRODUCT_DEVICE_TYPE = 'iot_product_device_type', // IOT 产品设备类型 + IOT_DATA_FORMAT = 'iot_data_format', // IOT 数据格式 + IOT_PROTOCOL_TYPE = 'iot_protocol_type', // IOT 接入网关协议 + IOT_DEVICE_STATUS = 'iot_device_status', // IOT 设备状态 + IOT_PRODUCT_FUNCTION_TYPE = 'iot_product_function_type', // IOT 产品功能类型 + IOT_DATA_TYPE = 'iot_data_type', // IOT 数据类型 + IOT_UNIT_TYPE = 'iot_unit_type', // IOT 单位类型 + IOT_RW_TYPE = 'iot_rw_type', // IOT 读写类型 } -export { DICT_TYPE, getDictObj, getDictLabel, getDictOptions }; +export { DICT_TYPE, getDictLabel, getDictObj, getDictOptions }; diff --git a/apps/web-antd/src/views/infra/codegen/components/BasicInfoForm.vue b/apps/web-antd/src/views/infra/codegen/components/BasicInfoForm.vue new file mode 100644 index 000000000..4c315e9bf --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/components/BasicInfoForm.vue @@ -0,0 +1,95 @@ + + diff --git a/apps/web-antd/src/views/infra/codegen/components/ColumInfoForm.vue b/apps/web-antd/src/views/infra/codegen/components/ColumInfoForm.vue new file mode 100644 index 000000000..ff94ef078 --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/components/ColumInfoForm.vue @@ -0,0 +1,150 @@ + + diff --git a/apps/web-antd/src/views/infra/codegen/components/GenerateInfoForm.vue b/apps/web-antd/src/views/infra/codegen/components/GenerateInfoForm.vue new file mode 100644 index 000000000..64a83674c --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/components/GenerateInfoForm.vue @@ -0,0 +1,355 @@ + + + + + diff --git a/apps/web-antd/src/views/infra/codegen/data.ts b/apps/web-antd/src/views/infra/codegen/data.ts new file mode 100644 index 000000000..ed02c4720 --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/data.ts @@ -0,0 +1,178 @@ +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 { getDataSourceConfigList } from '#/api/infra/data-source-config'; +import { getRangePickerDefaultProps } from '#/utils/date'; + +import { useAccess } from '@vben/access'; + +const { hasAccessByCodes } = useAccess(); + +/** 导入数据库表的表单 */ +export function useImportTableFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'dataSourceConfigId', + label: '数据源', + component: 'ApiSelect', + componentProps: { + api: async () => await getDataSourceConfigList(), + labelField: 'name', + valueField: 'id', + placeholder: '请选择数据源', + }, + rules: 'required', + }, + { + fieldName: 'name', + label: '表名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入表名称', + }, + }, + { + fieldName: 'comment', + label: '表描述', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入表描述', + }, + }, + ]; +} + +/** 预览代码模态框 */ +export function usePreviewFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'content', + component: 'Textarea', + componentProps: { + readonly: true, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'tableName', + label: '表名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入表名称', + }, + }, + { + fieldName: 'tableComment', + label: '表描述', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入表描述', + }, + }, + { + fieldName: 'createTime', + label: '创建时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns( + onActionClick: OnActionClickFn, + dataSourceConfigList: InfraDataSourceConfigApi.InfraDataSourceConfig[], +): VxeTableGridOptions['columns'] { + return [ + { + field: 'dataSourceConfigId', + title: '数据源', + minWidth: 120, + formatter: ({ cellValue }) => { + const config = dataSourceConfigList.find((item) => item.id === cellValue); + return config ? config.name : ''; + }, + }, + { + field: 'tableName', + title: '表名称', + minWidth: 200, + }, + { + field: 'tableComment', + title: '表描述', + minWidth: 200, + }, + { + field: 'className', + title: '实体', + minWidth: 200, + }, + { + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + field: 'updateTime', + title: '更新时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + field: 'operation', + title: '操作', + width: 300, + fixed: 'right', + align: 'center', + cellRender: { + attrs: { + nameField: 'tableName', + nameTitle: '代码生成', + onClick: onActionClick, + }, + name: 'CellOperation', + options: [ + { + code: 'preview', + text: '预览', + show: hasAccessByCodes(['infra:codegen:preview']), + }, + { + code: 'edit', + show: hasAccessByCodes(['infra:codegen:update']), + }, + { + code: 'delete', + show: hasAccessByCodes(['infra:codegen:delete']), + }, + { + code: 'sync', + text: '同步', + show: hasAccessByCodes(['infra:codegen:update']), + }, + { + code: 'generate', + text: '生成代码', + show: hasAccessByCodes(['infra:codegen:download']), + }, + ], + }, + }, + ]; +} diff --git a/apps/web-antd/src/views/infra/codegen/edit.vue b/apps/web-antd/src/views/infra/codegen/edit.vue new file mode 100644 index 000000000..2386eb6aa --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/edit.vue @@ -0,0 +1,104 @@ + + + diff --git a/apps/web-antd/src/views/infra/codegen/index.vue b/apps/web-antd/src/views/infra/codegen/index.vue new file mode 100644 index 000000000..917618f50 --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/index.vue @@ -0,0 +1,204 @@ + + diff --git a/apps/web-antd/src/views/infra/codegen/modules/import-table.vue b/apps/web-antd/src/views/infra/codegen/modules/import-table.vue new file mode 100644 index 000000000..a8075b17f --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/modules/import-table.vue @@ -0,0 +1,118 @@ + + + diff --git a/apps/web-antd/src/views/infra/codegen/modules/preview-code.vue b/apps/web-antd/src/views/infra/codegen/modules/preview-code.vue new file mode 100644 index 000000000..ff3b1df4d --- /dev/null +++ b/apps/web-antd/src/views/infra/codegen/modules/preview-code.vue @@ -0,0 +1,222 @@ + + + + +