Browse Source

手术等级问题

xiaochan 1 year ago
parent
commit
ce6e5a6888

+ 98 - 69
package-lock.json

@@ -12,11 +12,13 @@
         "@element-plus/icons-vue": "^2.0.6",
         "@kjgl77/datav-vue3": "^1.3.3",
         "@vitejs/plugin-legacy": "^1.8.2",
-        "@vueuse/core": "^9.6.0",
+        "@vueuse/core": "^10.7.1",
         "axios": "^0.27.2",
         "clipboard": "^2.0.11",
+        "crypto-js": "4.2.0",
         "d3": "^5.16.0",
         "dayjs": "^1.11.7",
+        "dom-zindex": "^1.0.1",
         "driver.js": "^1.3.0",
         "echarts": "^5.2.0",
         "element-plus": "file:deps/element-plus.2.0.4.1.tar.gz",
@@ -678,57 +680,6 @@
         "@vueuse/core": "^10.4.1"
       }
     },
-    "node_modules/@kjgl77/datav-vue3/node_modules/@types/web-bluetooth": {
-      "version": "0.0.18",
-      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz",
-      "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw=="
-    },
-    "node_modules/@kjgl77/datav-vue3/node_modules/@vueuse/core": {
-      "version": "10.5.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.5.0.tgz",
-      "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==",
-      "dependencies": {
-        "@types/web-bluetooth": "^0.0.18",
-        "@vueuse/metadata": "10.5.0",
-        "@vueuse/shared": "10.5.0",
-        "vue-demi": ">=0.14.6"
-      }
-    },
-    "node_modules/@kjgl77/datav-vue3/node_modules/@vueuse/metadata": {
-      "version": "10.5.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.5.0.tgz",
-      "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw=="
-    },
-    "node_modules/@kjgl77/datav-vue3/node_modules/@vueuse/shared": {
-      "version": "10.5.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.5.0.tgz",
-      "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==",
-      "dependencies": {
-        "vue-demi": ">=0.14.6"
-      }
-    },
-    "node_modules/@kjgl77/datav-vue3/node_modules/vue-demi": {
-      "version": "0.14.6",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
-      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@leichtgewicht/ip-codec": {
       "version": "2.0.4",
       "resolved": "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
@@ -1141,9 +1092,9 @@
       }
     },
     "node_modules/@types/web-bluetooth": {
-      "version": "0.0.16",
-      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
-      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+      "version": "0.0.20",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+      "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
     },
     "node_modules/@types/ws": {
       "version": "8.5.8",
@@ -1662,14 +1613,14 @@
       "dev": true
     },
     "node_modules/@vueuse/core": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
-      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "version": "10.7.1",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.7.1.tgz",
+      "integrity": "sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==",
       "dependencies": {
-        "@types/web-bluetooth": "^0.0.16",
-        "@vueuse/metadata": "9.13.0",
-        "@vueuse/shared": "9.13.0",
-        "vue-demi": "*"
+        "@types/web-bluetooth": "^0.0.20",
+        "@vueuse/metadata": "10.7.1",
+        "@vueuse/shared": "10.7.1",
+        "vue-demi": ">=0.14.6"
       }
     },
     "node_modules/@vueuse/core/node_modules/vue-demi": {
@@ -1695,16 +1646,16 @@
       }
     },
     "node_modules/@vueuse/metadata": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
-      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
+      "version": "10.7.1",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.7.1.tgz",
+      "integrity": "sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw=="
     },
     "node_modules/@vueuse/shared": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
-      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "version": "10.7.1",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.7.1.tgz",
+      "integrity": "sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==",
       "dependencies": {
-        "vue-demi": "*"
+        "vue-demi": ">=0.14.6"
       }
     },
     "node_modules/@vueuse/shared/node_modules/vue-demi": {
@@ -2921,6 +2872,11 @@
         "semver": "bin/semver"
       }
     },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+    },
     "node_modules/css-declaration-sorter": {
       "version": "6.4.1",
       "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
@@ -3873,6 +3829,79 @@
         "vue": "^3.2.0"
       }
     },
+    "node_modules/element-plus/node_modules/@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+    },
+    "node_modules/element-plus/node_modules/@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      }
+    },
+    "node_modules/element-plus/node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/element-plus/node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
+    },
+    "node_modules/element-plus/node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "dependencies": {
+        "vue-demi": "*"
+      }
+    },
+    "node_modules/element-plus/node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",

