diff --git a/package.json b/package.json index 58460358..c7ef3d40 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,6 @@ "url": "https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues" }, "homepage": "https://gitee.com/yudaocode/yudao-ui-admin-vue3", - "packageManager": "pnpm@8.6.0", "engines": { "node": ">= 16.0.0", "pnpm": ">=8.6.0" diff --git a/src/components/FormCreate/index.ts b/src/components/FormCreate/index.ts index 51b52603..d50ed3c6 100644 --- a/src/components/FormCreate/index.ts +++ b/src/components/FormCreate/index.ts @@ -1,4 +1,3 @@ -import MyFormCreateDesigner from './src/MyFormCreateDesigner.vue' import { useFormCreateDesigner } from './src/useFormCreateDesigner' -export { MyFormCreateDesigner, useFormCreateDesigner } +export { useFormCreateDesigner } diff --git a/src/components/FormCreate/src/MyFormCreateDesigner.vue b/src/components/FormCreate/src/MyFormCreateDesigner.vue deleted file mode 100644 index f202b9cb..00000000 --- a/src/components/FormCreate/src/MyFormCreateDesigner.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - diff --git a/src/components/FormCreate/src/config/index.ts b/src/components/FormCreate/src/config/index.ts index 5403ce0e..c3939159 100644 --- a/src/components/FormCreate/src/config/index.ts +++ b/src/components/FormCreate/src/config/index.ts @@ -3,11 +3,13 @@ import { useUploadImgRule } from './useUploadImgRule' import { useUploadImgsRule } from './useUploadImgsRule' import { useDictSelectRule } from './useDictSelectRule' import { useUserSelectRule } from './useUserSelectRule' +import { useEditorRule } from './useEditorRule' export { useUploadFileRule, useUploadImgRule, useUploadImgsRule, useDictSelectRule, - useUserSelectRule + useUserSelectRule, + useEditorRule } diff --git a/src/components/FormCreate/src/config/selectRule.ts b/src/components/FormCreate/src/config/selectRule.ts new file mode 100644 index 00000000..0974139e --- /dev/null +++ b/src/components/FormCreate/src/config/selectRule.ts @@ -0,0 +1,71 @@ +const selectRule = [ + { type: 'switch', field: 'multiple', title: '是否多选' }, + { + type: 'switch', + field: 'disabled', + title: '是否禁用' + }, + { type: 'switch', field: 'clearable', title: '是否可以清空选项' }, + { + type: 'switch', + field: 'collapseTags', + title: '多选时是否将选中值按文字的形式展示' + }, + { + type: 'inputNumber', + field: 'multipleLimit', + title: '多选时用户最多可以选择的项目数,为 0 则不限制', + props: { min: 0 } + }, + { + type: 'input', + field: 'autocomplete', + title: 'autocomplete 属性' + }, + { type: 'input', field: 'placeholder', title: '占位符' }, + { + type: 'switch', + field: 'filterable', + title: '是否可搜索' + }, + { type: 'switch', field: 'allowCreate', title: '是否允许用户创建新条目' }, + { + type: 'input', + field: 'noMatchText', + title: '搜索条件无匹配时显示的文字' + }, + { + type: 'switch', + field: 'remote', + title: '其中的选项是否从服务器远程加载' + }, + { + type: 'Struct', + field: 'remoteMethod', + title: '自定义远程搜索方法' + }, + { type: 'input', field: 'noDataText', title: '选项为空时显示的文字' }, + { + type: 'switch', + field: 'reserveKeyword', + title: '多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词' + }, + { + type: 'switch', + field: 'defaultFirstOption', + title: '在输入框按下回车,选择第一个匹配项' + }, + { + type: 'switch', + field: 'popperAppendToBody', + title: '是否将弹出框插入至 body 元素', + value: true + }, + { + type: 'switch', + field: 'automaticDropdown', + title: '对于不可搜索的 Select,是否在输入框获得焦点后自动弹出选项菜单' + } +] + +export default selectRule diff --git a/src/components/FormCreate/src/config/useDictSelectRule.ts b/src/components/FormCreate/src/config/useDictSelectRule.ts index 51cd33b7..7a1afc60 100644 --- a/src/components/FormCreate/src/config/useDictSelectRule.ts +++ b/src/components/FormCreate/src/config/useDictSelectRule.ts @@ -1,6 +1,7 @@ import { generateUUID } from '@/utils' import * as DictDataApi from '@/api/system/dict/dict.type' import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils' +import selectRule from '@/components/FormCreate/src/config/selectRule' export const useDictSelectRule = () => { const label = '字典选择器' @@ -51,73 +52,7 @@ export const useDictSelectRule = () => { { label: '布尔值', value: 'bool' } ] }, - { type: 'switch', field: 'multiple', title: '是否多选' }, - { - type: 'switch', - field: 'disabled', - title: '是否禁用' - }, - { type: 'switch', field: 'clearable', title: '是否可以清空选项' }, - { - type: 'switch', - field: 'collapseTags', - title: '多选时是否将选中值按文字的形式展示' - }, - { - type: 'inputNumber', - field: 'multipleLimit', - title: '多选时用户最多可以选择的项目数,为 0 则不限制', - props: { min: 0 } - }, - { - type: 'input', - field: 'autocomplete', - title: 'autocomplete 属性' - }, - { type: 'input', field: 'placeholder', title: '占位符' }, - { - type: 'switch', - field: 'filterable', - title: '是否可搜索' - }, - { type: 'switch', field: 'allowCreate', title: '是否允许用户创建新条目' }, - { - type: 'input', - field: 'noMatchText', - title: '搜索条件无匹配时显示的文字' - }, - { - type: 'switch', - field: 'remote', - title: '其中的选项是否从服务器远程加载' - }, - { - type: 'Struct', - field: 'remoteMethod', - title: '自定义远程搜索方法' - }, - { type: 'input', field: 'noDataText', title: '选项为空时显示的文字' }, - { - type: 'switch', - field: 'reserveKeyword', - title: '多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词' - }, - { - type: 'switch', - field: 'defaultFirstOption', - title: '在输入框按下回车,选择第一个匹配项' - }, - { - type: 'switch', - field: 'popperAppendToBody', - title: '是否将弹出框插入至 body 元素', - value: true - }, - { - type: 'switch', - field: 'automaticDropdown', - title: '对于不可搜索的 Select,是否在输入框获得焦点后自动弹出选项菜单' - } + ...selectRule ]) } } diff --git a/src/components/FormCreate/src/config/useEditorRule.ts b/src/components/FormCreate/src/config/useEditorRule.ts new file mode 100644 index 00000000..ac6d9ac0 --- /dev/null +++ b/src/components/FormCreate/src/config/useEditorRule.ts @@ -0,0 +1,32 @@ +import { generateUUID } from '@/utils' +import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils' + +export const useEditorRule = () => { + const label = '富文本' + const name = 'Editor' + return { + icon: 'icon-editor', + label, + name, + rule() { + return { + type: name, + field: generateUUID(), + title: label, + info: '', + $required: false + } + }, + props(_, { t }) { + return localeProps(t, name + '.props', [ + makeRequiredRule(), + { + type: 'input', + field: 'height', + title: '高度' + }, + { type: 'switch', field: 'readonly', title: '是否只读' } + ]) + } + } +} diff --git a/src/components/FormCreate/src/config/useUserSelectRule.ts b/src/components/FormCreate/src/config/useUserSelectRule.ts index 07f70836..dd5e51c3 100644 --- a/src/components/FormCreate/src/config/useUserSelectRule.ts +++ b/src/components/FormCreate/src/config/useUserSelectRule.ts @@ -1,5 +1,6 @@ import { generateUUID } from '@/utils' import { localeProps, makeRequiredRule } from '@/components/FormCreate/src/utils' +import selectRule from '@/components/FormCreate/src/config/selectRule' export const useUserSelectRule = () => { const label = '用户选择器' @@ -18,76 +19,7 @@ export const useUserSelectRule = () => { } }, props(_, { t }) { - return localeProps(t, name + '.props', [ - makeRequiredRule(), - { type: 'switch', field: 'multiple', title: '是否多选' }, - { - type: 'switch', - field: 'disabled', - title: '是否禁用' - }, - { type: 'switch', field: 'clearable', title: '是否可以清空选项' }, - { - type: 'switch', - field: 'collapseTags', - title: '多选时是否将选中值按文字的形式展示' - }, - { - type: 'inputNumber', - field: 'multipleLimit', - title: '多选时用户最多可以选择的项目数,为 0 则不限制', - props: { min: 0 } - }, - { - type: 'input', - field: 'autocomplete', - title: 'autocomplete 属性' - }, - { type: 'input', field: 'placeholder', title: '占位符' }, - { - type: 'switch', - field: 'filterable', - title: '是否可搜索' - }, - { type: 'switch', field: 'allowCreate', title: '是否允许用户创建新条目' }, - { - type: 'input', - field: 'noMatchText', - title: '搜索条件无匹配时显示的文字' - }, - { - type: 'switch', - field: 'remote', - title: '其中的选项是否从服务器远程加载' - }, - { - type: 'Struct', - field: 'remoteMethod', - title: '自定义远程搜索方法' - }, - { type: 'input', field: 'noDataText', title: '选项为空时显示的文字' }, - { - type: 'switch', - field: 'reserveKeyword', - title: '多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词' - }, - { - type: 'switch', - field: 'defaultFirstOption', - title: '在输入框按下回车,选择第一个匹配项' - }, - { - type: 'switch', - field: 'popperAppendToBody', - title: '是否将弹出框插入至 body 元素', - value: true - }, - { - type: 'switch', - field: 'automaticDropdown', - title: '对于不可搜索的 Select,是否在输入框获得焦点后自动弹出选项菜单' - } - ]) + return localeProps(t, name + '.props', [makeRequiredRule(), ...selectRule]) } } } diff --git a/src/components/FormCreate/src/useFormCreateDesigner.ts b/src/components/FormCreate/src/useFormCreateDesigner.ts index e142970d..fe42b24f 100644 --- a/src/components/FormCreate/src/useFormCreateDesigner.ts +++ b/src/components/FormCreate/src/useFormCreateDesigner.ts @@ -1,5 +1,6 @@ import { useDictSelectRule, + useEditorRule, useUploadFileRule, useUploadImgRule, useUploadImgsRule, @@ -13,8 +14,12 @@ import { Ref } from 'vue' * - 文件上传 * - 单图上传 * - 多图上传 + * - 字典选择器 + * - 系统用户选择器 + * - 富文本 */ export const useFormCreateDesigner = (designer: Ref) => { + const editorRule = useEditorRule() const uploadFileRule = useUploadFileRule() const uploadImgRule = useUploadImgRule() const uploadImgsRule = useUploadImgsRule() @@ -24,7 +29,10 @@ export const useFormCreateDesigner = (designer: Ref) => { onMounted(() => { // 移除自带的上传组件规则,使用 uploadFileRule、uploadImgRule、uploadImgsRule 替代 designer.value?.removeMenuItem('upload') + // 移除自带的富文本组件规则,使用 editorRule 替代 + designer.value?.removeMenuItem('fc-editor') const components = [ + editorRule, uploadFileRule, uploadImgRule, uploadImgsRule, diff --git a/src/plugins/formCreate/index.ts b/src/plugins/formCreate/index.ts index 2e4fc5d8..5f8428e6 100644 --- a/src/plugins/formCreate/index.ts +++ b/src/plugins/formCreate/index.ts @@ -21,6 +21,7 @@ import install from '@form-create/element-ui/auto-import' import { UploadFile, UploadImg, UploadImgs } from '@/components/UploadFile' import { DictSelect } from '@/components/DictSelect' import UserSelect from '@/views/system/user/components/UserSelect.vue' +import { Editor } from '@/components/Editor' const components = [ ElAside, @@ -39,7 +40,8 @@ const components = [ UploadImgs, UploadFile, DictSelect, - UserSelect + UserSelect, + Editor ] // 参考 http://www.form-create.com/v3/element-ui/auto-import.html 文档 diff --git a/src/utils/index.ts b/src/utils/index.ts index 412a8b62..274ab7ca 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,4 +1,4 @@ -import { toNumber } from 'lodash-es' +import {toNumber} from 'lodash-es' /** * @@ -418,3 +418,20 @@ export const erpCalculatePercentage = (value: number, total: number) => { if (total === 0) return 0 return ((value / total) * 100).toFixed(2) } + +/** + * 适配 echarts map 的地名 + * + * @param areaName 地区名称 + */ +export const areaReplace = (areaName: string) => { + if (!areaName) { + return areaName + } + return areaName + .replace('维吾尔自治区', '') + .replace('壮族自治区', '') + .replace('回族自治区', '') + .replace('自治区', '') + .replace('省', '') +} diff --git a/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue b/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue index 84b43ac4..513936c9 100644 --- a/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue +++ b/src/views/crm/statistics/portrait/components/PortraitCustomerArea.vue @@ -24,6 +24,7 @@ import { CrmStatisticCustomerAreaRespVO, StatisticsPortraitApi } from '@/api/crm/statistics/portrait' +import { areaReplace } from '@/utils' defineOptions({ name: 'PortraitCustomerArea' }) const props = defineProps<{ queryParams: any }>() // 搜索参数 @@ -106,12 +107,7 @@ const loadData = async () => { areaStatisticsList.value = areaList.map((item: CrmStatisticCustomerAreaRespVO) => { return { ...item, - areaName: item.areaName // TODO @puhui999:这里最好注释下原因哈, 🤣 我从 mall copy 过来的;这块看着是适合 ercharts 的地名,要不抽个小的 js 方法,然后把涉及到的地方都替换掉。 - // .replace('维吾尔自治区', '') - // .replace('壮族自治区', '') - // .replace('回族自治区', '') - // .replace('自治区', '') - // .replace('省', '') + areaName: areaReplace(item.areaName) } }) buildLeftMap() diff --git a/src/views/mall/statistics/member/index.vue b/src/views/mall/statistics/member/index.vue index a075810d..0e1bbaf6 100644 --- a/src/views/mall/statistics/member/index.vue +++ b/src/views/mall/statistics/member/index.vue @@ -3,44 +3,44 @@
- + - + - + - + @@ -67,42 +67,42 @@ @@ -110,7 +110,7 @@ - + @@ -122,16 +122,16 @@