yanjinhui
2025-08-28 554ea194fa4332e97c3def7e010acecde26b48d5
前端页面的修改
已修改16个文件
已添加1个文件
677 ■■■■■ 文件已修改
项目代码/前端/单机版/src/api/newapi/Parameters.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/api/user.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/assets/index/icon/主页图片.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/layout/index.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/utils/index.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/views/tts/AlarmReset/AlarmReset.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/views/tts/PickAndDrop/Manualcontrol.vue 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/views/tts/PickAndDrop/PickAndDrop.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/单机版/src/views/tts/UserManagement/Usermanagement.vue 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/api/newapi/Parameters.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/api/newapi/user.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/axios/service.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/permission.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/views/Authorization/Team/Team.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/views/Authorization/iPaddress/iPaddress.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/views/Login/components/LoginForm.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/前端/后台/src/views/tts/PickAndDrop/PickAndDrop.vue 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/api/newapi/Parameters.js
@@ -11,3 +11,6 @@
export const Pouse = () => http.post(`/api/Parameters/PauseButton`);
//获取当前伸缩杆位置
export const GetPosition = () => http.post(`/api/Parameters/CurrentLocation`);
//获取当前客户端的ip地址来决定视频流
export const GetStandid=()=>http.post(`/api/IPaddress/GetStandid`);
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/api/user.js
@@ -24,7 +24,9 @@
//修改密码 id=${data.id}&
export const UpdatePassword = (data) => http.post(`/api/User/modifyPwd?newPwd=${data.newPwd}&oldPwd=${data.oldPwd}`)
//
export const UpdatePwd = (data) => http.post(`/api/User/UpdatePwd?id=${data.id}&newPwd=${data.newPwd}&oldPwd=${data.oldPwd}`)
// export const UpdatePwd = (data) => http.post(`/api/User/UpdatePwd?id=${data.id}&newPwd=${data.newPwd}&oldPwd=${data.oldPwd}`)
export const UpdatePwd = (data) =>http.post(`/api/User/UpdatePwd?id=${encodeURIComponent(data.id)}&newPwd=${encodeURIComponent(data.newPwd)}&oldPwd=${encodeURIComponent(data.oldPwd)}`)
//导出用户列表
export const ExportApi = (data) => http.download("/api/User/Export", data, "用户列表数据.xlsx", "加载中");
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/assets/index/icon/Ö÷ҳͼƬ.png
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/layout/index.vue
@@ -34,17 +34,34 @@
              alt=""
            />
          </div>
          <!-- <div style="color: red;font-size:1.8rem; align-items: center">
             æŠ¥è­¦ï¼š<span>{{
              isfalsedata.length <= 0 ? "" : isfalsedata[0].AlarmContent
            }}</span>
          </div> -->
          <!-- æ‹¿æœ€æ–°çš„一条数据 -->
          <div style="color: red;font-size:1.8rem; align-items: center">
          <!-- <div style="color: red;font-size:1.8rem; align-items: center">
          <span>{{
                isfalsedata.length <= 0 ? "" : isfalsedata[isfalsedata.length - 1].AlarmContent
                }}</span> 
          </div> -->
          <div style="
            display: flex;
            justify-content: center;
            align-items: center;
            width: 45%;
          ">
              <img
                style="
                  width: 3.88rem;
                  height: 3.88rem;
                  cursor: pointer;
                "
                src="@/assets/index/icon/主页图片.png"
                alt=""
                @click="router.push({ path: '/index' })"
              />
               <!--@/assets/index/icon/home.png
              <span style="margin-right: 1.81rem;font-size: 2.88rem;color: rgb(255, 255, 255)"
                  @click="router.push({ path: '/index' })"
              >返回</span> -->
          </div>
          
          
          <!-- å ä½ -->
@@ -70,7 +87,8 @@
                >权限修改</span
              > -->
              <img
              <!-- å…¨å±€ -->
              <!-- <img
                v-if="!isFullscreen"
                style="
                  width: 2.88rem;
@@ -81,7 +99,7 @@
                src="@/assets/screen.png"
                alt=""
                @click="screenonToggle"
              />
              /> -->
              <img
                v-if="isFullscreen"
                style="
@@ -94,20 +112,23 @@
                alt=""
                @click="screenonToggle"
              />
              <img
              <!-- è¿”回主页 -->
              <!-- <img
                style="
                  width: 2.88rem;
                  height: 2.88rem;
                  margin-right: 1.81rem;
                  cursor: pointer;
                "
                src="@/assets/index/icon/home.png"
                alt=""
                @click="router.push({ path: '/index' })"
              />
              /> -->
              <!-- <span style="margin-right: 1.81rem;font-size: 1.88rem;color: rgb(255, 255, 255)"
                  @click="router.push({ path: '/index' })"
              >返回</span> -->
              <div>
                <span
                  style="color: rgb(255, 255, 255); font-size: 1.88rem"
                  style="color: rgb(255, 255, 255);cursor: pointer; font-size: 1.88rem; ;"
                  class="tetxsize"
                  >角色:{{ acountInfo.roleName }}</span
                >
@@ -119,7 +140,8 @@
                  >姓名:{{ acountInfo.userTrueName }}</span
                >
              </div>
              <img
              <!-- å¤´åƒ -->
              <!-- <img
                v-if="avatar"
                @click="to(links[0])"
                :src="avatar"
@@ -146,9 +168,10 @@
                  overflow: hidden;
                  box-shadow: 0rem 0.13rem 0.38rem 0rem rgba(0, 0, 0, 0.4);
                "
              />
              /> -->
              <div
              <!-- ç”¨æˆ·å -->
              <!-- <div
                style="
                  cursor: pointer;
                  line-height: 1.25rem;
@@ -159,8 +182,10 @@
                class="tetxsize"
              >
                {{ userName }}
              </div>
              </div> -->
            </div>
            <!--退出图片 -->
            <img
              @click="to(links[1])"
              src="@/assets/index/loginout.png"
