pengwei
2025-04-08 10298137c4d5e646a6e297c4fa1c250c70432ca0
最新代码
已修改10个文件
已添加3个文件
1107 ■■■■ 文件已修改
项目代码/client/dist.7z 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/public/webconfig.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/api/login.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/api/user.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/assets/TheCurrentJob/icon/nopouer.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/assets/TheCurrentJob/icon/pouer.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/utils/index.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/views/Login.vue 336 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/views/tts/BasicInformation/Basicinformation.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/views/tts/TaskManagement/Taskmanagement.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/views/tts/TaskManagement/Tasktemplates.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/views/tts/TheCurrentJob/Startjob.vue 390 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/client/src/views/tts/UserManagement/Usermanagement.vue 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/client/dist.7z
Binary files differ
ÏîÄ¿´úÂë/client/public/webconfig.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
window.webConfig = {
    "webApiDevelopment": "http://localhost:9291/",
    "webApiProduction": "http://localhost:9291/",
    "webApiDebug": "http://localhost:9291/",
    "webSocketUrl": "ws://localhost:5174/",
}
ÏîÄ¿´úÂë/client/src/api/login.js
@@ -1,11 +1,14 @@
import http from "./http";
//获取验证码接口
export const getCodeImg = () =>  http.get('api/User/getVierificationCode')
export const getCodeImg = () => http.get('api/User/getVierificationCode')
//用户登录接口
export const login = (data,tenantId) => http.post(`/api/User/login`, data)
export const login = (data, tenantId) => http.post(`/api/User/login`, data)
//用户注册接口
export const register = (data) => http.post('api/Registry/UserRegistry', data)
//删除saveFace的照片
export const CleanUnusedImages = () => http.get('/api/User/CleanUnusedImages')
ÏîÄ¿´úÂë/client/src/api/user.js
@@ -1,3 +1,4 @@
import data from "@/views/builder/builderData";
import http from "./http";
//获取验证码接口
@@ -13,11 +14,19 @@
//获取用户列表
export const GetUserList = (data) => http.post('/api/User/GetPageData', data)
//获取用户列表
export const NewGetUserList = (data) => http.post('/api/User/GetUserFace', data)
//新建用户
export const AddUser = (data) => http.post('/api/User/AddData', data)
//新新建用户
export const AdduserData = (data) => http.post('/api/User/AdduserData', data)
//修改用户
export const UpdateUser = (data) => http.post('/api/User/UpdateData', data)
//新更新用户
export const NewUpdateUser = (data) => http.post('/api/User/UpuserData', data)
//获取账号信息
export const GetUserInfo = (data) => http.post('/api/User/getCurrentUserInfo', data)
@@ -40,6 +49,15 @@
//编辑用户
export const EditUserApi = (data) => http.post('/api/User/UploaUser', data)
//删除用户
export const DeleteUserData = (data) => http.post(`/api/User/DeleteUserData?userAccount=${data.userAccount}`)
//保存个人信息
export const Upuserbase = (data) => http.post('/api/User/Upuserbase', data)
//用户上传图片
export const UploadImg = (data) => http.post('/api/User/SaveFiles', data)
//获取百度云分组
export const FaceGetPageData = (data) => http.post('/api/FaceRecognition/GetPageData', data)
ÏîÄ¿´úÂë/client/src/assets/TheCurrentJob/icon/nopouer.png
ÏîÄ¿´úÂë/client/src/assets/TheCurrentJob/icon/pouer.png
ÏîÄ¿´úÂë/client/src/utils/index.js
@@ -1,10 +1,8 @@
import { dayjs } from "element-plus";
// import XLSX from "xlsx"; //导入xlsx
export const baseUrl = "http://115.159.85.185:9098/"
// http://115.159.85.185:9091/
export const baseUrl = "http://192.168.0.80:5000/"
// http://192.168.0.80:5000/
// 115.159.85.185:9091
// http://115.159.85.185:9098/
ÏîÄ¿´úÂë/client/src/views/Login.vue
@@ -105,34 +105,91 @@
                  cursor: pointer;
                  font-size: 1rem;
                "
                @click="show = false"
                @click="recognition"
                >人脸识别登录</span
              >
            </div>
          </el-form-item>
        </el-form>
        <div class="face-login" v-else>
          <span style="font-size: 0.88rem; font-weight: bold; color: #333333"
          <span
            style="
              text-align: center;
              font-size: 0.88rem;
              font-weight: bold;
              color: #333333;
            "
            >请将脸部正对蓝色显示框内,并保持光线充足</span
          >
          <div
            style="
              display: flex;
              justify-content: center;
              align-items: center;
              border: 1px solid #4386ff;
              border-radius: 50%;
              width: 18.75rem;
              height: 18.75rem;
              margin: 2.06rem 0;
              background-color: #f1fcff;
            "
          >
            <img src="@/assets/login/face.png" alt="" />
          <div style="width: 100%; display: flex; justify-content: center">
            <div
              style="
                display: flex;
                justify-content: center;
                align-items: center;
                border: 1px solid #4386ff;
                border-radius: 50%;
                width: 18.75rem;
                height: 18.75rem;
                margin: 2.06rem 0;
                background-color: #f1fcff;
              "
            >
              <img v-if="!face" src="@/assets/login/face.png" alt="" />
              <!-- <canvas v-else ref="canvasDom" /> -->
              <div v-else>
                <!-- æ’­æ”¾å™¨ï¼Œç”¨æ¥æ’­æ”¾æ‹æ‘„的视频 -->
                <video class="camera_video" ref="videoDom" />
                <!--  æ˜¾ç¤ºç…§ç‰‡  -->
                <!-- <img
                  style="border-radius: 50%; width: 18.75rem; height: 18.75rem"
                  v-else
                  :src="imgurl"
                /> -->
              </div>
            </div>
          </div>
          <el-button type="primary" size="small" style="width: 100%"
          <!-- <el-button
            v-if="!reBtn"
            type="primary"
            size="small"
            style="width: 100%"
            @click="takePhoto"
            >开始识别</el-button
          >
          <el-button
            v-else
            type="primary"
            size="small"
            style="width: 100%"
            @click="REtakePhoto"
            >重新识别</el-button
          > -->
          <div style="width: 100%; margin-top: 1rem; display: flex">
            <el-button
              type="primary"
              size="small"
              style="width: 100%"
              @click="recognition"
              >重新获取摄像头</el-button
            >
            <el-select
              v-if="videoArr.length > 1"
              v-model="constraints"
              placeholder="请选择摄像头"
              size="samll"
              @change="changeconstraints"
              style="height: 2rem"
              :disabled="!videoArr.length > 1"
            >
              <el-option
                v-for="item in videoArr"
                :key="item.id"
                :label="item.label"
                :value="item.id"
              />
            </el-select>
          </div>
          <div
            style="
              display: flex;