+ 3 - 1
package.json

@@ -19,11 +19,13 @@
     "@element-plus/icons-vue": "^2.0.6",
     "@kjgl77/datav-vue3": "^1.3.3",
     "@vitejs/plugin-legacy": "^1.8.2",
-    "@vueuse/core": "^9.6.0",
+    "@vueuse/core": "^10.7.1",
     "axios": "^0.27.2",
     "clipboard": "^2.0.11",
+    "crypto-js": "4.2.0",
     "d3": "^5.16.0",
     "dayjs": "^1.11.7",
+    "dom-zindex": "^1.0.1",
     "driver.js": "^1.3.0",
     "echarts": "^5.2.0",
     "element-plus": "file:deps/element-plus.2.0.4.1.tar.gz",

+ 22 - 0
src/App.vue

@@ -499,4 +499,26 @@ input[type=number]::-webkit-outer-spin-button {
 }
 
 
+.small_tabs {
+  --el-tabs-header-height: 30px;
+
+  .el-tabs__header {
+    padding: 0;
+    position: relative;
+    margin: 0 0 5px;
+  }
+
+  &.padding_zero {
+    .el-tabs__content {
+      padding: 0px;
+    }
+  }
+
+  .el-tabs__content {
+    padding: 10px;
+  }
+
+}
+
+
 </style>

+ 53 - 0
src/components/cy/auto-popover/src/cy-auto-popover.vue

@@ -0,0 +1,53 @@
+<script setup lang="ts">
+import {nextTick, onMounted, ref, unref, useSlots} from "vue";
+import {onClickOutside} from '@vueuse/core'
+
+const visible = ref(false)
+
+const referenceRef = ref<HTMLDivElement>()
+const mainDivRef = ref<HTMLDivElement>()
+
+onClickOutside(mainDivRef, event => {
+  // @ts-ignore
+  if (referenceRef.value.contains(event.target)) {
+    return
+  }
+  visible.value = false
+})
+
+async function show() {
+  visible.value = true
+  await nextTick()
+}
+
+function test() {
+  console.log(123)
+}
+
+onMounted(() => {
+
+})
+
+defineExpose({
+  show
+})
+</script>
+
+<template>
+  <el-popover :visible="visible" :width="0">
+    <template #reference>
+      <div class="display_inline-block" ref="referenceRef">
+        <slot name="reference"/>
+      </div>
+    </template>
+    <div class="display_inline-block" ref="mainDivRef">
+      <slot/>
+    </div>
+  </el-popover>
+</template>
+
+<style lang="scss">
+.display_inline-block {
+  display: inline-block;
+}
+</style>

+ 0 - 1
src/components/cy/dialog/index.ts

@@ -1 +0,0 @@
-

+ 0 - 143
src/components/cy/dialog/src/CyDialog.vue