@@ -169,9 +194,22 @@
                height: 2.44rem;
                height: 2.44rem;
                margin-left: 0.69rem;
                margin-right: 1.81rem;
              "
              alt=""
            />
            <!-- å…¨å±€æ–¹æ³•图片 -->
            <img
                v-if="!isFullscreen"
                style="
                  width: 2.88rem;
                  height: 2.88rem;
                  cursor: pointer;
                "
                src="@/assets/screen.png"
                alt=""
                @click="screenonToggle"
              />
          </div>
        </div>
      </header>
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/utils/index.js
@@ -1,11 +1,12 @@
import { dayjs } from "element-plus";
// import XLSX from "xlsx"; //导入xlsx
export const baseUrl = "http://127.0.0.1:1598"
export const baseUrl = "http://192.168.1.103:9093"
// http://127.0.0.1:1598
// http://192.168.1.103:9093 ä»¥å‰çº¿ä¸Šåœ°å€
export const faceRecognitionUrl = "http://192.168.1.103:9095"
// export const faceRecognitionUrl = "http://127.0.0.1:1598"
//对象转FormData生成方法
export function objToFormData(obj) {
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/views/tts/AlarmReset/AlarmReset.vue
@@ -103,6 +103,7 @@
  clearInterval(timer.value);
  // åˆ›å»ºWebSocket连接
  //"ws://127.0.0.1:9295/admin"
  //ws://192.168.1.103:5173
  //192.168.1.103
  client.value = new WebSocket("ws://192.168.1.103:5173/");
  client.value.onopen = function () {
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/views/tts/PickAndDrop/Manualcontrol.vue
@@ -565,6 +565,7 @@
  AutoPickAndDrop,
  Pouse,
  GetParameter,
  GetStandid,
} from "@/api/newapi/Parameters.js";
// import EZUIKit from "ezuikit-js";
@@ -778,26 +779,63 @@
const webRtcServer_left = ref(null)
const webRtcServer_right = ref(null)
// æ‘„像头 RTSP åœ°å€ï¼Œæ³¨æ„ %23 æ›¿ä»£ #,这是 URL ç¼–码 è§†é¢‘编码格式 ä»Ž H.265 ä¿®æ”¹ä¸º H.264,265不支持
const rtspLeft = 'rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/101'
const rtspRight = 'rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/201'
// æ‘„像头 RTSP åœ°å€ï¼Œæ³¨æ„ %23 æ›¿ä»£ #,这是 URL ç¼–码 ;视频编码格式 ä»Ž H.265 ä¿®æ”¹ä¸º H.264,265不支持
const videoStreamList = [
  // index = StationID - 1,对应 StationID = 1 æ—¶å–第 0 é¡¹
  {
    left: "rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/101",
    right: "rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/201"
  },
  {
    left: "rtsp://admin:MXmx2380%23@192.168.1.169:554/Streaming/Channels/101",
    right: "rtsp://admin:MXmx2380%23@192.168.1.169:554/Streaming/Channels/201"
  },
  {
    left: "rtsp://admin:MXmx2380%23@192.168.1.170:554/Streaming/Channels/101",
    right: "rtsp://admin:MXmx2380%23@192.168.1.170:554/Streaming/Channels/201"
  }
  // å¯ä»¥ç»§ç»­æ·»åŠ æ›´å¤šç«™ç‚¹æµåœ°å€
];
const getStationId = async () => {
  try {
    const res = await GetStandid()
     console.log("手动视频监控站点",res)
    if (res.status) {
      const stationId = parseInt(res.data);
      initVideoByStationId(stationId);
    } else {
      ElMessage.error("获取站点编号失败:" + res.message);
    }
  } catch (err) {
    ElMessage.error("请求失败:" + err.message);
  }
};
// WebRtcStreamer æœåŠ¡åœ°å€
const serverUrl = 'http://192.168.1.103:8000' // â† æ”¹ä¸ºä½ è¿è¡Œçš„那台电脑的 IP
const initVideo = () => {
  try {
    webRtcServer_left.value = new WebRtcStreamer('video_left', serverUrl)
    webRtcServer_left.value.connect(rtspLeft)
const initVideoByStationId = (stationId) => {
  const index = stationId - 1;
    webRtcServer_right.value = new WebRtcStreamer('video_right', serverUrl)
    webRtcServer_right.value.connect(rtspRight)
    console.log('视频初始化完成')
  } catch (err) {
    ElMessage.error('视频初始化失败: ' + err.message)
  if (index < 0 || index >= videoStreamList.length) {
    ElMessage.error("无效的站点编号:" + stationId);
    return;
  }
}
  const rtspUrls = videoStreamList[index];
  try {
    webRtcServer_left.value = new WebRtcStreamer("video_left", serverUrl);
    webRtcServer_left.value.connect(rtspUrls.left);
    webRtcServer_right.value = new WebRtcStreamer("video_right", serverUrl);
    webRtcServer_right.value.connect(rtspUrls.right);
    console.log("视频初始化完成:", rtspUrls);
  } catch (err) {
    ElMessage.error("视频初始化失败: " + err.message);
  }
};
//销毁视频函数
const destroyVideo = () => {
@@ -835,7 +873,8 @@
onMounted(() => {
  initVideo(),
   getStationId(); // é¡µé¢åŠ è½½æ—¶è‡ªåŠ¨èŽ·å–å¹¶æ’­æ”¾è§†é¢‘
  // initVideo(),
  isStart.value = true; // è®¾ç½®ä¸ºå¼€å§‹çŠ¶æ€
  createSocket();
  getParameter();
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/views/tts/PickAndDrop/PickAndDrop.vue
@@ -37,25 +37,9 @@
            <div class="item">缩到位:{{ 0 }}</div>
            <div class="item">伸出速度:{{ ruleForm.extendSpeed }}</div>
            <div class="item">缩回速度:{{ ruleForm.extendSpeed }}</div>
            <!-- <div class="open">
              <div class="city">
                <div class="dotted"></div>
                <div class="pulse1"></div>
                <div class="pulse2"></div>
                <div class="pulse3"></div>
              </div>
            </div> -->
          </div>
        <!-- è§†é¢‘框 -->
        <div style="display: flex; justify-content: center">
          <!-- <div
            style="
              display: flex;
              flex-direction: column;
              align-items: center;
              width: 80%;
            "
          > -->
         <!-- æ¨ªå±è§†é¢‘监控左侧 -->
            <div class="video_l">
              <video
@@ -82,30 +66,12 @@
          <span>右侧警惕机构</span>
          <span></span>
        </div>
        <!-- è§†é¢‘框 -->
          <!-- <div
            style="
              display: flex;
              flex-direction: column;
              align-items: center;
              width: 80%;
            "
          > -->
         <div class="operate">
            <div class="item">伸到位:{{ ruleForm.leftPosition }}</div>
            <!--  ruleForm.leftPosition -->
            <div class="item">缩到位:{{ 0 }}</div>
            <div class="item">伸出速度:{{ ruleForm.extendSpeed }}</div>
            <div class="item">缩回速度:{{ ruleForm.extendSpeed }}</div>
            <!-- <div class="open">
              <div class="city">
                <div class="dotted"></div>
                <div class="pulse1"></div>
                <div class="pulse2"></div>
                <div class="pulse3"></div>
              </div>
            </div> -->
          </div>
           <div style="display: flex; justify-content: center;">
          <!-- æ¨ªå±è§†é¢‘监控右侧 -->
@@ -120,8 +86,6 @@
                height="100%"
              ></video>
            </div>
          <!-- </div> -->
        </div>
      </div>
    </div>
@@ -144,18 +108,8 @@
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.extendSpeed }}</div>
          <div class="item">缩回速度:{{ ruleForm.extendSpeed }}</div>
          <!-- <div class="open">
            <div class="city">
              <div class="dotted"></div>
              <div class="pulse1"></div>
              <div class="pulse2"></div>
              <div class="pulse3"></div>
            </div>
          </div> -->
        </div>
        <!-- <span style="color: #fff; font-size: 2.5rem; font-weight: bold"
              >视频监控左侧</span
            > -->
        <div  style="display: flex; flex-direction: column; align-items: center">
          <div class="video_l">
            <video
@@ -186,18 +140,7 @@
          <div class="item">缩到位:{{ 0 }}</div>
          <div class="item">伸出速度:{{ ruleForm.retractionSpeed }}</div>
          <div class="item">缩回速度:{{ ruleForm.retractionSpeed }}</div>
          <!-- <div class="open">
            <div class="city">
              <div class="dotted"></div>
              <div class="pulse1"></div>
              <div class="pulse2"></div>
              <div class="pulse3"></div>
            </div>
          </div> -->
        </div>
         <!-- <span style="color: #fff; font-size: 2.5rem; font-weight: bold"
              >视频监控右侧</span
            > -->
        <div style="display: flex; flex-direction: column; align-items: center">
          <div class="video_r">
            <video
@@ -233,6 +176,7 @@
  Pouse,
  GetPosition,
  GetParameter,
  GetStandid
} from "@/api/newapi/Parameters.js";
const router = useRouter();
@@ -251,8 +195,6 @@
  retractionSpeed: 0,
  manualExtend: 0,
  manualRetraction: 0,
  // depid: userInfo.depid,
  // account: userInfo.userName,
  leftPosition: 0,
  rightPosition: 0,
});
@@ -347,31 +289,66 @@
const webRtcServer_right = ref(null);
// æ‘„像头 RTSP åœ°å€ï¼Œæ³¨æ„ %23 æ›¿ä»£ #,这是 URL ç¼–码
const rtspLeft =
  "rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/101";
