From 4b2e902503ac1fabde7340ca26a1adbc0018d118 Mon Sep 17 00:00:00 2001
From: 艺术家 <10819716+q100102@user.noreply.gitee.com>
Date: 星期三, 11 六月 2025 17:31:41 +0800
Subject: [PATCH] 代码提交

---
 项目代码/伸缩杆/client/src/views/tts/UserManagement/Usermanagement.vue |  538 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 526 insertions(+), 12 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/\344\274\270\347\274\251\346\235\206/client/src/views/tts/UserManagement/Usermanagement.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/\344\274\270\347\274\251\346\235\206/client/src/views/tts/UserManagement/Usermanagement.vue"
index 3b86e55..da848c7 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/\344\274\270\347\274\251\346\235\206/client/src/views/tts/UserManagement/Usermanagement.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/\344\274\270\347\274\251\346\235\206/client/src/views/tts/UserManagement/Usermanagement.vue"
@@ -26,6 +26,12 @@
         >
           鐢ㄦ埛鍗曚綅
         </div>
+        <div
+          :class="['item', isactive == 5 ? 'isactive' : '']"
+          @click="changeactive(5)"
+        >
+          鐢ㄦ埛IP
+        </div>
       </div>
       <div class="serch">
         <div class="time_box">
@@ -161,6 +167,31 @@
             ><el-icon style="margin-right: 0.2rem"> <Plus /> </el-icon
             >鏂板缓</el-button
           >
+          <!-- 鐢ㄦ埛IP鏂板缓 -->
+          <el-button
+            v-if="isactive == 5"
+            type="primary"
+            size="small"
+            @click="Addip"
+            style="
+              width: 5.5rem;
+              height: 2rem;
+              font-size: 0.88rem;
+              display: flex;
+              align-items: center;
+            "
+            class="text_btn"
+            ><el-icon style="margin-right: 0.2rem"> <Plus /> </el-icon
+            >鏂板缓</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"
@@ -243,8 +274,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 +413,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" />
@@ -554,6 +585,63 @@
             </template></el-table-column
           >
         </el-table>
+
+        <!-- 鐢ㄦ埛IP -->
+        <el-table
+          empty-text="鏆傛棤鏁版嵁"
+          :height="isMin ? '950' : '450'"
+          v-if="isactive == 5"
+          :data="ipData"
+          style="width: 100%"
+          :header-cell-style="
+            isMin
+              ? {
+                  background: 'rgba(250,250,250,1)',
+                  color: '#101010',
+                  fontSize: '1.5rem',
+                  height: '3rem',
+                  border: 'none',
+                }
+              : {
+                  background: 'rgba(250,250,250,1)',
+                  color: '#101010',
+                  fontSize: '0.88rem',
+                  height: '3rem',
+                  border: 'none',
+                }
+          "
+          :row-style="
+            isMin
+              ? {
+                  color: '#101010',
+                  fontSize: '1.88rem',
+                  height: '3rem',
+                }
+              : {
+                  color: '#101010',
+                  fontSize: '0.88rem',
+                  height: '3rem',
+                }
+          "
+          @selection-change="IpSelectionChange"
+        >
+          <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 label="鎿嶄綔" align="center">
+            <template #default="scope">
+              <span
+                :style="{
+                  color: 'blue',
+                  fontSize: isMin ? '1.88rem' : '0.88rem',
+                  cursor: 'pointer',
+                }"
+                @click="Editip(scope.row)"
+                >缂栬緫</span
+              >
+            </template></el-table-column
+          >
+        </el-table>
       </div>
       <div
         style="
@@ -566,7 +654,7 @@
       >
         <el-pagination
           v-if="isactive == 1"
-          size="small"
+          size="large"
           background
           layout="prev, pager, next"
           :current-page="pageQuery.page"
@@ -679,7 +767,7 @@
                   <span
                     style="font-size: 0.88rem; color: black; font-weight: bold"
                     class="from_title"
-                    >鐢ㄦ埛瑙掕壊
+                    >瑙掕壊鍚嶅瓧
                   </span>
                 </div>
               </template>
