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