diff --git a/core/core-frontend/src/components/collapse-switch-item/src/CollapseSwitchItem.vue b/core/core-frontend/src/components/collapse-switch-item/src/CollapseSwitchItem.vue
index e46fd207b6..046ce69e8d 100644
--- a/core/core-frontend/src/components/collapse-switch-item/src/CollapseSwitchItem.vue
+++ b/core/core-frontend/src/components/collapse-switch-item/src/CollapseSwitchItem.vue
@@ -69,7 +69,7 @@ const switchValue = computed({
   display: flex;
   justify-content: space-between;
   align-items: center;
-  padding-right: 8px;
+  padding-right: 10px;
   flex-grow: 1;
   :deep(.ed-switch.is-checked .ed-switch__core > .ed-switch__action) {
     left: calc(100% - 12px);
diff --git a/core/core-frontend/src/components/data-visualization/canvas/ContextMenuDetails.vue b/core/core-frontend/src/components/data-visualization/canvas/ContextMenuDetails.vue
index e824380a85..02f3516647 100644
--- a/core/core-frontend/src/components/data-visualization/canvas/ContextMenuDetails.vue
+++ b/core/core-frontend/src/components/data-visualization/canvas/ContextMenuDetails.vue
@@ -10,6 +10,7 @@ import { computed, toRefs } from 'vue'
 import { ElDivider } from 'element-plus-secondary'
 import eventBus from '@/utils/eventBus'
 import { getCurInfo } from '@/store/modules/data-visualization/common'
+import { useEmitt } from '@/hooks/web/useEmitt'
 const dvMainStore = dvMainStoreWithOut()
 const copyStore = copyStoreWithOut()
 const lockStore = lockStoreWithOut()
@@ -20,6 +21,7 @@ const composeStore = composeStoreWithOut()
 const { areaData } = storeToRefs(composeStore)
 const { curComponent } = storeToRefs(dvMainStore)
 const emit = defineEmits(['close', 'rename'])
+const { emitter } = useEmitt()
 const props = defineProps({
   activePosition: {
     type: String,
@@ -157,6 +159,10 @@ const composeDivider = computed(() => {
 const isGroupArea = computed(() => {
   return curComponent.value?.component === 'GroupArea'
 })
+
+const editQueryCriteria = () => {
+  emitter.emit(`editQueryCriteria${curComponent.value.id}`)
+}
 </script>
 
 <template>
@@ -207,6 +213,8 @@ const isGroupArea = computed(() => {
       <el-divider class="custom-divider" v-show="composeDivider" />
       <template v-if="curComponent && !isGroupArea">
         <template v-if="!curComponent['isLock']">
+          <li v-if="curComponent.component === 'VQuery'" @click="editQueryCriteria">编辑</li>
+          <li @click="upComponent">上移一层</li>
           <li @click="upComponent">上移一层</li>
           <li @click="downComponent">下移一层</li>
           <li @click="topComponent">置于顶层</li>
diff --git a/core/core-frontend/src/custom-component/scroll-text/Component.vue b/core/core-frontend/src/custom-component/scroll-text/Component.vue
index b510ce476b..3e7dd1b6ee 100644
--- a/core/core-frontend/src/custom-component/scroll-text/Component.vue
+++ b/core/core-frontend/src/custom-component/scroll-text/Component.vue
@@ -187,10 +187,10 @@ const textStyle = computed(() => {
 }
 @keyframes marqueeAnimation {
   0% {
-    transform: translate(0, 0);
+    transform: translate(100%, 0);
   }
   100% {
-    transform: translate(-100%, 0);
+    transform: translate(-50%, 0);
   }
 }
 </style>
diff --git a/core/core-frontend/src/models/chart/chart-attr.d.ts b/core/core-frontend/src/models/chart/chart-attr.d.ts
index aecc541928..ae1a504e7f 100644
--- a/core/core-frontend/src/models/chart/chart-attr.d.ts
+++ b/core/core-frontend/src/models/chart/chart-attr.d.ts
@@ -279,10 +279,12 @@ declare interface ChartTableHeaderAttr {
    */
   tableHeaderSort: boolean
   /**
+   * @deprecated since version 2.7.0 由提示统一控制
    * 行头鼠标悬浮提示开关
    */
   showRowTooltip: boolean
   /**
+   * @deprecated since version 2.7.0 由提示统一控制
    * 列头鼠标悬浮提示开关
    */
   showColTooltip: boolean
@@ -324,6 +326,7 @@ declare interface ChartTableCellAttr {
    */
   tableItemSubBgColor: string
   /**
+   * @deprecated since version 2.7.0 由提示统一控制
    * 鼠标悬浮提示
    */
   showTooltip: boolean
diff --git a/core/core-frontend/src/permission.ts b/core/core-frontend/src/permission.ts
index cc00868bab..5cf6757e0c 100644
--- a/core/core-frontend/src/permission.ts
+++ b/core/core-frontend/src/permission.ts
@@ -29,20 +29,24 @@ router.beforeEach(async (to, from, next) => {
   start()
   loadStart()
   checkPlatform()
+  let isDesktop = wsCache.get('app.desktop')
+  if (isDesktop === null) {
+    await appStore.setAppModel()
+    isDesktop = appStore.getDesktop
+  }
   if (isMobile()) {
     done()
     loadDone()
     if (to.name === 'link') {
       window.location.href = window.origin + '/mobile.html#' + to.path
-    } else if (!isPlatformClient() && !isLarkPlatform()) {
+    } else if (
+      wsCache.get('user.token') ||
+      isDesktop ||
+      (!isPlatformClient() && !isLarkPlatform())
+    ) {
       window.location.href = window.origin + '/mobile.html#/index'
     }
   }
-  let isDesktop = wsCache.get('app.desktop')
-  if (isDesktop === null) {
-    await appStore.setAppModel()
-    isDesktop = appStore.getDesktop
-  }
   await appearanceStore.setAppearance()
   if (wsCache.get('user.token') || isDesktop) {
     if (!userStore.getUid) {
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/VQueryChartStyle.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/VQueryChartStyle.vue
index 5934c734f3..8a01d41f42 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-style/VQueryChartStyle.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-style/VQueryChartStyle.vue
@@ -37,11 +37,6 @@ const { element, chart, commonBackgroundPop } = toRefs(props)
       <el-collapse v-model="state.styleActiveNames" class="style-collapse">
         <el-collapse-item :effect="themes" name="component" :title="t('visualization.module')">
           <el-form label-position="top">
-            <el-form-item class="form-item margin-bottom-8" :class="'form-item-' + themes">
-              <el-checkbox :effect="themes" v-model="element.isHang" size="small">
-                隐藏组件
-              </el-checkbox>
-            </el-form-item>
             <el-form-item class="form-item margin-bottom-8" :class="'form-item-' + themes">
               <el-checkbox
                 :effect="themes"
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue
index 2c839f1ea4..d50ab591f0 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/QuadrantSelector.vue
@@ -142,7 +142,6 @@ onMounted(() => {
           :label="t('chart.split_line')"
           class="form-item"
           :class="'form-item-' + themes"
-          style="padding-right: 4px"
         >
           <el-color-picker
             v-model="state.quadrantForm.lineStyle.stroke"
@@ -189,12 +188,7 @@ onMounted(() => {
         </el-form-item>
       </div>
       <div style="display: flex">
-        <el-form-item
-          class="form-item"
-          label="X 轴恒线"
-          :class="'form-item-' + themes"
-          style="padding-left: 4px"
-        >
+        <el-form-item class="form-item" label="X 轴恒线" :class="'form-item-' + themes">
           <el-input-number
             controls-position="right"
             style="width: 100%"
@@ -225,7 +219,7 @@ onMounted(() => {
         </el-form-item>
       </div>
     </template>
-    <el-tabs v-model="tabActive" class="quadrant-tab-header" :class="{ dark: themes === 'dark' }">
+    <el-tabs v-model="tabActive" class="tab-header" :class="{ dark: themes === 'dark' }">
       <el-tab-pane
         :name="index + 1"
         v-for="(l, index) in state.quadrantForm.labels"
@@ -239,7 +233,6 @@ onMounted(() => {
               <el-form-item
                 class="form-item"
                 :class="'form-item-' + themes"
-                style="padding-right: 4px"
                 :label="t('chart.backgroundColor')"
               >
                 <el-color-picker
@@ -290,7 +283,6 @@ onMounted(() => {
               <el-form-item
                 class="form-item"
                 :class="'form-item-' + themes"
-                style="padding-right: 4px"
                 :label="t('chart.chart_style')"
               >
                 <el-color-picker
@@ -384,48 +376,6 @@ onMounted(() => {
       border-color: rgba(235, 235, 235, 0.15);
     }
   }
-  .quadrant-tab-header {
-    --ed-tabs-header-height: 34px;
-    --custom-tab-color: #646a73;
-
-    :deep(.ed-tabs__nav-wrap::after) {
-      background-color: unset;
-    }
-
-    &.dark {
-      --custom-tab-color: #a6a6a6;
-    }
-
-    height: 100%;
-    :deep(.ed-tabs__header) {
-      border-top: solid 1px @side-outline-border-color;
-    }
-    :deep(.ed-tabs__item) {
-      font-weight: 400;
-      font-size: 12px;
-      padding: 0 12px !important;
-      margin-right: 0 !important;
-      color: var(--custom-tab-color);
-    }
-    :deep(.is-active) {
-      font-weight: 500;
-      color: var(--ed-color-primary, #3370ff);
-    }
-
-    :deep(.ed-tabs__nav-scroll) {
-      padding-left: 0 !important;
-    }
-
-    :deep(.ed-tabs__header) {
-      margin: 0 !important;
-    }
-
-    :deep(.ed-tabs__content) {
-      height: calc(100% - 33px);
-      overflow-y: auto;
-      overflow-x: hidden;
-    }
-  }
   .padding-tab {
     padding: 0;
     height: 100%;
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableCellSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableCellSelector.vue
index 9fbbc4576a..e24f6f9e1e 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableCellSelector.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableCellSelector.vue
@@ -234,20 +234,6 @@ onMounted(() => {
         </el-form-item>
       </el-col>
     </el-row>
-    <el-form-item
-      class="form-item"
-      :class="'form-item-' + themes"
-      v-if="showProperty('showTooltip')"
-    >
-      <el-checkbox
-        size="small"
-        :effect="themes"
-        v-model="state.tableCellForm.showTooltip"
-        @change="changeTableCell('showTooltip')"
-      >
-        {{ t('chart.table_show_cell_tooltip') }}
-      </el-checkbox>
-    </el-form-item>
   </el-form>
 </template>
 
diff --git a/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableHeaderSelector.vue b/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableHeaderSelector.vue
index ef3be5cc72..e2b522a3a3 100644
--- a/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableHeaderSelector.vue
+++ b/core/core-frontend/src/views/chart/components/editor/editor-style/components/table/TableHeaderSelector.vue
@@ -250,38 +250,6 @@ onMounted(() => {
         {{ t('chart.table_header_sort') }}
       </el-checkbox>
     </el-form-item>
-    <el-form-item
-      class="form-item"
-      :class="'form-item-' + themes"
-      v-if="showProperty('showColTooltip')"
-    >
-      <el-checkbox
-        size="small"
-        :effect="themes"
-        v-model="state.tableHeaderForm.showColTooltip"
-        @change="changeTableHeader('showColTooltip')"
-      >
-        {{
-          chart.type === 'table-pivot'
-            ? t('chart.table_show_col_tooltip')
-            : t('chart.table_show_header_tooltip')
-        }}
-      </el-checkbox>
-    </el-form-item>
-    <el-form-item
-      class="form-item"
-      :class="'form-item-' + themes"
-      v-if="showProperty('showRowTooltip')"
-    >
-      <el-checkbox
-        size="small"
-        :effect="themes"
-        v-model="state.tableHeaderForm.showRowTooltip"
-        @change="changeTableHeader('showRowTooltip')"
-      >
-        {{ t('chart.table_show_row_tooltip') }}
-      </el-checkbox>
-    </el-form-item>
   </el-form>
 </template>
 
diff --git a/core/core-frontend/src/views/chart/components/editor/index.vue b/core/core-frontend/src/views/chart/components/editor/index.vue
index b2138a309e..41746af7ff 100644
--- a/core/core-frontend/src/views/chart/components/editor/index.vue
+++ b/core/core-frontend/src/views/chart/components/editor/index.vue
@@ -3166,7 +3166,7 @@ span {
   display: flex;
   transition: 0.5s;
   .padding-lr {
-    padding: 0 8px;
+    padding: 0 10px;
 
     &.no-top-border {
       border-top: none !important;
@@ -3217,7 +3217,7 @@ span {
     }
 
     :deep(.ed-collapse-item__content) {
-      padding: 16px 8px 0;
+      padding: 16px 10px 0;
       border: none;
       :deep(.ed-checkbox) {
         height: 20px;
diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/table/common.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/table/common.ts
index 4fa610f969..92bb20139a 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/charts/table/common.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/charts/table/common.ts
@@ -46,7 +46,7 @@ export const TABLE_EDITOR_PROPERTY_INNER: EditorPropertyInner = {
     'letterSpace',
     'fontShadow'
   ],
-  'tooltip-selector': ['fontSize', 'color', 'backgroundColor'],
+  'tooltip-selector': ['fontSize', 'color', 'backgroundColor', 'show'],
   'function-cfg': ['emptyDataStrategy'],
   threshold: ['tableThreshold']
 }
diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts
index 36afc49597..a6a5ef574c 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-info.ts
@@ -184,14 +184,10 @@ export class TableInfo extends S2ChartView<TableSheet> {
       }
       action(param)
     })
-
-    // hover
-    const { showColTooltip } = customAttr.tableHeader
-    if (showColTooltip) {
+    // tooltip
+    const { show } = customAttr.tooltip
+    if (show) {
       newChart.on(S2Event.COL_CELL_HOVER, event => this.showTooltip(newChart, event, meta))
-    }
-    const { showTooltip } = customAttr.tableCell
-    if (showTooltip) {
       newChart.on(S2Event.DATA_CELL_HOVER, event => this.showTooltip(newChart, event, meta))
     }
     // header resize
diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts
index 16a5dbf584..a0ee7616b2 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-normal.ts
@@ -187,13 +187,10 @@ export class TableNormal extends S2ChartView<TableSheet> {
       }
       action(param)
     })
-    // hover
-    const { showColTooltip } = customAttr.tableHeader
-    if (showColTooltip) {
+    // tooltip
+    const { show } = customAttr.tooltip
+    if (show) {
       newChart.on(S2Event.COL_CELL_HOVER, event => this.showTooltip(newChart, event, meta))
-    }
-    const { showTooltip } = customAttr.tableCell
-    if (showTooltip) {
       newChart.on(S2Event.DATA_CELL_HOVER, event => this.showTooltip(newChart, event, meta))
     }
     // header resize
diff --git a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-pivot.ts b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-pivot.ts
index 8bd20dc78b..473536b92c 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-pivot.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/charts/table/table-pivot.ts
@@ -200,16 +200,11 @@ export class TablePivot extends S2ChartView<PivotSheet> {
     this.configTooltip(chart, s2Options)
     // 开始渲染
     const s2 = new PivotSheet(containerDom, s2DataConfig, s2Options as unknown as S2Options)
-    // hover
-    const { showColTooltip, showRowTooltip } = customAttr.tableHeader
-    if (showColTooltip) {
+    // tooltip
+    const { show } = customAttr.tooltip
+    if (show) {
       s2.on(S2Event.COL_CELL_HOVER, event => this.showTooltip(s2, event, meta))
-    }
-    if (showRowTooltip) {
       s2.on(S2Event.ROW_CELL_HOVER, event => this.showTooltip(s2, event, meta))
-    }
-    const { showTooltip } = customAttr.tableCell
-    if (showTooltip) {
       s2.on(S2Event.DATA_CELL_HOVER, event => this.showTooltip(s2, event, meta))
     }
     // click
diff --git a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
index 9ed7a1a3a7..a6acb65fe1 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/common/common_table.ts
@@ -750,7 +750,8 @@ export function configTooltip(chart: Chart, option: S2Options) {
       boxShadow: 'rgba(0, 0, 0, 0.1) 0px 4px 8px 0px',
       borderRadius: '3px',
       padding: '4px 12px',
-      opacity: 0.95
+      opacity: 0.95,
+      position: 'absolute'
     },
     adjustPosition: ({ event }) => {
       return getTooltipPosition(event)
@@ -791,7 +792,7 @@ export function copyContent(s2Instance, event, fieldMeta) {
 function getTooltipPosition(event) {
   const s2Instance = event.s2Instance
   const { x, y } = event
-  const result = { x: x + 15, y: y + 10 }
+  const result = { x: x + 15, y }
   if (!s2Instance) {
     return result
   }
@@ -809,8 +810,16 @@ function getTooltipPosition(event) {
   if (result.x && result.x + offsetWidth > width) {
     result.x -= result.x + offsetWidth - width
   }
-  if (result.y && result.y + offsetHeight > height) {
-    result.y -= offsetHeight + 15
+  if (result.y) {
+    if (result.y > offsetHeight) {
+      if (result.y - offsetHeight >= 15) {
+        result.y -= offsetHeight + 15
+      } else {
+        result.y = 0
+      }
+    } else {
+      result.y += 15
+    }
   }
   return result
 }
diff --git a/core/core-frontend/src/views/chart/components/js/panel/types/impl/s2.ts b/core/core-frontend/src/views/chart/components/js/panel/types/impl/s2.ts
index 89e8b95166..3188b96972 100644
--- a/core/core-frontend/src/views/chart/components/js/panel/types/impl/s2.ts
+++ b/core/core-frontend/src/views/chart/components/js/panel/types/impl/s2.ts
@@ -3,7 +3,15 @@ import {
   AntVDrawOptions,
   ChartLibraryType
 } from '@/views/chart/components/js/panel/types'
-import { S2Theme, SpreadSheet, Style, S2Options, Meta, SERIES_NUMBER_FIELD } from '@antv/s2'
+import {
+  S2Theme,
+  SpreadSheet,
+  Style,
+  S2Options,
+  Meta,
+  SERIES_NUMBER_FIELD,
+  setTooltipContainerStyle
+} from '@antv/s2'
 import {
   configHeaderInteraction,
   configTooltip,
@@ -86,6 +94,8 @@ export abstract class S2ChartView<P extends SpreadSheet> extends AntVAbstractCha
       return
     }
     event.s2Instance = s2Instance
+    const style = s2Instance.options.tooltip.style
+    setTooltipContainerStyle(s2Instance.tooltip.container, { style })
     s2Instance.showTooltip({
       position: {
         x: event.clientX,
diff --git a/core/core-frontend/src/views/dashboard/index.vue b/core/core-frontend/src/views/dashboard/index.vue
index 8d115c330d..a24593758e 100644
--- a/core/core-frontend/src/views/dashboard/index.vue
+++ b/core/core-frontend/src/views/dashboard/index.vue
@@ -190,7 +190,7 @@ onMounted(async () => {
     }
     let deTemplateData
     if (createType === 'template') {
-      const templateParamsApply = JSON.parse(decodeURIComponent(Base64.decode(templateParams + '')))
+      const templateParamsApply = JSON.parse(Base64.decode(decodeURIComponent(templateParams + '')))
       await decompressionPre(templateParamsApply, result => {
         deTemplateData = result
       })
diff --git a/core/core-frontend/src/views/mobile/directory/index.vue b/core/core-frontend/src/views/mobile/directory/index.vue
index 17a2744150..abdeb123b1 100644
--- a/core/core-frontend/src/views/mobile/directory/index.vue
+++ b/core/core-frontend/src/views/mobile/directory/index.vue
@@ -1,5 +1,5 @@
 <script lang="ts" setup>
-import { ref, computed, onMounted, watch } from 'vue'
+import { ref, computed, onMounted, watch, onUnmounted } from 'vue'
 import { storeToRefs } from 'pinia'
 import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
 import { useCache } from '@/hooks/web/useCache'
@@ -160,12 +160,23 @@ const getTree = async () => {
   if (nodeData.length && nodeData[0]['id'] === '0' && nodeData[0]['name'] === 'root') {
     tableData.value = dfsTableData(nodeData[0]['children'] || [])
     rawTableData = cloneDeep(tableData.value)
+    setSortType()
     return
   }
   tableData.value = dfsTableData(nodeData)
   rawTableData = cloneDeep(tableData.value)
+  setSortType()
 }
 
+const setSortType = () => {
+  const type = wsCache.get('mobile-sort-type')
+  sortTypeChange(type || curSortType.value)
+}
+
+onUnmounted(() => {
+  wsCache.set('mobile-sort-type', curSortType.value)
+})
+
 onMounted(() => {
   getTree()
   activeDirectName.value = wsCache.get('activeDirectName')
diff --git a/core/core-frontend/src/views/template-market/index.vue b/core/core-frontend/src/views/template-market/index.vue
index 2c9a70c032..aa921bb8b7 100644
--- a/core/core-frontend/src/views/template-market/index.vue
+++ b/core/core-frontend/src/views/template-market/index.vue
@@ -450,7 +450,7 @@ const apply = template => {
       'changeCurrentComponent',
       ['dataV', 'SCREEN'].includes(state.dvCreateForm.nodeType)
         ? 'VisualizationEditor'
-        : 'Dashboard'
+        : 'DashboardEditor'
     )
     return
   }
diff --git a/de-xpack b/de-xpack
index 8a3233c72c..dac9215350 160000
--- a/de-xpack
+++ b/de-xpack
@@ -1 +1 @@
-Subproject commit 8a3233c72c50bf1fcbed274ca833fc72c76f47d6
+Subproject commit dac92153509c5e1f4b7eb3b8418bd4ce320726c5
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java
index aee9b7736b..f74058b3c5 100644
--- a/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/dingtalk/api/DingtalkApi.java
@@ -19,6 +19,10 @@ public interface DingtalkApi {
     @GetMapping("/info")
     DingtalkInfoVO info();
 
+    @Operation(summary = "查询钉钉二维码信息")
+    @GetMapping("/qrinfo")
+    DingtalkInfoVO qrinfo();
+
     @Operation(summary = "保存")
     @PostMapping("/create")
     void save(@RequestBody DingtalkSettingCreator creator);
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarkApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarkApi.java
index fc5ee2ffce..1f1145f792 100644
--- a/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarkApi.java
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarkApi.java
@@ -20,6 +20,10 @@ public interface LarkApi {
     @GetMapping("/info")
     LarkInfoVO info();
 
+    @Operation(summary = "查询飞书二维码信息")
+    @GetMapping("/qrinfo")
+    LarkInfoVO qrinfo();
+
     @Operation(summary = "保存")
     @PostMapping("/create")
     void save(@RequestBody LarkSettingCreator creator);
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarksuiteApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarksuiteApi.java
index c378eeeacb..ea64ffa00b 100644
--- a/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarksuiteApi.java
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/lark/api/LarksuiteApi.java
@@ -19,6 +19,10 @@ public interface LarksuiteApi {
     @GetMapping("/info")
     LarkInfoVO info();
 
+    @Operation(summary = "查询国际飞书二维码信息")
+    @GetMapping("/qrinfo")
+    LarkInfoVO qrinfo();
+
     @Operation(summary = "保存")
     @PostMapping("/create")
     void save(@RequestBody LarkSettingCreator creator);
diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/wecom/api/WecomApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/wecom/api/WecomApi.java
index f91b8957f6..4a41afc453 100644
--- a/sdk/api/api-base/src/main/java/io/dataease/api/wecom/api/WecomApi.java
+++ b/sdk/api/api-base/src/main/java/io/dataease/api/wecom/api/WecomApi.java
@@ -19,6 +19,10 @@ public interface WecomApi {
     @GetMapping("/info")
     WecomInfoVO info();
 
+    @Operation(summary = "查询企微二维码信息")
+    @GetMapping("/qrinfo")
+    WecomInfoVO qrinfo();
+
     @Operation(summary = "保存")
     @PostMapping("/create")
     void save(@RequestBody WecomCreator creator);
diff --git a/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java b/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java
index 242f99f81d..b1ec7d6e6a 100644
--- a/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java
+++ b/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java
@@ -31,13 +31,13 @@ public class WhitelistUtils {
             "/doc.html",
             "/panel.html",
             "/mobile.html",
-            "/lark/info",
+            "/lark/qrinfo",
             "/lark/token",
-            "/larksuite/info",
+            "/larksuite/qrinfo",
             "/larksuite/token",
-            "/dingtalk/info",
+            "/dingtalk/qrinfo",
             "/dingtalk/token",
-            "/wecom/info",
+            "/wecom/qrinfo",
             "/wecom/token",
             "/sysParameter/requestTimeOut",
             "/setting/authentication/status",