From c0f4517b87de5a0172a057fb9da141f758cca1fa Mon Sep 17 00:00:00 2001 From: kailong321200875 <321200875@qq.com> Date: Sat, 26 Aug 2023 10:10:49 +0800 Subject: [PATCH] feat: JsonEditor --- mock/role/index.ts | 9 ++ package.json | 1 + .../Form/src/helper/componentMap.ts | 4 +- src/components/Form/src/types/index.ts | 5 +- src/components/JsonEditor/index.ts | 4 + src/components/JsonEditor/src/JsonEditor.vue | 98 +++++++++++++++++++ src/components/JsonEditor/src/types/index.ts | 23 +++++ src/locales/en.ts | 6 +- src/locales/zh-CN.ts | 7 +- src/router/index.ts | 8 ++ src/views/Components/Editor/JsonEditor.vue | 36 +++++++ src/views/Components/Form/DefaultForm.vue | 14 +++ vite.config.ts | 10 +- 13 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 src/components/JsonEditor/index.ts create mode 100644 src/components/JsonEditor/src/JsonEditor.vue create mode 100644 src/components/JsonEditor/src/types/index.ts create mode 100644 src/views/Components/Editor/JsonEditor.vue diff --git a/mock/role/index.ts b/mock/role/index.ts index 905ba9b..46cf309 100644 --- a/mock/role/index.ts +++ b/mock/role/index.ts @@ -179,6 +179,14 @@ const adminList = [ meta: { title: 'router.richText' } + }, + { + path: 'json-editor', + component: 'views/Components/Editor/JsonEditor', + name: 'JsonEditor', + meta: { + title: 'router.jsonEditor' + } } ] }, @@ -588,6 +596,7 @@ const testList: string[] = [ '/components/table/ref-table', '/components/editor-demo', '/components/editor-demo/editor', + '/components/editor-demo/json-editor', '/components/search', '/components/descriptions', '/components/image-viewer', diff --git a/package.json b/package.json index ece0c2a..44aa572 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "url": "^0.11.1", "vue": "3.3.4", "vue-i18n": "9.2.2", + "vue-json-pretty": "^2.2.4", "vue-router": "^4.2.4", "vue-types": "^5.1.1" }, diff --git a/src/components/Form/src/helper/componentMap.ts b/src/components/Form/src/helper/componentMap.ts index b40c8ce..1f69009 100644 --- a/src/components/Form/src/helper/componentMap.ts +++ b/src/components/Form/src/helper/componentMap.ts @@ -22,6 +22,7 @@ import { } from 'element-plus' import { InputPassword } from '@/components/InputPassword' import { Editor } from '@/components/Editor' +import { JsonEditor } from '@/components/JsonEditor' import { ComponentName } from '../types' const componentMap: Recordable = { @@ -47,7 +48,8 @@ const componentMap: Recordable = { InputPassword: InputPassword, Editor: Editor, TreeSelect: ElTreeSelect, - Upload: ElUpload + Upload: ElUpload, + JsonEditor: JsonEditor } export { componentMap } diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts index 8d13e0d..2d08d84 100644 --- a/src/components/Form/src/types/index.ts +++ b/src/components/Form/src/types/index.ts @@ -21,6 +21,7 @@ import { UploadProps } from 'element-plus' import { IEditorConfig } from '@wangeditor/editor' +import { JsonEditorProps } from '@/components/JsonEditor' import { CSSProperties } from 'vue' export interface PlaceholderModel { @@ -53,7 +54,8 @@ export enum ComponentNameEnum { INPUT_PASSWORD = 'InputPassword', EDITOR = 'Editor', TREE_SELECT = 'TreeSelect', - UPLOAD = 'Upload' + UPLOAD = 'Upload', + JSON_EDITOR = 'JsonEditor' } type CamelCaseComponentName = keyof typeof ComponentNameEnum extends infer K @@ -620,6 +622,7 @@ export interface FormSchema { | InputPasswordComponentProps | TreeSelectComponentProps | UploadComponentProps + | JsonEditorProps | any /** diff --git a/src/components/JsonEditor/index.ts b/src/components/JsonEditor/index.ts new file mode 100644 index 0000000..53a2d06 --- /dev/null +++ b/src/components/JsonEditor/index.ts @@ -0,0 +1,4 @@ +import JsonEditor from './src/JsonEditor.vue' +export type { JsonEditorProps } from './src/types' + +export { JsonEditor } diff --git a/src/components/JsonEditor/src/JsonEditor.vue b/src/components/JsonEditor/src/JsonEditor.vue new file mode 100644 index 0000000..2f86200 --- /dev/null +++ b/src/components/JsonEditor/src/JsonEditor.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/components/JsonEditor/src/types/index.ts b/src/components/JsonEditor/src/types/index.ts new file mode 100644 index 0000000..d77097f --- /dev/null +++ b/src/components/JsonEditor/src/types/index.ts @@ -0,0 +1,23 @@ +export interface JsonEditorProps { + value: any + deep?: number + showLength?: boolean + showLineNumbers?: boolean + showLineNumber?: boolean + showIcon?: boolean + showDoubleQuotes?: boolean + virtual?: boolean + height?: number + itemHeight?: number + rootPath?: string + nodeSelectable?: (...args: any[]) => boolean + selectableType?: 'multiple' | 'single' + showSelectController?: boolean + selectOnClickNode?: boolean + highlightSelectedNode?: boolean + collapsedOnClickBrackets?: boolean + renderNodeKey?: (...args: any[]) => any + renderNodeValue?: (...args: any[]) => any + editable?: boolean + editableTrigger?: 'click' | 'dblclick' +} diff --git a/src/locales/en.ts b/src/locales/en.ts index 2f7ccca..1a791a9 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -147,6 +147,7 @@ export default { defaultTable: 'Basic example', editor: 'Editor', richText: 'Rich text', + jsonEditor: 'JSON Editor', dialog: 'Dialog', imageViewer: 'Image viewer', descriptions: 'Descriptions', @@ -300,6 +301,7 @@ export default { verifyReset: 'Verify reset', // 富文本编辑器 richText: 'Rich text', + jsonEditor: 'JSON Editor', form: 'Form', // 远程加载 remoteLoading: 'Remote loading', @@ -448,7 +450,9 @@ export default { }, richText: { richText: 'Rich text', - richTextDes: 'Secondary packaging based on wangeditor' + richTextDes: 'Secondary packaging based on wangeditor', + jsonEditor: 'JSON Editor', + jsonEditorDes: 'Secondary packaging based on vue-json-pretty' }, dialogDemo: { dialog: 'Dialog', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 44ac79f..47e587e 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -147,6 +147,7 @@ export default { defaultTable: '基础示例', editor: '编辑器', richText: '富文本', + jsonEditor: 'JSON编辑器', dialog: '弹窗', imageViewer: '图片预览', descriptions: '描述', @@ -298,6 +299,8 @@ export default { verifyReset: '验证重置', // 富文本编辑器 richText: '富文本编辑器', + // JSON编辑器 + jsonEditor: 'JSON编辑器', form: '表单', // 远程加载 remoteLoading: '远程加载', @@ -441,7 +444,9 @@ export default { }, richText: { richText: '富文本', - richTextDes: '基于 wangeditor 二次封装' + richTextDes: '基于 wangeditor 二次封装', + jsonEditor: 'JSON编辑器', + jsonEditorDes: '基于 vue-json-pretty 二次封装' }, dialogDemo: { dialog: '弹窗', diff --git a/src/router/index.ts b/src/router/index.ts index 3d4487f..eadb645 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -220,6 +220,14 @@ export const asyncRouterMap: AppRouteRecordRaw[] = [ meta: { title: t('router.richText') } + }, + { + path: 'json-editor', + component: () => import('@/views/Components/Editor/JsonEditor.vue'), + name: 'JsonEditor', + meta: { + title: t('router.jsonEditor') + } } ] }, diff --git a/src/views/Components/Editor/JsonEditor.vue b/src/views/Components/Editor/JsonEditor.vue new file mode 100644 index 0000000..c508fbd --- /dev/null +++ b/src/views/Components/Editor/JsonEditor.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/views/Components/Form/DefaultForm.vue b/src/views/Components/Form/DefaultForm.vue index b4f9fc5..4fc24ce 100644 --- a/src/views/Components/Form/DefaultForm.vue +++ b/src/views/Components/Form/DefaultForm.vue @@ -1760,6 +1760,20 @@ const schema = reactive([ ) } } + }, + { + field: 'field85', + component: 'Divider', + label: t('formDemo.jsonEditor') + }, + { + field: 'field86', + component: 'JsonEditor', + label: t('formDemo.default'), + value: { + a: 1, + b: 2 + } } ]) diff --git a/vite.config.ts b/vite.config.ts index 0f89012..214dd2d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -31,7 +31,12 @@ export default ({ command, mode }: ConfigEnv): UserConfig => { return { base: env.VITE_BASE_PATH, plugins: [ - Vue(), + Vue({ + script: { + // 开启defineModel + defineModel: true + } + }), VueJsx(), // WindiCSS(), progress(), @@ -145,7 +150,8 @@ export default ({ command, mode }: ConfigEnv): UserConfig => { 'intro.js', 'qrcode', '@wangeditor/editor', - '@wangeditor/editor-for-vue' + '@wangeditor/editor-for-vue', + 'vue-json-pretty' ] } }