From c3524ab79c8de8f95113e39ee1cf322a815a002f Mon Sep 17 00:00:00 2001 From: dap <15891557205@163.com> Date: Tue, 24 Sep 2024 10:18:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/tool/gen/edit-gen.vue | 46 +++- .../tool/gen/edit-steps/basic-setting.vue | 133 +++++++++++ .../src/views/tool/gen/edit-steps/basic.tsx | 214 ++++++++++++++++++ .../views/tool/gen/edit-steps/gen-config.vue | 65 ++++++ .../views/tool/gen/edit-steps/gen-data.tsx | 1 + .../views/tool/gen/edit-steps/gen-success.vue | 25 ++ .../src/views/tool/gen/edit-steps/index.ts | 3 + apps/web-antd/src/views/tool/gen/mitt.ts | 15 ++ packages/utils/src/helpers/index.ts | 2 + packages/utils/src/helpers/mitt.ts | 135 +++++++++++ packages/utils/src/helpers/safe.ts | 10 + 11 files changed, 644 insertions(+), 5 deletions(-) create mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/basic-setting.vue create mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/basic.tsx create mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/gen-config.vue create mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/gen-data.tsx create mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/gen-success.vue create mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/index.ts create mode 100644 apps/web-antd/src/views/tool/gen/mitt.ts create mode 100644 packages/utils/src/helpers/mitt.ts create mode 100644 packages/utils/src/helpers/safe.ts diff --git a/apps/web-antd/src/views/tool/gen/edit-gen.vue b/apps/web-antd/src/views/tool/gen/edit-gen.vue index 704113f7..ee86b700 100644 --- a/apps/web-antd/src/views/tool/gen/edit-gen.vue +++ b/apps/web-antd/src/views/tool/gen/edit-gen.vue @@ -1,26 +1,62 @@ diff --git a/apps/web-antd/src/views/tool/gen/edit-steps/basic-setting.vue b/apps/web-antd/src/views/tool/gen/edit-steps/basic-setting.vue new file mode 100644 index 00000000..4414f75e --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/edit-steps/basic-setting.vue @@ -0,0 +1,133 @@ + + + diff --git a/apps/web-antd/src/views/tool/gen/edit-steps/basic.tsx b/apps/web-antd/src/views/tool/gen/edit-steps/basic.tsx new file mode 100644 index 00000000..77153b94 --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/edit-steps/basic.tsx @@ -0,0 +1,214 @@ +import { getPopupContainer } from '@vben/utils'; + +import { type FormSchemaGetter, z } from '#/adapter'; + +export const formSchema: FormSchemaGetter = () => [ + { + component: 'Divider', + componentProps: { + orientation: 'left', + }, + fieldName: 'divider1', + formItemClass: 'col-span-2', + label: '基本信息', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'tableName', + label: '表名称', + rules: 'required', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'tableComment', + label: '表描述', + rules: 'required', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'className', + label: '实体类名称', + rules: 'required', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'functionAuthor', + label: '作者', + rules: 'required', + }, + { + component: 'Divider', + componentProps: { + orientation: 'left', + }, + fieldName: 'divider2', + formItemClass: 'col-span-2', + label: '生成信息', + }, + { + component: 'Select', + componentProps: { + allowClear: false, + getPopupContainer, + options: [ + { label: '单表(增删改查)', value: 'crud' }, + { label: '树表(增删改查)', value: 'tree' }, + ], + }, + defaultValue: 'crud', + fieldName: 'tplCategory', + label: '模板类型', + rules: 'selectRequired', + }, + { + component: 'Select', + componentProps: { + getPopupContainer, + placeholder: '请选择', + }, + dependencies: { + show: (values) => values.tplCategory === 'tree', + triggerFields: ['tplCategory'], + }, + fieldName: 'treeCode', + helpMessage: '树节点显示的编码字段名, 如: dept_id (相当于id)', + label: '树编码字段', + rules: 'selectRequired', + }, + { + component: 'Select', + componentProps: { + allowClear: false, + placeholder: '请选择', + }, + dependencies: { + show: (values) => values.tplCategory === 'tree', + triggerFields: ['tplCategory'], + }, + fieldName: 'treeParentCode', + help: '树节点显示的父编码字段名, 如: parent_Id (相当于parentId)', + label: '树父编码字段', + rules: 'selectRequired', + }, + { + component: 'Select', + componentProps: { + allowClear: false, + placeholder: '请选择', + }, + dependencies: { + show: (values) => values.tplCategory === 'tree', + triggerFields: ['tplCategory'], + }, + fieldName: 'treeName', + help: '树节点的显示名称字段名, 如: dept_name (相当于label)', + label: '树名称字段', + rules: 'selectRequired', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'packageName', + help: '生成在哪个java包下, 例如 com.ruoyi.system', + label: '生成包路径', + rules: 'required', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'moduleName', + help: '可理解为子系统名,例如 system', + label: '生成模块名', + rules: 'required', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'businessName', + help: '可理解为功能英文名,例如 user', + label: '生成业务名', + rules: 'required', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'functionName', + help: '用作类描述,例如 用户', + label: '生成功能名', + rules: 'required', + }, + { + component: 'TreeSelect', + componentProps: { + allowClear: false, + getPopupContainer, + placeholder: '请选择', + }, + defaultValue: 0, + fieldName: 'parentMenuId', + label: '上级菜单', + }, + { + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + options: [ + { label: 'zip压缩包', value: '0' }, + { label: '自定义路径', value: '1' }, + ], + optionType: 'button', + }, + defaultValue: '0', + fieldName: 'genType', + help: '默认为zip压缩包下载, 也可以自定义生成路径', + label: '生成代码方式', + }, + { + component: 'Input', + componentProps: { + placeholder: '请输入', + }, + defaultValue: '/', + dependencies: { + show: (model) => model.genType === '1', + triggerFields: ['genType'], + }, + fieldName: 'genPath', + help: '输入绝对路径, 不支持"./"相对路径', + label: '代码生成路径', + rules: z + .string() + .regex(/^(?:[a-z]:)?(?:\/|(?:\\|\/)[^\\/:*?"<>|\r\n]+)*(?:\\|\/)?$/i, { + message: '请输入合法的路径', + }), + }, + { + component: 'Textarea', + componentProps: { + placeholder: '请输入', + }, + fieldName: 'remark', + formItemClass: 'col-span-2 items-baseline', + label: '备注', + }, +]; diff --git a/apps/web-antd/src/views/tool/gen/edit-steps/gen-config.vue b/apps/web-antd/src/views/tool/gen/edit-steps/gen-config.vue new file mode 100644 index 00000000..592a6e60 --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/edit-steps/gen-config.vue @@ -0,0 +1,65 @@ + + + diff --git a/apps/web-antd/src/views/tool/gen/edit-steps/gen-data.tsx b/apps/web-antd/src/views/tool/gen/edit-steps/gen-data.tsx new file mode 100644 index 00000000..cc798ff5 --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/edit-steps/gen-data.tsx @@ -0,0 +1 @@ +export const a = 1; diff --git a/apps/web-antd/src/views/tool/gen/edit-steps/gen-success.vue b/apps/web-antd/src/views/tool/gen/edit-steps/gen-success.vue new file mode 100644 index 00000000..50c72128 --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/edit-steps/gen-success.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/apps/web-antd/src/views/tool/gen/edit-steps/index.ts b/apps/web-antd/src/views/tool/gen/edit-steps/index.ts new file mode 100644 index 00000000..11e77963 --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/edit-steps/index.ts @@ -0,0 +1,3 @@ +export { default as BasicSetting } from './basic-setting.vue'; +export { default as GenConfig } from './gen-config.vue'; +export { default as GenSuccess } from './gen-success.vue'; diff --git a/apps/web-antd/src/views/tool/gen/mitt.ts b/apps/web-antd/src/views/tool/gen/mitt.ts new file mode 100644 index 00000000..5cb4951d --- /dev/null +++ b/apps/web-antd/src/views/tool/gen/mitt.ts @@ -0,0 +1,15 @@ +import { mitt } from '@vben/utils'; + +type Events = { + to: number; +}; + +export const emitter = mitt(); + +/** + * 跳转到指定步骤 + * @param step 步骤 + */ +export function toCurrentStep(step: number) { + emitter.emit('to', step); +} diff --git a/packages/utils/src/helpers/index.ts b/packages/utils/src/helpers/index.ts index 1e7f7f4a..ae8741de 100644 --- a/packages/utils/src/helpers/index.ts +++ b/packages/utils/src/helpers/index.ts @@ -4,7 +4,9 @@ export * from './generate-routes-backend'; export * from './generate-routes-frontend'; export * from './get-popup-container'; export * from './merge-route-modules'; +export * from './mitt'; export * from './reset-routes'; +export * from './safe'; export * from './tree'; export * from './unmount-global-loading'; export * from './uuid'; diff --git a/packages/utils/src/helpers/mitt.ts b/packages/utils/src/helpers/mitt.ts new file mode 100644 index 00000000..52be313e --- /dev/null +++ b/packages/utils/src/helpers/mitt.ts @@ -0,0 +1,135 @@ +/** + * copy to https://github.com/developit/mitt + * Expand clear method + */ +export type EventType = string | symbol; + +// An event handler can take an optional event argument +// and should not return a value +export type Handler = (event: T) => void; +export type WildcardHandler> = ( + type: keyof T, + event: T[keyof T], +) => void; + +// An array of all currently registered event handlers for a type +export type EventHandlerList = Array>; +export type WildCardEventHandlerList> = Array< + WildcardHandler +>; + +// A map of event types and their corresponding event handlers. +export type EventHandlerMap> = Map< + '*' | keyof Events, + EventHandlerList | WildCardEventHandlerList +>; + +export interface Emitter> { + all: EventHandlerMap; + + clear(): void; + emit( + type: undefined extends Events[Key] ? Key : never, + ): void; + + emit(type: Key, event: Events[Key]): void; + off(type: '*', handler: WildcardHandler): void; + + off( + type: Key, + handler?: Handler, + ): void; + on(type: '*', handler: WildcardHandler): void; + on(type: Key, handler: Handler): void; +} + +/** + * Mitt: Tiny (~200b) functional event emitter / pubsub. + * @name mitt + * @returns {Mitt} any + */ +export function mitt>( + all?: EventHandlerMap, +): Emitter { + type GenericEventHandler = + | Handler + | WildcardHandler; + all = all || new Map(); + + return { + /** + * A Map of event names to registered handler functions. + */ + all, + + /** + * Clear all + */ + clear() { + this.all.clear(); + }, + + /** + * Invoke all handlers for the given type. + * If present, `'*'` handlers are invoked after type-matched handlers. + * + * Note: Manually firing '*' handlers is not supported. + * + * @param {string|symbol} type The event type to invoke + * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler + * @memberOf mitt + */ + emit(type: Key, evt?: Events[Key]) { + let handlers = all?.get(type); + if (handlers) { + [...(handlers as EventHandlerList)].forEach( + (handler) => { + handler(evt as Events[Key]); + }, + ); + } + + handlers = all?.get('*'); + if (handlers) { + [...(handlers as WildCardEventHandlerList)].forEach( + (handler) => { + handler(type, evt as Events[Key]); + }, + ); + } + }, + + /** + * Remove an event handler for the given type. + * If `handler` is omitted, all handlers of the given type are removed. + * @param {string|symbol} type Type of event to unregister `handler` from (`'*'` to remove a wildcard handler) + * @param {Function} [handler] Handler function to remove + * @memberOf mitt + */ + off(type: Key, handler?: GenericEventHandler) { + const handlers: Array | undefined = all?.get(type); + if (handlers) { + if (handler) { + handlers.splice(handlers.indexOf(handler) >>> 0, 1); + } else { + all?.set(type, []); + } + } + }, + + /** + * Register an event handler for the given type. + * @param {string|symbol} type Type of event to listen for, or `'*'` for all events + * @param {Function} handler Function to call in response to given event + * @memberOf mitt + */ + on(type: Key, handler: GenericEventHandler) { + const handlers: Array | undefined = all?.get(type); + if (handlers) { + handlers.push(handler); + } else { + all?.set(type, [handler] as EventHandlerList); + } + }, + }; +} diff --git a/packages/utils/src/helpers/safe.ts b/packages/utils/src/helpers/safe.ts new file mode 100644 index 00000000..ad31337c --- /dev/null +++ b/packages/utils/src/helpers/safe.ts @@ -0,0 +1,10 @@ +/** + * 跟后台逻辑一致 + * Number.isSafeInteger形参只能为Number类型 其他的直接返回false + * @param str 数字 + * @returns 安全数内返回number类型 否则返回原字符串 + */ +export function safeParseNumber(str: string): number | string { + const num = Number(str); + return Number.isSafeInteger(num) ? num : str; +}