refactor: 按 codereview 意见修改

pull/79/head
dhb52 2025-04-23 22:37:33 +08:00
parent 1fb5a9e31d
commit 10514ec1b8
22 changed files with 118 additions and 117 deletions

View File

@ -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:*",

View File

@ -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';

View File

@ -1,3 +0,0 @@
export { useApiSelect } from './src/components/useApiSelect';
export { useFormCreateDesigner } from './src/useFormCreateDesigner';

View File

@ -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';

View File

@ -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);
});
}
};

View File

@ -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',
}); });

View File

@ -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';

View File

@ -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) => {
// 插入组件规则 // 插入组件规则

View File

@ -0,0 +1,3 @@
export { useApiSelect } from './components/use-api-select';
export { useFormCreateDesigner } from './helpers';

View File

@ -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';

View File

@ -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,
})) ?? []; })) ?? [];

View File

@ -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 = '富文本';

View File

@ -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

View File

@ -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 = '文件上传';

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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';

View File

@ -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';

View File

@ -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: