Merge branch 'dev' into dev-commet

This commit is contained in:
tnt group 2023-05-10 11:33:48 +08:00
commit d701411547
18 changed files with 776 additions and 761 deletions

View File

@ -20,7 +20,7 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
### 🤯 后端项目 ### 🤯 后端项目
后端项目gitee地址[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve) 后端项目 gitee 地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb) 接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)
@ -53,7 +53,7 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
| 名称 | 版本 | 名称 | 版本 | | 名称 | 版本 | 名称 | 版本 |
| ------------------- | ----- | ----------- | ------ | | ------------------- | ----- | ----------- | ------ |
| Vue | 3.2.x | TypeScript4 | 4.6.x | | Vue | 3.2.x | TypeScript4 | 4.6.x |
| Vite | 2.9.x | NaiveUI | 2.27.x | | Vite | 4.2.x | NaiveUI | 2.34.x |
| ECharts | 5.3.x | Pinia | 2.0.x | | ECharts | 5.3.x | Pinia | 2.0.x |
| 详见 `package.json` | 😁 | 🥰 | 🤗 | | 详见 `package.json` | 😁 | 🥰 | 🤗 |
@ -61,7 +61,7 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
| 名称 | 版本 | 名称 | 版本 | | 名称 | 版本 | 名称 | 版本 |
| ---- | ------- | ------- | ----- | | ---- | ------- | ------- | ----- |
| node | 16.14.x | npm | 8.5.x | | node | 16.16.x | npm | 8.5.x |
| pnpm | 7.1.x | windows | 11 | | pnpm | 7.1.x | windows | 11 |
已完成图表: 已完成图表:

View File

