hongrunxia 1 рік тому
батько
коміт
af7175f4ab
43 змінених файлів з 1753 додано та 298 видалено
  1. 1 1
      .env.production
  2. 1 0
      public/js/config.js
  3. 10 5
      src/components/Form/src/BasicForm.vue
  4. 20 1
      src/components/Form/src/jeecg/components/MTreeSelect.vue
  5. 14 1
      src/components/Table/src/BasicTable.vue
  6. 16 3
      src/components/Table/src/hooks/usePagination.tsx
  7. 1 0
      src/components/jeecg/JVxeTable/src/hooks/useColumns.ts
  8. 7 0
      src/design/ant/pagination.less
  9. 8 2
      src/design/vent/index.less
  10. 1 1
      src/layouts/default/header/index.vue
  11. 0 1
      src/utils/threejs/useThree.ts
  12. 1 1
      src/utils/ui.js
  13. 2 1
      src/utils/ventutil.ts
  14. 1 1
      src/views/dashboard/Analysis/homePage/workerFace.vue
  15. 165 0
      src/views/system/loginmini/MiniCodelogin.vue
  16. 282 0
      src/views/system/loginmini/MiniForgotpad.vue
  17. 559 0
      src/views/system/loginmini/MiniLogin.vue
  18. 266 0
      src/views/system/loginmini/MiniRegister.vue
  19. 87 0
      src/views/system/loginmini/OAuth2Login.vue
  20. 5 52
      src/views/vent/deviceManager/comment/warningTabel/BaseModal.vue
  21. 15 2
      src/views/vent/deviceManager/comment/warningTabel/index2.vue
  22. 53 69
      src/views/vent/deviceManager/comment/warningTabel/index3.vue
  23. 11 0
      src/views/vent/deviceManager/comment/warningTabel/warning.data.ts
  24. 1 0
      src/views/vent/deviceManager/deviceTable/device.data.ts
  25. 1 1
      src/views/vent/deviceManager/equipManager/component/normalBtnTable.vue
  26. 3 1
      src/views/vent/home/colliery/index.vue
  27. 5 3
      src/views/vent/monitorManager/camera/index.vue
  28. 27 3
      src/views/vent/monitorManager/comment/GroupMonitorTable.vue
  29. 14 9
      src/views/vent/monitorManager/comment/HistoryTable.vue
  30. 6 1
      src/views/vent/monitorManager/comment/MonitorTable.vue
  31. 2 0
      src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts
  32. 17 9
      src/views/vent/monitorManager/deviceMonitor/components/device/index.vue
  33. 1 1
      src/views/vent/monitorManager/fanLocalMonitor/index.vue
  34. 10 6
      src/views/vent/monitorManager/gateMonitor/index.vue
  35. 1 1
      src/views/vent/monitorManager/mainFanMonitor/index.vue
  36. 9 5
      src/views/vent/monitorManager/obfurage1Monitor/index.vue
  37. 1 1
      src/views/vent/monitorManager/safetyMonitor/index.vue
  38. 99 99
      src/views/vent/monitorManager/sensorMonitor/index.vue
  39. 12 6
      src/views/vent/monitorManager/windowMonitor/index.vue
  40. 1 1
      src/views/vent/monitorManager/windowMonitor/window.threejs.ts
  41. 10 5
      src/views/vent/monitorManager/windrectMonitor/index.vue
  42. 3 1
      src/views/vent/performance/fileDetail/index.vue
  43. 4 4
      vite.config.ts

+ 1 - 1
.env.production

@@ -5,7 +5,7 @@ VITE_USE_MOCK = true
 VITE_PUBLIC_PATH = /
 
 # 控制台不输出
-VITE_DROP_CONSOLE = false
+VITE_DROP_CONSOLE = true
 
 # 是否启用gzip或brotli压缩
 # 选项值: gzip | brotli | none

+ 1 - 0
public/js/config.js

@@ -1,4 +1,5 @@
 const VUE_APP_URL = {
+  // baseUrl: "http://182.92.126.35:9999", // 后台地址
   baseUrl: "http://182.92.126.35:9999", // 后台地址
   webRtcUrl: '//192.168.183.216:8000' // rtsp服务器IP地址
 }

+ 10 - 5
src/components/Form/src/BasicForm.vue

@@ -335,7 +335,6 @@
   @prefix-cls: ~'@{namespace}-basic-form';
   @ventSpace: zxm;
 
-
   .@{prefix-cls} {
     .@{ventSpace}-form-item {
       &-label label::after {
@@ -396,9 +395,15 @@
       }
     }
   }
-  :deep(.@{ventSpace}-select-dropdown) {
-    left: 0px !important;
-    top: 34px !important;
-    background: #ffffff !important;
+  .vent-form{
+    :deep(.@{ventSpace}-select-dropdown) {
+      left: 0px !important;
+      top: 34px !important;
+      background: #ffffff !important;
+      .@{ventSpace}-select-item{
+        color: #000 !important;
+      }
+    }
   }
+  
 </style>

+ 20 - 1
src/components/Form/src/jeecg/components/MTreeSelect.vue

@@ -1,5 +1,6 @@
 <template>
   <a-tree-select
+    class="tree-select"
     allowClear
     style="width: 100%"
     :multiple = "multiple"
@@ -182,4 +183,22 @@ import { onMounted, nextTick } from 'vue';
   })
 </script>
 
-<style lang="less"></style>
+<style lang="less" scoped>
+  @ventSpace: zxm;
+  :deep(.@{ventSpace}-select-dropdown) {
+    .zxm-select-tree{
+      // border-bottom: 1px solid #ececec66;
+      // background: transparent !important;
+      border: 1px solid #ececec66;
+      // background: transparent !important;
+      // backdrop-filter: blur(50px) !important;
+      .@{ventSpace}-select-tree-treenode{
+        color: black !important;
+      }
+      .@{ventSpace}-select-tree-switcher-icon{
+        color: black !important;
+      }
+    }
+    
+  }
+</style>

+ 14 - 1
src/components/Table/src/BasicTable.vue

@@ -8,6 +8,7 @@
       @register="registerForm"
       @submit="handleSearchInfoChange"
       @advanced-change="redoHeight"
+      class="table-form"
     >
       <template #[replaceFormSlotKey(item)]="data" v-for="item in getFormSlotKeys">
         <slot :name="item" v-bind="data || {}"></slot>
@@ -458,7 +459,19 @@
       }
     }
   }