@@ -1263,6 +1351,120 @@
       </template>
     </el-dialog>
 
+    <!-- 鐢ㄦ埛ip鏂板缓/缂栬緫 -->
+    <el-dialog
+      v-model="dialogipVisible"
+      title=""
+      width="40%"
+      :before-close="handleClose"
+      :show-close="false"
+      :align-center="true"
+      @close="resetForm4(formipRef)"
+    >
+      <template #title>
+        <div
+          style="
+            height: 3.63rem;
+            display: flex;
+            border-bottom: 1px solid #e6e6e6;
+          "
+        >
+          <span
+            :style="{
+              color: 'rgb(16, 16, 16)',
+              fontSize: isMin ? '2rem' : '1rem',
+              fontWeight: 'bold',
+            }"
+            >鐢ㄦ埛ip</span
+          >
+        </div>
+      </template>
+      <el-form
+        :model="formip"
+        label-width="auto"
+        label-position="top"
+        ref="formipRef"
+        :rules="ipRules"
+        :hide-required-asterisk="true"
+      >
+        <el-form-item prop="iPaddress">
+          <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,
+                }"
+                >ip鍦板潃</span
+              >
+            </div>
+          </template>
+          <el-input
+            style="height: 2rem"
+            size="small"
+            v-model="formip.iPaddress"
+            placeholder="璇疯緭鍏�"
+          />
+        </el-form-item>
+        <el-form-item prop="addressname">
+          <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.addressname"
+            placeholder="璇疯緭鍏�"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer" style="text-align: center">
+          <el-button
+            size="small"
+            @click="dialogipVisible = false"
+            style="height: 2rem; font-size: 0.88rem"
+            >鍙栨秷</el-button
+          >
+
+          <el-button
+            size="small"
+            type="primary"
+            @click="saveIp(formipRef)"
+            style="height: 2rem; font-size: 0.88rem"
+          >
+            淇濆瓨
+          </el-button>
+        </div>
+      </template>
+    </el-dialog>
+
     <el-dialog v-model="imgdialogVisible" width="35%" top="3vh">
       <div
         style="
@@ -1281,11 +1483,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,
@@ -1304,6 +1546,10 @@
   AddUserUnit,
   EditUserUnit,
   DeleteUserUnit,
+  GetIPData,
+  AddIP,
+  EditIP,
+  DeleteIP,
 } from "@/api/user";
 import { useRouter } from "vue-router";
 import { formatTime } from "@/utils/index.js";
@@ -1409,6 +1655,8 @@
 const dialogVisible1 = ref(false);
 //鐢ㄦ埛瑙掕壊鏂板缓
 const dialogVisible2 = ref(false);
+//浜鸿劯娉ㄥ唽
+const registerdialogVisible = ref(false);
 //绛涢�夋潯浠�
 const userOptions = [
   {
@@ -1631,6 +1879,19 @@
     unitName: "",
   };
 };
+const resetForm4 = (formEl) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  formip.value = {
+    creater: "",
+    createDate: "",
+    modifier: "",
+    modifyDate: "",
+    id: 0,
+    iPaddress: "",
+    addressname: "",
+  };
+};
 
 const handlePictureCardPreview = (uploadFile) => {
   dialogImageUrl.value = uploadFile.url;
@@ -1664,6 +1925,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;
@@ -1828,6 +2090,19 @@
     trigger: "blur",
   },
 });
+const ipRules = reactive({
+  iPaddress: {
+    required: true,
+    message: "璇疯緭鍏P鍦板潃",
+    trigger: "blur",
+  },
+  addressname: {
+    required: true,
+    message: "璇疯緭鍏ユ淇亾",
+    trigger: "blur",
+  },
+});
+
 const formRole = ref({
   roleName: "",
   description: "",
@@ -1993,6 +2268,10 @@
   Unittype.value = "鏂板缓";
   UnitdialogVisible.value = true;
 };
+const Addip = () => {
+  ipType.value = "鏂板缓";
+  dialogipVisible.value = true;
+};
 //鑾峰彇鐢ㄦ埛鍗曚綅
 const getUnit = () => {
   const startTime = formatTime(queryForm.value.selectTime[0]);
@@ -2049,6 +2328,8 @@
   } else if (isactive.value == 4) {
     selectoptions.value = unitOptions;
     getUnit();
+  } else if ((isactive.value = 5)) {
+    getIpData();
   }
 };
 
