refactor: 按 codereview 意见修改
parent
1fb5a9e31d
commit
10514ec1b8
|
@ -29,7 +29,6 @@
|
||||||
"@form-create/ant-design-vue": "catalog:",
|
"@form-create/ant-design-vue": "catalog:",
|
||||||
"@form-create/antd-designer": "catalog:",
|
"@form-create/antd-designer": "catalog:",
|
||||||
"@tinymce/tinymce-vue": "catalog:",
|
"@tinymce/tinymce-vue": "catalog:",
|
||||||
"@types/crypto-js": "catalog:",
|
|
||||||
"@types/lodash.clonedeep": "catalog:",
|
"@types/lodash.clonedeep": "catalog:",
|
||||||
"@vben/access": "workspace:*",
|
"@vben/access": "workspace:*",
|
||||||
"@vben/common-ui": "workspace:*",
|
"@vben/common-ui": "workspace:*",
|
||||||
|
|
|
@ -11,7 +11,7 @@ import '@vben/styles/antd';
|
||||||
import { useTitle } from '@vueuse/core';
|
import { useTitle } from '@vueuse/core';
|
||||||
|
|
||||||
import { $t, setupI18n } from '#/locales';
|
import { $t, setupI18n } from '#/locales';
|
||||||
import { setupFormCreate } from '#/plugins/formCreate';
|
import { setupFormCreate } from '#/plugins/form-create';
|
||||||
|
|
||||||
import { initComponentAdapter } from './adapter/component';
|
import { initComponentAdapter } from './adapter/component';
|
||||||
import App from './app.vue';
|
import App from './app.vue';
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
export { useApiSelect } from './src/components/useApiSelect';
|
|
||||||
|
|
||||||
export { useFormCreateDesigner } from './src/useFormCreateDesigner';
|
|
|
@ -1,6 +0,0 @@
|
||||||
export { useDictSelectRule } from './useDictSelectRule';
|
|
||||||
export { useEditorRule } from './useEditorRule';
|
|
||||||
export { useSelectRule } from './useSelectRule';
|
|
||||||
export { useUploadFileRule } from './useUploadFileRule';
|
|
||||||
export { useUploadImgRule } from './useUploadImgRule';
|
|
||||||
export { useUploadImgsRule } from './useUploadImgsRule';
|
|
|
@ -1,65 +0,0 @@
|
||||||
export function makeRequiredRule() {
|
|
||||||
return {
|
|
||||||
type: 'Required',
|
|
||||||
field: 'formCreate$required',
|
|
||||||
title: '是否必填',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export const localeProps = (
|
|
||||||
t: (msg: string) => any,
|
|
||||||
prefix: string,
|
|
||||||
rules: any[],
|
|
||||||
) => {
|
|
||||||
return rules.map((rule: { field: string; title: any }) => {
|
|
||||||
if (rule.field === 'formCreate$required') {
|
|
||||||
rule.title = t('props.required') || rule.title;
|
|
||||||
} else if (rule.field && rule.field !== '_optionType') {
|
|
||||||
rule.title = t(`components.${prefix}.${rule.field}`) || rule.title;
|
|
||||||
}
|
|
||||||
return rule;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 解析表单组件的 field, title 等字段(递归,如果组件包含子组件)
|
|
||||||
*
|
|
||||||
* @param rule 组件的生成规则 https://www.form-create.com/v3/guide/rule
|
|
||||||
* @param fields 解析后表单组件字段
|
|
||||||
* @param parentTitle 如果是子表单,子表单的标题,默认为空
|
|
||||||
*/
|
|
||||||
export const parseFormFields = (
|
|
||||||
rule: Record<string, any>,
|
|
||||||
fields: Array<Record<string, any>> = [],
|
|
||||||
parentTitle: string = '',
|
|
||||||
) => {
|
|
||||||
const { type, field, $required, title: tempTitle, children } = rule;
|
|
||||||
if (field && tempTitle) {
|
|
||||||
let title = tempTitle;
|
|
||||||
if (parentTitle) {
|
|
||||||
title = `${parentTitle}.${tempTitle}`;
|
|
||||||
}
|
|
||||||
let required = false;
|
|
||||||
if ($required) {
|
|
||||||
required = true;
|
|
||||||
}
|
|
||||||
fields.push({
|
|
||||||
field,
|
|
||||||
title,
|
|
||||||
type,
|
|
||||||
required,
|
|
||||||
});
|
|
||||||
// TODO 子表单 需要处理子表单字段
|
|
||||||
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
|
|
||||||
// // 解析子表单的字段
|
|
||||||
// rule.props.rule.forEach((item) => {
|
|
||||||
// parseFields(item, fieldsPermission, title)
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
if (children && Array.isArray(children)) {
|
|
||||||
children.forEach((rule) => {
|
|
||||||
parseFormFields(rule, fields);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,5 +1,7 @@
|
||||||
<!-- 数据字典 Select 选择器 -->
|
<!-- 数据字典 Select 选择器 -->
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import type { DictSelectProps } from '../typing';
|
||||||
|
|
||||||
import { computed, useAttrs } from 'vue';
|
import { computed, useAttrs } from 'vue';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
@ -17,18 +19,9 @@ import {
|
||||||
getStrDictOptions,
|
getStrDictOptions,
|
||||||
} from '#/utils/dict';
|
} from '#/utils/dict';
|
||||||
|
|
||||||
// 接受父组件参数
|
|
||||||
interface Props {
|
|
||||||
dictType: string; // 字典类型
|
|
||||||
valueType?: 'bool' | 'int' | 'str'; // 字典值类型
|
|
||||||
selectType?: 'checkbox' | 'radio' | 'select'; // 选择器类型,下拉框 select、多选框 checkbox、单选框 radio
|
|
||||||
// eslint-disable-next-line vue/require-default-prop
|
|
||||||
formCreateInject?: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
defineOptions({ name: 'DictSelect' });
|
defineOptions({ name: 'DictSelect' });
|
||||||
|
|
||||||
const props = withDefaults(defineProps<Props>(), {
|
const props = withDefaults(defineProps<DictSelectProps>(), {
|
||||||
valueType: 'str',
|
valueType: 'str',
|
||||||
selectType: 'select',
|
selectType: 'select',
|
||||||
});
|
});
|
|
@ -1,4 +1,4 @@
|
||||||
import type { ApiSelectProps } from '#/components/FormCreate/src/type';
|
import type { ApiSelectProps } from '#/components/form-create/typing';
|
||||||
|
|
||||||
import { defineComponent, onMounted, ref, useAttrs } from 'vue';
|
import { defineComponent, onMounted, ref, useAttrs } from 'vue';
|
||||||
|
|
|
@ -1,19 +1,85 @@
|
||||||
import type { Ref } from 'vue';
|
import type { Ref } from 'vue';
|
||||||
|
|
||||||
import type { Menu } from '#/components/FormCreate/src/type';
|
import type { Menu } from '#/components/form-create/typing';
|
||||||
|
|
||||||
import { nextTick, onMounted } from 'vue';
|
import { nextTick, onMounted } from 'vue';
|
||||||
|
|
||||||
import { apiSelectRule } from '#/components/FormCreate/src/config/selectRule';
|
import { apiSelectRule } from '#/components/form-create/rules/data';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
useDictSelectRule,
|
useDictSelectRule,
|
||||||
useEditorRule,
|
useEditorRule,
|
||||||
useSelectRule,
|
useSelectRule,
|
||||||
useUploadFileRule,
|
useUploadFileRule,
|
||||||
useUploadImgRule,
|
useUploadImageRule,
|
||||||
useUploadImgsRule,
|
useUploadImagesRule,
|
||||||
} from './config';
|
} from './rules';
|
||||||
|
|
||||||
|
export function makeRequiredRule() {
|
||||||
|
return {
|
||||||
|
type: 'Required',
|
||||||
|
field: 'formCreate$required',
|
||||||
|
title: '是否必填',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const localeProps = (
|
||||||
|
t: (msg: string) => any,
|
||||||
|
prefix: string,
|
||||||
|
rules: any[],
|
||||||
|
) => {
|
||||||
|
return rules.map((rule: { field: string; title: any }) => {
|
||||||
|
if (rule.field === 'formCreate$required') {
|
||||||
|
rule.title = t('props.required') || rule.title;
|
||||||
|
} else if (rule.field && rule.field !== '_optionType') {
|
||||||
|
rule.title = t(`components.${prefix}.${rule.field}`) || rule.title;
|
||||||
|
}
|
||||||
|
return rule;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析表单组件的 field, title 等字段(递归,如果组件包含子组件)
|
||||||
|
*
|
||||||
|
* @param rule 组件的生成规则 https://www.form-create.com/v3/guide/rule
|
||||||
|
* @param fields 解析后表单组件字段
|
||||||
|
* @param parentTitle 如果是子表单,子表单的标题,默认为空
|
||||||
|
*/
|
||||||
|
export const parseFormFields = (
|
||||||
|
rule: Record<string, any>,
|
||||||
|
fields: Array<Record<string, any>> = [],
|
||||||
|
parentTitle: string = '',
|
||||||
|
) => {
|
||||||
|
const { type, field, $required, title: tempTitle, children } = rule;
|
||||||
|
if (field && tempTitle) {
|
||||||
|
let title = tempTitle;
|
||||||
|
if (parentTitle) {
|
||||||
|
title = `${parentTitle}.${tempTitle}`;
|
||||||
|
}
|
||||||
|
let required = false;
|
||||||
|
if ($required) {
|
||||||
|
required = true;
|
||||||
|
}
|
||||||
|
fields.push({
|
||||||
|
field,
|
||||||
|
title,
|
||||||
|
type,
|
||||||
|
required,
|
||||||
|
});
|
||||||
|
// TODO 子表单 需要处理子表单字段
|
||||||
|
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
|
||||||
|
// // 解析子表单的字段
|
||||||
|
// rule.props.rule.forEach((item) => {
|
||||||
|
// parseFields(item, fieldsPermission, title)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
if (children && Array.isArray(children)) {
|
||||||
|
children.forEach((rule) => {
|
||||||
|
parseFormFields(rule, fields);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 表单设计器增强 hook
|
* 表单设计器增强 hook
|
||||||
|
@ -29,8 +95,8 @@ import {
|
||||||
export const useFormCreateDesigner = async (designer: Ref) => {
|
export const useFormCreateDesigner = async (designer: Ref) => {
|
||||||
const editorRule = useEditorRule();
|
const editorRule = useEditorRule();
|
||||||
const uploadFileRule = useUploadFileRule();
|
const uploadFileRule = useUploadFileRule();
|
||||||
const uploadImgRule = useUploadImgRule();
|
const uploadImageRule = useUploadImageRule();
|
||||||
const uploadImgsRule = useUploadImgsRule();
|
const uploadImagesRule = useUploadImagesRule();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建表单组件
|
* 构建表单组件
|
||||||
|
@ -43,8 +109,8 @@ export const useFormCreateDesigner = async (designer: Ref) => {
|
||||||
const components = [
|
const components = [
|
||||||
editorRule,
|
editorRule,
|
||||||
uploadFileRule,
|
uploadFileRule,
|
||||||
uploadImgRule,
|
uploadImageRule,
|
||||||
uploadImgsRule,
|
uploadImagesRule,
|
||||||
];
|
];
|
||||||
components.forEach((component) => {
|
components.forEach((component) => {
|
||||||
// 插入组件规则
|
// 插入组件规则
|
|
@ -0,0 +1,3 @@
|
||||||
|
export { useApiSelect } from './components/use-api-select';
|
||||||
|
|
||||||
|
export { useFormCreateDesigner } from './helpers';
|
|
@ -0,0 +1,6 @@
|
||||||
|
export { useDictSelectRule } from './use-dict-select';
|
||||||
|
export { useEditorRule } from './use-editor-rule';
|
||||||
|
export { useSelectRule } from './use-select-rule';
|
||||||
|
export { useUploadFileRule } from './use-upload-file-rule';
|
||||||
|
export { useUploadImageRule } from './use-upload-image-rule';
|
||||||
|
export { useUploadImagesRule } from './use-upload-images-rule';
|
|
@ -5,11 +5,11 @@ import { buildUUID } from '@vben/utils';
|
||||||
import cloneDeep from 'lodash.clonedeep';
|
import cloneDeep from 'lodash.clonedeep';
|
||||||
|
|
||||||
import * as DictDataApi from '#/api/system/dict/type';
|
import * as DictDataApi from '#/api/system/dict/type';
|
||||||
import { selectRule } from '#/components/FormCreate/src/config/selectRule';
|
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/FormCreate/src/utils';
|
} from '#/components/form-create/helpers';
|
||||||
|
import { selectRule } from '#/components/form-create/rules/data';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典选择器规则,如果规则使用到动态数据则需要单独配置不能使用 useSelectRule
|
* 字典选择器规则,如果规则使用到动态数据则需要单独配置不能使用 useSelectRule
|
||||||
|
@ -25,7 +25,7 @@ export const useDictSelectRule = () => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dictOptions.value =
|
dictOptions.value =
|
||||||
data?.map((item: DictDataApi.SystemDictTypeApi.SystemDictType) => ({
|
data?.map((item: DictDataApi.SystemDictTypeApi.DictType) => ({
|
||||||
label: item.name,
|
label: item.name,
|
||||||
value: item.type,
|
value: item.type,
|
||||||
})) ?? [];
|
})) ?? [];
|
|
@ -3,7 +3,7 @@ import { buildUUID } from '@vben/utils';
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/FormCreate/src/utils';
|
} from '#/components/form-create/helpers';
|
||||||
|
|
||||||
export const useEditorRule = () => {
|
export const useEditorRule = () => {
|
||||||
const label = '富文本';
|
const label = '富文本';
|
|
@ -1,14 +1,14 @@
|
||||||
import type { SelectRuleOption } from '#/components/FormCreate/src/type';
|
import type { SelectRuleOption } from '#/components/form-create/typing';
|
||||||
|
|
||||||
import { buildUUID } from '@vben/utils';
|
import { buildUUID } from '@vben/utils';
|
||||||
|
|
||||||
import cloneDeep from 'lodash.clonedeep';
|
import cloneDeep from 'lodash.clonedeep';
|
||||||
|
|
||||||
import { selectRule } from '#/components/FormCreate/src/config/selectRule';
|
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/FormCreate/src/utils';
|
} from '#/components/form-create/helpers';
|
||||||
|
import { selectRule } from '#/components/form-create/rules/data';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用选择器规则 hook
|
* 通用选择器规则 hook
|
|
@ -3,7 +3,7 @@ import { buildUUID } from '@vben/utils';
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/FormCreate/src/utils';
|
} from '#/components/form-create/helpers';
|
||||||
|
|
||||||
export const useUploadFileRule = () => {
|
export const useUploadFileRule = () => {
|
||||||
const label = '文件上传';
|
const label = '文件上传';
|
|
@ -3,9 +3,9 @@ import { buildUUID } from '@vben/utils';
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/FormCreate/src/utils';
|
} from '#/components/form-create/helpers';
|
||||||
|
|
||||||
export const useUploadImgRule = () => {
|
export const useUploadImageRule = () => {
|
||||||
const label = '单图上传';
|
const label = '单图上传';
|
||||||
const name = 'ImageUpload';
|
const name = 'ImageUpload';
|
||||||
return {
|
return {
|
|
@ -3,9 +3,9 @@ import { buildUUID } from '@vben/utils';
|
||||||
import {
|
import {
|
||||||
localeProps,
|
localeProps,
|
||||||
makeRequiredRule,
|
makeRequiredRule,
|
||||||
} from '#/components/FormCreate/src/utils';
|
} from '#/components/form-create/helpers';
|
||||||
|
|
||||||
export const useUploadImgsRule = () => {
|
export const useUploadImagesRule = () => {
|
||||||
const label = '多图上传';
|
const label = '多图上传';
|
||||||
const name = 'ImagesUpload';
|
const name = 'ImagesUpload';
|
||||||
return {
|
return {
|
|
@ -1,5 +1,12 @@
|
||||||
import type { Rule } from '@form-create/ant-design-vue'; // 左侧拖拽按钮
|
import type { Rule } from '@form-create/ant-design-vue';
|
||||||
// 左侧拖拽按钮
|
|
||||||
|
// 数据字典 Select 选择器组件 Props 类型
|
||||||
|
export interface DictSelectProps {
|
||||||
|
dictType: string; // 字典类型
|
||||||
|
valueType?: 'bool' | 'int' | 'str'; // 字典值类型
|
||||||
|
selectType?: 'checkbox' | 'radio' | 'select'; // 选择器类型,下拉框 select、多选框 checkbox、单选框 radio
|
||||||
|
formCreateInject?: any;
|
||||||
|
}
|
||||||
|
|
||||||
// 左侧拖拽按钮
|
// 左侧拖拽按钮
|
||||||
export interface MenuItem {
|
export interface MenuItem {
|
|
@ -5,9 +5,9 @@ import FcDesigner from '@form-create/antd-designer';
|
||||||
import Antd from 'ant-design-vue';
|
import Antd from 'ant-design-vue';
|
||||||
|
|
||||||
// ======================= 自定义组件 =======================
|
// ======================= 自定义组件 =======================
|
||||||
import { useApiSelect } from '#/components/FormCreate';
|
import { useApiSelect } from '#/components/form-create';
|
||||||
import DictSelect from '#/components/FormCreate/src/components/DictSelect.vue';
|
import DictSelect from '#/components/form-create/components/dict-select.vue';
|
||||||
import { useImagesUpload } from '#/components/FormCreate/src/components/useImagesUpload';
|
import { useImagesUpload } from '#/components/form-create/components/use-images-upload';
|
||||||
import { Tinymce } from '#/components/tinymce';
|
import { Tinymce } from '#/components/tinymce';
|
||||||
import { FileUpload, ImageUpload } from '#/components/upload';
|
import { FileUpload, ImageUpload } from '#/components/upload';
|
||||||
|
|
|
@ -13,7 +13,7 @@ import hljs from 'highlight.js';
|
||||||
import xml from 'highlight.js/lib/languages/java';
|
import xml from 'highlight.js/lib/languages/java';
|
||||||
import json from 'highlight.js/lib/languages/json';
|
import json from 'highlight.js/lib/languages/json';
|
||||||
|
|
||||||
import { useFormCreateDesigner } from '#/components/FormCreate';
|
import { useFormCreateDesigner } from '#/components/form-create';
|
||||||
import { $t } from '#/locales';
|
import { $t } from '#/locales';
|
||||||
|
|
||||||
import 'highlight.js/styles/github.css';
|
import 'highlight.js/styles/github.css';
|
||||||
|
|
|
@ -683,9 +683,6 @@ importers:
|
||||||
'@tinymce/tinymce-vue':
|
'@tinymce/tinymce-vue':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 6.1.0(vue@3.5.13(typescript@5.8.3))
|
version: 6.1.0(vue@3.5.13(typescript@5.8.3))
|
||||||
'@types/crypto-js':
|
|
||||||
specifier: 'catalog:'
|
|
||||||
version: 4.2.2
|
|
||||||
'@types/lodash.clonedeep':
|
'@types/lodash.clonedeep':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 4.5.9
|
version: 4.5.9
|
||||||
|
@ -764,6 +761,10 @@ importers:
|
||||||
vue-router:
|
vue-router:
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 4.5.0(vue@3.5.13(typescript@5.8.3))
|
version: 4.5.0(vue@3.5.13(typescript@5.8.3))
|
||||||
|
devDependencies:
|
||||||
|
'@types/crypto-js':
|
||||||
|
specifier: 'catalog:'
|
||||||
|
version: 4.2.2
|
||||||
|
|
||||||
apps/web-ele:
|
apps/web-ele:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
Loading…
Reference in New Issue