@@ -150,7 +207,7 @@
                cursor: pointer;
                font-size: 1rem;
              "
              @click="show = true"
              @click="accountlogin"
              >账号登录</span
            >
          </div>
@@ -161,11 +218,13 @@
</template>
<script setup>
import { getCodeImg, login } from "@/api/login";
import { getCodeImg, login, CleanUnusedImages } from "@/api/login";
import { UploadImg } from "@/api/user";
import { useRouter, useRoute } from "vue-router";
import { getCurrentInstance, ref, nextTick, onMounted } from "vue";
import { ElMessage } from "element-plus";
import store from "@/store";
import axios from "axios";
const router = useRouter();
const route = useRoute();
@@ -176,7 +235,14 @@
const codeUrl = ref(""); // éªŒè¯ç 
const loading = ref(false); // ç™»å½•加载状态
const face = ref(false); // äººè„¸è¯†åˆ«ç™»å½•
// ç…§ç‰‡è·¯å¾„
const imgurl = ref(null);
// canvas控件对象
const canvasDom = ref(null);
// video æŽ§ä»¶å¯¹è±¡
const videoDom = ref(null);
const reBtn = ref(false);
const loginForm = ref({
  userName: "",
  password: "",
@@ -236,9 +302,229 @@
nextTick(() => {
  userNameRef.value.focus();
});
const videoArr = ref([]);
//选择的摄像头的id
const constraints = ref("");
const videoConstraints = ref({});
//人脸识别登录
const recognition = () => {
  show.value = false;
  videoArr.value = [];
  setTimeout(async () => {
    face.value = true;
    navigator.mediaDevices
      .enumerateDevices()
      .then((devices) => {
        devices.forEach(function (device) {
          if (device.kind == "videoinput") {
            videoArr.value.push({
              label: device.label,
              id: device.deviceId,
            });
            constraints.value = videoArr.value[0].id;
          }
        });
        openCamera();
      })
      .catch(function (err) {
        layer.msg(err.name + ": " + err.message);
      });
  }, 1000);
  ElMessage({
    message: "正在调用摄像头,请稍等...",
    type: "warning",
    plain: true,
    duration: 1000,
  });
  // äººè„¸è¯†åˆ«ç™»å½•逻辑
};
//账号登录
function accountlogin() {
  stop();
  ElMessage({
    message: "正在关闭摄像头,请稍等...",
    type: "warning",
    plain: true,
    duration: 2000,
  });
  setTimeout(() => {
    ElMessage({
      message: "关闭摄像头成功",
      type: "success",
      plain: true,
    });
  }, 3000);
  setTimeout(() => {
    show.value = true;
    face.value = false;
  }, 2000);
}
//打开摄像头
const openCamera = async () => {
  videoConstraints.value.deviceId = { exact: constraints.value };
  // æ£€æµ‹æµè§ˆå™¨æ˜¯å¦æ”¯æŒmediaDevices
  if (navigator.mediaDevices) {
    navigator.mediaDevices
      // å¼€å¯è§†é¢‘,关闭音频
      .getUserMedia({
        audio: false,
        video: {
          width: 300, // è®¾ç½®è§†é¢‘宽度
          height: 300, // è®¾ç½®è§†é¢‘高度
          facingMode: "user", // ä½¿ç”¨å‰ç½®æ‘„像头
          deviceId: videoConstraints.value.deviceId,
        },
      })
      .then((stream) => {
        // å°†è§†é¢‘流传入viedo控件
        videoDom.value.srcObject = stream;
        // æ’­æ”¾
        videoDom.value.play();
        Facerecognition();
        ElMessage({
          message: "摄像头调用成功",
          type: "success",
          plain: true,
        });
      })
      .catch((err) => {
        console.log(err);
      });
  } else {
    window.alert("该浏览器不支持开启摄像头,请更换最新版浏览器");
  }
};
const changeconstraints = (res) => {
  openCamera();
};
// å¼€å§‹è¯†åˆ«
const takePhoto = async () => {
  // å¦‚果已经拍照了就重新启动摄像头
  // if (imgurl.value) {
  //   imgurl.value = null;
  //   openCamera();
  //   return;
  // }
  console.log(videoDom.value.videoWidth, videoDom.value.videoHeight);
  // åˆ›å»ºä¸€ä¸ªç”»å¸ƒå…ƒç´ ï¼Œè®¾ç½®ç”»å¸ƒå°ºå¯¸ä¸ºè§†é¢‘流的尺寸
  const canvas = document.createElement("canvas");
  // è®¾ç½®ç”»å¸ƒå¤§å°ä¸Žæ‘„像大小一致
  canvas.width = videoDom.value.videoWidth;
  canvas.height = videoDom.value.videoHeight;
  // èŽ·å–ç”»å¸ƒä¸Šä¸‹æ–‡å¯¹è±¡
  const ctx = canvas.getContext("2d");
  // ç»˜åˆ¶å½“前视频帧到画布上
  ctx.drawImage(videoDom.value, 0, 0, canvas.width, canvas.height);
  // å°†ç”»å¸ƒå†…容转为 Base64 æ•°æ®
  const imageDataUrl = canvas.toDataURL("image/png");
  // å­˜å‚¨å›¾ç‰‡è·¯å¾„
  imgurl.value = imageDataUrl;
  // // åˆ›å»ºä¸€ä¸ªå›¾ç‰‡å…ƒç´ 
  // const imageElement = new Image();
  // // å°† Base64 æ•°æ®è®¾ç½®ä¸ºå›¾ç‰‡çš„ src å±žæ€§
  // imageElement.src = imageDataUrl;
  // console.log(imageElement, imageDataUrl, "图片路径");
  // return;
  // canvasDom.value.width = videoDom.value.videoWidth;
  // canvasDom.value.height = videoDom.value.videoHeight;
  // // æ‰§è¡Œç”»çš„æ“ä½œ
  // canvasDom.value.getContext("2d").drawImage(videoDom.value, 0, 0);
  // // å°†ç»“果转换为可展示的格式
  // imgurl.value = canvasDom.value.toDataURL("image/webp");
  // å…³é—­æ‘„像头
  let files = dataURLtoFile(imgurl.value, new Date().getTime() + ".png");
  const formdata = new FormData();
  formdata.append("files", files);
  let response = await axios.post("/api/User/SaveFiles", formdata, {
    headers: {
      "Content-Type": "multipart/form-data",
    },
  });
  ElMessage({
    message: "开始识别中,请稍等...",
    type: "warning",
    plain: true,
    duration: 2000,
  });
  setTimeout(() => {
    login({
      userName: "",
      password: "",
      path: response.data.data,
    })
      .then((res) => {
        if (res.status) {
          store.commit("setUserInfo", { ...res.data });
          ElMessage({
            message: "识别成功,开始登录",
            type: "success",
            plain: true,
            duration: 2000,
          });
          CleanUnusedImages();
          stop();
          setTimeout(() => {
            router.push({ path: "/" });
          }, 1000);
        }
      })
      .catch((err) => {
        loading.value = false;
        return proxy.$message.error(err.message);
      });
    setTimeout(() => {
      loading.value = false;
    }, 1000);
  }, 1000);
  reBtn.value = true;
};
//重新识别
// const REtakePhoto = () => {
//   reBtn.value = false;
//   takePhoto();
// };
// å°† base64 è½¬æ¢ä¸º Blob
const dataURLtoFile = (dataurl, filename) => {
  let arr = dataurl.split(","),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new File([u8arr], filename, {
    type: mime,
  });
};
// å…³é—­æ‘„像头
const stop = () => {
  let stream = videoDom.value.srcObject;
  if (!stream) return;
  let tracks = stream.getTracks();
  tracks.forEach((x) => {
    x.stop();
  });
  clearInterval(timer.value);
};
//获取验证码
getCode();
//定时人脸识别
const timer = ref(null);
const Facerecognition = () => {
  clearInterval(timer.value);
  if (!show.value) {
    timer.value = setInterval(() => {
      takePhoto();
    }, 3000);
  }
};
</script>
<style lang="less" scoped>
@@ -301,9 +587,19 @@
      }
    }
    .face-login {
      width: 30rem;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-content: center;
      text-align: center;
    }
  }
}
.camera_video {
  width: 18.75rem;
  height: 18.75rem;
  border: 1px black solid;
  border-radius: 50% 50%;
}
</style>
ÏîÄ¿´úÂë/client/src/views/tts/BasicInformation/Basicinformation.vue
@@ -145,7 +145,7 @@
            fontSize: '0.88rem',
            height: '3rem',
          }"
          @select="InfoSelectionChange"
          @selection-change="InfoSelectionChange"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="articleName" label="信息名称" align="center" />
