艺术家
2025-06-11 e00d1817afd6f86154aaa4c870571c724ebfecfc
ÏîÄ¿´úÂë/ÉìËõ¸Ë/client/src/views/tts/UserManagement/Usermanagement.vue
@@ -162,6 +162,14 @@
            >新建</el-button
          >
          <el-button
            type="primary"
            size="small"
            style="width: 5.5rem; height: 2rem; font-size: 0.88rem"
            class="text_btn"
            @click="registerdialogVisible = true"
            >人脸注册</el-button
          >
          <el-button
            size="small"
            style="width: 5.5rem; height: 2rem; font-size: 0.88rem"
            @click="printExcel"
@@ -243,8 +251,8 @@
            min-width="2%"
          >
            <template #default="scope">
              <span v-if="scope.row.isLeader == 0">组员</span>
              <span v-else-if="scope.row.isLeader == 1">组长</span>
              <span v-if="scope.row.isLeader == 0">二级</span>
              <span v-else-if="scope.row.isLeader == 1">一级</span>
            </template>
          </el-table-column>
          <el-table-column
@@ -382,10 +390,10 @@
              >
            </template>
          </el-table-column>
          <el-table-column prop="isLeader" label="组员类型" align="center">
          <el-table-column prop="isLeader" label="用户类型" align="center">
            <template #default="scope">
              <span v-if="scope.row.isLeader == 0">组员</span>
              <span v-else-if="scope.row.isLeader == 1">组长</span>
              <span v-if="scope.row.isLeader == 0">二级</span>
              <span v-else-if="scope.row.isLeader == 1">一级</span>
            </template>
          </el-table-column>
          <el-table-column prop="deptName" label="备注" align="center" />
@@ -566,7 +574,7 @@
      >
        <el-pagination
          v-if="isactive == 1"
          size="small"
          size="large"
          background
          layout="prev, pager, next"
          :current-page="pageQuery.page"
@@ -679,7 +687,7 @@
                  <span
                    style="font-size: 0.88rem; color: black; font-weight: bold"
                    class="from_title"
                    >用户角色
                    >角色名字
                  </span>
                </div>
              </template>