const rtspRight =
  "rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/201";
const videoStreamList = [
  // index = StationID - 1,对应 StationID = 1 æ—¶å–第 0 é¡¹
  {
    left: "rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/101",
    right: "rtsp://admin:MXmx2380%23@192.168.1.168:554/Streaming/Channels/201"
  },
  {
    left: "rtsp://admin:MXmx2380%23@192.168.1.169:554/Streaming/Channels/101",
    right: "rtsp://admin:MXmx2380%23@192.168.1.169:554/Streaming/Channels/201"
  },
  {
    left: "rtsp://admin:MXmx2380%23@192.168.1.170:554/Streaming/Channels/101",
    right: "rtsp://admin:MXmx2380%23@192.168.1.170:554/Streaming/Channels/201"
  }
  // å¯ä»¥ç»§ç»­æ·»åŠ æ›´å¤šç«™ç‚¹æµåœ°å€
];
const getStationId = async () => {
  try {
    const res = await GetStandid()
     console.log("视频监控站点",res)
    if (res.status) {
      const stationId = parseInt(res.data);
      initVideoByStationId(stationId);/// ä¼ é€’到视频初始化函数(调用方法)
    } else {
      ElMessage.error("获取站点编号失败:" + res.message);
    }
  } catch (err) {
    ElMessage.error("请求失败:" + err.message);
  }
};
// WebRtcStreamer æœåŠ¡åœ°å€
const serverUrl = "http://192.168.1.103:8000"; // â† æ”¹ä¸ºä½ è¿è¡Œçš„那台电脑的 IP
const initVideo = () => {
//根据后端返回的不同数字来读取不同的视频监控流
const initVideoByStationId = (stationId) => {
  const index = stationId - 1;
  if (index < 0 || index >= videoStreamList.length) {
    ElMessage.error("无效的站点编号:" + stationId);
    return;
  }
  const rtspUrls = videoStreamList[index];
  try {
    webRtcServer_left.value = new WebRtcStreamer("video_left", serverUrl);
    webRtcServer_left.value.connect(rtspLeft);
    webRtcServer_left.value.connect(rtspUrls.left);
    webRtcServer_right.value = new WebRtcStreamer("video_right", serverUrl);
    webRtcServer_right.value.connect(rtspRight);
    webRtcServer_right.value.connect(rtspUrls.right);
    console.log(
      "视频初始化完成",
      webRtcServer_left.value,
      webRtcServer_right.value
    );
    console.log("视频初始化完成:", rtspUrls);
  } catch (err) {
    ElMessage.error("视频初始化失败: " + err.message);
  }
};
const destroyVideo = () => {
  if (webRtcServer_left.value) {
@@ -386,7 +363,8 @@
// ä»¥ä¸Šæ˜¯è§†é¢‘监控
onMounted(() => {
  initVideo();
   getStationId(); // é¡µé¢åŠ è½½æ—¶è‡ªåŠ¨èŽ·å–å¹¶æ’­æ”¾è§†é¢‘
  // initVideoByStationId();
  //监听窗口大小变化
  window.addEventListener("resize", () => {
    nextTick(() => {
@@ -430,9 +408,6 @@
const isPortrait = ref(checkOrientation() === 'portrait');
onActivated(() => {
  // ç¼“存页面 æ‰“开页面 å®žçŽ°æ’­æ”¾
  // const video = document.getElementById("video");
  // video.paused && video.play();
  ["video_left", "video_right"].forEach((id) => {
    const video = document.getElementById(id);
    if (video && video.paused) video.play();
@@ -441,9 +416,6 @@
// é¡µé¢åœç”¨
onDeactivated(() => {
  // ç¼“存页面 ç¦»å¼€é¡µé¢ å®žçŽ°æš‚åœ
  // const video = document.getElementById("video");
  // video.play && video.pause();
  ["video_left", "video_right"].forEach((id) => {
    const video = document.getElementById(id);
    if (video && !video.paused) video.pause();
ÏîÄ¿´úÂë/ǰ¶Ë/µ¥»ú°æ/src/views/tts/UserManagement/Usermanagement.vue
@@ -1,6 +1,6 @@
<template>
  <div class="Usermanagement">
    <div class="content">
    <div class="content" >
      <div class="checkbox">
        <div
          :class="['item', isactive == 1 ? 'isactive' : '']"
@@ -208,7 +208,7 @@
          >
        </div>
      </div>
      <div style="margin-top: 1rem; height: 100%">
      <div style="margin-top: 1rem; height: 90%">
        <!-- ç”¨æˆ·åˆ—表 -->
        <el-table
          empty-text="暂无数据"
@@ -575,7 +575,7 @@
          <el-table-column prop="unitName" label="单位名称" align="center" />
          <el-table-column prop="creater" label="创建者" align="center" />
          <el-table-column prop="createDate" label="创建日期" align="center" />
          <el-table-column label="操作" align="center">
          <el-table-column label="操作"  >
            <template #default="scope">
              <span
                v-if="
@@ -638,7 +638,8 @@
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="iPaddress" label="ip地址" align="center" />
          <el-table-column prop="addressname" label="检修道" align="center" />
          <el-table-column prop="addressname" label="设备名称" align="center" />
          <el-table-column prop="stationID" label="检修道" align="center" />
          <el-table-column label="操作" align="center">
            <template #default="scope">
              <span
@@ -1387,7 +1388,7 @@
              fontSize: isMin ? '2rem' : '1rem',
              fontWeight: 'bold',
            }"
            >用户ip</span
            >设备ip</span
          >
        </div>
      </template>
@@ -1444,14 +1445,44 @@
                  color: 'black',
                  fontWeight: bold,
                }"
                >检修道</span
                >设备名称</span
              >
            </div>
          </template>
          <el-input
            style="height: 2rem"
            size="small"
            v-model="formip.addressname"
            placeholder="请输入"
          />
        </el-form-item>
         <el-form-item prop="stationID">
          <template #label>
            <div style="display: flex; align-items: flex-end">
              <span
                :style="{
                  color: 'red',
                  marginRight: '0.2rem',
                  fontSize: '2rem',
                }"
                >*</span
              >
              <span
                :style="{
                  fontSize: isMin ? '2rem' : '0.88rem',
                  color: 'black',
                  fontWeight: bold,
                }"
                >轨道站</span
              >
            </div>
          </template>
          <el-input
            style="height: 2rem"
            size="small"
            v-model="formip.stationID"
            placeholder="请输入"
          />
        </el-form-item>
@@ -2446,6 +2477,7 @@
    getIpData();
  }
};
//禁止页面滑动
//批量删除
const ids = ref([]);
@@ -2718,6 +2750,7 @@
  id: 0,
  iPaddress: "",
  addressname: "",
  stationID:0
});
const formipRef = ref(null);
//获取ip数据
@@ -2780,6 +2813,7 @@
onMounted(() => {
  if (window.innerWidth <= 1080) {
    isMin.value = true;
    // document.body.style.overflow = "hidden";
  }
  //打印当前屏幕宽度
  userInfo.value = JSON.parse(localStorage.getItem("user"));
@@ -2802,6 +2836,7 @@
    width: 100%;
    display: flex;
    flex-direction: column;
    .checkbox {
      width: 25rem;
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/api/newapi/Parameters.js
@@ -8,4 +8,7 @@
//暂停
export const Pause = (data) => request.post({ url: `/api/Parameters/PauseButton?deptid=${data}` });
//回去伸缩杆当前位置
export const GetPosition = (data) => request.post({ url: `/api/Parameters/CurrentLocation?deptid=${data}` });
export const GetPosition = (data) => request.post({ url: `/api/Parameters/CurrentLocation?deptid=${data}` });
//返回伸缩杆每台plc设置的参数
export const BackfillSpeed=(data)=>request.post({ url: `/api/Parameters/BackfillSpeed?plank=${data}` });
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/api/newapi/user.js
@@ -24,7 +24,8 @@
//修改密码 id=${data.id}&
export const UpdatePassword = (data) => request.post({ url: `/api/User/modifyPwd?newPwd=${data.newPwd}&oldPwd=${data.oldPwd}` })
//
export const UpdatePwd = (data) => request.post({ url: `/api/User/UpdatePwd?id=${data.id}&newPwd=${data.newPwd}&oldPwd=${data.oldPwd}` })
// export const UpdatePwd = (data) => request.post({ url: `/api/User/UpdatePwd?id=${data.id}&newPwd=${data.newPwd}&oldPwd=${data.oldPwd}` })
export const UpdatePwd = (data) =>http.post(`/api/User/UpdatePwd?id=${encodeURIComponent(data.id)}&newPwd=${encodeURIComponent(data.newPwd)}&oldPwd=${encodeURIComponent(data.oldPwd)}`)
//导出用户列表
export const ExportApi = (data) => http.download("/api/User/Export", data, "用户列表数据.xlsx", "加载中");
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/axios/service.ts
@@ -20,7 +20,7 @@
// 'http://192.168.1.103:9090' //上线地址
// 'http://192.168.0.80:1596'
axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => {
  const controller = new AbortController()
  const controller = new AbortController()
  const url = res.url || ''
  res.signal = controller.signal
  abortControllerMap.set(
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/permission.ts
@@ -39,9 +39,17 @@
        await permissionStore.generateRoutes('static')
      }
      // permissionStore.getAddRouters.forEach((route) => {
      //   router.addRoute(route as unknown as RouteRecordRaw) // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
      // })
      //下面是我自己修改的路由访问方式(上面访问4000路径总是报错)
      permissionStore.getAddRouters.forEach((route) => {
        router.addRoute(route as unknown as RouteRecordRaw) // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
      })
      const normalizedRoute = {
        ...route,
        path: route.path.startsWith('/') ? route.path : `/${route.path}` // [!code ++]
      };
      router.addRoute(normalizedRoute as unknown as RouteRecordRaw); // [!code ++]
    });
      const redirectPath = from.query.redirect || to.path
      const redirect = decodeURIComponent(redirectPath as string)
      const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect }
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/views/Authorization/Team/Team.vue
@@ -111,7 +111,7 @@
  })
}
// ç¼–辑班组
// ç¼–辑班组
const EditTream = (val) => {
  Treamtype.value = "修改"
  formTeam.value = Object.assign({}, val)
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/views/Authorization/iPaddress/iPaddress.vue
@@ -160,6 +160,7 @@
  formIP.value = {
    iPaddress: '',
    addressname: '',
    stationID:0,
    createDate: formatTime(new Date()),
    creater: JSON.parse(localStorage.getItem('user')).userName
  }
@@ -236,7 +237,8 @@
    >
      <el-table-column type="selection" align="center" />
      <el-table-column prop="iPaddress" label="IP地址" align="center" />
      <el-table-column prop="addressname" label="检修道" align="center" />
      <el-table-column prop="addressname" label="设备名称" align="center" />
      <el-table-column prop="stationID" label="检修道" align="center" />
      <!-- <el-table-column prop="creater" label="创建者" align="center" /> -->
      <el-table-column prop="createDate" label="创建时间" align="center" />
      <el-table-column label="操作" align="center">
@@ -335,6 +337,20 @@
          placeholder="请输入检修道名称"
        />
      </el-form-item>
      <el-form-item prop="stationID">
        <template #label>
          <div style="display: flex; align-items: flex-end">
            <span style="color: red; margin-right: 0.2rem">*</span>
            <span style="font-size: 0.88rem; color: black; font-weight: bold">检修道号</span>
          </div>
        </template>
        <el-input
          style="height: 2rem"
          size="small"
          v-model="formIP.stationID"
          placeholder="请输入检修道号"
        />
      </el-form-item>
    </el-form>
    <template #footer>
      <div class="dialog-footer" style="text-align: center">
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/views/Login/components/LoginForm.vue
@@ -197,7 +197,9 @@
              addRoute(route as RouteRecordRaw) // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
            })
            permissionStore.setIsAddRouters(true)
            push({ path: redirect.value || permissionStore.addRouters[0].path })
           // push({ path: redirect.value || permissionStore.addRouters[0].path })
           push({ path: '/PickAndDrop' })
          }
        }
      } finally {
@@ -228,7 +230,9 @@
      addRoute(route as RouteRecordRaw) // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
    })
    permissionStore.setIsAddRouters(true)
    push({ path: redirect.value || permissionStore.addRouters[0].path })
    // push({ path: redirect.value || permissionStore.addRouters[0].path })
    push({ path: '/tts/PickAndDrop' })
  }
}
ÏîÄ¿´úÂë/ǰ¶Ë/ºǫ́/src/views/tts/PickAndDrop/PickAndDrop.vue
@@ -115,7 +115,7 @@
    <div v-if="isMobile" class="content">
      <div class="content_l">
        <div class="model">左侧伸缩杆</div>
        <div class="operate" style="opacity: 0">
        <div class="operate" style="opacity: 100">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