@@ -180,7 +180,7 @@
            fontSize: '0.88rem',
            height: '3rem',
          }"
          @select="ToolSelectionChange"
          @selection-change="ToolSelectionChange"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="toolName" label="工具名称" align="center" />
ÏîÄ¿´úÂë/client/src/views/tts/TaskManagement/Taskmanagement.vue
@@ -138,7 +138,7 @@
            fontSize: '0.88rem',
            height: '3rem',
          }"
          @select="SelectionChange"
          @selection-change="SelectionChange"
        >
          <el-table-column type="selection" align="center" min-width="1%" />
          <el-table-column
ÏîÄ¿´úÂë/client/src/views/tts/TaskManagement/Tasktemplates.vue
@@ -107,7 +107,7 @@
            fontSize: '0.88rem',
            height: '3rem',
          }"
          @Select="getSelectionRows"
          @selection-change="getSelectionRows"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column
ÏîÄ¿´úÂë/client/src/views/tts/TheCurrentJob/Startjob.vue
@@ -171,21 +171,20 @@
              >
            </span>
          </div>
          <div style="position: absolute; width: 62rem; height: 2.5rem">
          <div style="width: 62rem; height: 2.5rem">
            <el-table
              empty-text="暂无数据"
              style="margin-top: 0.88rem"
              style="margin-top: 0.88rem; opacity: 0.8"
              :data="gridData"
              width="100%"
              :header-cell-style="{
                height: '1.61rem',
                color: '#1AC8FE',
                background: '#0A5B91',
                color: '#fff',
                fontSize: '0.88rem',
                border: 'solid 1px #1ac2f7',
              }"
              :cell-style="{
                color: '#fff',
                background: '#147BAF',
              }"
            >
              <el-table-column
@@ -194,18 +193,27 @@
                min-width="13%"
              >
                <template #default="scope">
                  <span
                    ref="spanHide"
                    @click="showDetail1(!contentShow)"
                    style="
                      color: #1ac2f7;
                      font-size: 0.88rem;
                      cursor: pointer;
                      text-decoration: underline;
                    "
                    >{{ scope.row.craftsStep }}
                  </span></template
                >
                  <el-tooltip placement="bottom" effect="light">
                    <template #content>
                      <span style="display: block; width: 15rem">{{
                        scope.row.craftsStep
                      }}</span>
                    </template>
                    <span
                      @click="true"
                      style="
                        color: #ffffff;
                        font-size: 0.88rem;
                        display: -webkit-box; /* è®¾ç½®ä¸ºWebKit内核的弹性盒子模型 */
                        -webkit-box-orient: vertical; /* åž‚直排列 */
                        -webkit-line-clamp: 1; /* é™åˆ¶æ˜¾ç¤ºä¸¤è¡Œ */
                        overflow: hidden; /* éšè—è¶…出范围的内容 */
                        text-overflow: ellipsis; /* ä½¿ç”¨çœç•¥å· */
                      "
                      >{{ scope.row.craftsStep }}</span
                    >
                  </el-tooltip>
                </template>
              </el-table-column>
              <el-table-column
@@ -238,20 +246,27 @@
              >
              <el-table-column property="tools" label="工具" min-width="12%">
                <template #default="scope">
                  <span
                    ref="spanHide"
                    style="
                      color: #ffffff;
                      font-size: 0.88rem;
                      display: -webkit-box; /* è®¾ç½®ä¸ºWebKit内核的弹性盒子模型 */
                      -webkit-box-orient: vertical; /* åž‚直排列 */
                      -webkit-line-clamp: 2; /* é™åˆ¶æ˜¾ç¤ºä¸¤è¡Œ */
                      overflow: hidden; /* éšè—è¶…出范围的内容 */
                      text-overflow: ellipsis; /* ä½¿ç”¨çœç•¥å· */
                    "
                    >{{ scope.row.tools }}
                  </span></template
                ></el-table-column
                  <el-tooltip placement="bottom" effect="light">
                    <template #content>
                      <span style="display: block; width: 15rem">{{
                        scope.row.tools
                      }}</span>
                    </template>
                    <span
                      @click="true"
                      style="
                        color: #ffffff;
                        font-size: 0.88rem;
                        display: -webkit-box; /* è®¾ç½®ä¸ºWebKit内核的弹性盒子模型 */
                        -webkit-box-orient: vertical; /* åž‚直排列 */
                        -webkit-line-clamp: 2; /* é™åˆ¶æ˜¾ç¤ºä¸¤è¡Œ */
                        overflow: hidden; /* éšè—è¶…出范围的内容 */
                        text-overflow: ellipsis; /* ä½¿ç”¨çœç•¥å· */
                      "
                      >{{ scope.row.tools }}</span
                    >
                  </el-tooltip>
                </template></el-table-column
              >
              <el-table-column
                property="craftsStep"