@ -21,7 +21,7 @@ axiosInstance.interceptors.request.use(
axiosInstance.interceptors.response.use( axiosInstance.interceptors.response.use(
(res: AxiosResponse) => { (res: AxiosResponse) => {
const { code } = res.data as { code: number } const { code } = res.data as { code: number }
if (code === undefined || code === null) return Promise.resolve(res) if (code === undefined || code === null) return Promise.resolve(res.data)
if (code === ResultEnum.DATA_SUCCESS) return Promise.resolve(res.data) if (code === ResultEnum.DATA_SUCCESS) return Promise.resolve(res.data)
// 重定向 // 重定向
if (ErrorPageNameMap.get(code)) redirectErrorPage(code) if (ErrorPageNameMap.get(code)) redirectErrorPage(code)

View File

@ -76,10 +76,11 @@ export const useChartDataFetch = (
if (res) { if (res) {
try { try {
const filter = targetComponent.filter const filter = targetComponent.filter
echartsUpdateHandle(newFunctionHandle(res?.data, res, filter)) const { data } = res
echartsUpdateHandle(newFunctionHandle(data, res, filter))
// 更新回调函数 // 更新回调函数
if (updateCallback) { if (updateCallback) {
updateCallback(newFunctionHandle(res?.data, res, filter)) updateCallback(newFunctionHandle(data, res, filter))
} }
} catch (error) { } catch (error) {
console.error(error) console.error(error)

View File

@ -2,7 +2,7 @@
<collapse-item name="信息" :expanded="true"> <collapse-item name="信息" :expanded="true">
<setting-item-box name="文字" :alone="true"> <setting-item-box name="文字" :alone="true">
<setting-item> <setting-item>
<n-input v-model:value="optionData.dataset" size="small"></n-input> <n-input v-model:value="optionData.dataset" type="textarea" size="small"></n-input>
</setting-item> </setting-item>
</setting-item-box> </setting-item-box>
<setting-item-box name="链接" :alone="true"> <setting-item-box name="链接" :alone="true">
@ -30,11 +30,7 @@
<n-input-number v-model:value="optionData.fontSize" size="small" placeholder="字体大小"></n-input-number> <n-input-number v-model:value="optionData.fontSize" size="small" placeholder="字体大小"></n-input-number>
</setting-item> </setting-item>
<setting-item name="字体粗细"> <setting-item name="字体粗细">
<n-select <n-select v-model:value="optionData.fontWeight" size="small" :options="fontWeightOptions" />
v-model:value="optionData.fontWeight"
size="small"
:options="fontWeightOptions"
/>
</setting-item> </setting-item>
<setting-item name="X轴内边距"> <setting-item name="X轴内边距">
<n-input-number v-model:value="optionData.paddingX" size="small" placeholder="输入内边距"></n-input-number> <n-input-number v-model:value="optionData.paddingX" size="small" placeholder="输入内边距"></n-input-number>
@ -87,9 +83,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PropType } from 'vue' import { PropType } from 'vue'
import { option, WritingModeEnum, WritingModeObject, import { option, WritingModeEnum, WritingModeObject, FontWeightEnum, FontWeightObject } from './config'
FontWeightEnum,
FontWeightObject, } from './config'
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
const props = defineProps({ const props = defineProps({
optionData: { optionData: {
@ -117,13 +111,13 @@ const verticalOptions = [
const fontWeightOptions = [ const fontWeightOptions = [
{ {
label: FontWeightEnum.NORMAL, label: FontWeightEnum.NORMAL,
value: FontWeightObject[FontWeightEnum.NORMAL], value: FontWeightObject[FontWeightEnum.NORMAL]
}, },
{ {
label: FontWeightEnum.BOLD, label: FontWeightEnum.BOLD,
value: FontWeightObject[FontWeightEnum.BOLD], value: FontWeightObject[FontWeightEnum.BOLD]
}, }
]; ]
const handleLinkClick = () => { const handleLinkClick = () => {
window.open(props.optionData.linkHead + props.optionData.link) window.open(props.optionData.linkHead + props.optionData.link)
} }

View File

@ -1,8 +1,8 @@
<template> <template>
<div class="go-text-box"> <div class="go-text-box">
<div class="content"> <div class="content">
<span style="cursor: pointer" v-if="link" @click="click">{{ option.dataset }}</span> <span style="cursor: pointer; white-space: pre-wrap" v-if="link" @click="click"></span>
<span v-else>{{ option.dataset }}</span> <span style="white-space: pre-wrap" v-else>{{ option.dataset }}</span>
</div> </div>
</div> </div>
</template> </template>

View File

@ -140,6 +140,7 @@ export interface CreateComponentType extends PublicConfigType, requestConfig {
key: string key: string
chartConfig: ConfigType chartConfig: ConfigType
option: GlobalThemeJsonType option: GlobalThemeJsonType
groupList?: Array<CreateComponentType>
} }
// 组件成组实例类 // 组件成组实例类

View File

@ -2212,9 +2212,9 @@
"pinyin": "tengluozi" "pinyin": "tengluozi"
}, },
{ {
"CMYK": [57, 62, 16, 2], "CMYK": [34, 39, 0, 24],
"RGB": [128, 109, 158], "RGB": [128, 118, 195],
"hex": "#806d9e", "hex": "#8076c3",
"name": "槿紫", "name": "槿紫",
"pinyin": "jinzi" "pinyin": "jinzi"
}, },

View File

@ -55,7 +55,11 @@ export const useChartLayoutStore = defineStore({
} }
}, },
actions: { actions: {
setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void { setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(
key: T,
value: K,
computedScale = true
): void {
this.$patch(state => { this.$patch(state => {
state[key] = value state[key] = value
}) })
@ -64,9 +68,11 @@ export const useChartLayoutStore = defineStore({
// 这里需要标记重置画布位置 // 这里需要标记重置画布位置
this.rePositionCanvas = true; this.rePositionCanvas = true;
// 重新计算拖拽区域缩放比例 // 重新计算拖拽区域缩放比例
setTimeout(() => { if (computedScale) {
chartEditStore.computedScale() setTimeout(() => {
}, 500) chartEditStore.computedScale()
}, 500)
}
}, },
setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void { setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {
this.$patch(state => { this.$patch(state => {

View File

@ -11,7 +11,7 @@
@update:value="clickItemHandle" @update:value="clickItemHandle"
></n-menu> ></n-menu>
<div class="chart-content-list"> <div class="chart-content-list">
<n-scrollbar> <n-scrollbar trigger="none">
<charts-item-box :menuOptions="packages.selectOptions"></charts-item-box> <charts-item-box :menuOptions="packages.selectOptions"></charts-item-box>
</n-scrollbar> </n-scrollbar>
</div> </div>
@ -119,6 +119,7 @@ $menuWidth: 65px;
@include fetch-bg-color('background-color2-shallow'); @include fetch-bg-color('background-color2-shallow');
} }
.chart-content-list { .chart-content-list {
width: 200px;
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@ -74,9 +74,9 @@ const clickItemHandle = (key: string, item: any) => {
selectOptions.value = item selectOptions.value = item
// 处理折叠 // 处理折叠
if (beforeSelect === key) { if (beforeSelect === key) {
setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value) setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value, false)
} else { } else {
setItem(ChartLayoutStoreEnum.CHARTS, true) setItem(ChartLayoutStoreEnum.CHARTS, true, false)
} }
beforeSelect = key beforeSelect = key
} }

View File

@ -130,8 +130,9 @@ const sendHandle = async () => {
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig)) const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
loading.value = false loading.value = false
if (res) { if (res) {
if (!res?.data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!') const { data } = res
targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter) if (!data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
showMatching.value = true showMatching.value = true
return return
} }

View File

@ -58,7 +58,7 @@
<help-outline-icon></help-outline-icon> <help-outline-icon></help-outline-icon>
</n-icon> </n-icon>
</template> </template>
<n-text>不支持静态组件分组</n-text> <n-text>不支持静态组件</n-text>
</n-tooltip> </n-tooltip>
</template> </template>
<n-select <n-select
@ -169,7 +169,27 @@ const fnDimensionsAndSource = (interactOn: InteractEventOn | undefined) => {
// //
const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => { const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => {
const filterOptionList = chartEditStore.componentList.filter(item => { //
const fnFlattern = (
data: Array<CreateComponentType | CreateComponentGroupType>
): Array<CreateComponentType | CreateComponentGroupType> => {
return data.reduce(
(
iter: Array<CreateComponentType | CreateComponentGroupType>,
val: CreateComponentType | CreateComponentGroupType
) => {
if (val.groupList && val.groupList.length > 0) {
iter.push(val)
} else {
iter.push(val)
}
return val.groupList ? [...iter, ...fnFlattern(val.groupList)] : iter
},
[]
)
}
const filterOptionList = fnFlattern(chartEditStore.componentList).filter(item => {
// //
const isNotSelf = item.id !== targetData.value.id const isNotSelf = item.id !== targetData.value.id
// //

View File

@ -23,6 +23,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, PropType } from 'vue' import { computed, PropType } from 'vue'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
import { useDesignStore } from '@/store/modules/designStore/designStore' import { useDesignStore } from '@/store/modules/designStore/designStore'
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
import { useSizeStyle, usePointStyle } from '../../hooks/useStyle.hook' import { useSizeStyle, usePointStyle } from '../../hooks/useStyle.hook'
@ -55,6 +57,9 @@ const themeColor = computed(() => {
// //
const hover = computed(() => { const hover = computed(() => {
const isDrag = chartEditStore.getEditCanvas[EditCanvasTypeEnum.IS_DRAG]
if (isDrag) return false
if (props.item.status.lock) return false if (props.item.status.lock) return false
return props.item.id === chartEditStore.getTargetChart.hoverId return props.item.id === chartEditStore.getTargetChart.hoverId
}) })

View File

@ -5,8 +5,9 @@ import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStor
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()
// 布局处理 // 布局处理
export const useLayout = () => { export const useLayout = (fn: () => Promise<void>) => {
onMounted(() => { let removeScale: Function = () => { }
onMounted(async () => {
// 设置 Dom 值(ref 不生效先用 document) // 设置 Dom 值(ref 不生效先用 document)
chartEditStore.setEditCanvas( chartEditStore.setEditCanvas(
EditCanvasTypeEnum.EDIT_LAYOUT_DOM, EditCanvasTypeEnum.EDIT_LAYOUT_DOM,
@ -17,13 +18,16 @@ export const useLayout = () => {
document.getElementById('go-chart-edit-content') document.getElementById('go-chart-edit-content')
) )
// 获取数据
await fn()
// 监听初始化 // 监听初始化
const removeScale = chartEditStore.listenerScale() removeScale = chartEditStore.listenerScale()
onUnmounted(() => { })
chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null)
chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null) onUnmounted(() => {
removeScale() chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null)
}) chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null)
removeScale()
}) })
} }

View File

@ -109,10 +109,10 @@ const chartEditStore = useChartEditStore()
const { handleContextMenu } = useContextMenu() const { handleContextMenu } = useContextMenu()
// scale // scale
provide(SCALE_KEY, null); provide(SCALE_KEY, null)
// //
useLayout() useLayout(async () => {})
// //
const { mouseenterHandle, mouseleaveHandle, mousedownHandle, mouseClickHandle } = useMouseHandle() const { mouseenterHandle, mouseleaveHandle, mousedownHandle, mouseClickHandle } = useMouseHandle()

View File

@ -185,6 +185,11 @@ export const useSync = () => {
} else { } else {
await create(comItem as CreateComponentType) await create(comItem as CreateComponentType)
} }
if (percentage === 100) {
// 清除历史记录
chartHistoryStore.clearBackStack()
chartHistoryStore.clearForwardStack()
}
} }
} else { } else {
// 非组件(顺便排除脏数据) // 非组件(顺便排除脏数据)

View File

@ -131,20 +131,6 @@ const selectOptions = ref([
key: 'preview', key: 'preview',
icon: renderIcon(BrowsersOutlineIcon) icon: renderIcon(BrowsersOutlineIcon)
}, },
{
label: renderLang('global.r_copy'),
key: 'copy',
icon: renderIcon(CopyIcon)
},
{
label: renderLang('global.r_rename'),
key: 'rename',
icon: renderIcon(PencilIcon)
},
{
type: 'divider',
key: 'd1'
},
{ {
label: props.cardData?.release label: props.cardData?.release
? renderLang('global.r_unpublish') ? renderLang('global.r_unpublish')
@ -152,15 +138,6 @@ const selectOptions = ref([
key: 'send', key: 'send',
icon: renderIcon(SendIcon) icon: renderIcon(SendIcon)
}, },
{
label: renderLang('global.r_download'),
key: 'download',
icon: renderIcon(DownloadIcon)
},
{
type: 'divider',
key: 'd2'
},
{ {
label: renderLang('global.r_delete'), label: renderLang('global.r_delete'),
key: 'delete', key: 'delete',