@@ -138,7 +138,7 @@
      </div>
      <div class="content_r">
        <div class="model">右侧伸缩杆</div>
        <div class="operate" style="opacity: 0">
        <div class="operate" style="opacity: 100">
          <div class="item">伸到位</div>
          <div class="item">缩到位</div>
          <div class="item">伸出速度</div>
@@ -164,9 +164,9 @@
    <div v-else class="content_mobile">
      <div class="content_l">
        <div style="display: flex; align-items: center">
          <div class="model">左侧伸缩杆</div>
          <div class="model">左侧竖屏伸缩杆</div>
          <div class="mode"></div>
          <div class="operate" style="opacity: 0">
          <div class="operate" style="opacity:100">
            <div class="item">伸到位</div>
            <div class="item">缩到位</div>
            <div class="item">伸出速度</div>
@@ -190,9 +190,9 @@
      </div>
      <div class="content_r">
        <div style="display: flex; align-items: center">
          <div class="model">右侧伸缩杆</div>
          <div class="model">右侧竖屏伸缩杆</div>
          <div class="mode"></div>
          <div class="operate" style="opacity: 0">
          <div class="operate" style="opacity: 100">
            <div class="item">伸到位</div>
            <div class="item">缩到位</div>
            <div class="item">伸出速度</div>
