| | |
| | | > |
| | | ç¨æ·åä½ |
| | | </div> |
| | | <div |
| | | :class="['item', isactive == 5 ? 'isactive' : '']" |
| | | @click="changeactive(5)" |
| | | > |
| | | ç¨æ·IP |
| | | </div> |
| | | </div> |
| | | <div class="serch"> |
| | | <div class="time_box"> |
| | |
| | | ><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" |
| | |
| | | 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 |
| | |
| | | > |
| | | </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" /> |
| | |
| | | </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=" |
| | |
| | | > |
| | | <el-pagination |
| | | v-if="isactive == 1" |
| | | size="small" |
| | | size="large" |
| | | background |
| | | layout="prev, pager, next" |
| | | :current-page="pageQuery.page" |
| | |
| | | <span |
| | | style="font-size: 0.88rem; color: black; font-weight: bold" |
| | | class="from_title" |
| | | >ç¨æ·è§è² |
| | | >è§è²åå |
| | | </span> |
| | | </div> |
| | | </template> |
| | |
| | | </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=" |
| | |
| | | /> |
| | | </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, |
| | |
| | | AddUserUnit, |
| | | EditUserUnit, |
| | | DeleteUserUnit, |
| | | GetIPData, |
| | | AddIP, |
| | | EditIP, |
| | | DeleteIP, |
| | | } from "@/api/user"; |
| | | import { useRouter } from "vue-router"; |
| | | import { formatTime } from "@/utils/index.js"; |
| | |
| | | const dialogVisible1 = ref(false); |
| | | //ç¨æ·è§è²æ°å»º |
| | | const dialogVisible2 = ref(false); |
| | | //äººè¸æ³¨å |
| | | const registerdialogVisible = ref(false); |
| | | //ç鿡件 |
| | | const userOptions = [ |
| | | { |
| | |
| | | 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; |
| | |
| | | // 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; |
| | |
| | | trigger: "blur", |
| | | }, |
| | | }); |
| | | const ipRules = reactive({ |
| | | iPaddress: { |
| | | required: true, |
| | | message: "请è¾å
¥IPå°å", |
| | | trigger: "blur", |
| | | }, |
| | | addressname: { |
| | | required: true, |
| | | message: "请è¾å
¥æ£ä¿®é", |
| | | trigger: "blur", |
| | | }, |
| | | }); |
| | | |
| | | const formRole = ref({ |
| | | roleName: "", |
| | | description: "", |
| | |
| | | Unittype.value = "æ°å»º"; |
| | | UnitdialogVisible.value = true; |
| | | }; |
| | | const Addip = () => { |
| | | ipType.value = "æ°å»º"; |
| | | dialogipVisible.value = true; |
| | | }; |
| | | //è·åç¨æ·åä½ |
| | | const getUnit = () => { |
| | | const startTime = formatTime(queryForm.value.selectTime[0]); |
| | |
| | | } else if (isactive.value == 4) { |
| | | selectoptions.value = unitOptions; |
| | | getUnit(); |
| | | } else if ((isactive.value = 5)) { |
| | | getIpData(); |
| | | } |
| | | }; |
| | | |
| | |
| | | ids.value = val.map((item) => item.id); |
| | | }; |
| | | const UnitSelectionChange = (val) => { |
| | | ids.value = []; |
| | | ids.value = val.map((item) => item.id); |
| | | }; |
| | | const IpSelectionChange = (val) => { |
| | | ids.value = []; |
| | | ids.value = val.map((item) => item.id); |
| | | }; |
| | |
| | | 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: "æ£å¨å¤çä¸,请ç¨å...", |
| | | 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(() => { |
| | |
| | | flex-direction: column; |
| | | |
| | | .checkbox { |
| | | width: 35rem; |
| | | width: 45rem; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-top: 1rem; |
| | |
| | | } |
| | | } |
| | | } |
| | | /* æ·»å åä½å¾æ åº */ |
| | | .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 { |