@@ -2071,11 +2352,18 @@
   ids.value = [];
   ids.value = val.map((item) => item.id);
 };
+const IpSelectionChange = (val) => {
+  ids.value = [];
+  ids.value = val.map((item) => item.id);
+};
 const deleteAll = () => {
-  if (ids.value.includes(1)) {
-    ElMessage({ message: "瓒呯骇绠$悊鍛樹笉鑳藉垹闄�", type: "error" });
-    return;
+  if (isactive.value == 1 || isactive.value == 2) {
+    if (ids.value.includes(1)) {
+      ElMessage({ message: "瓒呯骇绠$悊鍛樹笉鑳藉垹闄�", type: "error" });
+      return;
+    }
   }
+
   if (ids.value.length == 0) {
     ElMessage({ message: "璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁", type: "error" });
     return;
@@ -2100,11 +2388,173 @@
       ElMessage({ message: "鍒犻櫎鎴愬姛", type: "success" });
       getUnit();
     });
+  } else if (isactive.value == 5) {
+    DeleteIP(ids.value).then((res) => {
+      ElMessage({ message: "鍒犻櫎鎴愬姛", type: "success" });
+      getIpData();
+    });
   }
 };
 // 绠$悊 璺敱璺宠浆
 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: "姝e湪澶勭悊涓�,璇风◢鍚�...",
+    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;
+    }
+  };
+  xmlResquest.send(JSON.stringify({ Base64Image: imgbase64.value }));
+}
+const ipData = ref([]);
+const dialogipVisible = ref(false);
+const ipType = ref("鏂板缓");
+const formip = ref({
+  creater: "",
+  createDate: "",
+  modifier: "",
+  modifyDate: "",
+  id: 0,
+  iPaddress: "",
+  addressname: "",
+});
+const formipRef = ref(null);
+//鑾峰彇ip鏁版嵁
+const getIpData = () => {
+  // 鏌ヨ鏉′欢
+  const startTime = formatTime(queryForm.value.selectTime[0]);
+  const endTime = formatTime(queryForm.value.selectTime[1]);
+  const filter = [
+    {
+      name: queryForm.value.selectType,
+      value: queryForm.value.selectInput,
+      displayType: "like",
+    },
+    { name: "createDate", value: startTime, displayType: "ThanOrEqual" },
+    { name: "createDate", value: endTime, displayType: "LessOrEqual" },
+  ];
+  GetIPData({
+    ...pageQuery.value,
+    filter,
+  }).then((res) => {
+    ipData.value = res.rows;
+    pageTotal.value = res.total;
+  });
+};
+const Editip = (val) => {
+  ipType.value = "淇敼";
+  let obj = Object.assign({}, val);
+  formip.value = obj;
+  dialogipVisible.value = true;
+};
+//淇濆瓨ip
+const saveIp = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      if (ipType.value == "淇敼") {
+        EditIP(formip.value).then((res) => {
+          ElMessage({ message: "淇敼鎴愬姛", type: "success" });
+          dialogipVisible.value = false;
+          getIpData();
+        });
+      } else {
+        formip.value.creater = JSON.parse(
+          localStorage.getItem("user")
+        ).userName;
+        formip.value.createDate = formatTime(new Date());
+
+        AddIP(formip.value).then((res) => {
+          ElMessage({ message: "娣诲姞鎴愬姛", type: "success" });
+          dialogipVisible.value = false;
+          getIpData();
+        });
+      }
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
 };
 
 onMounted(() => {
@@ -2273,7 +2723,7 @@
       flex-direction: column;
 
       .checkbox {
-        width: 35rem;
+        width: 45rem;
         display: flex;
         justify-content: space-between;
         margin-top: 1rem;
@@ -2450,6 +2900,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 {

--
Gitblit v1.9.3