@@ -221,6 +221,7 @@
    <!-- é€šè¿‡æ ‡ç­¾é¡µåˆ‡æ¢éƒ¨é—¨ï¼Œå¹¶åŠ¨æ€åŠ è½½è¯¥éƒ¨é—¨çš„ä½ç½®æ•°æ®ã€‚ -->
    <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> 
      <el-tab-pane v-for="item in list" :key="item.id" :label="item.name" :name="item.id">
       <!-- Manualcontrol:控制横屏 -->
        <div class="Manualcontrol">
          <div class="button">
            <el-button
@@ -304,10 +305,10 @@
                </div>
              </div>
              <div class="operate">
                <div class="item">伸到位</div>
                <div class="item">缩到位</div>
                <div class="item">伸出速度</div>
                <div class="item">缩回速度</div>
                <div class="item">伸到位{{ruleForm.leftPosition}}</div>
                <div class="item">缩到位{{0}}</div>
                <div class="item">伸出速度{{ruleForm.extendSpeed}}</div>
                <div class="item">缩回速度{{ruleForm.extendSpeed}}</div>
                <!-- <div class="open">
                  <div class="city">
                    <div class="dotted"></div>
@@ -406,10 +407,10 @@
                </div>
              </div>
              <div class="operate">
                <div class="item">伸到位</div>
                <div class="item">缩到位</div>
                <div class="item">伸出速度</div>
                <div class="item">缩回速度</div>
                <div class="item">伸到位{{ruleForm.leftPosition}}</div>
                <div class="item">缩到位{{0}}</div>
                <div class="item">伸出速度{{ruleForm.extendSpeed}}</div>
                <div class="item">缩回速度{{ruleForm.extendSpeed}}</div>
                <!-- <div class="open">
                  <div class="city">
                    <div class="dotted"></div>