@@ -259,22 +274,30 @@
                min-width="15%"
              >
                <template #default="scope">
                  <span
                    style="
                      color: #ffffff;
                      font-size: 0.88rem;
                      display: -webkit-box; /* è®¾ç½®ä¸ºWebKit内核的弹性盒子模型 */
                      -webkit-box-orient: vertical; /* åž‚直排列 */
                      -webkit-line-clamp: 2; /* é™åˆ¶æ˜¾ç¤ºä¸¤è¡Œ */
                      overflow: hidden; /* éšè—è¶…出范围的内容 */
                      text-overflow: ellipsis; /* ä½¿ç”¨çœç•¥å· */
                    "
                    >{{ scope.row.material }}</span
                  ></template
                ></el-table-column
                  <el-tooltip placement="bottom" effect="light">
                    <template #content>
                      <span style="display: block; width: 15rem">{{
                        scope.row.material
                      }}</span>
                    </template>
                    <span
                      @click="true"
                      style="
                        color: #ffffff;
                        font-size: 0.88rem;
                        display: -webkit-box; /* è®¾ç½®ä¸ºWebKit内核的弹性盒子模型 */
                        -webkit-box-orient: vertical; /* åž‚直排列 */
                        -webkit-line-clamp: 2; /* é™åˆ¶æ˜¾ç¤ºä¸¤è¡Œ */
                        overflow: hidden; /* éšè—è¶…出范围的内容 */
                        text-overflow: ellipsis; /* ä½¿ç”¨çœç•¥å· */
                      "
                      >{{ scope.row.material }}</span
                    >
                  </el-tooltip>
                </template></el-table-column
              >
            </el-table>
            <div class="consten" v-show="contentShow">
            <!-- <div class="consten" v-show="contentShow">
              <el-table
                empty-text="暂无数据"
                :data="gridData"
@@ -324,7 +347,7 @@
                  ></el-table-column
                >
              </el-table>
            </div>
            </div> -->
          </div>
        </div>
        <div class="rect-item3" style="position: relative">
@@ -407,11 +430,6 @@
          display: flex;
          justify-content: center;
          align-items: center;
          position: absolute;
          top: 38%;
          left: 50%;
          transform: translateX(-50%);
          z-index: 999;
        "
      >
        <div
@@ -442,8 +460,9 @@
          align-items: center;
          position: absolute;
          bottom: 5%;
          left: 50%;
          transform: translateX(-50%);
          right: 0%;
          transform: translateX(-20%);
          z-index: 999;
        "
      >
        <el-button
@@ -531,7 +550,7 @@
  </div>