-
+  .@{prefix-cls}{
+    :deep(.vent-form){
+      .@{ventSpace}-select-dropdown {
+        left: 0px !important;
+        top: 34px !important;
+        // background: #ffffff !important;
+        background: transparent !important;
+        backdrop-filter: blur(50px);
+        color: #fff !important;
+      }
+    }
+  }
+  
   .@{prefix-cls} {
     max-width: 100%;
 

+ 16 - 3
src/components/Table/src/hooks/usePagination.tsx

@@ -24,7 +24,7 @@ function itemRender({ page, type, originalElement }: ItemRender) {
 
 export function usePagination(refProps: ComputedRef<BasicTableProps>) {
   const { t } = useI18n();
-
+  
   const configRef = ref<PaginationProps>({});
   const show = ref(true);
 
@@ -35,6 +35,19 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) {
         configRef.value = {
           ...unref(configRef),
           ...(pagination ?? {}),
+          selectComponentClass: () => <Select
+            defaultValue = {configRef.value.pageSize}
+            options={
+              [
+                {label: '10条每页', value: 10},
+                {label: '30条每页', value: 30},
+                {label: '50条每页', value: 50},
+                {label: '100条每页', value: 100},
+              ]
+            }
+            style='width: 100px; margin-right: 10px;'
+            onChange={ updataPageSize }
+          ></Select>,
         };
       }
     }
@@ -65,8 +78,9 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) {
     const paginationInfo = unref(getPaginationInfo);
     configRef.value = {
       ...(!isBoolean(paginationInfo) ? paginationInfo : {}),
+      ...info,
       selectComponentClass: () => <Select
-        defaultValue = { () =>configRef.value.pageSize }
+        defaultValue = { configRef.value.pageSize }
         options={
           [
             {label: '10条每页', value: 10},
@@ -78,7 +92,6 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) {
         style='width: 100px; margin-right: 10px;'
         onChange={ updataPageSize }
       ></Select>,
-      ...info,
     };
   }
 

+ 1 - 0
src/components/jeecg/JVxeTable/src/hooks/useColumns.ts

@@ -148,6 +148,7 @@ function handleSelectionColumn({ props, data, col, columns }: HandleArgs) {
     if (data.statistics.has && !props.rowExpand && !props.dragSort) {
       width = 60;
     }
+
     let column = {
       type: props.rowSelectionType,
       width: width,

+ 7 - 0
src/design/ant/pagination.less

@@ -29,6 +29,10 @@ html[data-theme='dark'] {
 }
 
 .@{ventSpace}-pagination {
+    margin-right: 20px !important;
+    margin-top: 5px !important;
+    display: flex;
+    align-items: center;
   &.mini {
     .@{ventSpace}-pagination-prev,
     .@{ventSpace}-pagination-next {
@@ -78,6 +82,9 @@ html[data-theme='dark'] {
 
     .@{ventSpace}-pagination-options {
       margin-left: 12px;
+      .@{ventSpace}-select-selector{
+        // height: 25px !important;
+      }
     }
 
     .@{ventSpace}-pagination-options-quick-jumper input {

+ 8 - 2
src/design/vent/index.less

@@ -147,9 +147,15 @@
       // border-bottom: 1px solid #ececec66;
       // background: transparent !important;
       border: 1px solid #ececec66;
-      background: #ffffff !important;
-      // left: 0px !important;
+      // background: #ffffff !important;
+      // // left: 0px !important;
+      // backdrop-filter: blur(50px);
+      // color: #fff !important;
+      // background: transparent !important;
       backdrop-filter: blur(50px);
+      .@{ventSpace}-select-item{
+        color: #fff !important;
+      }
 
       .@{ventSpace}-select-item-option-selected,
       .@{ventSpace}-select-item-option-active {

+ 1 - 1
src/layouts/default/header/index.vue

@@ -38,7 +38,7 @@
       </div>
     </div>
   </Header>
-  <div v-else :class="`${prefixCls}-action`"  style="position: fixed; top: 30px; right: 20px; z-index: 999;">
+  <div v-else-if="!currentRoute.path.startsWith('/micro-need-air')" :class="`${prefixCls}-action`"  style="position: fixed; top: 30px; right: 20px; z-index: 999;">
     <div class="right-position">
       <UserDropDown :theme="getHeaderTheme" />
     </div>

+ 0 - 1
src/utils/threejs/useThree.ts

@@ -460,7 +460,6 @@ class UseThree {
       // 刷新相机矩阵
       this.camera?.updateProjectionMatrix();
     }
-    linkState;
     // 设置场景尺寸
     this.renderer?.setSize(this.canvasContainer.clientWidth, this.canvasContainer.clientHeight);
     this.css3dRender?.setSize(this.canvasContainer.clientWidth, this.canvasContainer.clientHeight);

+ 1 - 1
src/utils/ui.js

@@ -77,5 +77,5 @@ export function rainBg(className, bgClassName) {
 export const getAssetURL = (image) => {
   // 参数一: 相对路径
   // 参数二: 当前路径的URL
-  return new URL(`/src/assets/images/${image}`, import.meta.url).href
+  return new URL(`../assets/images/${image}`, import.meta.url).href
 }

+ 2 - 1
src/utils/ventutil.ts

@@ -49,7 +49,6 @@ export function cameraInit(dom, rtspUrl) {
   return { webRtcServer };
 }
 
-
 // 模型监测加载视频
 export function deviceCameraInit(cameraAddrs, player: HTMLElement, webRtcServerList: any[] = []) {
   const playerDoms: (HTMLVideoElement | undefined | null)[] = [];
@@ -79,6 +78,7 @@ export function deviceCameraInit(cameraAddrs, player: HTMLElement, webRtcServerL
               if (server) {
                 try {
                   const videoElement = server.videoElement as HTMLVideoElement;
+                  videoElement.volume = 0;
                   const cameraNameDom = videoElement.parentElement?.getElementsByClassName('video-name')[0];
                   if (cameraNameDom) cameraNameDom.innerText = cameraUrl.name;
                   playerDoms.unshift(videoElement);
@@ -94,6 +94,7 @@ export function deviceCameraInit(cameraAddrs, player: HTMLElement, webRtcServerL
                 const videoParentDom: HTMLElement = document.createElement('div');
                 videoParentDom.setAttribute('class', 'video-parent');
                 const videoDom: HTMLVideoElement = document.createElement('video');
+                videoDom.volume = 0;
                 videoDom.setAttribute('class', 'rtspVideo');
                 videoDom.setAttribute('muted', 'muted');
                 videoDom.setAttribute('poster', '/src/assets/images/vent/noSinge.png');

+ 1 - 1
src/views/dashboard/Analysis/homePage/workerFace.vue

@@ -108,7 +108,7 @@
               :dataSource="deviceMonitorData"
               title="风门监测"
               :isShowSelect="false"
-              :isShowPagination="false"
+              :isShowPagination="true"
               :isShowActionColumn="true"
               :scroll="{ y: 160 }"
             >

+ 165 - 0
src/views/system/loginmini/MiniCodelogin.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="aui-content">
+    <div class="aui-container">
+      <div class="aui-form">
+        <div class="aui-image">
+          <div class="aui-image-text">
+            <img :src="adTextImg" alt="" />
+          </div>
+        </div>
+        <div class="aui-formBox aui-formEwm">
+          <div class="aui-formWell">
+            <form>
+              <div class="aui-flex aui-form-nav investment_title" style="padding-bottom: 19px">
+                <div class="aui-flex-box activeNav">{{t('sys.login.qrSignInFormTitle')}}</div>
+              </div>
+              <div class="aui-form-box">
+                <div class="aui-account" style="padding: 30px 0">
+                  <div class="aui-ewm">
+                    <QrCode :value="qrCodeUrl" class="enter-x flex justify-center xl:justify-start" :width="280" />
+                  </div>
+                </div>
+              </div>
+              <div class="aui-formButton">
+                <a class="aui-linek-code aui-link-register" @click="goBackHandleClick">{{t('sys.login.backSignIn')}}</a>
+              </div>
+            </form>
+          </div>
+          <div class="aui-flex aui-third-text">
+            <div class="aui-flex-box aui-third-border">
+              <span>{{ t('sys.login.otherSignIn') }}</span>
+            </div>
+          </div>
+          <div class="aui-flex" :class="`${prefixCls}-sign-in-way`">
+            <div class="aui-flex-box">
+              <div class="aui-third-login">
+                <a href="" title="github" @click="onThirdLogin('github')"><GithubFilled /></a>
+              </div>
+            </div>
+            <div class="aui-flex-box">
+              <div class="aui-third-login">
+                <a href="" title="企业微信" @click="onThirdLogin('wechat_enterprise')"><icon-font class="item-icon" type="icon-qiyeweixin3" /></a>
+              </div>
+            </div>
+            <div class="aui-flex-box">
+              <div class="aui-third-login">
+                <a href="" title="钉钉" @click="onThirdLogin('dingtalk')"><DingtalkCircleFilled /></a>
+              </div>
+            </div>
+            <div class="aui-flex-box">
+              <div class="aui-third-login">
+                <a href="" title="微信" @click="onThirdLogin('wechat_open')"><WechatFilled /></a>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <!-- 第三方登录相关弹框 -->
+  <ThirdModal ref="thirdModalRef"></ThirdModal>
+</template>
+
+<script lang="ts" setup name="mini-code-login">
+  import { ref, onUnmounted } from 'vue';
+  import { getLoginQrcode, getQrcodeToken } from '/@/api/sys/user';
+  import { useUserStore } from '/@/store/modules/user';
+  import { QrCode } from '/@/components/Qrcode/index';
+  import ThirdModal from '/@/views/sys/login/ThirdModal.vue';
+  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';
+  import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { GithubFilled, WechatFilled, DingtalkCircleFilled, createFromIconfontCN } from '@ant-design/icons-vue';
+
+  const IconFont = createFromIconfontCN({
+    scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',
+  });
+  const { prefixCls } = useDesign('minilogin');
+  const { t } = useI18n();
+  const qrCodeUrl = ref<string>('');
+  let timer: IntervalHandle;
+  const state = ref('0');
+  const thirdModalRef = ref();
+  const userStore = useUserStore();
+  const emit = defineEmits(['go-back', 'success', 'register']);
+
+  //加载二维码信息
+  function loadQrCode() {
+    state.value = '0';
+    getLoginQrcode().then((res) => {
+      qrCodeUrl.value = res.qrcodeId;
+      if (res.qrcodeId) {
+        openTimer(res.qrcodeId);
+      }
+    });
+  }
+  //监控扫码状态
+  function watchQrcodeToken(qrcodeId) {
+    getQrcodeToken({ qrcodeId: qrcodeId }).then((res) => {
+      let token = res.token;
+      if (token == '-2') {
+        //二维码过期重新获取
+        loadQrCode();
+        clearInterval(timer);
+      }
+      //扫码成功
+      if (res.success) {
+        state.value = '2';
+        clearInterval(timer);
+        setTimeout(() => {
+          userStore.qrCodeLogin(token);
+        }, 500);
+      }
+    });
+  }
+
+  /** 开启定时器 */
+  function openTimer(qrcodeId) {
+    watchQrcodeToken(qrcodeId);
+    closeTimer();
+    timer = setInterval(() => {
+      watchQrcodeToken(qrcodeId);
+    }, 1500);
+  }
+
+  /** 关闭定时器 */
+  function closeTimer() {
+    if (timer) clearInterval(timer);
+  }
+
+  /**
+   * 第三方登录
+   * @param type
+   */
+  function onThirdLogin(type) {
+    thirdModalRef.value.onThirdLogin(type);
+  }
+
+  /**
+   * 初始化表单
+   */
+  function initFrom() {
+    loadQrCode();
+  }
+
+  /**
+   * 返回
+   */
+  function goBackHandleClick() {
+    emit('go-back');
+    closeTimer();
+  }
+
+  onUnmounted(() => {
+    closeTimer();
+  });
+
+  defineExpose({
+    initFrom,
+  });
+</script>
+<style lang="less" scoped>
+@import '/@/assets/loginmini/style/home.less';
+@import '/@/assets/loginmini/style/base.less';
+</style>

+ 282 - 0
src/views/system/loginmini/MiniForgotpad.vue

@@ -0,0 +1,282 @@
+<template>
+  <div class="aui-content">
+    <div class="aui-container">
+      <div class="aui-form">
+        <div class="aui-image">
+          <div class="aui-image-text">
+            <img :src="adTextImg" alt="" />
+          </div>
+        </div>
+        <div class="aui-formBox">
+          <div class="aui-formWell">
+            <div class="aui-step-box">
+              <div class="aui-step-item" :class="activeKey === 1 ? 'activeStep' : ''">
+                <div class="aui-step-tags">
+                  <em>1</em>
+                  <p>{{t('sys.login.authentication')}}</p>
+                </div>
+              </div>
+              <div class="aui-step-item" :class="activeKey === 2 ? 'activeStep' : ''">
+                <div class="aui-step-tags">
+                  <em>2</em>
+                  <p>{{t('sys.login.resetLoginPassword')}}</p>
+                </div>
+              </div>
+              <div class="aui-step-item" :class="activeKey === 3 ? 'activeStep' : ''">
+                <div class="aui-step-tags">
+                  <em>3</em>
+                  <p>{{t('sys.login.resetSuccess')}}</p>
+                </div>
+              </div>
+            </div>
+            <div class="" style="height: 230px; position: relative">
+              <a-form ref="formRef" :model="formData" v-if="activeKey === 1">
+                <!-- 身份验证 begin -->
+                <div class="aui-account aui-account-line aui-forgot">
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <a-input type="text" :placeholder="t('sys.login.mobile')" v-model:value="formData.mobile" />
+                    </div>
+                  </a-form-item>
+                  <div class="aui-input-line">
+                    <a-form-item>
+                      <a-input type="text" :placeholder="t('sys.login.smsCode')" v-model:value="formData.smscode" />
+                    </a-form-item>
+                    <div v-if="showInterval" class="aui-code-line" @click="getLoginCode">{{t('component.countdown.normalText')}}</div>
+                    <div v-else class="aui-code-line">{{t('component.countdown.sendText',[unref(timeRuning)])}}</div>
+                  </div>
+                </div>
+                <!-- 身份验证 end -->
+              </a-form>
+              <a-form ref="pwdFormRef" :model="pwdFormData" v-else-if="activeKey === 2">
+                <!-- 重置密码 begin -->
+                <div class="aui-account aui-account-line aui-forgot">
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <a-input type="password" :placeholder="t('sys.login.passwordPlaceholder')" v-model:value="pwdFormData.password" />
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <a-input type="password" :placeholder="t('sys.login.confirmPassword')" v-model:value="pwdFormData.confirmPassword" />
+                    </div>
+                  </a-form-item>
+                </div>
+                <!-- 重置密码 end -->
+              </a-form>
+                <!-- 重置成功 begin -->
+                <div class="aui-success" v-else>
+                  <div class="aui-success-icon">
+                    <img :src="successImg"/>
+                  </div>
+                  <h3>恭喜您,重置密码成功!</h3>
+                </div>
+                <!-- 重置成功 end -->
+            </div>
+            <div class="aui-formButton" style="padding-bottom: 40px">
+              <div class="aui-flex" v-if="activeKey === 1 || activeKey === 2">
+                <a class="aui-link-login aui-flex-box" @click="nextStepClick">{{t('sys.login.nextStep')}}</a>
+              </div>
+              <div class="aui-flex" v-else>
+                <a class="aui-linek-code aui-flex-box" @click="toLogin">{{t('sys.login.goToLogin')}}</a>
+              </div>
+              <div class="aui-flex">
+                <a class="aui-linek-code aui-flex-box" @click="goBack"> {{ t('sys.login.backSignIn') }}</a>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script lang="ts" name="mini-forgotpad" setup>
+  import { reactive, ref, toRaw, unref } from 'vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { SmsEnum, useFormRules, useFormValid, useLoginState } from '/@/views/sys/login/useLogin';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { getCaptcha, passwordChange, phoneVerify } from '/@/api/sys/user';
+  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png'
+  import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png'
+  import successImg from '/@/assets/loginmini/icon/icon-success.png'
+
+  //下一步控制
+  const activeKey = ref<number>(1);
+  const { t } = useI18n();
+  const { handleBackLogin } = useLoginState();
+  const { notification, createMessage, createErrorModal } = useMessage();
+  //是否显示获取验证码
+  const showInterval = ref<boolean>(true);
+  //60s
+  const timeRuning = ref<number>(60);
+  //定时器
+  const timer = ref<any>(null);
+  const formRef = ref();
+  const pwdFormRef = ref();
+  //账号数据
+  const accountInfo = reactive<any>({});
+  //手机号表单
+  const formData = reactive({
+    mobile: '',
+    smscode: '',
+  });
+  //密码表单
+  const pwdFormData = reactive<any>({
+    password: '',
+    confirmPassword: '',
+  });
+  const emit = defineEmits(['go-back', 'success', 'register']);
+
+  /**
+   * 下一步
+   */
+  async function handleNext() {
+    if (!formData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    if (!formData.smscode) {
+      createMessage.warn(t('sys.login.smsPlaceholder'));
+      return;
+    }
+    const resultInfo = await phoneVerify(
+      toRaw({
+        phone: formData.mobile,
+        smscode: formData.smscode,
+      })
+    );
+    if (resultInfo.success) {
+      Object.assign(accountInfo, {
+        username: resultInfo.result.username,
+        phone: formData.mobile,
+        smscode: formData.smscode,
+      });
+      activeKey.value = 2;
+      setTimeout(()=>{
+        pwdFormRef.value.resetFields();
+      },300)
+    } else {
+      notification.error({
+        message: '错误提示',
+        description: resultInfo.message || t('sys.api.networkExceptionMsg'),
+        duration: 3,
+      });
+    }
+  }
+
+  /**
+   * 完成修改密码
+   */
+  async function finishedPwd() {
+    if (!pwdFormData.password) {
+      createMessage.warn(t('sys.login.passwordPlaceholder'));
+      return;
+    }
+    if (!pwdFormData.confirmPassword) {
+      createMessage.warn(t('sys.login.confirmPassword'));
+      return;
+    }
+    if (pwdFormData.password !== pwdFormData.confirmPassword) {
+      createMessage.warn(t('sys.login.diffPwd'));
+      return;
+    }
+    const resultInfo = await passwordChange(
+      toRaw({
+        username: accountInfo.username,
+        password: pwdFormData.password,
+        smscode: accountInfo.smscode,
+        phone: accountInfo.phone,
+      })
+    );
+    if (resultInfo.success) {
+      accountInfo.password = pwdFormData.password;
+      //修改密码
+      activeKey.value = 3;
+    } else {
+      //错误提示
+      createErrorModal({
+        title: t('sys.api.errorTip'),
+        content: resultInfo.message || t('sys.api.networkExceptionMsg'),
+      });
+    }
+  }
+  /**
+   * 下一步
+   */
+  function nextStepClick() {
+    if (unref(activeKey) == 1) {
+      handleNext();
+    } else if (unref(activeKey) == 2) {
+      finishedPwd();
+    }
+  }
+
+  /**
+   * 去登录
+   */
+  function toLogin() {
+    emit('success', { username: accountInfo.username, password: accountInfo.password });
+    initForm();
+  }
+
+  /**
+   * 返回
+   */
+  function goBack() {
+    emit('go-back');
+    initForm();
+  }
+
+  /**
+   * 获取手机验证码
+   */
+  async function getLoginCode() {
+    if (!formData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    const result = await getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.FORGET_PASSWORD });
+    if (result) {
+      const TIME_COUNT = 60;
+      if (!unref(timer)) {
+        timeRuning.value = TIME_COUNT;
+        showInterval.value = false;
+        timer.value = setInterval(() => {
+          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {
+            timeRuning.value = timeRuning.value - 1;
+          } else {
+            showInterval.value = true;
+            clearInterval(unref(timer));
+            timer.value = null;
+          }
+        }, 1000);
+      }
+    }
+  }
+
+  /**
+   * 初始化表单
+   */
+  function initForm() {
+    activeKey.value = 1;
+    Object.assign(formData, { phone: '', smscode: '' });
+    Object.assign(pwdFormData, { password: '', confirmPassword: '' });
+    Object.assign(accountInfo, {});
+    if(unref(timer)){
+      clearInterval(unref(timer));
+      timer.value = null;
+      showInterval.value = true;
+    }
+    setTimeout(()=>{
+      formRef.value.resetFields();
+    },300)
+  }
+
+  defineExpose({
+    initForm,
+  });
+</script>
+<style lang="less" scoped>
+@import '/@/assets/loginmini/style/home.less';
+@import '/@/assets/loginmini/style/base.less';
+</style>

+ 559 - 0
src/views/system/loginmini/MiniLogin.vue

@@ -0,0 +1,559 @@
+<template>
+  <div :class="prefixCls" class="login-background-img">
+    <AppLocalePicker class="absolute top-4 right-4 enter-x xl:text-gray-600" :showText="false"/>
+    <AppDarkModeToggle class="absolute top-3 right-7 enter-x" />
+    <div class="aui-logo" v-if="!getIsMobile">
+      <div>
+        <h3>
+          <img :src="logoImg" alt="jeecg" />
+        </h3>
+      </div>
+    </div>
+    <div v-else class="aui-phone-logo">
+      <img :src="logoImg" alt="jeecg" />
+    </div>
+    <div v-show="type === 'login'">
+      <div class="aui-content">
+        <div class="aui-container">
+          <div class="aui-form">
+            <div class="aui-image">
+              <div class="aui-image-text">
+                <img :src="adTextImg" />
+              </div>
+            </div>
+            <div class="aui-formBox">
+              <div class="aui-formWell">
+                <div class="aui-flex aui-form-nav investment_title">
+                  <div class="aui-flex-box" :class="activeIndex === 'accountLogin' ? 'activeNav on' : ''" @click="loginClick('accountLogin')"
+                    >{{ t('sys.login.signInFormTitle') }}
+                  </div>
+                  <div class="aui-flex-box" :class="activeIndex === 'phoneLogin' ? 'activeNav on' : ''" @click="loginClick('phoneLogin')"
+                    >{{ t('sys.login.mobileSignInFormTitle') }}
+                  </div>
+                </div>
+                <div class="aui-form-box" style="height: 180px">
+                  <a-form ref="loginRef" :model="formData" v-if="activeIndex === 'accountLogin'" @keyup.enter.native="loginHandleClick">
+                    <div class="aui-account">
+                      <div class="aui-inputClear">
+                        <i class="icon icon-code"></i>
+                        <a-form-item>
+                          <a-input class="fix-auto-fill" :placeholder="t('sys.login.userName')" v-model:value="formData.username" />
+                        </a-form-item>
+                      </div>
+                      <div class="aui-inputClear">
+                        <i class="icon icon-password"></i>
+                        <a-form-item>
+                          <a-input class="fix-auto-fill" type="password" :placeholder="t('sys.login.password')" v-model:value="formData.password" />
+                        </a-form-item>
+                      </div>
+                      <div class="aui-inputClear">
+                        <i class="icon icon-code"></i>
+                        <a-form-item>
+                          <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.inputCode')" v-model:value="formData.inputCode" />
+                        </a-form-item>
+                        <div class="aui-code">
+                          <img v-if="randCodeData.requestCodeSuccess" :src="randCodeData.randCodeImage" @click="handleChangeCheckCode" />
+                          <img v-else style="margin-top: 2px; max-width: initial" :src="codeImg" @click="handleChangeCheckCode" />
+                        </div>
+                      </div>
+                      <div class="aui-flex">
+                        <div class="aui-flex-box">
+                          <div class="aui-choice">
+                            <a-input class="fix-auto-fill" type="checkbox" v-model:value="rememberMe" />
+                            <span style="margin-left: 5px">{{ t('sys.login.rememberMe') }}</span>
+                          </div>
+                        </div>
+                        <div class="aui-forget">
+                          <a @click="forgetHandelClick"> {{ t('sys.login.forgetPassword') }}</a>
+                        </div>
+                      </div>
+                    </div>
+                  </a-form>
+                  <a-form v-else ref="phoneFormRef" :model="phoneFormData" @keyup.enter.native="loginHandleClick">
+                    <div class="aui-account phone">
+                      <div class="aui-inputClear phoneClear">
+                        <a-input class="fix-auto-fill" :placeholder="t('sys.login.mobile')" v-model:value="phoneFormData.mobile" />
+                      </div>
+                      <div class="aui-inputClear">
+                        <a-input class="fix-auto-fill" :maxlength="6" :placeholder="t('sys.login.smsCode')" v-model:value="phoneFormData.smscode" />
+                        <div v-if="showInterval" class="aui-code" @click="getLoginCode">
+                          <a>{{ t('component.countdown.normalText') }}</a>
+                        </div>
+                        <div v-else class="aui-code">
+                          <span class="aui-get-code code-shape">{{ t('component.countdown.sendText', [unref(timeRuning)]) }}</span>
+                        </div>
+                      </div>
+                    </div>
+                  </a-form>
+                </div>
+                <div class="aui-formButton">
+                  <div class="aui-flex">
+                    <a-button :loading="loginLoading" class="aui-link-login aui-flex-box" type="primary" @click="loginHandleClick">
+                      {{ t('sys.login.loginButton') }}</a-button>
+                  </div>
+                  <div class="aui-flex">
+                    <a class="aui-linek-code aui-flex-box" @click="codeHandleClick">{{ t('sys.login.qrSignInFormTitle') }}</a>
+                  </div>
+                  <div class="aui-flex">
+                    <a class="aui-linek-code aui-flex-box" @click="registerHandleClick">{{ t('sys.login.registerButton') }}</a>
+                  </div>
+                </div>
+              </div>
+              <a-form @keyup.enter.native="loginHandleClick">
+                <div class="aui-flex aui-third-text">
+                  <div class="aui-flex-box aui-third-border">
+                    <span>{{ t('sys.login.otherSignIn') }}</span>
+                  </div>
+                </div>
+                <div class="aui-flex" :class="`${prefixCls}-sign-in-way`">
+                  <div class="aui-flex-box">
+                    <div class="aui-third-login">
+                      <a title="github" @click="onThirdLogin('github')"><GithubFilled /></a>
+                    </div>
+                  </div>
+                  <div class="aui-flex-box">
+                    <div class="aui-third-login">
+                      <a title="企业微信" @click="onThirdLogin('wechat_enterprise')"><icon-font class="item-icon" type="icon-qiyeweixin3" /></a>
+                    </div>
+                  </div>
+                  <div class="aui-flex-box">
+                    <div class="aui-third-login">
+                      <a title="钉钉" @click="onThirdLogin('dingtalk')"><DingtalkCircleFilled /></a>
+                    </div>
+                  </div>
+                  <div class="aui-flex-box">
+                    <div class="aui-third-login">
+                      <a title="微信" @click="onThirdLogin('wechat_open')"><WechatFilled /></a>
+                    </div>
+                  </div>
+                </div>
+              </a-form>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div v-show="type === 'forgot'" :class="`${prefixCls}-form`">
+      <MiniForgotpad ref="forgotRef" @go-back="goBack" @success="handleSuccess" />
+    </div>
+    <div v-show="type === 'register'" :class="`${prefixCls}-form`">
+      <MiniRegister ref="registerRef" @go-back="goBack" @success="handleSuccess" />
+    </div>
+    <div v-show="type === 'codeLogin'" :class="`${prefixCls}-form`">
+      <MiniCodelogin ref="codeRef" @go-back="goBack" @success="handleSuccess" />
+    </div>
+    <!-- 第三方登录相关弹框 -->
+    <ThirdModal ref="thirdModalRef"></ThirdModal>
+  </div>
+</template>
+<script lang="ts" setup name="login-mini">
+  import { getCaptcha, getCodeInfo } from '/@/api/sys/user';
+  import { computed, onMounted, reactive, ref, toRaw, unref } from 'vue';
+  import codeImg from '/@/assets/images/checkcode.png';
+  import { Rule } from '/@/components/Form';
+  import { useUserStore } from '/@/store/modules/user';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { SmsEnum } from '/@/views/sys/login/useLogin';
+  import ThirdModal from '/@/views/sys/login/ThirdModal.vue';
+  import MiniForgotpad from './MiniForgotpad.vue';
+  import MiniRegister from './MiniRegister.vue';
+  import MiniCodelogin from './MiniCodelogin.vue';
+  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';
+  import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';
+  import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';
+  import { useLocaleStore } from '/@/store/modules/locale';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useAppInject } from "/@/hooks/web/useAppInject";
+  import { GithubFilled, WechatFilled, DingtalkCircleFilled, createFromIconfontCN } from '@ant-design/icons-vue';
+
+  const IconFont = createFromIconfontCN({
+    scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',
+  });
+  const { prefixCls } = useDesign('mini-login');
+  const { notification, createMessage } = useMessage();
+  const userStore = useUserStore();
+  const { t } = useI18n();
+  const localeStore = useLocaleStore();
+  const showLocale = localeStore.getShowPicker;
+  const randCodeData = reactive<any>({
+    randCodeImage: '',
+    requestCodeSuccess: false,
+    checkKey: null,
+  });
+  const rememberMe = ref<string>('0');
+  //手机号登录还是账号登录
+  const activeIndex = ref<string>('accountLogin');
+  const type = ref<string>('login');
+  //账号登录表单字段
+  const formData = reactive<any>({
+    inputCode: '',
+    username: 'admin',
+    password: '123456',
+  });
+  //手机登录表单字段
+  const phoneFormData = reactive<any>({
+    mobile: '',
+    smscode: '',
+  });
+  const loginRef = ref();
+  //第三方登录弹窗
+  const thirdModalRef = ref();
+  //扫码登录
+  const codeRef = ref();
+  //是否显示获取验证码
+  const showInterval = ref<boolean>(true);
+  //60s
+  const timeRuning = ref<number>(60);
+  //定时器
+  const timer = ref<any>(null);
+  //忘记密码
+  const forgotRef = ref();
+  //注册
+  const registerRef = ref();
+  const loginLoading = ref<boolean>(false);
+  const { getIsMobile } = useAppInject();
+
+  defineProps({
+    sessionTimeout: {
+      type: Boolean,
+    },
+  });
+
+  /**
+   * 获取验证码
+   */
+  function handleChangeCheckCode() {
+    formData.inputCode = '';
+
+    randCodeData.checkKey = 1629428467008;
+    getCodeInfo(randCodeData.checkKey).then((res) => {
+      randCodeData.randCodeImage = res;
+      randCodeData.requestCodeSuccess = true;
+    });
+  }
+
+  /**
+   * 切换登录方式
+   */
+  function loginClick(type) {
+    activeIndex.value = type;
+  }
+
+  /**
+   * 账号或者手机登录
+   */
+  async function loginHandleClick() {
+    if (unref(activeIndex) === 'accountLogin') {
+      accountLogin();
+    } else {
+      //手机号登录
+      phoneLogin();
+    }
+  }
+
+  async function accountLogin() {
+    if (!formData.username) {
+      createMessage.warn(t('sys.login.accountPlaceholder'));
+      return;
+    }
+    if (!formData.password) {
+      createMessage.warn(t('sys.login.passwordPlaceholder'));
+      return;
+    }
+    try {
+      loginLoading.value = true;
+      const { userInfo } = await userStore.login(
+        toRaw({
+          password: formData.password,
+          username: formData.username,
+          captcha: formData.inputCode,
+          checkKey: randCodeData.checkKey,
+          mode: 'none', //不要默认的错误提示
+        })
+      );
+      if (userInfo) {
+        notification.success({
+          message: t('sys.login.loginSuccessTitle'),
+          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realname}`,
+          duration: 3,
+        });
+      }
+    } catch (error) {
+      notification.error({
+        message: t('sys.api.errorTip'),
+        description: error.message || t('sys.login.networkExceptionMsg'),
+        duration: 3,
+      });
+      handleChangeCheckCode();
+    } finally {
+      loginLoading.value = false;
+    }
+  }
+
+  /**
+   * 手机号登录
+   */
+  async function phoneLogin() {
+    if (!phoneFormData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    if (!phoneFormData.smscode) {
+      createMessage.warn(t('sys.login.smsPlaceholder'));
+      return;
+    }
+    try {
+      loginLoading.value = true;
+      const { userInfo }: any = await userStore.phoneLogin({
+        mobile: phoneFormData.mobile,
+        captcha: phoneFormData.smscode,
+        mode: 'none', //不要默认的错误提示
+      });
+      if (userInfo) {
+        notification.success({
+          message: t('sys.login.loginSuccessTitle'),
+          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realname}`,
+          duration: 3,
+        });
+      }
+    } catch (error) {
+      notification.error({
+        message: t('sys.api.errorTip'),
+        description: error.message || t('sys.login.networkExceptionMsg'),
+        duration: 3,
+      });
+    } finally {
+      loginLoading.value = false;
+    }
+  }
+
+  /**
+   * 获取手机验证码
+   */
+  async function getLoginCode() {
+    if (!phoneFormData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    const result = await getCaptcha({ mobile: phoneFormData.mobile, smsmode: SmsEnum.FORGET_PASSWORD });
+    if (result) {
+      const TIME_COUNT = 60;
+      if (!unref(timer)) {
+        timeRuning.value = TIME_COUNT;
+        showInterval.value = false;
+        timer.value = setInterval(() => {
+          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {
+            timeRuning.value = timeRuning.value - 1;
+          } else {
+            showInterval.value = true;
+            clearInterval(unref(timer));
+            timer.value = null;
+          }
+        }, 1000);
+      }
+    }
+  }
+
+  /**
+   * 第三方登录
+   * @param type
+   */
+  function onThirdLogin(type) {
+    thirdModalRef.value.onThirdLogin(type);
+  }
+
+  /**
+   * 忘记密码
+   */
+  function forgetHandelClick() {
+    type.value = 'forgot';
+    setTimeout(() => {
+      forgotRef.value.initForm();
+    }, 300);
+  }
+
+  /**
+   * 返回登录页面
+   */
+  function goBack() {
+    activeIndex.value = 'accountLogin';
+    type.value = 'login';
+  }
+
+  /**
+   * 忘记密码/注册账号回调事件
+   * @param value
+   */
+  function handleSuccess(value) {
+    Object.assign(formData, value);
+    Object.assign(phoneFormData, { mobile: "", smscode: "" });
+    type.value = 'login';
+    activeIndex.value = 'accountLogin';
+    handleChangeCheckCode();
+  }
+
+  /**
+   * 注册
+   */
+  function registerHandleClick() {
+    type.value = 'register';
+    setTimeout(() => {
+      registerRef.value.initForm();
+    }, 300);
+  }
+
+  /**
+   * 注册
+   */
+  function codeHandleClick() {
+    type.value = 'codeLogin';
+    setTimeout(() => {
+      codeRef.value.initFrom();
+    }, 300);
+  }
+
+  onMounted(() => {
+    //加载验证码
+    handleChangeCheckCode();
+  });
+</script>
+
+<style lang="less" scoped>
+  @import '/@/assets/loginmini/style/home.less';
+  @import '/@/assets/loginmini/style/base.less';
+
+  :deep(.ant-input:focus) {
+    box-shadow: none;
+  }
+  .aui-get-code {
+    float: right;
+    position: relative;
+    z-index: 3;
+    background: #ffffff;
+    color: #1573e9;
+    border-radius: 100px;
+    padding: 5px 16px;
+    margin: 7px;
+    border: 1px solid #1573e9;
+    top: 12px;
+  }
+
+  .aui-get-code:hover {
+    color: #1573e9;
+  }
+
+  .code-shape {
+    border-color: #dadada !important;
+    color: #aaa !important;
+  }
+
+  :deep(.jeecg-dark-switch){
+    position:absolute;
+    margin-right: 10px;
+  }
+  .aui-link-login{
+    height: 42px;
+    padding: 10px 15px;
+    font-size: 14px;
+    border-radius: 8px;
+    margin-top: 15px;
+    margin-bottom: 8px;
+  }
+  .aui-phone-logo{
+    position: absolute;
+    margin-left: 10px;
+    width: 60px;
+    top:2px;
+    z-index: 4;
+  }
+  .top-3{
+    top: 0.45rem;
+  }
+</style>
+
+<style lang="less">
+@prefix-cls: ~'@{namespace}-mini-login';
+@dark-bg: #293146;
+
+html[data-theme='dark'] {
+  .@{prefix-cls} {
+    background-color: @dark-bg !important;
+    background-image: none;
+
+    &::before {
+      background-image: url(/@/assets/svg/login-bg-dark.svg);
+    }
+    .aui-inputClear{
+      background-color: #232a3b !important;
+    }
+    .ant-input,
+    .ant-input-password {
+      background-color: #232a3b !important;
+    }
+
+    .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {
+      border: 1px solid #4a5569 !important;
+    }
+
+    &-form {
+      background: @dark-bg !important;
+    }
+
+    .app-iconify {
+      color: #fff !important;
+    }
+    .aui-inputClear input,.aui-input-line input,.aui-choice{
+      color: #c9d1d9 !important;
+    }
+
+    .aui-formBox{
+      background-color: @dark-bg !important;
+    }
+    .aui-third-text span{
+      background-color: @dark-bg !important;
+    }
+    .aui-form-nav .aui-flex-box{
+      color: #c9d1d9 !important;
+    }
+
+    .aui-formButton .aui-linek-code{
+      background:  @dark-bg !important;
+      color: white !important;
+    }
+    .aui-code-line{
+      border-left: none !important;
+    }
+    .ant-checkbox-inner,.aui-success h3{
+      border-color: #c9d1d9;
+    }
+    //update-begin---author:wangshuai ---date:20230828  for:【QQYUN-6363】这个样式代码有问题,不在里面,导致表达式有问题------------
+    &-sign-in-way {
+      .anticon {
+        font-size: 22px !important;
+        color: #888 !important;
+        cursor: pointer !important;
+
+        &:hover {
+          color: @primary-color !important;
+        }
+      }
+    }
+    //update-end---author:wangshuai ---date:20230828  for:【QQYUN-6363】这个样式代码有问题,不在里面,导致表达式有问题------------
+  }
+
+  input.fix-auto-fill,
+  .fix-auto-fill input {
+    -webkit-text-fill-color: #c9d1d9 !important;
+    box-shadow: inherit !important;
+  }
+  
+  .ant-divider-inner-text {
+    font-size: 12px !important;
+    color: @text-color-secondary !important;
+  }
+  .aui-third-login a{
+    background: transparent;
+  }
+}
+</style>

+ 266 - 0
src/views/system/loginmini/MiniRegister.vue

@@ -0,0 +1,266 @@
+<template>
+  <div class="aui-content">
+    <div class="aui-container">
+      <div class="aui-form">
+        <div class="aui-image">
+          <div class="aui-image-text">
+            <img :src="jeecgAdTextImg" alt="" />
+          </div>
+        </div>
+        <div class="aui-formBox">
+          <div class="aui-formWell">
+            <a-form ref="formRef" :model="formData">
+              <div class="aui-flex aui-form-nav aui-clear-left" style="padding-bottom: 21px">
+                <div class="aui-flex-box activeNav on">{{t('sys.login.signUpFormTitle')}}</div>
+              </div>
+              <div class="aui-form-box">
+                <div class="aui-account aui-account-line">
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:user-outlined"/>
+                      <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.userName')" v-model:value="formData.username" />
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:mobile-outlined"/>
+                      <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.mobile')" v-model:value="formData.mobile" />
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:mail-outlined"/>
+                      <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.smsCode')" v-model:value="formData.smscode" />
+                      <div v-if="showInterval" class="aui-code-line" @click="getLoginCode">{{t('component.countdown.normalText')}}</div>
+                      <div v-else class="aui-code-line">{{t('component.countdown.sendText',[unref(timeRuning)])}}</div>
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:lock-outlined"/>
+                      <a-input class="fix-auto-fill" :type="pwdIndex==='close'?'password':'text'" :placeholder="t('sys.login.password')" v-model:value="formData.password" />
+                      <div class="aui-eye">
+                        <img :src="eyeKImg" alt="开启" v-if="pwdIndex==='open'"  @click="pwdClick('close')" />
+                        <img :src="eyeGImg" alt="关闭"  v-else-if="pwdIndex==='close'"  @click="pwdClick('open')" />
+                      </div>
+                    </div>
+                  </a-form-item>
+                  <a-form-item>
+                    <div class="aui-input-line">
+                      <Icon class="aui-icon" icon="ant-design:lock-outlined"/>
+                      <a-input class="fix-auto-fill" :type="confirmPwdIndex==='close'?'password':'text'" :placeholder="t('sys.login.confirmPassword')" v-model:value="formData.confirmPassword" />
+                      <div class="aui-eye">
+                        <img :src="eyeKImg" alt="开启" v-if="confirmPwdIndex==='open'" @click="confirmPwdClick('close')" />
+                        <img :src="eyeGImg" alt="关闭" v-else-if="confirmPwdIndex==='close'" @click="confirmPwdClick('open')" />
+                      </div>
+                    </div>
+                  </a-form-item>
+                  <a-form-item name="policy">
+                    <div class="aui-flex">
+                      <div class="aui-flex-box">
+                        <div class="aui-choice">
+                          <a-checkbox  v-model:checked="formData.policy" />
+                          <span style="color: #1b90ff;margin-left: 4px">{{ t('sys.login.policy') }}</span>
+                        </div>
+                      </div>
+                    </div>
+                  </a-form-item>
+                </div>
+              </div>
+              <div class="aui-formButton">
+                <div class="aui-flex">
+                  <a class="aui-link-login aui-flex-box" @click="registerHandleClick"> {{ t('sys.login.registerButton') }}</a>
+                </div>
+                <div class="aui-flex">
+                  <a class="aui-linek-code aui-flex-box" @click="goBackHandleClick">{{ t('sys.login.backSignIn') }}</a>
+                </div>
+              </div>
+            </a-form>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup name="mini-register">
+  import { ref, reactive, unref, toRaw } from 'vue';
+  import { getCaptcha, register } from '/@/api/sys/user';
+  import { SmsEnum } from '/@/views/sys/login/useLogin';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';
+  import jeecgAdTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';
+  import eyeKImg from '/@/assets/loginmini/icon/icon-eye-k.png';
+  import eyeGImg from '/@/assets/loginmini/icon/icon-eye-g.png';
+  import { useI18n } from "/@/hooks/web/useI18n";
+
+  const { t } = useI18n();
+  const { notification, createErrorModal, createMessage } = useMessage();
+  const emit = defineEmits(['go-back', 'success', 'register']);
+  const formRef = ref();
+  const formData = reactive<any>({
+    username: '',
+    mobile: '',
+    smscode: '',
+    password: '',
+    confirmPassword: '',
+    policy: false,
+  });
+  //是否显示获取验证码
+  const showInterval = ref<boolean>(true);
+  //60s
+  const timeRuning = ref<number>(60);
+  //定时器
+  const timer = ref<any>(null);
+  //密码眼睛打开关闭
+  const pwdIndex = ref<string>('close');
+  //确认密码眼睛打开关闭
+  const confirmPwdIndex = ref<string>('close');
+
+  /**
+   * 返回
+   */
+  function goBackHandleClick() {
+    emit('go-back');
+    initForm();
+  }
+
+  /**
+   * 获取手机验证码
+   */
+  async function getLoginCode() {
+    if (!formData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    const result = await getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.REGISTER });
+    if (result) {
+      const TIME_COUNT = 60;
+      if (!unref(timer)) {
+        timeRuning.value = TIME_COUNT;
+        showInterval.value = false;
+        timer.value = setInterval(() => {
+          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {
+            timeRuning.value = timeRuning.value - 1;
+          } else {
+            showInterval.value = true;
+            clearInterval(unref(timer));
+            timer.value = null;
+          }
+        }, 1000);
+      }
+    }
+  }
+
+  function registerHandleClick() {
+    if (!formData.username) {
+      createMessage.warn(t('sys.login.accountPlaceholder'));
+      return;
+    }
+    if (!formData.mobile) {
+      createMessage.warn(t('sys.login.mobilePlaceholder'));
+      return;
+    }
+    if (!formData.smscode) {
+      createMessage.warn(t('sys.login.smsPlaceholder'));
+      return;
+    }
+    if (!formData.password) {
+      createMessage.warn(t('sys.login.passwordPlaceholder'));
+      return;
+    }
+    if (!formData.confirmPassword) {
+      createMessage.warn(t('sys.login.confirmPassword'));
+      return;
+    }
+    if (formData.password !== formData.confirmPassword) {
+      createMessage.warn(t('sys.login.diffPwd'));
+      return;
+    }
+    if(!formData.policy){
+      createMessage.warn(t('sys.login.policyPlaceholder'));
+      return;
+    }
+    registerAccount();
+  }
+
+  /**
+   * 注册账号
+   */
+  async function registerAccount() {
+    try {
+      const resultInfo = await register(
+        toRaw({
+          username: formData.username,
+          password: formData.password,
+          phone: formData.mobile,
+          smscode: formData.smscode,
+        })
+      );
+      if (resultInfo && resultInfo.data.success) {
+        notification.success({
+          description: resultInfo.data.message || t('sys.api.registerMsg'),
+          duration: 3,
+        });
+        emit('success', { username: formData.username, password: formData.password });
+        initForm();
+      } else {
+        notification.warning({
+          message: t('sys.api.errorTip'),
+          description: resultInfo.data.message || t('sys.api.networkExceptionMsg'),
+          duration: 3,
+        });
+      }
+    } catch (error) {
+      notification.error({
+        message: t('sys.api.errorTip'),
+        description: error.message || t('sys.api.networkExceptionMsg'),
+        duration: 3,
+      });
+    }
+  }
+
+  /**
+   * 初始化表单
+   */
+  function initForm() {
+    Object.assign(formData,{username:'',mobile: '', smscode: '', password: '', confirmPassword: '', policy: false})
+    if(!unref(timer)){
+      showInterval.value = true;
+      clearInterval(unref(timer));
+      timer.value = null;
+    }
+    formRef.value.resetFields();
+  }
+
+  /**
+   * 密码打开或关闭
+   * @param value
+   */
+  function pwdClick(value) {
+    pwdIndex.value = value;
+  }
+
+  /**
+   * 确认密码打开或关闭
+   * @param value
+   */
+  function confirmPwdClick(value) {
+    confirmPwdIndex.value = value;
+  }
+
+  defineExpose({
+    initForm
+  })
+</script>
+<style lang="less" scoped>
+@import '/@/assets/loginmini/style/home.less';
+@import '/@/assets/loginmini/style/base.less';
+.aui-input-line .aui-icon{
+  position: absolute;
+  z-index: 2;
+  top: 10px;
+  left: 10px;
+  font-size: 20px !important;
+}
+</style>

+ 87 - 0
src/views/system/loginmini/OAuth2Login.vue

@@ -0,0 +1,87 @@
+<template>
+  <div> </div>
+</template>
+
+<script setup lang="ts">
+  import { ref } from 'vue';
+  import { isOAuth2AppEnv, sysOAuth2Login } from '/@/views/sys/login/useLogin';
+  import { useRouter } from 'vue-router';
+  import { PageEnum } from '/@/enums/pageEnum';
+  import { router } from '/@/router';
+  import { useUserStore } from '/@/store/modules/user';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import {getTenantId} from "/@/utils/auth";
+
+  const isOAuth = ref<boolean>(isOAuth2AppEnv());
+  const env = ref<any>({ thirdApp: false, wxWork: false, dingtalk: false });
+  const { currentRoute } = useRouter();
+  const route = currentRoute.value;
+  if (!isOAuth2AppEnv()) {
+    router.replace({ path: PageEnum.BASE_LOGIN, query: route.query });
+  }
+
+  if (isOAuth.value) {
+    checkEnv();
+  }
+
+  /**
+   * 检测当前的环境
+   */
+  function checkEnv() {
+    // 判断当时是否是企业微信环境
+    if (/wxwork/i.test(navigator.userAgent)) {
+      env.value.thirdApp = true;
+      env.value.wxWork = true;
+    }
+    // 判断当时是否是钉钉环境
+    if (/dingtalk/i.test(navigator.userAgent)) {
+      env.value.thirdApp = true;
+      env.value.dingtalk = true;
+    }
+    doOAuth2Login();
+  }
+
+  /**
+   * 进行OAuth2登录操作
+   */
+  function doOAuth2Login() {
+    if (env.value.thirdApp) {
+      // 判断是否携带了Token,是就说明登录成功
+      if (route.query.oauth2LoginToken) {
+        let token = route.query.oauth2LoginToken;
+        //执行登录操作
+        thirdLogin({ token, thirdType: route.query.thirdType,tenantId: getTenantId });
+      } else if (env.value.wxWork) {
+        sysOAuth2Login('wechat_enterprise');
+      } else if (env.value.dingtalk) {
+        sysOAuth2Login('dingtalk');
+      }
+    }
+  }
+
+  /**
+   * 第三方登录
+   * @param params
+   */
+  function thirdLogin(params) {
+    const userStore = useUserStore();
+    const { notification } = useMessage();
+    const { t } = useI18n();
+    userStore.ThirdLogin(params).then((res) => {
+      if (res && res.userInfo) {
+        notification.success({
+          message: t('sys.login.loginSuccessTitle'),
+          description: `${t('sys.login.loginSuccessDesc')}: ${res.userInfo.realname}`,
+          duration: 3,
+        });
+      } else {
+        notification.error({
+          message: t('sys.login.errorTip'),
+          description: ((res.response || {}).data || {}).message || res.message || t('sys.login.networkExceptionMsg'),
+          duration: 4,
+        });
+      }
+    });
+  }
+</script>

+ 5 - 52
src/views/vent/deviceManager/comment/warningTabel/BaseModal.vue

@@ -1,13 +1,6 @@
 <template>
-  <BasicModal @register="register" :title="title" :width="800" v-bind="$attrs" @ok="onSubmit">
-    <BasicForm @register="registerForm" >
-      <template #monitor="{ model, field }" >
-        <div class="vent-flex-row-between">
-          <Select ref="selectRef" disabled v-model:value="pointData" :options="option" style="width: calc(100% - 65px);" />
-          <a-button class="vent-margin-b-5" type="primary" @click="selectPoint(model['strtype'])" style="position: absolute; right: 0; top: 1px;">选择</a-button>
-        </div>
-      </template>
-    </BasicForm>
+  <BasicModal @register="register" :title="title" :width="800" :min-height="400" v-bind="$attrs" @ok="onSubmit">
+    <BasicForm @register="registerForm" ></BasicForm>
   </BasicModal>
   <DevicePointTable @register="registerModal" :data-source="devicePointList" :selection-row-keys="pointData" @reload="setPoint" />
 </template>
@@ -16,7 +9,7 @@
 import { BasicForm, useForm } from '/@/components/Form/index';
 import { BasicModal, useModalInner, useModal } from '/@/components/Modal';
 import type { FormSchema } from '/@/components/Form/src/types/form';
-import { Select } from 'ant-design-vue';
+import { Select, message } from 'ant-design-vue';
 import DevicePointTable from './DevicePointTable.vue';
 import { workFacePointList } from './warning.api'
 
@@ -32,7 +25,6 @@ import { workFacePointList } from './warning.api'
     }
   })
   const emit = defineEmits(['add', 'update', 'register'])
-  const option = ref<any[]>([])
   const devicePointList = ref<any[]>([])
   const pointData = ref<String[]>([])
   const title = ref('')
@@ -50,66 +42,27 @@ import { workFacePointList } from './warning.api'
     await resetFields();
     if(data.isUpdate){
       await setFieldsValue({ ...data.record });
-      pointData.value = [data.record['monitorId']]
-
-      // 初始打开有数据时候要查点表
-
-    }else if(data.record){
-      await setFieldsValue({ relId: data.record['id'] });
     }
   });
 
-  const [registerModal, { openModal }] = useModal();
-
-  async function getDevicePointList(strtype) {
-    try {
-      const result = await workFacePointList({ deviceType: strtype, valueType: props.monitorType });
-      devicePointList.value = result
-    } catch (error) {
-      devicePointList.value = []
-    }
-  };
-
+  const [registerModal] = useModal();
   async function onSubmit() {
     try {
       const data = await getFieldsValue()
       await setFieldsValue({...data, monitorId: pointData.value[0] })
       const values = await validate();
       setModalProps({ confirmLoading: true });
-      debugger
       // 提交表单
-      if (!values['id']) {
+      if (!isUpdate.value) {
         emit('add', 'add', values)
       } else {
         emit('update', 'update',values)
       }
-      // //关闭弹窗
-      // closeModal();
-      // //刷新列表
-      // reload()
     } finally {
       setModalProps({ confirmLoading: false });
     }
   }
 
-  async function selectPoint(strtype) {
-    await getDevicePointList(strtype)
-    openModal()
-  }
-
-  function setPoint(value) {
-    const data = value[0]
-    option.value = [
-      {
-        value: data.id,
-        label: data.valuename
-      }
-    ]
-    nextTick(() => {
-      pointData.value = [data.id]
-    })
-  }
-
   onMounted(async () => {
     
   });

+ 15 - 2
src/views/vent/deviceManager/comment/warningTabel/index2.vue

@@ -5,7 +5,7 @@
         <a-button preIcon="ant-design:plus-outlined" type="primary" @click="openModal()">新增</a-button>
       </template>
       <template #action="{ record }">
-        <a class="table-action-link" @click="openModal()">编辑</a>
+        <a class="table-action-link" @click="openModalFn(record)">编辑</a>
         <a-popconfirm
           title="确定删除?"
           @confirm="handleDelete(record)"
@@ -21,7 +21,7 @@
 <script lang="ts" name="system-user" setup>
 import { BasicTable, TableAction } from '/@/components/Table';
 import { useListPage } from '/@/hooks/system/useListPage';
-import BaseModal from './BaseModal.vue' 
+import BaseModal from './BaseModal1.vue' 
 import { useModal } from '/@/components/Modal';
 import { workFaceWarningColumns, workFaceWarningFormSchemas } from './warning.data'
 import { warningLogList, warningLogAdd, warningLogEdit, warningLogDeleteById } from './warning.api'
@@ -54,6 +54,19 @@ const [registerTable, { reload }] = tableContext;
 const [register, { openModal, closeModal }] = useModal()
 
 
+function openModalFn(record?) {
+  if(record){
+    openModal(true, {
+      isUpdate: true,
+      record
+    })
+  }else{
+    openModal(true, {
+      isUpdate: false
+    })
+  } 
+}
+
 async function handleDelete(record) {
   await warningLogDeleteById(record.id)
 }

+ 53 - 69
src/views/vent/deviceManager/comment/warningTabel/index3.vue

@@ -42,7 +42,7 @@
   const formSchemas = monitorWarningFormSchemas({ id: props.deviceId })
   const activeID = ref('')
   const warningList = ref<{ id: string, alarmName: string }[]>([])
-  const dataSource = ref([])
+  const dataSource = ref<any[]>([])
 
   function selectWarning(id) {
     activeID.value = id
@@ -60,80 +60,65 @@
     const result = await workFaceWarningList({ sysId: props.deviceId, monitorType: 2, alarmId: activeID.value, pageSize: 100000 })
     let flag = 0
     let groupNum = 0
-    //合并数据
-    const resetRowOrColSpanMap = (i) => {
-      
-      let j = i - flag
-      const value0 = [
-        {
-          code: 'key',
-          rowSpan: flag + 1,
-          colSpan: 1
-        },
-        {
-          code: 'alarmName',
-          rowSpan: flag + 1,
-          colSpan: 1
-        },
-        {
-          code: 'operation1',
-          rowSpan: flag + 1,
-          colSpan: 1
-        },
-      ]
-      const value1 = [
-        {
-          code: 'key',
-          rowSpan: 0,
-          colSpan: 1
-        },
-        {
-          code: 'alarmName',
-          rowSpan: 0,
-          colSpan: 1
-        },
-        {
-          code: 'operation1',
-          rowSpan: 0,
-          colSpan: 1
-        },
-      ]
-      if(i == result.records.length - 1){
-        rowOrColSpanMap.set(result.records[j]['id'], value0)
-        j += 1
-        while (j <= i) {
-          rowOrColSpanMap.set(result.records[j]['id'], value1)
-          ++j
-        }
-      }else{
-        rowOrColSpanMap.set(result.records[j - 1]['id'], value0)
-        while (j < i) {
-          rowOrColSpanMap.set(result.records[j]['id'], value1)
-          ++j
-        }
-      }
-    }
+    let resultDataSource:any[] = []
+    const value1 = [
+      {
+        code: 'key',
+        rowSpan: 0,
+        colSpan: 1
+      },
+      {
+        code: 'alarmName',
+        rowSpan: 0,
+        colSpan: 1
+      },
+      {
+        code: 'operation1',
+        rowSpan: 0,
+        colSpan: 1
+      },
+    ]
+    // 根据relId 排序
 
-    for(let i=0; i< result.records.length; i++){
+    for(let i = 0; i< result.records.length; i++){
       const item = result.records[i]
-      item['key'] = `${groupNum}`
-      if(item.relId){
-        
-        ++flag
-        if(i == result.records.length - 1){
-          resetRowOrColSpanMap(i)
-        }
-      }else{
+      if(!item.relId){
         groupNum++
-        if(flag){
-          resetRowOrColSpanMap(i)
+        resultDataSource.push(item)
+        let itemChildArr:any[] = []
+        for (let j = 0; j < result.records.length; j++) {
+          const itemChild = result.records[j]
+          if(itemChild.relId == item.id){
+            resultDataSource.push(itemChild)
+            itemChildArr.push(itemChild)
+          }
+        }
+        const value0 = [
+          {
+            code: 'key',
+            rowSpan: itemChildArr.length + 1,
+            colSpan: 1
+          },
+          {
+            code: 'alarmName',
+            rowSpan: itemChildArr.length + 1,
+            colSpan: 1
+          },
+          {
+            code: 'operation1',
+            rowSpan: itemChildArr.length + 1,
+            colSpan: 1
+          },
+        ]
+        rowOrColSpanMap.set(item['id'], value0)
+        item['key'] = `${groupNum}`
+        for(let m=0; m< itemChildArr.length; m++){
+          rowOrColSpanMap.set(itemChildArr[m]['id'], value1)
         }
-        flag = 0
       }
     }
-    console.log(rowOrColSpanMap)
     show.value = true
-    dataSource.value = result.records
+    dataSource.value = resultDataSource
   }
 
   async function handleDelete(record) {
@@ -144,7 +129,6 @@
   const [register, { openModal, closeModal }] = useModal()
 
   function handleOpen(flag?, record?) {
-    debugger
     if (record) {
       if(flag == 'update'){
         openModal(true, {

+ 11 - 0
src/views/vent/deviceManager/comment/warningTabel/warning.data.ts

@@ -201,6 +201,11 @@ export const workFaceWarningColumns: BasicColumn[] = [
     align: 'center',
   },
   {
+    title: '所属系统',
+    dataIndex: 'systemType',
+    align: 'center',
+  },
+  {
     title: '创建人',
     dataIndex: 'createBy',
     align: 'center',
@@ -231,6 +236,12 @@ export const workFaceWarningFormSchemas: FormSchema[] = [
     component: 'JDictSelectTag',
     componentProps: { dictCode: 'leveltype' },
   },
+  {
+    label: '所属系统',
+    field: 'systemType',
+    component: 'JDictSelectTag',
+    componentProps: { dictCode: 'kindtype' },
+  },
 ];
 
 export const manageWarningPointColumns: BasicColumn[] = [

+ 1 - 0
src/views/vent/deviceManager/deviceTable/device.data.ts

@@ -69,6 +69,7 @@ export const searchFormSchema: FormSchema[] = [
     label: '所属分站',
     field: 'nsubstationid',
     component: 'ApiSelect',
+    colProps: { span: 6 },
     componentProps: {
       api: list,
       labelField: 'strname',

+ 1 - 1
src/views/vent/deviceManager/equipManager/component/normalBtnTable.vue

@@ -21,7 +21,7 @@
         </a-dropdown> -->
       </template>
       <template #action="{ record }">
-        <!-- <a class="table-action-link" @click="handleEdit(record)">编辑</a> -->
+        <a class="table-action-link" @click="handleEdit(record)">编辑</a>
         <a class="table-action-link" @click="handleAdds(record)">新增下级</a>
         <a-popconfirm
           title="确定删除?"

+ 3 - 1
src/views/vent/home/colliery/index.vue

@@ -94,7 +94,9 @@ import { useRouter } from 'vue-router';
 // import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
 import moment from 'moment';
 import { getActions } from '/@/qiankun/state';
+import { useGo } from '/@/hooks/web/usePage';
 
+const go = useGo();
 const actions = getActions();
 let timer: NodeJS.Timeout | null = null;
 let fanLocalList = reactive<any[]>([]); //局部风机数据
@@ -240,7 +242,7 @@ let timeDate = computed(() => {
 });
 
 function goModalDetail() {
-  actions.setGlobalState({ pageObj: { pageType: 'model3D' } });
+  go('/micro-vent-3dModal/dashboard/analysis?pageType=model3D')
 }
 
 onMounted(() => {

+ 5 - 3
src/views/vent/monitorManager/camera/index.vue

@@ -4,7 +4,7 @@
       <div class="player-name">{{ item.name }}</div>
       <div>
         <template v-if="item.addr.startsWith('rtsp://')">
-          <video :id="`video${index}`" muted="true" autoplay></video>
+          <video :id="`video${index}`" muted autoplay></video>
         </template>
         <template v-else>
           <LivePlayer :videoUrl="item.addr" muted live loading/>
@@ -34,9 +34,11 @@
     for(let i =1; i<= addrList.value.length; i++){
       const item = addrList.value[i]
       if(item.addr.startsWith('rtsp://')){
-        const webRtcServer = new window['WebRtcStreamer']('video' + i, location.protocol + ip)
+        const dom = document.getElementById('video' + i) as HTMLVideoElement
+        dom.muted = true;
+        dom.volume = 0   
+        const webRtcServer = new window['WebRtcStreamer'](dom, location.protocol + ip)
         webRtcServerList.push(webRtcServer)
-        // webRtcServer.connect('rtsp://admin:admin12345@192.168.183.64:554/Streaming/Channels/1')
         webRtcServer.connect(item.addr)
       }
     }

+ 27 - 3
src/views/vent/monitorManager/comment/GroupMonitorTable.vue

@@ -51,6 +51,10 @@
     isAction: {
       type: Boolean,
       default: false
+    },
+    isShowSelect: {
+      type: Boolean,
+      default: true
     }
   });
 
@@ -90,6 +94,22 @@
         }
       },
     };
+     const indexColumn = {
+      title: '序号',
+      dataIndex: 'key',
+      width: 120,
+      align: 'center',
+      customCell: (_, index) => {
+        if (index % 2 == 0) {
+          return { rowSpan: 2 };
+        } else {
+          return { rowSpan: 0 };
+        }
+      },
+      customRender: function ({ index }) {
+        return index/2 + 1;
+      }
+    };
     const runDevice = {
       title: '运行风机',
       dataIndex: 'runDevice',
@@ -116,15 +136,19 @@
       };
     }
     columns.value.splice(1, 0, runDevice);
+    if (props.isShowSelect) {
+      columns.value = [isCheckColumn, ...columns.value];
+    }else{
+      columns.value = [indexColumn, ...columns.value];
+    }
+
     if(props.isAction){
-       columns.value = [isCheckColumn, ...columns.value, {
+       columns.value = [...columns.value, {
         title: '操作',
         dataIndex: 'operation',
         width: 120,
         slots: { customRender: 'operation' },
       }];
-    }else{
-      columns.value = [isCheckColumn, ...columns.value];
     }
    
    

+ 14 - 9
src/views/vent/monitorManager/comment/HistoryTable.vue

@@ -73,7 +73,7 @@
     (newVal) => {
       if (!newVal) return
       if(historyTable.value) getForm().resetFields()
-      const column = getTableHeaderColumns(newVal + '_history')
+      const column = getTableHeaderColumns(newVal.includes('_history') ? newVal : newVal + '_history')
       if (column && column.length < 1) {
         const arr = newVal.split('_')
         const columnKey = arr.reduce((prev, cur, index) => {
@@ -120,8 +120,6 @@
         formConfig: {
           labelAlign: 'left',
           showAdvancedButton: false,
-          // autoAdvancedCol: 2,
-
           baseColProps: {
             // offset: 0.5,
             xs: 24,
@@ -162,7 +160,7 @@
               component: 'ApiSelect',
               required: true,
               componentProps: {
-                api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle')? 'location ': props.deviceType } }),
+                api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType } }),
                 // resultField: 'result',
                 labelField: 'strinstallpos',
                 valueField: 'id',
@@ -286,7 +284,7 @@
             component: 'ApiSelect',
             required: true,
             componentProps: {
-              api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType } }),
+              api: () => defHttp.get({ url: '/safety/ventanalyManageSystem/linkdevicelist', params: { sysId: props.sysId, deviceType: props.deviceType.startsWith('vehicle') ? 'location_normal' : props.deviceType } }),
               // resultField: 'result',
               labelField: 'strinstallpos',
               valueField: 'id',
@@ -337,6 +335,12 @@
           },
         ],
       },
+      pagination: {
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ['10', '30', '50', '100'],
+        showQuickJumper: false
+      },
       // pagination: false,
       fetchSetting: {
         totalField: 'total',
@@ -355,6 +359,11 @@
         }else{
           params.interval = '1m'
         }
+        if (props.deviceType.startsWith('vehicle')) {
+          params['isEmployee'] = false
+        } else if (props.deviceType.startsWith('location')) {
+          params['isEmployee'] = true
+        }
       },
       afterFetch(result) {
         return result;
@@ -373,16 +382,12 @@
       console.log('[ data ] >', data);
     }
   });
-
-  
-
   defineExpose({ setLoading })
 </script>
 
 <style scoped lang="less">
   @import '/@/design/vent/color.less';
   
-
   :deep(.@{ventSpace}-table-body) {
     height: auto !important;
   }

+ 6 - 1
src/views/vent/monitorManager/comment/MonitorTable.vue

@@ -150,6 +150,7 @@
       size: props.size,
       useSearchForm: props.formConfig ? true : false,
       showTableSetting: false,
+      showIndexColumn: true,
       showActionColumn: props.isShowActionColumn,
       maxHeight: tableMaxHeight,
       bordered: false,
@@ -163,8 +164,9 @@
       },
       pagination: props.isShowPagination ? {
         current: 1,
-        pageSize: 5,
+        pageSize: 10,
         pageSizeOptions: ['10', '30', '50', '100'],
+        showQuickJumper: false
       } : false,
       beforeFetch: (params) => {
         if(props.deviceType?.startsWith('safetymonitor')){
@@ -225,4 +227,7 @@
   :deep(.jeecg-basic-table .@{ventSpace}-table-wrapper .@{ventSpace}-table-title) {
     min-height: 0;
   }
+  :deep(.@{ventSpace}-pagination) {
+    margin-right: 20px !important;
+  }
 </style>

+ 2 - 0
src/views/vent/monitorManager/deviceMonitor/components/device/device.data.ts

@@ -222,3 +222,5 @@ export const majorColumns: BasicColumn[] = [
 
 export const noDetailArr = ['nitrogen', 'forcFan'];
 export const haveDetailArr = ['windrect', 'window', 'gate', 'fanlocal', 'fanmain', 'fiber', 'bundletube', 'dusting', 'pump', 'safetymonitor'];
+export const haveHandlerArr = ['windrect', 'window', 'gate', 'fanlocal', 'fanmain', 'pump', 'obfurage', 'nitrogen', 'pulping', 'spray', 'dustdev'];
+export const noWarningArr = ['location', 'vehicle', 'cheliang'];

+ 17 - 9
src/views/vent/monitorManager/deviceMonitor/components/device/index.vue

@@ -70,7 +70,7 @@
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange" id="tabsBox" v-if="isRefresh">
           <a-tab-pane key="1" tab="实时监测">
             <template v-if="(deviceType.startsWith('fanlocal') || deviceType.startsWith('fanmain')) && activeKey == '1'">
-              <GroupMonitorTable  ref="MonitorDataTable" :dataSource="dataSource" :columnsType="`${deviceType}_monitor`" :scroll="scroll" :isAction="true">
+              <GroupMonitorTable  ref="MonitorDataTable" :dataSource="dataSource" :columnsType="`${deviceType}_monitor`" :scroll="scroll" :isAction="true" :isShowSelect="false">
                 <template #action="{ record }">
                     <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
                       {
@@ -105,8 +105,8 @@
             </template>
             <template v-else="activeKey == '1'">
               <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
-                design-scope="device_monitor" :isShowPagination="false" :isShowActionColumn="true" title="设备监测"
-                :scroll="scroll">
+                design-scope="device_monitor" :isShowActionColumn="true" :isShowSelect="false" title="设备监测"
+                :scroll="{y: scroll.y - 30}">
                 <template #action="{ record }">
                   <TableAction :actions="haveDetailArr.find((item) => deviceType.startsWith(item)) ? [
                     {
@@ -198,13 +198,13 @@
           </a-tab-pane>
           <a-tab-pane key="2" tab="历史数据">
             <div class="tab-item">
-              <HistoryTable ref="historyTable" v-if="activeKey == '2'" :sysId="systemID" :columns-type="`${deviceType.startsWith('vehicle') ? 'location' : deviceType }`"
+              <HistoryTable ref="historyTable" v-if="activeKey == '2'" :sysId="systemID" :columns-type="`${deviceType}`"
                 :device-type="deviceType"
                 :device-list-api="getDeviceList.bind(null, { devicekind: deviceType, sysId: systemID })"
                 designScope="device-history" :scroll="scroll" />
             </div>
           </a-tab-pane>
-          <a-tab-pane key="3" tab="报警历史">
+          <a-tab-pane key="3" tab="报警历史" v-if="!noWarningArr.find((item) => deviceType.startsWith(item))">
             <div class="tab-item">
               <AlarmHistoryTable ref="alarmHistoryTable" v-if="activeKey == '3'" :sysId="systemID" columns-type="alarm"
                 :device-type="deviceType"
@@ -212,7 +212,7 @@
                 designScope="alarm-history" />
             </div>
           </a-tab-pane>
-          <a-tab-pane key="4" tab="操作历史">
+          <a-tab-pane key="4" tab="操作历史" v-if="haveHandlerArr.find((item) => deviceType.startsWith(item))">
             <div class="tab-item">
               <HandlerHistoryTable ref="handlerHistoryTable" v-if="activeKey == '4'" :sysId="systemID"
                 columns-type="operator_history" :device-type="deviceType"
@@ -231,7 +231,7 @@
 </template>
 
 <script setup lang="ts">
-import { ref, onMounted, onUnmounted, ComponentOptions, shallowRef, nextTick, watch, reactive, defineProps } from 'vue'
+import { ref, onMounted, onUnmounted, ComponentOptions, shallowRef, reactive, defineProps } from 'vue'
 import { SendOutlined } from '@ant-design/icons-vue';
 import { list, getDeviceList, getDeviceTypeList } from './device.api'
 import AlarmHistoryTable from '../../../comment/AlarmHistoryTable.vue';
@@ -248,7 +248,7 @@ import { SvgIcon } from '/@/components/Icon';
 import { getActions } from '/@/qiankun/state';
 import { useRouter } from 'vue-router';
 import { setDivHeight } from '/@/utils/event';
-import { majorColumns, noDetailArr, haveDetailArr } from  './device.data'
+import { majorColumns, noDetailArr, haveDetailArr, haveHandlerArr, noWarningArr } from  './device.data'
 import mainPath from './modal/mainPath.vue'
 // import { BorderBox8 as DvBorderBox8 } from '@kjgl77/datav-vue3';
 
@@ -1217,4 +1217,12 @@ onUnmounted(() => {
 
 :deep(.zxm-select-dropdown) {
   left: 0 !important;
-}</style>
+}
+// :deep(.@{ventSpace}-pagination){
+//   margin-right: 20px !important;
+//   margin-top: 5px !important;
+//   display: flex;
+//   align-items: center;
+// }
+
+</style>

+ 1 - 1
src/views/vent/monitorManager/fanLocalMonitor/index.vue

@@ -170,7 +170,7 @@
 
     <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 170, scroll, 180)">
       
-      <dv-border-box8 :dur="5" class="dv_border_8"  :style="`bottom: 20px; padding: 5px; height: ${scroll.y + 120}px`" >
+      <dv-border-box8 :dur="5" class="dv_border_8"  :style="`bottom: 20px; padding: 5px; height: ${scroll.y + 140}px`" >
         <!-- <div class="enter-detail" @click="goDetail()">
           <send-outlined class=""/>风机运行详情
         </div> -->

+ 10 - 6
src/views/vent/monitorManager/gateMonitor/index.vue

@@ -48,13 +48,13 @@
     <div class="title-text">
       {{ selectData.strname }}
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll)">
-      <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 100}px`">
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 350, scroll)">
+      <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 120}px`">
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
           <a-tab-pane key="1" tab="实时监测">
             <MonitorTable v-if="activeKey === '1'" ref="MonitorDataTable" class="monitor-table" columnsType="gate_monitor"
-              :dataSource="dataSource" design-scope="gate-monitor" @selectRow="getSelectRow" :scroll="scroll" title="风门监测"
-              :isShowPagination="false">
+              :dataSource="dataSource" design-scope="gate-monitor" @selectRow="getSelectRow" :scroll="{ y: scroll.y - 40 }" title="风门监测"
+              :isShowPagination="true">
               <template #filterCell="{ column, record }">
                 <template v-if="record.frontGateOpenCtrl == 1 || record.frontGateOpenCtrl === true">
                   <a-tag
@@ -165,7 +165,7 @@ const activeKey = ref('1'); // tab
 const loading = ref(false);
 
 const scroll = reactive({
-  y: 240
+  y: 230
 })
 
 const frontDoorIsOpen = ref(false); //前门是否开启
@@ -614,7 +614,11 @@ onUnmounted(() => {
 
 <style lang="less" scoped>
 @import '/@/design/vent/modal.less';
-
+.scene-box{
+  .bottom-tabs-box{
+    height: 350px;
+  }
+}
 .button-box {
   border: none !important;
   height: 34px !important;

+ 1 - 1
src/views/vent/monitorManager/mainFanMonitor/index.vue

@@ -198,7 +198,7 @@
       </div>
     </div>
     <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll, 170)">
-      <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 100}px`" >
+      <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 120}px`" >
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
           <a-tab-pane key="1" tab="实时监测">
             <GroupMonitorTable v-if="activeKey === '1'" ref="MonitorDataTable" :dataSource="dataSource" columnsType="fanmain_monitor" @selectRow="getSelectRow" :scroll="scroll"/>

+ 9 - 5
src/views/vent/monitorManager/obfurage1Monitor/index.vue

@@ -48,13 +48,13 @@
     <div class="title-text">
       {{ selectData.strname.replace('风门', '快速密闭') }}
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll)">
-      <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 100}px`">
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 350, scroll)">
+      <dv-border-box8 :dur="5" :style="`padding: 5px; height: ${scroll.y + 120}px`">
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
           <a-tab-pane key="1" tab="实时监测">
             <MonitorTable v-if="activeKey === '1'" ref="MonitorDataTable" class="monitor-table" :columns="columns"
-              :dataSource="dataSource" design-scope="gate-monitor" @selectRow="getSelectRow" :scroll="scroll" title="风门监测"
-              :isShowPagination="false">
+              :dataSource="dataSource" design-scope="gate-monitor" @selectRow="getSelectRow" :scroll="{ y: scroll.y - 40 }" title="风门监测"
+              :isShowPagination="true">
               <template #filterCell="{ column, record }">
                 <template v-if="record.frontGateOpenCtrl == 1 || record.frontGateOpenCtrl === true">
                   <a-tag
@@ -611,7 +611,11 @@ onUnmounted(() => {
 
 <style lang="less" scoped>
 @import '/@/design/vent/modal.less';
-
+.scene-box{
+  .bottom-tabs-box{
+    height: 350px;
+  }
+}
 .button-box {
   border: none !important;
   height: 34px !important;

+ 1 - 1
src/views/vent/monitorManager/safetyMonitor/index.vue

@@ -7,7 +7,7 @@
         </template>
         <template v-else-if="activeKey == '1' && deviceType">
           <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
-            design-scope="device_monitor" :isShowPagination="false" :isShowActionColumn="true" title="设备监测"
+            design-scope="device_monitor" :isShowPagination="false" :isShowActionColumn="true" :is-show-select="false" title="设备监测"
             :form-config="deviceType == 'safetymonitor' ? formConfig : undefined" >
             <template #filterCell="{ column, record }">
               <template v-if="deviceType.startsWith('gate')">

+ 99 - 99
src/views/vent/monitorManager/sensorMonitor/index.vue

@@ -1,91 +1,93 @@
 <template>
   <div class="sensor-container">
-    <a-tabs class="tabs-box" type="card" v-model:activeKey="activeKey" @change="tabChange">
-      <a-tab-pane key="1" tab="实时监测">
-        <div class="box-bg table-box" style="margin-bottom: 10px">
-          <label style="color: #fff">设备类型:</label>
-          <Select
-            @change="handleSensorChange"
-            :options="deviceTypeOption"
-            :fieldNames="{ label: 'itemText', value: 'itemValue' }"
-            v-model:value="deviceKind"
-            style="width: 200px; margin-bottom: 5px"
-            placeholder="请选择设备类型"
-            :allowClear="true"
-          ></Select>
-          <MonitorTable
-            ref="SensorMonitorRef"
-            :columnsType="deviceKind+'_monitor'"
-            :dataSource="dataSource"
-            design-scope="modelsensor_monitor"
-            @select-row="getSelectRow"
-            :deviceType="deviceKind"
-            size="''"
-            title="传感器监测"
-          >
-            <template #filterCell="{ column, record }">
-              <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == 0 ? 'green' : 'red'">{{
-                record.warnFlag == 0 ? '正常' : '报警'
-              }}</a-tag>
-              <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
-                record.netStatus == 0 ? '断开' : '连接'
-              }}</a-tag>
-            </template>
-          </MonitorTable>
-        </div>
+    <a-spin :spinning="loading">
+      <a-tabs class="tabs-box" type="card" v-model:activeKey="activeKey" @change="tabChange">
+        <a-tab-pane key="1" tab="实时监测">
+          <div class="box-bg table-box" style="margin-bottom: 10px">
+            <label style="color: #fff">设备类型:</label>
+            <Select
+              @change="handleSensorChange"
+              :options="deviceTypeOption"
+              :fieldNames="{ label: 'itemText', value: 'itemValue' }"
+              v-model:value="deviceKind"
+              style="width: 200px; margin-bottom: 5px"
+              placeholder="请选择设备类型"
+              :allowClear="true"
+            ></Select>
+            <MonitorTable
+              ref="SensorMonitorRef"
+              :columnsType="deviceKind+'_monitor'"
+              :dataSource="dataSource"
+              design-scope="modelsensor_monitor"
+              @select-row="getSelectRow"
+              :deviceType="deviceKind"
+              size="''"
+              title="传感器监测"
+            >
+              <template #filterCell="{ column, record }">
+                <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == 0 ? 'green' : 'red'">{{
+                  record.warnFlag == 0 ? '正常' : '报警'
+                }}</a-tag>
+                <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
+                  record.netStatus == 0 ? '断开' : '连接'
+                }}</a-tag>
+              </template>
+            </MonitorTable>
+          </div>
 
-        <div class="charts-box box-bg">
-          <BarAndLine
-            v-if="chartsColumns.length > 0"
-            :chartsColumnsType="selectData.deviceType"
-            xAxisPropType="readTime"
-            :dataSource="detailDataSource"
-            height="100%"
-            :chartsColumns="chartsColumns"
-            chartsType="detail"
-            :option="echartsOption"
-            @refresh="refreshEchatrs"
-          />
-        </div>
-      </a-tab-pane>
-      <a-tab-pane key="2" tab="历史数据">
-        <div class="tab-item table-box box-bg padding-0">
-          <HistoryTable
-            columns-type="modelsensor"
-            device-type="modelsensor"
-            :device-list-api="baseList"
-            @change="historyDataSourceChange"
-            designScope="modelsensor-history"
-          />
-        </div>
-        <div class="charts-box box-bg">
-          <BarAndLine
-            v-if="chartsColumns.length > 0"
-            :chartsColumnsType="selectData.deviceType"
-            xAxisPropType="gcreatetime"
-            :dataSource="historyDataSource"
-            height="100%"
-            :chartsColumns="chartsColumns"
-            chartsType="history"
-            :option="echartsOption1"
-            @refresh="refreshEchatrs"
-          />
-        </div>
-      </a-tab-pane>
-      <a-tab-pane key="3" tab="报警历史">
-        <div class="tab-item box-bg">
-          <AlarmHistoryTable columns-type="alarm" device-type="modelsensor" :device-list-api="baseList" designScope="alarm-history" />
-        </div>
-      </a-tab-pane>
-      <a-tab-pane key="4" tab="操作历史">
-        <div class="tab-item box-bg">
-          <HandlerHistoryTable columns-type="operator_history" device-type="modelsensor" :device-list-api="baseList" designScope="alarm-history" />
-        </div>
-      </a-tab-pane>
-    </a-tabs>
-    <div class="title-text">
-      {{ selectData.strname }}
-    </div>
+          <div class="charts-box box-bg">
+            <BarAndLine
+              v-if="chartsColumns.length > 0"
+              :chartsColumnsType="selectData.deviceType"
+              xAxisPropType="readTime"
+              :dataSource="detailDataSource"
+              height="100%"
+              :chartsColumns="chartsColumns"
+              chartsType="detail"
+              :option="echartsOption"
+              @refresh="refreshEchatrs"
+            />
+          </div>
+        </a-tab-pane>
+        <a-tab-pane key="2" tab="历史数据">
+          <div class="tab-item table-box box-bg padding-0">
+            <HistoryTable
+              columns-type="modelsensor"
+              device-type="modelsensor"
+              :device-list-api="baseList"
+              @change="historyDataSourceChange"
+              designScope="modelsensor-history"
+            />
+          </div>
+          <div class="charts-box box-bg">
+            <BarAndLine
+              v-if="chartsColumns.length > 0"
+              :chartsColumnsType="selectData.deviceType"
+              xAxisPropType="gcreatetime"
+              :dataSource="historyDataSource"
+              height="100%"
+              :chartsColumns="chartsColumns"
+              chartsType="history"
+              :option="echartsOption1"
+              @refresh="refreshEchatrs"
+            />
+          </div>
+        </a-tab-pane>
+        <a-tab-pane key="3" tab="报警历史">
+          <div class="tab-item box-bg">
+            <AlarmHistoryTable columns-type="alarm" device-type="modelsensor" :device-list-api="baseList" designScope="alarm-history" />
+          </div>
+        </a-tab-pane>
+        <a-tab-pane key="4" tab="操作历史">
+          <div class="tab-item box-bg">
+            <HandlerHistoryTable columns-type="operator_history" device-type="modelsensor" :device-list-api="baseList" designScope="alarm-history" />
+          </div>
+        </a-tab-pane>
+      </a-tabs>
+      <div class="title-text">
+        {{ selectData.strname }}
+      </div>
+    </a-spin>
   </div>
 </template>
 
@@ -113,7 +115,7 @@
   const detailDataSource = ref<any[]>([]);
   const historyDataSource = ref<any[]>([]);
   const chartsColumns = ref<any[]>([]);
-
+  const loading = ref(true)
 
   const echartsOption = {
     grid: {
@@ -185,7 +187,7 @@
     });
     const data: any = toRaw(dataSource.value[selectRowIndex.value]); //maxarea
     Object.assign(selectData, data);
-
+    
     // if (chartsColumns.value.length <= 0 && selectData.deviceType) {
     //   handleChange(selectData.deviceType);
     // }
@@ -203,6 +205,10 @@
         }
       }
     }
+
+    if(loading.value){
+      loading.value = false
+    }
     return data;
   };
 
@@ -235,22 +241,16 @@
   }
 
   function handleSensorChange(type) {
-    if (timer) {
-      clearTimeout(timer);
-      timer = undefined;
-    }
-    setTimeout(() => {
-      handleChange(type);
-      timer = null;
-      dataSource.value = [];
-      detailDataSource.value = [];
-      getMonitor(true);
-    }, 500);
+    loading.value = true
+    handleChange(type);
+    timer = null;
+    dataSource.value = [];
+    detailDataSource.value = [];
   }
 
   function refreshEchatrs() {
     timer = null;
-    getMonitor(true);
+    // getMonitor(true);
     console.log('echarts 刷新');
   }
   function historyDataSourceChange(dataSource) {

+ 12 - 6
src/views/vent/monitorManager/windowMonitor/index.vue

@@ -56,8 +56,8 @@
     <div class="title-text">
       {{ selectData.strname }}
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll)">
-      <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 100}px`" >
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 350, scroll)">
+      <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 120}px`" >
         <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange">
           <a-tab-pane key="1" tab="实时监测">
             <MonitorTable
@@ -67,9 +67,9 @@
               :dataSource="dataSource"
               @selectRow="getSelectRow"
               design-scope="window-monitor"
-              :scroll="scroll"
+              :scroll="{y: scroll.y - 40}"
               title="风窗监测"
-              :isShowPagination="false"
+              :isShowPagination="true"
             >
               <template #filterCell="{ column, record }">
                 <a-tag v-if="column.dataIndex === 'warnFlag'" :color="record.warnFlag == 0 ? 'green' : 'red'">{{
@@ -145,7 +145,7 @@
   const playerRef = ref();
   let webRtcServer: any[] = []
   const scroll = reactive({
-    y: 240
+    y: 230
   })
 
   const modalIsShow = ref<boolean>(false); // 是否显示模态框
@@ -371,8 +371,8 @@
       getMonitor(true);
       loading.value = false;
       addMonitorText(selectData);
-      
     });
+   
   });
   onUnmounted(() => {
     destroy();
@@ -407,4 +407,10 @@
     }
     margin-right: 10px;
   }
+  .scene-box{
+    .bottom-tabs-box{
+      height: 350px;
+    }
+  }
+  
 </style>

+ 1 - 1
src/views/vent/monitorManager/windowMonitor/window.threejs.ts

@@ -109,7 +109,7 @@ export const addMonitorText = (selectData) => {
 };
 
 export const play = (rotationParam, flag) => {
-  if (windowType === 'doubleWindow') {
+  if (windowType === 'doubleWindow' && doubleWindowObj) {
     return doubleWindowObj.play.call(doubleWindowObj, rotationParam, flag);
   } else if (windowType === 'singleWindow' && singleWindowObj) {
     return singleWindowObj.play.call(singleWindowObj, rotationParam, flag);

+ 10 - 5
src/views/vent/monitorManager/windrectMonitor/index.vue

@@ -40,8 +40,8 @@
     <div class="title-text">
       {{ selectData.strname }}
     </div>
-    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll)">
-      <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 100}px`" >
+    <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 350, scroll)">
+      <dv-border-box8 :dur="5"  :style="`padding: 5px; height: ${scroll.y + 120}px`" >
         <div class="tabs-button-group">
           <a-button class="tabs-button" type="primary" @click="openModel">一键测风</a-button>
         </div>
@@ -54,9 +54,9 @@
               :dataSource="dataSource"
               design-scope="windrect-monitor"
               @selectRow="getSelectRow"
-              :scroll="scroll"
+              :scroll="{ y: scroll.y - 40 }"
               title="测风装置监测"
-              :isShowPagination="false"
+              :isShowPagination="true"
             >
               <template #filterCell="{ column, record }">
                 <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? '#FF5812' : 'green'">{{
@@ -171,7 +171,7 @@
   let webRtcServer: any[] = []
 
   const scroll = reactive({
-    y: 240
+    y: 230
   })
   const modalType = ref('')
   const modalIsShow = ref(false)
@@ -728,6 +728,11 @@
   :deep(.@{ventSpace}-tabs-tabpane-active) {
     height: 100%;
   }
+  .scene-box{
+    .bottom-tabs-box{
+      height: 350px;
+    }
+  }
   .head-line {
     display: flex;
     flex-direction: row;

+ 3 - 1
src/views/vent/performance/fileDetail/index.vue

@@ -435,8 +435,10 @@
   }
   :deep(.@{ventSpace}-select-dropdown) {
     border: 1px solid #ececec66;
-    background: #ffffff !important;
+    // background: #ffffff !important;
     // left: 0px !important;
+    // backdrop-filter: blur(50px);
+    background: transparent !important;
     backdrop-filter: blur(50px);
 
 

+ 4 - 4
vite.config.ts

@@ -9,7 +9,6 @@ import { wrapperEnv } from './build/utils';
 import { createVitePlugins } from './build/vite/plugin';
 import { OUTPUT_DIR } from './build/constant';
 
-
 function pathResolve(dir: string) {
   return resolve(process.cwd(), '.', dir);
 }
@@ -83,8 +82,8 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
           manualChunks: {
             'tinymce-vendor': ['tinymce'],
             'echarts-vendor': ['echarts'],
-            'antd-vue-vendor': ['ant-design-vue','@ant-design/icons-vue','@ant-design/colors'],
-            'vxe-table-vendor': ['vxe-table','vxe-table-plugin-antd','xe-utils'],
+            'antd-vue-vendor': ['ant-design-vue', '@ant-design/icons-vue', '@ant-design/colors'],
+            'vxe-table-vendor': ['vxe-table', 'vxe-table-plugin-antd', 'xe-utils'],
             'codemirror-vendor': ['codemirror'],
             //'emoji-mart-vue-fast': ['emoji-mart-vue-fast'],
             'jeecg-online-vendor': ['@jeecg/online'],
@@ -95,8 +94,9 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
             vue: ['vue', 'vue-router'],
             'cron-parser-vendor': ['cron-parser'],
           },
-        }
+        },
       },
+
       // 关闭brotliSize显示可以稍微减少打包时间
       reportCompressedSize: false,
       // 提高超大静态资源警告大小