@@ -499,17 +500,17 @@
                    <span style="font-size: 1.25rem; text-align: center">点动缩</span>
                  </el-button>
                </div>
                <div style="color: #fff; font-size: 1.5rem"> å·¦ä¾§ä¼¸ç¼©æ† </div>
                <div style="color: #fff; font-size: 1.5rem"> å·¦ä¾§ç«–屏手动伸缩杆 </div>
                <div style="color: #fff; font-size: 1.5rem">
                  <!-- å½“前伸缩杆位置:{{ Position.left }} -->
                  </div>
              </div>
              <!-- æŠŠ style去掉就显示了-->
              <div class="operate" style="opacity: 0">
                <div class="item">伸到位</div>
                <div class="item">缩到位</div>
                <div class="item">伸出速度</div>
                <div class="item">缩回速度</div>
              <div class="operate" style="opacity: 100">
               <div class="item">伸到位{{ruleForm.leftPosition}}</div>
                <div class="item">缩到位{{0}}</div>
                <div class="item">伸出速度{{ruleForm.extendSpeed}}</div>
                <div class="item">缩回速度{{ruleForm.extendSpeed}}</div>
                <!-- <div class="open">
                  <div class="city">
                    <div class="dotted"></div>
@@ -521,11 +522,21 @@
              </div>
              <div style="display: flex; flex-direction: column; align-items: center">
                <div class="video_l">
                  <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
                  <!-- <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
                    >竖屏手动视频监控左侧</span
                  >
                  <img src="@/assets/imgs/right.png" alt="" />
                  <img src="@/assets/imgs/right.png" alt="" /> -->
                  <video
                id="video_left"
                autoplay
                muted
                controls
                playsinline
                width="100%"
                height="100%"
              ></video>
                </div>
              </div>
            </div>
            <div class="content_r">
@@ -596,16 +607,16 @@
                    <span style="font-size: 1.25rem; text-align: center">点动缩</span>
                  </el-button>
                </div>
                <div style="color: #fff; font-size: 1.5rem"> å³ä¾§ä¼¸ç¼©æ† </div>
                <div style="color: #fff; font-size: 1.5rem"> å³ä¾§ç«–屏手动伸缩杆 </div>
                <div style="color: #fff; font-size: 1.5rem">
                  <!-- å½“前伸缩杆位置:{{ Position.right }} -->
                  </div>
              </div>
              <div class="operate" style="opacity: 0">
                <div class="item">伸到位</div>
                <div class="item">缩到位</div>
                <div class="item">伸出速度</div>
                <div class="item">缩回速度</div>
              <div class="operate" style="opacity:100">
            <div class="item">伸到位{{ruleForm.leftPosition}}</div>
                <div class="item">缩到位{{0}}</div>
                <div class="item">伸出速度{{ruleForm.extendSpeed}}</div>
                <div class="item">缩回速度{{ruleForm.extendSpeed}}</div>
                <!-- <div class="open">
                  <div class="city">
                    <div class="dotted"></div>
@@ -617,11 +628,20 @@
              </div>
              <div style="display: flex; flex-direction: column; align-items: center">
                <div class="video_r">
                  <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
                  <!-- <span style="color: #fff; font-size: 1.25rem; font-weight: bold"
                    >视频监控右侧58</span
                  >
                
                  <img src="@/assets/imgs/left.png" alt="" />
                  <img src="@/assets/imgs/left.png" alt="" /> -->
                  <video
                id="video_left"
                autoplay
                muted
                controls
                playsinline
                width="100%"
                height="100%"
              ></video>
                </div>
              </div>
            </div>