@@ -1,143 +0,0 @@
-<script setup lang="ts">
-import {computed, nextTick, onMounted, ref, useSlots, watch} from "vue";
-import {
-  ElOverlay,
-  ElFocusTrap,
-  useZIndex, useDraggable,
-} from "element-plus";
-import '@/assets/cy/cy-dialog.scss'
-
-const props = defineProps({
-  modelValue: {
-    type: Boolean
-  },
-  appendToBody: {
-    type: Boolean,
-    default: false
-  },
-  width: {
-    type: String,
-    default: '30%'
-  },
-  draggable: {
-    type: Boolean,
-    default: true
-  }
-})
-
-const emits = defineEmits(['vanish'])
-
-const visible = ref(false)
-const zIndex = ref(0)
-const headerRef = ref<HTMLHeadElement>()
-const rootRef = ref<HTMLDivElement>()
-const focusStartRef = ref<HTMLDivElement>()
-
-const slots = useSlots()
-
-const mainStyle = computed(() => {
-  return {
-    '--cy-dialog-width': props.width
-  }
-})
-
-const draggable = computed(() => {
-  return props.draggable
-})
-
-function onCloseRequested() {
-  console.log(12)
-}
-
-useDraggable(rootRef, headerRef, draggable)
-
-watch(() => props.modelValue, (val) => {
-  if (val) {
-    nextTick().then(() => {
-      visible.value = val
-      zIndex.value = useZIndex().nextZIndex()
-    })
-  } else {
-    visible.value = val
-  }
-  focusStartRef.value = rootRef.value
-}, {immediate: true})
-
-</script>
-
-<template>
-  <teleport to="body" :disabled="!props.appendToBody">
-    <transition name="overlay_background">
-      <el-overlay v-show="visible"
-                  :z-index="zIndex"
-                  :style="mainStyle">
-        <transition name="cy-enlarge"
-                    @after-leave="emits('vanish')">
-          <div role="dialog"
-               v-show="visible"
-               aria-modal="true"
-               class="cy-overlay_dialog">
-            <ElFocusTrap loop
-                         :trapped="visible"
-                         focus-start-el="container"
-                         @release-requested="onCloseRequested">
-              <div class="cy-dialog_content" ref="rootRef" tabindex="-1" @click.stop>
-                <div class="cy-dialog_root">
-                  <header ref="headerRef">
-                    标题
-                  </header>
-                  <div class="cy-dialog_body">
-
-                  </div>
-                  <footer>
-
-                  </footer>
-                </div>
-              </div>
-            </ElFocusTrap>
-          </div>
-        </transition>
-      </el-overlay>
-    </transition>
-  </teleport>
-</template>
-
-<style lang="scss">
-.cy-overlay_dialog {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  overflow: auto;
-
-  .cy-dialog_content {
-    width: var(--cy-dialog-width);
-    min-height: 200px;
-    border-radius: 15px;
-    background: white;
-    margin: 10% auto auto;
-
-    .cy-dialog_root {
-      width: 100%;
-      height: 100%;
-
-      header {
-        padding: 10px 16px;
-        text-align: center;
-        cursor: move;
-        user-select: none;
-        border-bottom: 1px solid #0a84fd;
-        box-sizing: border-box;
-      }
-
-      .cy-dialog_body {
-        box-sizing: border-box;
-        padding: 10px 16px;
-      }
-
-    }
-  }
-
-}
-</style>

+ 1 - 0
src/components/query-components/XcQuery.vue

@@ -67,6 +67,7 @@ const emits = defineEmits([
   'clickQuery'
 ])
 
+
 const formRef = ref<FormInstance | null>(null)
 const rules = ref<FormRules>({})
 const divRef = ref<HTMLHtmlElement>()

+ 65 - 32
src/components/xiao-chan/combo-grid/XcComboGridV2.vue

@@ -3,6 +3,8 @@ import {computed, nextTick, onMounted, ref, watch} from "vue";
 import XEUtils from 'xe-utils'
 import {useVModels} from "@vueuse/core";
 import {VxeTableInstance} from "vxe-table";