@@ -1281,11 +1289,51 @@
        />
      </div>
    </el-dialog>
    <!-- äººè„¸æ³¨å†Œ -->
    <el-dialog
      v-model="registerdialogVisible"
      title="插件配置"
      width="500"
      :before-close="handleClose"
      top="5vh"
    >
      <template #header="{ titleId }">
        <div class="my-header">
          <h2 :id="titleId" style="font-size: 2rem">人脸录入</h2>
        </div>
      </template>
      <div class="content_register">
        <div class="image-container">
          <img
            src="@/assets/login/headimg.jpg"
            id="img"
            style="width: 100%"
            class="profile-image"
          />
        </div>
        <div class="action-buttons" @click="begin(1)">
          <a href="myapp://" class="btn face-register">
            <i class="fas fa-user-plus"></i> äººè„¸å½•å…¥</a
          >
          <button class="btn submit-data" @click="faceEnter()">
            <i class="fas fa-paper-plane"></i> æäº¤æ•°æ®
          </button>
        </div>
      </div>
      <template #footer>
        <!-- <div class="dialog-footer">
          <el-button type="primary" class="downloadreBtn" @click="download(2)"
            >提交配置</el-button
          >
        </div> -->
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, reactive, onMounted, toRef } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { ElMessage, ElMessageBox, ElLoading } from "element-plus";
import {
  GetUserList,
  AddUser,
@@ -1409,6 +1457,8 @@
const dialogVisible1 = ref(false);
//用户角色新建
const dialogVisible2 = ref(false);
//人脸注册
const registerdialogVisible = ref(false);
//筛选条件
const userOptions = [
  {
@@ -1664,6 +1714,7 @@
        //   formUser.value.userteam = formUser.value.userteam + "组";
        // }
        formUser.value.isLeader = newRole.value.isLeader;
        formUser.value.rolename = newRole.value.roleName;
        UpdateUser(formUser.value).then((res) => {
          ElMessage({ message: "修改成功", type: "success" });
          dialogVisible.value = false;
@@ -2106,6 +2157,95 @@
const toDetail = (row) => {
  router.push({ name: "permission", state: { info: JSON.stringify(row) } });
};
const interval = ref(null);
const onloading = ref(null);
const baseUrl = "http://192.168.1.103:9093";
const token = ref("");
const imgbase64 = ref("");
let urlPlugin = baseUrl + "/api/UserFace/DownlodaFacePlugin";
let urlPReg = baseUrl + "/api/UserFace/DownloadRegFile";
const getData = (flag) => {
  let url = "http://localhost:9298";
  let xmlResquest = new XMLHttpRequest();
  xmlResquest.open("post", url, true);
  xmlResquest.onload = function (e) {
    if (xmlResquest.status == 200) {
      clearTimeout(interval.value);
      imgbase64.value = xmlResquest.response;
      if (flag == 2) {
        const faceContainer = document.getElementById("face-recognition");
        const faceIcon = faceContainer.querySelector(".face-icon");
        const capturedFace = document.getElementById("captured-face");
        capturedFace.src = "data:image/png;base64," + xmlResquest.response;
        faceIcon.style.display = "none";
        capturedFace.style.display = "block";
        window.URL.revokeObjectURL(url);
        faceRecognitionEvent();
        return;
      } else {
        let img = document.getElementById("img");
        img.src = "data:image/png;base64," + xmlResquest.response;
        window.URL.revokeObjectURL(url);
        // hideLoading();
        onloading.value.close();
        return;
      }
    }
    // hideLoading();
    onloading.value.close();
  };
  xmlResquest.send();
};
const begin = (flag) => {
  if (interval.value) {
    clearTimeout(interval.value);
  }
  onloading.value = ElLoading.service({
    lock: true,
    text: "正在处理中,请稍后...",
    background: "rgba(0, 0, 0, 0.7)",
  });
  interval.value = setInterval(() => {
    getData(flag);
  }, 10000);
};
function faceEnter() {
  token.value = JSON.parse(localStorage.getItem("user")).token;
  console.log(token.value);
  let url = baseUrl + "/api/UserFace/faceEnter";
  let xmlResquest = new XMLHttpRequest();
  xmlResquest.open("post", url, true);
  xmlResquest.setRequestHeader("Content-Type", "application/json");
  xmlResquest.setRequestHeader("Authorization", "Bearer " + token.value);
  xmlResquest.onload = function (e) {
    img.src = "headimg.jpg";
    if (xmlResquest.status == 200) {
      let response = JSON.parse(xmlResquest.response);
      if (response.status) {
        ElMessage.success("人脸录入成功,图片名称:" + response.data);
        onloading.value.close();
        registerdialogVisible.value = false;
        // hideLoading();
      } else {
        ElMessage.error("人脸录入失败,错误信息:" + response.message);
        onloading.value.close();
        registerdialogVisible.value = false;
        // hideLoading();
      }
    } else {
      ElMessage.error("数据提交失败");
      onloading.value.close();
      registerdialogVisible.value = false;
      // hideLoading();
    }
  };
  xmlResquest.send(JSON.stringify({ Base64Image: imgbase64.value }));
}
onMounted(() => {
  if (window.innerWidth <= 1080) {
@@ -2450,6 +2590,70 @@
    }
  }
}
/* æ·»åŠ å­—ä½“å›¾æ ‡åº“ */
.content_register {
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 30px;
  background-color: #f8f9fa;
  border-radius: 12px;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
  max-width: 800px;
  margin: 0 auto;
  .image-container {
    margin-bottom: 25px;
    border: 3px solid #e9ecef;
    border-radius: 8px;
    overflow: hidden;
  }
  .profile-image {
    display: block;
    width: 200px;
    height: 360px;
    object-fit: cover;
  }
  .action-buttons {
    display: flex;
    gap: 20px;
  }
  .btn,
  a.btn {
    padding: 12px 25px;
    border: none;
    border-radius: 50px;
    font-size: 16px;
    font-weight: 600;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 10px;
    text-decoration: none;
    color: white;
  }
  .face-register {
    background-color: #4e73df;
  }
  .submit-data {
    background-color: #1cc88a;
  }
  /* ç¡®ä¿a标签可点击区域 */
  .btn {
    position: relative;
    z-index: 1;
  }
  /* æ·»åŠ ç‚¹å‡»åé¦ˆ */
  .btn:active {
    transform: scale(0.98);
  }
}
</style>
<style>
.confirmButtonClass {