</template>
<script setup>
import { ref, onMounted, nextTick } from "vue";
import { ref, onMounted, nextTick, onBeforeUnmount } from "vue";
import {
  GetScreenData,
  GetPre,
@@ -582,6 +601,8 @@
  takeid: "",
  setnum: 0,
});
const client = ref(null);
//扭力值
const torqueFrom = ref({
@@ -736,35 +757,6 @@
    group: info.value.grouptype,
    takeid: info.value.njtakeid,
  }).then((res) => {
    // if (res.message == "返回工艺表中的第一条") {
    //   gridData.value = res.data.proNoe;
    //   obj.value = res.data.proNoe[0];
    //   sunNUm.value = res.data.maxproce;
    //   queryData.value.setnum = obj.value.setpNum;
    //   xPos.value =
    //     gridData.value[0].pointAxisXYZ != null &&
    //     gridData.value[0].pointAxisXYZ != 0
    //       ? gridData.value[0].pointAxisXYZ.split(",")[0]
    //       : -585;
    //   yPos.value =
    //     gridData.value[0].pointAxisXYZ != null &&
    //     gridData.value[0].pointAxisXYZ != 0
    //       ? gridData.value[0].pointAxisXYZ.split(",")[1]
    //       : 692;
    //   zPos.value =
    //     gridData.value[0].pointAxisXYZ != null &&
    //     gridData.value[0].pointAxisXYZ != 0
    //       ? gridData.value[0].pointAxisXYZ.split(",")[2]
    //       : 692;
    //   cameraAnimate(
    //     [xPos.value, yPos.value, zPos.value],
    //     nodeList[gridData.value[0].setpNum]
    //   );
    //   GetTorque(queryData.value).then((res) => {
    //     Torque.value = res.data;
    //   });
    //   return;
    // }
    gridData.value = [res.data.proNow];
    sunNUm.value = res.data.maxproce;
    obj.value = res.data.proNow;
@@ -1049,10 +1041,134 @@
      console.error("添加失败", error);
    });
};
const timer = ref(null);
const createSocket = (url) => {
  clearInterval(timer.value);
  // åˆ›å»ºWebSocket连接
  //"ws://127.0.0.1:9295/admin"
  client.value = new WebSocket("ws://115.159.85.185:9098/");
  client.value.onopen = function () {
    console.log("WebSocket è¿žæŽ¥æˆåŠŸ");
  };
  client.value.onmessage = function (event) {
    let data = JSON.parse(event.data);
    (gridData.value = [data.process.proNow].map((item) => {
      return {
        articleOne: item.ArticleOne,
        articleOneid: item.ArticleOneid,
        articleTowid: item.ArticleTowid,
        articleTwo: item.ArticleTwo,
        craftContent: item.CraftContent,
        craftID: item.CraftID,
        craftType: item.CraftType,
        craftsStep: item.CraftsStep,
        createDate: item.CreateDate,
        creater: item.Creater,
        material: item.Material,
        modifier: item.Modifier,
        modifyDate: item.ModifyDate,
        moduleName: item.ModuleName,
        nodal: item.Nodal,
        pointAxisHPB: item.PointAxisHPB,
        pointAxisXYZ: item.PointAxisXYZ,
        setpNum: item.SetpNum,
        tools: item.Tools,
        torqueOne: item.TorqueOne,
        torqueOneQuantity: item.TorqueOneQuantity,
        torqueSum: item.TorqueSum,
        torqueTwo: item.TorqueTwo,
        torqueTwoQuantity: item.TorqueTwoQuantity,
      };
    })),
      (sunNUm.value = data.process.maxproce);
    obj.value = [data.process.proNow].map((item) => {
      return {
        articleOne: item.ArticleOne,
        articleOneid: item.ArticleOneid,
        articleTowid: item.ArticleTowid,
        articleTwo: item.ArticleTwo,
        craftContent: item.CraftContent,
        craftID: item.CraftID,
        craftType: item.CraftType,
        craftsStep: item.CraftsStep,
        createDate: item.CreateDate,
        creater: item.Creater,
        material: item.Material,
        modifier: item.Modifier,
        modifyDate: item.ModifyDate,
        moduleName: item.ModuleName,
        nodal: item.Nodal,
        pointAxisHPB: item.PointAxisHPB,
        pointAxisXYZ: item.PointAxisXYZ,
        setpNum: item.SetpNum,
        tools: item.Tools,
        torqueOne: item.TorqueOne,
        torqueOneQuantity: item.TorqueOneQuantity,
        torqueSum: item.TorqueSum,
        torqueTwo: item.TorqueTwo,
        torqueTwoQuantity: item.TorqueTwoQuantity,
      };
    })[0];
    Torque.value = data.operation.map((item) => {
      return {
        createDate: item.CreateDate,
        creater: item.Creater,
        deviceCode: item.SystemDeviceCode,
        groupOp: item.GroupOp,
        id: item.ID,
        modifier: item.Modifier,
        modifyDate: item.ModifyDate,
        processSte: item.ProcessSte,
        takeId: item.TakeId,
        torqueSize: item.TorqueSize,
      };
    });
    xPos.value =
      gridData.value[0].pointAxisXYZ != null &&
      gridData.value[0].pointAxisXYZ != 0
        ? gridData.value[0].pointAxisXYZ.split(",")[0]
        : -585;
    yPos.value =
      gridData.value[0].pointAxisXYZ != null &&
      gridData.value[0].pointAxisXYZ != 0
        ? gridData.value[0].pointAxisXYZ.split(",")[1]
        : 692;
    zPos.value =
      gridData.value[0].pointAxisXYZ != null &&
      gridData.value[0].pointAxisXYZ != 0
        ? gridData.value[0].pointAxisXYZ.split(",")[2]
        : 692;
    isJob.value = data.process.finish.map((item) => {
      return item.moduleName;
    });
    cameraAnimate(
      [xPos.value, yPos.value, zPos.value],
      gridData.value[0].moduleName
    );
    console.log(
      "WebSocket æŽ¥æ”¶åˆ°æ¶ˆæ¯",
      data,
      gridData.value,
      sunNUm.value,
      Torque.value,
      isJob.value
    );
  };
  client.value.onclose = function () {
    console.log("WebSocket è¿žæŽ¥å…³é—­");
    timer.value = setTimeout(createSocket, 1000);
  };
  client.value.onerror = function () {};
};
onMounted(() => {
  console.log("mounted", window.innerWidth, window.innerHeight);
  // åˆå§‹åŒ–场景
  renderer.setSize(window.innerWidth / 1.01, window.innerHeight / 2.1);
  renderer.setSize(window.innerWidth - 20, window.innerHeight - 100);
  renderer.setClearColor(0xeeeeee); // è®¾ç½®èƒŒæ™¯è‰²
  // å¯ç”¨ç‰©ç†æ¸²æŸ“模式
  // renderer.physicallyCorrectLights = true;
@@ -1064,9 +1180,9 @@
  const controls = new OrbitControls(camera, renderer.domElement);
  controls.enablePan = false; //禁止右键拖拽
  //相机位置与观察目标点最小值
  controls.minDistance = 650;
  controls.minDistance = 600;
  //相机位置与观察目标点最大值
  controls.maxDistance = 900;
  controls.maxDistance = 1000;
  camera.position.set(...CAMERA_POS);
  controls.update();
@@ -1126,8 +1242,13 @@
  });
  // };
  document.addEventListener("click", handleClickOutside);
  console.log(window.webConfig);
  createSocket();
  // showModel();
});
onBeforeUnmount(() => {
  clearInterval(timer.value);
});
</script>
<style lang="scss" scoped>
@@ -1151,7 +1272,7 @@
  background-size: 0.3rem 2rem, 2rem 0.3rem, 0.3rem 2rem, 2rem 0.3rem;
  padding: 0.2rem;
  box-sizing: border-box;
  background-color: rgba(0, 0, 0, 0.3);
  background-color: rgba(0, 0, 0, 0.1);
  overflow: hidden;
  .rect {
@@ -1184,33 +1305,67 @@
    .rect-center {
      display: flex;
      justify-content: space-between;
      width: 80%;
      justify-content: space-around;
      width: 100%;
      margin: 0 auto;
      padding: 0.8rem 2.15rem;
      box-sizing: border-box;
      position: absolute;
      left: 50%;
      top: 5%;
      transform: translateX(-50%);
      .rect-item1 {
        display: flex;
        flex-direction: column;
        width: 16rem;
        height: 15.38rem;
        background-image: url("../../../assets/TheCurrentJob/bg.png");
        background-repeat: no-repeat;
        background-size: 100% 100%;
        padding: 0.28rem 0.28rem;
        // background-image: url("../../../assets/TheCurrentJob/bg.png");
        // background-repeat: no-repeat;
        // background-size: 100% 100%;
        border-radius: 8px;
        background: linear-gradient(
            0deg,
            rgba(0, 0, 0, 0.001),
            rgba(0, 0, 0, 0.001)
          ),
          rgba(0, 0, 0, 0),
          linear-gradient(
            135deg,
            rgba(30, 58, 138, 0.6) -3%,
            rgba(49, 46, 129, 0.6) 99%
          );
        box-sizing: border-box;
        border: 1px solid rgba(96, 165, 250, 0.3);
        box-shadow: 0px 4px 6px -4px rgba(0, 0, 0, 0.1),
          0px 10px 15px -3px rgba(0, 0, 0, 0.1);
        padding: 0.28rem 1.28rem;
        box-sizing: border-box;
      }
      .rect-item2 {
        width: 65rem;
        height: 15.38rem;
        border: 0.1rem solid #02cde6;
        height: 14.38rem;
        border-radius: 8px;
        background: linear-gradient(
            0deg,
            rgba(0, 0, 0, 0.001),
            rgba(0, 0, 0, 0.001)
          ),
          rgba(0, 0, 0, 0),
          linear-gradient(
            135deg,
            rgba(30, 58, 138, 0.6) -3%,
            rgba(49, 46, 129, 0.6) 99%
          );
        box-sizing: border-box;
        border: 1px solid rgba(96, 165, 250, 0.3);
        box-shadow: 0px 4px 6px -4px rgba(0, 0, 0, 0.1),
          0px 10px 15px -3px rgba(0, 0, 0, 0.1);
        padding: 0.69rem 1.44rem;
        position: relative;
        .el-table :deep(.el-table__header th) {
          border: solid 1px #1ac0f6;
          // border: solid 1px #1ac0f6;
          color: white;
        }
@@ -1227,9 +1382,25 @@
        flex-direction: column;
        width: 11.31rem;
        height: 15.38rem;
        background-image: url("../../../assets/TheCurrentJob/bg.png");
        background-repeat: no-repeat;
        background-size: 100% 100%;
        // background-image: url("../../../assets/TheCurrentJob/bg.png");
        // background-repeat: no-repeat;
        // background-size: 100% 100%;
        border-radius: 8px;
        background: linear-gradient(
            0deg,
            rgba(0, 0, 0, 0.001),
            rgba(0, 0, 0, 0.001)
          ),
          rgba(0, 0, 0, 0),
          linear-gradient(
            135deg,
            rgba(30, 58, 138, 0.6) -3%,
            rgba(49, 46, 129, 0.6) 99%
          );
        box-sizing: border-box;
        border: 1px solid rgba(96, 165, 250, 0.3);
        box-shadow: 0px 4px 6px -4px rgba(0, 0, 0, 0.1),
          0px 10px 15px -3px rgba(0, 0, 0, 0.1);
        padding: 0.28rem 0.28rem;
        box-sizing: border-box;
      }
@@ -1249,6 +1420,19 @@
//   border-bottom: solid 1px #1ac2f7;
//   color: white;
// }
.el-table {
  --el-table-border-color: transparent;
  --el-table-border: none;
  --el-table-text-color: #bdbdbe;
  --el-table-header-text-color: #bdbdbe;
  --el-table-row-hover-bg-color: transparent;
  --el-table-current-row-bg-color: transparent;
  --el-table-header-bg-color: transparent;
  --el-table-bg-color: transparent;
  --el-table-tr-bg-color: transparent;
  --el-table-expanded-cell-bg-color: transparent;
}
.el-table :deep(.el-table__row td) {
  border: solid 1px #1ac2f7;
  color: white;
@@ -1259,9 +1443,9 @@
  color: #1ac2f7;
}
.el-table :deep(.el-table__body-wrapper) {
  background-color: #1ac2f7;
}
// .el-table :deep(.el-table__body-wrapper) {
//   background-color: #1ac2f7;
// }
:deep(.el-popper) {
  background-color: #ad2525;
ÏîÄ¿´úÂë/client/src/views/tts/UserManagement/Usermanagement.vue
@@ -107,6 +107,7 @@
            >新建</el-button
          >
          <el-button
            v-if="isactive != 3"
            size="small"
            style="width: 5.5rem; height: 2rem; font-size: 0.88rem"
            @click="printExcel"
@@ -140,7 +141,7 @@
            fontSize: '0.88rem',
            height: '3rem',
          }"
          @select="UserSelectionChange"
          @selection-change="UserSelectionChange"
        >
          <el-table-column type="selection" align="center" min-width="1%" />
          <el-table-column
@@ -182,13 +183,21 @@
            <template #default="scope">
              <el-image
                style="width: 70px; height: 70px"
                :src="'http://115.159.85.185:9098' + scope.row.headImageUrl"
                :src="
                  'http://115.159.85.185:9098' + scope.row.headImageUrl
                "
                show-progress
                :initial-index="4"
                fit="cover"
              />
            </template>
          </el-table-column>
          <el-table-column
            prop="groupID"
            label="百度云分组"
            align="center"
            min-width="3%"
          />
          <el-table-column label="是否启用" align="center" min-width="2%">
            <template #default="scope">
              <el-switch
@@ -228,6 +237,15 @@
                @click="Editpassword(scope.row)"
                >修改密码</el-button
              >
              <el-button
                size="small"
                type="text"
                @click="deletUser(scope.row)"
                :disabled="
                  scope.row.userName == 'admin' || scope.row.user_Id == '1'
                "
                >删除</el-button
              >
            </template>
          </el-table-column>
        </el-table>
@@ -251,7 +269,7 @@
            fontSize: '0.88rem',
            height: '3rem',
          }"
          @select="RoleSelectionChange"
          @selection-change="RoleSelectionChange"
        >
          <el-table-column type="selection" align="center" />
          <el-table-column prop="roleName" label="角色名称" align="center" />
@@ -316,6 +334,17 @@
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
        />
        <el-pagination
          v-if="isactive == 2"
          size="small"
          background
          layout="prev, pager, next"
          :current-page="pageQuery.page"
          :page-size="pageQuery.rows"
          :total="pageTotal1"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
        />
      </div>
    </div>
@@ -353,7 +382,7 @@
      >
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item prop="userName">
            <el-form-item prop="username">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
@@ -365,13 +394,13 @@
              </template>
              <el-input
                size="small"
                v-model="formUser.userName"
                v-model="formUser.username"
                placeholder="请输入"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item prop="userTrueName">
            <el-form-item prop="usertruename">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
@@ -383,13 +412,13 @@
              </template>
              <el-input
                size="small"
                v-model="formUser.userTrueName"
                v-model="formUser.usertruename"
                placeholder="请输入"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item prop="phoneNo">
            <el-form-item prop="phoneno">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
@@ -401,7 +430,7 @@
              </template>
              <el-input
                size="small"
                v-model="formUser.phoneNo"
                v-model="formUser.phoneno"
                placeholder="请输入"
              />
            </el-form-item>
@@ -409,7 +438,7 @@
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item prop="role_Id">
            <el-form-item prop="roleid">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
@@ -420,12 +449,12 @@
                </div>
              </template>
              <el-select
                v-model="formUser.role_Id"
                v-model="formUser.roleid"
                placeholder="请选择"
                size="small"
              >
                <el-option
                  :disabled="item.roleId == 1"
                  :disabled="item.roleId == 20"
                  v-for="item in groupOptions"
                  :key="item.roleId"
                  :label="item.roleName"
@@ -435,7 +464,7 @@
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item prop="roleName">
            <el-form-item prop="rolename">
              <template #label>
                <div style="display: flex; align-items: flex-end">
                  <span style="color: red; margin-right: 0.2rem">*</span>
@@ -446,7 +475,7 @@
                </div>
              </template>
              <el-select
                v-model="formUser.roleName"
                v-model="formUser.rolename"
                placeholder="请选择"
                size="small"
              >
@@ -516,6 +545,7 @@
                @before-upload="beforeAvatarUpload"
                :on-success="handleAvatarSuccess"
                :file-list="fileList != [] ? fileList : []"
                :class="{ hide: showUpload }"
              >
                <el-icon>
                  <Plus />
@@ -605,7 +635,7 @@
        </div>
      </template>
      <el-form
        :model="formUser"
        :model="newobj"
        label-width="auto"
        label-position="top"
        ref="formpasswordRef"
@@ -636,7 +666,7 @@
          <el-input
            style="margin-top: 1rem"
            size="large"
            v-model="formUser.newPwd"
            v-model="newobj.newPwd"
            placeholder="请输入"
          />
        </el-form-item>
@@ -748,7 +778,6 @@
    </el-dialog>
    <!-- æƒé™ç®¡ç†å¼¹å‡ºæ¡† -->
    <el-dialog v-model="imgdialogVisible">
      <div
        style="
@@ -768,16 +797,17 @@
import { ref, reactive, onMounted, toRef } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
  GetUserList,
  AddUser,
  UpdateUser,
  DelApi,
  ExportApi,
  ExportApi1,
  UpdatePassword,
  UpdatePwd,
  AddUserApi,
  EditUserApi,
  NewGetUserList,
  AdduserData,
  NewUpdateUser,
  DeleteUserData,
  FaceGetPageData,
} from "@/api/user";
import { useRouter } from "vue-router";
import { formatTime } from "@/utils/index.js";
@@ -799,6 +829,7 @@
const tableData = ref([]);
const grideData = ref([]);
const faceData = ref([]);
//新建用户ref
const formUserRef = ref();
const options = ref([]);
@@ -810,31 +841,27 @@
  },
  { value: 1, label: "是" },
]);
const showUpload = ref(false);
//分组
const groupOptions = ref([]);
const groupIDOptions = ref([]);
const formUser = ref({
  user_Id: undefined,
  userName: "",
  role_Id: 2,
  roleName: "",
  phoneNo: "",
  remark: "",
  userPwd: "123456",
  userTrueName: "",
  dept_Id: 0,
  id: undefined,
  username: "",
  phoneno: "",
  roleid: 21,
  rolename: "",
  enable: 1,
  headImageUrl: "",
  createDate: formatTime(new Date()), //创建时间
  creater: JSON.parse(localStorage.getItem("user")).userName, //创建人
  newPwd: "",
  path: "",
  usertruename: "",
});
const rules = reactive({
  userName: {
  username: {
    required: true,
    message: "请输入用户名",
    trigger: "blur",
  },
  role_Id: {
  roleid: {
    required: true,
    message: "请选择角色",
    trigger: "change",
@@ -851,12 +878,12 @@
    message: "请输入姓名",
    trigger: "blur",
  },
  phoneNo: {
  phoneno: {
    required: true,
    message: "请输入手机号",
    trigger: "blur",
  },
  userTrueName: {
  usertruename: {
    required: true,
    message: "请输入真实姓名",
    trigger: "blur",
@@ -875,11 +902,11 @@
//筛选条件
const userOptions = [
  {
    value: "userName",
    value: "username",
    label: "登录账号",
  },
  {
    value: "userTrueName",
    value: "usertruename",
    label: "真实姓名",
  },
  {
@@ -929,39 +956,11 @@
});
const uploadRef = ref();
// //用户修改密码
// const handleUpdatePassword = (row) => {
//   dialogVisible1.value = true;
//   formUser.value = Object.assign({}, row);
// };
// const UpdatePassword = () => {
//   formpasswordRef.value.validate((valid) => {
//     if (valid) {
//       UpdatePassword({
//         user_Id: formUser.value.user_Id,
//         oldPwd: formpassword.value.oldPwd,
//         newPwd: formpassword.value.newPwd,
//       }).then((res) => {
//         if (res.code == 200) {
//           ElMessage({
//             message: "修改成功",
//             type: "success",
//           });
//           dialogVisible1.value = false;
//           initData();
//         } else {
//           ElMessage({
//             message: res.msg,
//             type: "error",
//           });
//         }
//       });
//     }
//   });
// };
const pageTotal = ref(0);
//登录记录
const pageTotal1 = ref(0);
const pageTotal2 = ref(0);
//用户列表
const initData = () => {
  // æŸ¥è¯¢æ¡ä»¶
  const startTime = formatTime(queryForm.value.selectTime[0]);
@@ -975,14 +974,16 @@
    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
  ];
  GetUserList({
    ...pageQuery.value,
    filter,
  NewGetUserList({
    pageIndex: pageQuery.value.page,
    pageSize: pageQuery.value.rows,
    searchKeyword: queryForm.value.selectInput,
    startDate: startTime,
    endDate: endTime,
  }).then((res) => {
    tableData.value = res.rows;
    pageTotal.value = res.total;
    tableData.value = res.data.items;
    pageTotal.value = res.data.totalCount;
  });
  getRole();
};
//分页请求参数
const pageQuery = ref({
@@ -993,23 +994,48 @@
  wheres: "", //条件查询
});
//分页请求参数
const pageQuery1 = ref({
  page: 1, //当前页面
  rows: 10, //每页显示条数
  order: "desc", //排序方式
  sort: "", //排序字段
  wheres: "", //条件查询
});
//分页请求参数
const pageQuery2 = ref({
  page: 1, //当前页面
  rows: 10, //每页显示条数
  order: "desc", //排序方式
  sort: "", //排序字段
  wheres: "", //条件查询
});
//数据检索事件
const handleQuery = () => {
  pageQuery.value.page = 1;
  if (isactive.value == 1) {
    pageQuery.value.page = 1;
    initData();
  } else {
  } else if (isactive.value == 2) {
    pageQuery1.value.page = 1;
    getRole();
  } else {
    pageQuery2.value.page = 1;
    GetFacePageData();
  }
};
//重置查询条件
const resetQuery = () => {
  queryForm.value = Object.assign({}, obj);
  pageQuery.value.page = 1;
  if (isactive.value == 1) {
    pageQuery.value.page = 1;
    initData();
  } else {
  } else if (isactive.value == 2) {
    pageQuery1.value.page = 1;
    getRole();
  } else {
    pageQuery2.value.page = 1;
    GetFacePageData();
  }
};
//分页页面大小改变
@@ -1017,8 +1043,10 @@
  pageQuery.value.rows = val;
  if (isactive.value == 1) {
    initData();
  } else {
  } else if (isactive.value == 2) {
    getRole();
  } else {
    GetFacePageData();
  }
};
@@ -1027,34 +1055,42 @@
  pageQuery.value.page = val;
  if (isactive.value == 1) {
    initData();
  } else {
  } else if (isactive.value == 2) {
    getRole();
  } else {
    GetFacePageData();
  }
};
const handleAvatarSuccess = (val) => {
  formUser.value.headImageUrl = "/image/" + val.data;
const handleAvatarSuccess = (response, file, fileList) => {
  formUser.value.path = response.data;
  if (fileList.length >= 1) {
    showUpload.value = true;
  }
};
//重置表单
const resetForm = (formEl) => {
  if (!formEl) return;
  formEl.resetFields();
  formUser.value = {
    user_Id: undefined,
    userName: "",
    role_Id: 21,
    roleName: "",
    phoneNo: "",
    remark: "",
    userPwd: "123456",
    userTrueName: "",
    dept_Id: 0,
    username: "",
    phoneno: "",
    roleid: 21,
    rolename: "",
    enable: 1,
    headImageUrl: "",
    newPwd: "",
    path: "",
    user_Id: undefined,
  };
  fileList.value = [];
};
const resetForm1 = (formEl) => {
  if (!formEl) return;
  formEl.resetFields();
  formRole.value = {
    roleName: "",
    description: "",
  };
};
const resetForm2 = (formEl) => {
  if (!formEl) return;
  formEl.resetFields();
  formRole.value = {
@@ -1067,23 +1103,18 @@
  dialogImageUrl.value = uploadFile.url;
  imgdialogVisible.value = true;
};
const handleRemove = (val) => {
const handleRemove = (file, fileList1) => {
  fileList.value = [];
  //移除已上传的图片
  formUser.value.headImageUrl = "";
  formUser.value.path = "";
  if (fileList.value.length < 1) {
    showUpload.value = false;
  }
};
const beforeAvatarUpload = (val) => {
  console.log(val);
};
// const submitUpload = () => {
//   let promise = new Promise((resolve, reject) => {
//     setTimeout(async () => {
//       await uploadRef.value.submit();
//       resolve("上传成功");
//     });
//   });
//   return promise;
// };
//新建用户账号
const saveObj = async (formEl) => {
@@ -1091,14 +1122,14 @@
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      if (formUser.value.user_Id != undefined) {
        UpdateUser(formUser.value).then((res) => {
      if (formUser.value.id != undefined) {
        NewUpdateUser(formUser.value).then((res) => {
          ElMessage({ message: "修改成功", type: "success" });
          dialogVisible.value = false;
          initData();
        });
      } else {
        AddUser(formUser.value).then((res) => {
        AdduserData(formUser.value).then((res) => {
          ElMessage({ message: "提交成功", type: "success" });
          dialogVisible.value = false;
          initData();
@@ -1111,9 +1142,17 @@
};
//是否启用
const changeSwitch = (val) => {
  let data = Object.assign({}, val);
  console.log(data);
  UpdateUser(data).then((res) => {
  let data = {
    id: val.user_Id,
    username: val.userName,
    phoneno: val.phoneNo,
    roleid: val.role_Id,
    rolename: val.roleName,
    enable: val.enable,
    path: val.headImageUrl,
    usertruename: val.userTrueName,
  };
  NewUpdateUser(data).then((res) => {
    ElMessage({ message: "修改成功", type: "success" });
    dialogVisible.value = false;
    initData();
@@ -1131,15 +1170,24 @@
};
//编辑用户账号
const Edit = (val) => {
  let obj = Object.assign({}, val);
  let obj = {
    id: val.user_Id,
    username: val.userName,
    phoneno: val.phoneNo,
    roleid: val.role_Id,
    rolename: val.roleName,
    enable: val.enable,
    path: val.headImageUrl,
    usertruename: val.userTrueName,
  };
  formUser.value = {
    ...obj,
  };
  if (obj.headImageUrl != "") {
  if (obj.path != "") {
    fileList.value = [
      {
        name: "1",
        url: "http://115.159.85.185:9098" + obj.headImageUrl,
        url: "http://115.159.85.185:9098" + obj.path,
      },
    ];
  }
@@ -1153,20 +1201,15 @@
  formUser.value = obj;
  formpassword.value = val;
  newobj.value = Object.assign({}, val);
  console.log(newobj.value);
  dialogVisible1.value = true;
};
//保存修改密码
const savePassword = async (formEl) => {
  let obj = Object.assign({}, newobj);
  // obj.password = formpassword.value.password;
  console.log(formUser.value);
  let obj = Object.assign({}, newobj.value);
  let formdata = {
    id: formUser.value.user_Id,
    oldPwd: formUser.value.userPwd,
    newPwd: formUser.value.newPwd,
    id: obj.user_Id,
    oldPwd: obj.userPwd,
    newPwd: obj.newPwd,
  };
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
@@ -1250,12 +1293,39 @@
    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
  ];
  GetPageDataApi({ ...pageQuery.value, filter }).then((res) => {
  GetPageDataApi({ ...pageQuery1.value, filter }).then((res) => {
    grideData.value = res.rows;
    pageTotal.value = res.total;
    pageTotal1.value = res.total;
    groupOptions.value = res.rows;
  });
};
//删除用户
const deletUser = (val) => {
  ElMessageBox.confirm("确认删除该用户吗?", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      DeleteUserData({
        userAccount: val.userName,
      }).then((res) => {
        ElMessage({
          type: "success",
          message: "删除成功",
        });
        initData();
      });
    })
    .catch(() => {
      ElMessage({
        type: "info",
        message: "取消删除",
      });
    });
};
//打印数据
const printExcel = () => {
  // æŸ¥è¯¢æ¡ä»¶
@@ -1294,9 +1364,11 @@
  if (isactive.value == 1) {
    selectoptions.value = userOptions;
    initData();
  } else {
  } else if (isactive.value == 2) {
    selectoptions.value = roleOptions;
    getRole();
  } else {
    GetFacePageData();
  }
};
@@ -1331,6 +1403,7 @@
    });
  }
};
//管理
//路由跳转
const toDetail = (row) => {
@@ -1339,6 +1412,7 @@
onMounted(() => {
  initData();
  getRole();
});
</script>
<style lang="scss" scoped>
@@ -1484,14 +1558,16 @@
    text-align: center;
  }
}
:deep(.hide .el-upload--picture-card) {
  display: none;
}
</style>
<style>
.confirmButtonClass {
/* .confirmButtonClass {
  margin-right: 10px;
}
.el-message-box .el-message-box__btns {
  flex-direction: row-reverse !important;
  justify-content: normal !important;
}
} */
</style>