@@ -639,6 +659,7 @@
        <el-radio :value="3">检修道三</el-radio>
        <el-radio :value="4">检修道四</el-radio>
        <el-radio :value="5">检修道五</el-radio>
        <el-radio :value="6">检修道六</el-radio>
      </el-radio-group>
    </div>
    <template #footer>
@@ -653,7 +674,7 @@
import { ref, onMounted, nextTick ,onUnmounted,onActivated,onDeactivated ,onBeforeUnmount} from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import { AutoPickAndDrop, ManualOperation, Pause, GetPosition } from '@/api/newapi/Parameters.js'
import { AutoPickAndDrop, ManualOperation, Pause, GetPosition,BackfillSpeed } from '@/api/newapi/Parameters.js'
const activeName = ref('first')
const router = useRouter()
const isShow = ref(false)
@@ -749,6 +770,49 @@
  console.log(res)
}, 2000)
//定义伸缩杆返回速度参数
const ruleForm = ref({
  id: 0,
  extendSpeed: 0,
  retractionSpeed: 0,
  manualExtend: 0,
  manualRetraction: 0,
  leftPosition: 0,
  rightPosition: 0,
});
//调用返回伸缩杆设置参数
const GetfillSpeed= async(DeptId)=>{
  try{
    const res = await BackfillSpeed(DeptId)
    // console.log('DeptId',DeptId)
    console.log("返回速度信息",res)
    if(res.status === true){
      if(res.code === 0){
         ruleForm.value.extendSpeed = res.data == null ? 0 : res.data.extendSpeed;
      ruleForm.value.retractionSpeed =
        res.data == null ? 0 : res.data.retractionSpeed;
      ruleForm.value.manualExtend =
        res.data == null ? 0 : res.data.manualExtend;
      ruleForm.value.manualRetraction =
        res.data == null ? 0 : res.data.manualRetraction;
      ruleForm.value.leftPosition =
        res.data == null ? 0 : res.data.leftPosition;
      ruleForm.value.rightPosition =
        res.data == null ? 0 : res.data.rightPosition;
      }else{
        ElMessage.error(res.message)
      }
    }else{
      ElMessage.error('获取伸缩杆速度失败')
    }
  }
  catch(error){
    console.error(error)
    ElMessage.error('获取伸缩杆速度失败')
  }
}
// é€šè¿‡æ ‡ç­¾é¡µåˆ‡æ¢éƒ¨é—¨ï¼Œå¹¶åŠ¨æ€åŠ è½½è¯¥éƒ¨é—¨çš„ä½ç½®æ•°æ®ã€‚
@@ -781,17 +845,17 @@
const webRtcServer_left = ref(null)
const webRtcServer_right = ref(null)
//切换标签
const handleClick = (tab, event) => {
  destroyVideo()//切换的时候消除上次的视频监控流
  console.log(tab.index);
  console.log("当前标签下表",tab.index);
  DeptId.value = Number(tab.index) + 1
  // GetPosition(DeptId.value).then((res) => {
  //   Position.value.left = res.data.lift
  //   Position.value.right = res.data.right
  // })
  console.log('当前部门ID:', DeptId.value)
  
  GetfillSpeed(DeptId.value)
  rstp.value=srtpaddres[tab.index].left
  rstp1.value=srtpaddres[tab.index].right
}
@@ -895,12 +959,13 @@
}
onMounted(() => {
   GetfillSpeed(1) //获取伸缩杆速度
  initVideo()//开始的时候导入视频监控流
  // ç›‘听窗口大小变化
  window.addEventListener('resize', () => {
    nextTick(() => {
      if (window.innerWidth > 1200) {
        isMobile.value = true
        isMobile.value = true //默认是横屏
      } else {
        isMobile.value = false
      }
@@ -980,20 +1045,6 @@
          top: -0.25rem;
          border-radius: 50%;
        }
        // .Aspan::after {
        //   content: '';
        //   position: absolute;
        //   height: 0.66rem;
        //   /* è®¾ç½®è¾¹æ¡†çš„长度 */
        //   width: 0.66rem;
        //   /* è®¾ç½®è¾¹æ¡†çš„宽度 */
        //   background-color: rgba(102, 255, 255, 1);
        //   /* è®¾ç½®è¾¹æ¡†çš„颜色 */
        //   right: -9.5rem;
        //   top: -0.25rem;
        //   border-radius: 50%;
        // }
      }
      .btn::after {
@@ -1033,9 +1084,9 @@
  .content {
    display: flex;
    .content_l {
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      // display: flex;
      // flex-direction: column;
      // justify-content: space-between;
      width: 50%;
      height: 45rem;
      background-color: rgba(9, 48, 104, 1);
@@ -1050,11 +1101,19 @@
        font-size: 2rem;
      }
      //横屏自动页面左边
      .operate {
        // display: flex;
        // margin-left: auto;
        // flex-direction: column;
        // align-items: flex-end;
        // padding: 0.58rem 0.58rem;
        display: flex;
        flex-direction: column;
        align-items: flex-end;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        margin-bottom: 10px;
        .item {
          display: flex;
@@ -1074,6 +1133,7 @@
          font-size: 1.13rem;
          padding-left: 0.69rem;
          margin-top: 0.88rem;
          margin-left: 1rem;
        }
        .open {
@@ -1176,10 +1236,11 @@
      }
    }
    //横屏自动页面右边
    .content_r {
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      // display: flex;
      // flex-direction: column;
      // justify-content: space-between;
      width: 50%;
      height: 45rem;
      background-color: rgba(9, 48, 104, 1);
@@ -1195,11 +1256,18 @@
        font-size: 2rem;
      }
      //横屏自动页面右边
      .operate {
        display: flex;
        flex-direction: column;
        align-items: flex-end;
        // display: flex;
        // flex-direction: column;
        // align-items: flex-end;
        // padding: 0.58rem 0.58rem;
             display: flex;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        margin-bottom: 10px;
        .item {
          display: flex;
          flex-direction: column;
@@ -1218,6 +1286,7 @@
          font-size: 1.13rem;
          padding-left: 0.69rem;
          margin-top: 0.88rem;
          margin-left: 10px;
        }
        .open {
@@ -1321,6 +1390,7 @@
    }
  }
// æŽ§åˆ¶ç«–屏样式
  .content_mobile {
    display: flex;
    flex-direction: column;
@@ -1343,10 +1413,15 @@
      }
      .operate {
        // display: flex;
        // flex-direction: column;
        // align-items: flex-end;
        // padding: 0 0.88rem;
        display: flex;
        flex-direction: column;
        align-items: flex-end;
        padding: 0 0.88rem;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        .item {
          display: flex;
          flex-direction: column;
@@ -1365,6 +1440,7 @@
          font-size: 1.13rem;
          padding-left: 0.69rem;
          margin-top: 0.88rem;
          margin-right: 1rem;
        }
        .open {
@@ -1483,10 +1559,15 @@
      }
      .operate {
        display: flex;
        flex-direction: column;
        align-items: flex-end;
        padding: 0 0.88rem;
        // display: flex;
        // flex-direction: column;
        // align-items: flex-end;
        // padding: 0 0.88rem;
             display: flex;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        .item {
          display: flex;
          flex-direction: column;
@@ -1505,6 +1586,7 @@
          font-size: 1.13rem;
          padding-left: 0.69rem;
          margin-top: 0.88rem;
          margin-right: 1rem;
        }
        .open {
@@ -1639,20 +1721,6 @@
        top: -0.25rem;
        border-radius: 50%;
      }
      // .Aspan::after {
      //   content: '';
      //   position: absolute;
      //   height: 0.66rem;
      //   /* è®¾ç½®è¾¹æ¡†çš„长度 */
      //   width: 0.66rem;
      //   /* è®¾ç½®è¾¹æ¡†çš„宽度 */
      //   background-color: rgba(102, 255, 255, 1);
      //   /* è®¾ç½®è¾¹æ¡†çš„颜色 */
      //   right: -11.8rem;
      //   top: -0.25rem;
      //   border-radius: 50%;
      // }
    }
    .btn::after {
@@ -1691,9 +1759,9 @@
  .content {
    display: flex;
    .content_l {
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      // display: flex;
      // flex-direction: column;
      // // justify-content: space-between;
      width: 50%;
      height: 45rem;
      background-color: rgba(9, 48, 104, 1);
@@ -1723,8 +1791,11 @@
      .operate {
        display: flex;
        flex-direction: column;
        align-items: flex-end;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        .item {
          display: flex;
          flex-direction: column;
@@ -1732,6 +1803,7 @@
          width: 8.75rem;
          height: 3.19rem;
          border-radius: 0.31rem;
          margin-left:0.5rem ;
          background: linear-gradient(
            90deg,
            rgba(0, 224, 255, 0.74) 0%,
@@ -1742,7 +1814,8 @@
          color: rgb(255, 255, 255);
          font-size: 1.13rem;
          padding-left: 0.69rem;
          margin-top: 0.88rem;
          margin-top: 1rem;
          margin-bottom: 1rem;
        }
        .open {
@@ -1846,9 +1919,9 @@
    }
    .content_r {
      display: flex;
      justify-content: space-between;
      flex-direction: column;
      // display: flex;
      // justify-content: space-between;
      // flex-direction: column;
      width: 50%;
      height: 45rem;
      background-color: rgba(9, 48, 104, 1);
@@ -1880,9 +1953,14 @@
      }
      .operate {
        display: flex;
        align-items: flex-end;
        flex-direction: column;
        // display: flex;
        // align-items: flex-end;
        // flex-direction: column;
        // padding: 0.58rem 0.58rem;
             display: flex;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        .item {
@@ -1891,6 +1969,7 @@
          justify-content: center;
          width: 8.75rem;
          height: 3.19rem;
          margin-left:0.5rem ;
          border-radius: 0.31rem;
          background: linear-gradient(
            90deg,
@@ -1902,7 +1981,8 @@
          color: rgb(255, 255, 255);
          font-size: 1.13rem;
          padding-left: 0.69rem;
          margin-top: 0.88rem;
          margin-top: 1rem;
          margin-bottom: 1rem;
        }
        .open {
@@ -2043,10 +2123,15 @@
      }
      .operate {
        display: flex;
        flex-direction: column;
        align-items: flex-end;
        padding: 0.88rem 0.58rem;
        // display: flex;
        // flex-direction: column;
        // align-items: flex-end;
        // padding: 0.88rem 0.58rem;
             display: flex;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        .item {
          display: flex;
          flex-direction: column;
@@ -2054,6 +2139,7 @@
          width: 8.75rem;
          height: 4.19rem;
          border-radius: 0.31rem;
          margin-right: 1rem;
          background: linear-gradient(
            90deg,
            rgba(0, 224, 255, 0.74) 0%,
@@ -2199,10 +2285,15 @@
      }
      .operate {
        display: flex;
        flex-direction: column;
        padding: 0 0.88rem;
        align-items: flex-end;
        // display: flex;
        // flex-direction: column;
        // padding: 0 0.88rem;
        // align-items: flex-end;
             display: flex;
        flex-direction: row; // æ¨ªå‘排列
        align-items: center; // åž‚直居中
        justify-content: flex-start; // é å·¦
        padding: 0.58rem 0.58rem;
        .item {
          display: flex;
          flex-direction: column;
@@ -2210,6 +2301,7 @@
          width: 8.75rem;
          height: 4.19rem;
          border-radius: 0.31rem;
          margin-right: 1rem;
          background: linear-gradient(
            90deg,
            rgba(0, 224, 255, 0.74) 0%,