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 @@
-
- 修改代码生成
- {{ tableId }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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;
+}