+import DomZIndex from 'dom-zindex'
+import {useZIndex} from "element-plus";
 
 const props = defineProps({
   modelValue: {
@@ -58,6 +60,10 @@ const props = defineProps({
   rowClickHide: {
     type: Boolean,
     default: true
+  },
+  transfer: {
+    type: Boolean,
+    default: true
   }
 });
 
@@ -67,7 +73,7 @@ const emits = defineEmits([
   'clear',
   'focus',
   'blur',
-  'update:model-value',
+  'update:modelValue',
   'update:data'
 ])
 
@@ -133,10 +139,18 @@ const notNullAndLike = (data: any, keyName: Array<string>, likeValue: string) =>
   return false
 }
 
-const change = XEUtils.debounce(async (value) => {
+async function showPanel() {
+  await pullDownRef.value.showPanel()
+}
+
+async function togglePanel() {
+  await pullDownRef.value.togglePanel()
+}
+
+const change: (val: string) => void = XEUtils.debounce(async (value) => {
   if (props.disabled) return
   emits('input', value)
-  await pullDownRef.value.showPanel()
+  await showPanel()
   if (XEUtils.isEmpty(value)) return
   if (props.filterable) {
     return
@@ -158,7 +172,7 @@ const change = XEUtils.debounce(async (value) => {
     }
   } catch {
   }
-  await pullDownRef.value.showPanel()
+  await showPanel()
   currentIndex.value = -1
 }, 500)
 
@@ -191,7 +205,7 @@ const rowClick = (val) => {
 }
 
 const inputClick = async () => {
-  await pullDownRef.value.togglePanel()
+  await togglePanel()
   if (props.select) {
     await vxeTableRef.value.setCurrentRow(theRowIsCurrentlySelected.value.row)
     await vxeTableRef.value.scrollToRow(theRowIsCurrentlySelected.value.row)
@@ -232,6 +246,7 @@ const handleBlur = () => {
       inputData.value = <string>props.modelValue;
     }
   }
+
 }
 
 const keyUp = () => {
@@ -267,7 +282,7 @@ const enterToSelect = () => {
   if (pullDownRef.value.isPanelVisible()) {
     let temp = vxeTableRef.value.getCurrentRecord()
     if (!temp) {
-      pullDownRef.value.togglePanel()
+      togglePanel()
     } else {
       rowClick({
         row: temp,
@@ -275,7 +290,7 @@ const enterToSelect = () => {
       })
     }
   } else {
-    pullDownRef.value.showPanel()
+    showPanel()
     handleFocus()
     vxeTableRef.value.scrollToRow(theRowIsCurrentlySelected.value.row)
   }
@@ -368,8 +383,9 @@ onMounted(async () => {
 
 <template>
   <vxe-pulldown
-      v-model="isShow"
-      ref="pullDownRef" transfer>
+      popup-class-name="vxe_pull_down-box"
+      ref="pullDownRef"
+      transfer>
     <template #default>
       <el-input v-model="inputData"
                 :title="isObj ? props.modelValue[modName] : props.modelValue"
@@ -390,32 +406,49 @@ onMounted(async () => {
                 @focus="handleFocus"/>
     </template>
     <template #dropdown>
-      <div style="z-index: 9999999999">
-        <vxe-table
-            ref="vxeTableRef"
-            :height="200"
-            @scroll="scroll"
-            border
-            :scroll-x="{gt: 0,enabled: false}"
-            :scroll-y="{gt: 0 ,enabled: true}"
-            :column-config="{resizable: true}"
-            :row-config="{ height: 24,isCurrent: true,isHover:true }"
-            class="vxe-padding_zero vxe-header-max_content hl-style vxe-scroll_15"
-            header-row-class-name="padding_zero "
-            @cell-click="rowClick"
-            show-header-overflow
-            show-overflow
-            :data="computedData">
-          <vxe-column v-for="item in tableHeader"
-                      :title="item.title ? item.title : item.label "
-                      :field="item.field ? item.field : item.prop"
-                      :width="item.width"/>
-          <slot/>
-        </vxe-table>
-      </div>
+      <vxe-table
+          ref="vxeTableRef"
+          :max-height="200"
+          @scroll="scroll"
+          border
+          :scroll-y="{gt: 0 ,enabled: true}"
+          :column-config="{resizable: true}"
+          :row-config="{ height: 24,isCurrent: true,isHover:true }"
+          class="xc_combo_grid"
+          @cell-click="rowClick"
+          show-header-overflow
+          show-overflow
+          show-footer-overflow
+          :data="computedData">
+        <vxe-column v-for="item in tableHeader"
+                    :title="item.title ? item.title : item.label "
+                    :field="item.field ? item.field : item.prop"
+                    :width="item.width"/>
+        <slot/>
+      </vxe-table>
     </template>
   </vxe-pulldown>
 </template>
 
 <style lang="scss">
+.xc_combo_grid {
+  --vxe-table-column-padding-default: 5px 0;
+  --vxe-table-row-height-default: max-content;
+  --vxe-table-cell-padding-left: 5px;
+  --vxe-table-cell-padding-right: 5px;
+
+  .vxe-table--body-wrapper {
+    &::-webkit-scrollbar {
+      width: 18px !important;
+    }
+  }
+}
+
+.vxe_pull_down-box {
+  padding: 5px;
+  background: var(--el-bg-color-overlay);
+  border: 1px solid var(--el-border-color-light);
+  box-shadow: var(--el-box-shadow-light);
+  border-radius: var(--el-border-radius-base);
+}
 </style>

+ 4 - 4
src/data/operation.ts

@@ -6,8 +6,8 @@ export const surgicalSituation = [
 
 
 export const shouShuDengJi = [
-    {code: '1', name: '四级', value: 4},
-    {code: '2', name: '三级', value: 3},
-    {code: '3', name: '二级', value: 2},
-    {code: '4', name: '一级', value: 1},
+    {code: '4', name: '四级', value: 4},
+    {code: '3', name: '三级', value: 3},
+    {code: '2', name: '二级', value: 2},
+    {code: '1', name: '一级', value: 1},
 ]

+ 11 - 2
src/main.js

@@ -18,6 +18,15 @@ import print from 'vue3-print-nb'
 import VElBtn from "@/directives/v-el-btn";
 import VTitle from "@/directives/v-title";
 import "driver.js/dist/driver.css";
+import DomZIndex from 'dom-zindex'
+
+DomZIndex.getNext = () => {
+    return useZIndex().nextZIndex()
+}
+
+DomZIndex.getCurrent = () => {
+    return useZIndex().currentZIndex.value
+}
 
 addRoutes()
 
@@ -28,8 +37,8 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
 
 VXETable.config({
     version: 0,
-    zIndex: 99999,
-    table : {
+    // zIndex: 99999,
+    table: {
         autoResize: true
     }
 })

+ 6 - 1
src/router/modules/dashboard.js

@@ -880,6 +880,11 @@ const route = [
                 component: createNameComponent(() => import('@/views/utilities/page-editor-help/PageEditorHelp.vue')),
                 meta: {title: '页面编辑'}
             },
+            {
+                path: 'pageEditorHelpV2',
+                component: createNameComponent(() => import('@/views/utilities/page-editor-help-v2/src/PageEditorHelpV2.vue')),
+                meta: {title: '页面编辑'}
+            },
             {
                 path: 'knowledgeBase',
                 component: createNameComponent(() => import('@/views/utilities/KnowledgeBase.vue')),
@@ -1052,7 +1057,7 @@ const route = [
                 path: 'medicaManagement/yzCheck',
                 component: createNameComponent(() => import('@/views/medical-advice/advice-management/YzCheck.vue')),
                 meta: {title: '医嘱核对'},
-            },{
+            }, {
                 path: 'patientInfo/addBabyInfo',
                 component: createNameComponent(() => import('@/views/medical-advice/patient-info/AddBabyInfo.vue')),
                 meta: {title: '增加婴儿信息'},

+ 18 - 0
src/utils/arr-length.ts

@@ -0,0 +1,18 @@
+import {unref} from "vue";
+
+const ArrIndexLength = {
+    add: function (arr: any[], index: number) {
+        index += 1;
+        const length = unref(arr).length;
+        index = index >= length ? 0 : index
+        return index
+    },
+    sub: function (arr: any[], index: number) {
+        index -= 1;
+        const length = unref(arr).length;
+        index = index < 0 ? length - 1 : index
+        return index
+    }
+}
+
+export default ArrIndexLength;

+ 2 - 2
src/views/data-base/DataBase.vue

@@ -11,8 +11,8 @@ import DataBaseDialog from "@/views/data-base/components/DataBaseDialog.vue";
 
 const iframe = ref<HTMLIFrameElement>()
 // @ts-ignore
-const src = import.meta.env.VITE_DATA_BASE + '/magic/web/index.html'
-// const src = 'http://192.168.56.1:8991'
+// const src = import.meta.env.VITE_DATA_BASE + '/magic/web/index.html'
+const src = 'http://192.168.56.1:8991'
 // const src = 'http://172.16.32.160:9205/magic/web/index.html'
 const func = {
   'user': user

+ 8 - 0
src/views/data-base/src/data-base-api.ts

@@ -46,3 +46,11 @@ export function getApiListByCodeName(codeName) {
         params: {codeName}
     })
 }
+
+export function saveApi(data) {
+    return request<string[]>({
+        method: 'post',
+        url: '/magic/web/resource/folder/save',
+        data
+    })
+}

+ 8 - 8
src/views/surgical-management/SurgeryArrangement.vue

@@ -137,10 +137,10 @@
           <template #default="scope">
             <div v-if="scope.row.status === 'd'">{{ filterOpScale(scope.row.opScale) }}</div>
             <el-select v-else v-model="scope.row.opScale" placeholder=" ">
-              <el-option label="一级手术" value="4"></el-option>
-              <el-option label="二级手术" value="3"></el-option>
-              <el-option label="三级手术" value="2"></el-option>
-              <el-option label="四级手术" value="1"></el-option>
+              <el-option label="一级手术" value="1"></el-option>
+              <el-option label="二级手术" value="2"></el-option>
+              <el-option label="三级手术" value="3"></el-option>
+              <el-option label="四级手术" value="4"></el-option>
             </el-select>
           </template>
         </el-table-column>
@@ -544,13 +544,13 @@ const filterTwFlag = (flag) => {
 
 const filterOpScale = (scale) => {
   switch (scale) {
-    case '1':
+    case '4':
       return '四级手术';
-    case '2':
-      return '三级手术';
     case '3':
+      return '三级手术';
+    case '2':
       return '二级手术'
-    case '4':
+    case '1':
       return '一级手术';
     default:
       return '';

+ 35 - 0
src/views/utilities/page-editor-help-v2/components/MagicIframeEditor.vue

@@ -0,0 +1,35 @@
+<script setup lang="ts">
+// const src = import.meta.env.VITE_DATA_BASE + '/magic/web/index.html'
+import {nextTick, onMounted, ref} from "vue";
+import {userInfoStore} from "@/utils/store-public";
+
+const iframe = ref<HTMLIFrameElement>()
+const src = 'http://192.168.56.1:8991'
+
+// const src = 'http://172.16.32.160:9205/magic/web/index.html'
+
+function sendMessage(name: string, value: any) {
+  const data = {
+    name,
+    ...value
+  }
+  iframe.value.contentWindow.postMessage(JSON.stringify(data), '*')
+}
+
+onMounted(async () => {
+  await nextTick()
+  iframe.value.onload = () => {
+    sendMessage('setToken', {token: userInfoStore.value.token})
+    sendMessage('showOnlyTheEditor', {value: true})
+  }
+})
+</script>
+
+<template>
+  <iframe :src="src" width="100%" height="100%" style="border: 0"
+          ref="iframe"/>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 41 - 0
src/views/utilities/page-editor-help-v2/components/left-sidebar/PageHelpLeftSidebar.vue

@@ -0,0 +1,41 @@
+<script setup lang="ts">
+import {computed, ref} from "vue";
+
+const props = defineProps<{
+  height: any
+}>()
+
+const headerHeight = 30
+const padding = 25
+const headerMargin = 5
+
+const maxHeight = computed(() => {
+  return {
+    height: props.height - headerHeight - padding - headerMargin + 'px',
+    overflow: 'auto'
+  }
+})
+
+const tabsName = ref('tree')
+</script>
+
+<template>
+  <el-tabs class="small_tabs padding_zero"
+           v-model="tabsName"
+           type="border-card">
+    <el-tab-pane name="tree" label="报表">
+      <div :style="maxHeight">
+
+      </div>
+    </el-tab-pane>
+    <el-tab-pane name="component" label="组件">
+      <div :style="maxHeight">
+
+      </div>
+    </el-tab-pane>
+  </el-tabs>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 11 - 0
src/views/utilities/page-editor-help-v2/components/left-sidebar/PageTree.vue

@@ -0,0 +1,11 @@
+<script setup lang="ts">
+
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 32 - 0
src/views/utilities/page-editor-help-v2/src/PageEditorHelpV2.vue

@@ -0,0 +1,32 @@
+<script setup lang="ts">
+import MagicIframeEditor from "@/views/utilities/page-editor-help-v2/components/MagicIframeEditor.vue";
+import CyAutoSize from "@/components/cy/auto-size/cy-auto-size.vue";
+import PageHelpLeftSidebar from "@/views/utilities/page-editor-help-v2/components/left-sidebar/PageHelpLeftSidebar.vue";
+</script>
+
+<template>
+  <cy-auto-size>
+    <template #default="{width , height}">
+      <div class="page_help_container">
+        <div class="page_help_left-sidebar">
+          <PageHelpLeftSidebar :height="height"/>
+        </div>
+        <div></div>
+      </div>
+    </template>
+  </cy-auto-size>
+  <!--  <MagicIframeEditor/>-->
+</template>
+
+<style scoped lang="scss">
+.page_help_container {
+  width: 100%;
+  height: 100%;
+  display: flex;
+
+  .page_help_left-sidebar {
+    width: 300px;
+  }
+}
+
+</style>

+ 0 - 1
src/views/utilities/page-editor-help/components/BuiltInComponents.vue

@@ -89,7 +89,6 @@ const addEl = (data) => {
   pageJson.value.queryParam[key] = data.data.defaultValue
 }
 
-
 </script>
 
 <template>