锁屏管理系统功能增加

master
gsy 10 months ago
parent 9b6a39827b
commit d576402a3e

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -8,8 +8,8 @@
<title></title>
<script type="module" crossorigin src="./assets/index.1e86c638.js"></script>
<link rel="stylesheet" href="./assets/index.32d30889.css">
<script type="module" crossorigin src="./assets/index.d5a6cfd9.js"></script>
<link rel="stylesheet" href="./assets/index.ecc43642.css">
</head>
<body>
<div id="app">

@ -51,8 +51,19 @@ export const generateDynamicPassword = data => post("LockScreenManager/LockScree
//获取客户端信息
export const getLockScreenClientList = data => post("LockScreenManager/LockScreenClient/getLockScreenClientList",data)
//修改客户端本地信息
export const updateLockScreenClient = data => post("LockScreenManager/LockScreenClient/updateLockScreenClient",data)
//发送远程修改配置指令
export const updateConfigClient = data => post("LockScreenManager/LockScreenClient/updateConfigClient",data)
//发送远程解锁指令
export const unLockClient = data => post("LockScreenManager/LockScreenClient/unLockClient",data)
//获取登录日志
export const getLockScreenLoginLogList = data => post("LockScreenManager/LockScreenLoginLog/getLockScreenLoginLogList",data)

@ -5,8 +5,8 @@ import {ElMessage} from "element-plus";
// axios.defaults.staticBaseURL = '../'
//axios.defaults.baseURL = 'http://' + window.location.host //正式
axios.defaults.baseURL = 'http://' + window.location.hostname + ':9440' //测试
axios.defaults.baseURL = 'http://' + window.location.host //正式
//axios.defaults.baseURL = 'http://' + window.location.hostname + ':9440' //测试
//post请求头
axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8";

@ -17,6 +17,9 @@ import dynamicPassword from '../..//views/LockScreenManager/dynamicPassword.vue'
import clientManage from '../..//views/LockScreenManager/clientManage/clientManage.vue';
import userloginlogquery from '../..//views/LockScreenManager/userloginlogquery.vue';
import menu from '../../views/menu/menu.vue';
@ -40,6 +43,9 @@ const routes = [
},{
path: 'clientManage',//cafterqueryPage
component: clientManage,
},{
path: 'userloginlogquery',//cafterqueryPage
component: userloginlogquery,
},
{
path: 'index',//index

@ -2,21 +2,14 @@
<el-form ref="formDom" :rules="addFormRules" :model="formData" size="medium" v-loading="loading">
<el-row>
<el-col :span="19" :offset="1">
<el-form-item label="用户名" :label-width="formLabelWidth" prop="loginName" clearable>
<el-input v-model="formData.loginName" autocomplete="off"></el-input>
<el-form-item label="客户端别名" :label-width="formLabelWidth" >
<el-input clearable v-model="formData.clientName" autocomplete="off"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="口令" :label-width="formLabelWidth" prop="loginPwd" clearable>
<el-input type="password" v-model="formData.loginPwd" autocomplete="off" maxlength="12"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="人员名称" :label-width="formLabelWidth" prop="userName" clearable>
<el-input v-model="formData.userName" autocomplete="off"></el-input>
<el-form-item label="客户端所属群组" :label-width="formLabelWidth" prop="groupName" >
<el-input clearable type="text" v-model="formData.groupName" autocomplete="off" maxlength="12"></el-input>
</el-form-item>
</el-col>
@ -32,7 +25,7 @@ import pro from '../../../util/tool.js';
import { onMounted, reactive, ref, toRefs, warn } from 'vue';
import { addLockScreenGtUser, updateLockScreenGtUser } from '@/util/api/api.js';
import { addLockScreenGtUser, updateLockScreenClient } from '@/util/api/api.js';
import { ElMessage, ElMessageBox } from "element-plus";
@ -65,11 +58,7 @@ const formDom = ref(null);
//
const addFormRules = ref({
loginName: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
userName: [{ required: true, message: '请输入人员名称', trigger: 'blur' }],
// jobNumber: [{ required: true, message: '', trigger: 'blur' }],
loginPwd: [{ required: true, message: '请输入口令', trigger: 'blur' }],
groupName: [{ required: true, message: '请输入客户端所属群组', trigger: 'blur' }],
})
@ -99,7 +88,7 @@ function saveData() {
//
function updateData() {
formData.value.isAntiFee = 0;
updateLockScreenGtUser(formData.value).then(res => {
updateLockScreenClient(formData.value).then(res => {
if (res.result == 1) {
ElMessage.success("修改成功");
//

@ -0,0 +1,124 @@
<template>
<el-form ref="formDom" :rules="addFormRules" :model="formData" size="medium" v-loading="loading">
<el-row>
<el-col :span="19" :offset="1">
<el-form-item label="等待时间" :label-width="formLabelWidth">
<el-input oninput="if(!/^[0-9]+$/.test(value)) value=value.replace(/\D/g,'');if(value<0) value='';" clearable v-model="formData.WaiteTime" autocomplete="off">
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="MQTT服务连接url" :label-width="formLabelWidth" prop="groupName">
<el-input clearable type="text" v-model="formData.MqttUrl" autocomplete="off"
maxlength="12"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="MQTT服务连接用户名" :label-width="formLabelWidth" prop="groupName">
<el-input clearable type="text" v-model="formData.MqttUser" autocomplete="off"
maxlength="12"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="MQTT服务连接密码" :label-width="formLabelWidth" prop="groupName">
<el-input clearable type="text" v-model="formData.MqttPassword" autocomplete="off"
maxlength="12"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="客户端动态口令私钥" :label-width="formLabelWidth" prop="groupName">
<el-input clearable type="text" v-model="formData.PrivateKey" autocomplete="off"
maxlength="12"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="客户端别名" :label-width="formLabelWidth" prop="groupName">
<el-input clearable type="text" v-model="formData.ClientName" autocomplete="off"
maxlength="12"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup>
import pro from '../../../util/tool.js';
import { onMounted, reactive, ref, toRefs, warn } from 'vue';
import { updateConfigClient } from '@/util/api/api.js';
import { ElMessage, ElMessageBox } from "element-plus";
//
const props = defineProps(['rowData']);
//
const emit = defineEmits(['addReload']);
// label
const formLabelWidth = ref('150px');
//
const formData = ref({});
//
const addServiceAreaList = ref([]);
//
const addRoleList = ref([]);
//
const loading = ref(false);
const formDom = ref(null);
const locationOptions = ['Home', 'Company', 'School']
onMounted(() => {
formData.value = props.rowData;
});
//
function saveConfigData() {
updateConfigClient(formData.value).then(res => {
if (res.result == 1) {
ElMessage.success(res.msg);
//
emit("addReload");
} else if (res.result == -2) {
ElMessage.error(res.msg);
} else {
ElMessage.error(res.msg);
}
})
}
//使
defineExpose({
formDom,
saveConfigData
});
</script>
<style scoped></style>

@ -10,11 +10,19 @@
<span style="vertical-align: middle;"> 新增 </span>
</el-button> -->
<el-button type="warning" style="margin-left: 0.5%;margin-top: 0px;" @click="updateOperators">
<el-button type="primary" style="margin-left: 0.5%;margin-top: 0px;" @click="updateOperators">
<el-icon>
<Edit />
</el-icon>
<span style="vertical-align: middle;"> 修改配置信息 </span>
<span style="vertical-align: middle;">修改</span>
</el-button>
<el-button type="warning" style="margin-left: 0.5%;margin-top: 0px;" @click="configClient">
<el-icon>
<Edit />
</el-icon>
<span style="vertical-align: middle;"> 远程修改配置信息 </span>
</el-button>
<!-- <el-button type="danger" style="margin-top: 0px;" @click="del">
@ -34,19 +42,20 @@
</div>
<el-table :height=myHeight highlight-current-row="true" v-loading.fullscreen.lock="tableLoading" :data="tableData" border
style="width: 100%;" @current-change="tableHandleCurrentChange"
<el-table :height=myHeight highlight-current-row="true" v-loading.fullscreen.lock="tableLoading"
:data="tableData" border style="width: 100%;" @current-change="tableHandleCurrentChange"
@selection-change="handleSelectionChange">
<el-table-column :resizable="false" fixed align="center" type="index" width="80" label="序号" />
<el-table-column :resizable="false" align="center" prop="clientName" label="客户端别名" />
<el-table-column :resizable="false" align="center" width="150" prop="clientId" label="客户端MAC地址" />
<el-table-column :resizable="false" align="center" width="180" prop="connectStartTime" label="客户端创建连接时间" />
<el-table-column :resizable="false" align="center" width="180" prop="connectStartTime"
label="客户端创建连接时间" />
<el-table-column :resizable="false" align="center" prop="passwordKey" label="客户端动态口令私钥" />
<el-table-column :resizable="false" align="center" width="130" prop="groupName" label="客户端所属群组" />
<el-table-column :resizable="false" prop="right" label="操作" width="200" align="center">
<template v-slot="scope">
<el-button style="width: 48%;margin-left: 1%;margin-top: 2%"
@click="details(scope.row, scope.$index)" type="danger" size="default" :icon="View">
<el-button style="width: 48%;margin-left: 1%;margin-top: 2%" @click="unlock(scope.row)"
type="danger" size="default" :icon="View">
<span style="vertical-align: middle;"> 解锁屏幕 </span>
</el-button>
</template>
@ -67,13 +76,33 @@
<el-row>
<el-col :span="19" :offset="1">
<el-form-item label="用户名" :label-width="formLabelWidth" clearable>
<el-input placeholder="请输入" v-model="searchForm.loginNameQuery" autocomplete="off"></el-input>
<el-form-item label="客户端别名" :label-width="formLabelWidth">
<el-input clearable placeholder="请输入" v-model="searchForm.clientNameQuery"
autocomplete="off"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="客户端MAC地址" :label-width="formLabelWidth">
<el-input clearable placeholder="请输入" v-model="searchForm.clientIdQuery"
autocomplete="off"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="群组名称" :label-width="formLabelWidth">
<el-input clearable placeholder="请输入" v-model="searchForm.groupNameQuery"
autocomplete="off"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="人员名称" :label-width="formLabelWidth" clearable>
<el-input placeholder="请输入" v-model="searchForm.userNameQuery" autocomplete="off"></el-input>
<el-form-item label="核销时间(起始)" :label-width="formLabelWidth">
<el-date-picker clearable v-model="searchForm.startTime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD 00:00:00" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="核销时间(终止)" :label-width="formLabelWidth">
<el-date-picker clearable v-model="searchForm.endTime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD 23:59:59" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
@ -126,6 +155,32 @@
</span>
</template>
</el-dialog>
<el-dialog v-model="configShow" width="40%" top="0.5%" :destroy-on-close="true" :close-on-click-modal="false">
<template #header="{ titleAdd, titleClass, warnMessgae }">
<div class="my-header">
<span :id="titleAdd" :class="titleClass">客户端远程配置修改</span>
<span :id="warnMessgae" :class="titleClass" style="color: red;">
输入要修改的值点击保存后发送修改指令 </span>
</div>
</template>
<clientConfigUpdate ref="clientConfigUpdateDom" :rowData="configForm" @addReload="addReload">
</clientConfigUpdate>
<template #footer>
<span class="dialog-footer">
<el-button @click="configShow = false"> 取消</el-button>
<el-button type="primary" @click="saveConfigData()"> </el-button>
</span>
</template>
</el-dialog>
</el-row>
</template>
@ -137,16 +192,25 @@ import pro from '../../../util/tool.js';
import { onMounted, reactive, ref, toRefs, warn } from 'vue';
import { getLockScreenClientList, addLockScreenGtUser,deleteLockScreenGtUser } from '@/util/api/api.js';
import { getLockScreenClientList, unLockClient, deleteLockScreenGtUser } from '@/util/api/api.js';
import { ElMessage, ElMessageBox } from "element-plus";
import clientAddUpdate from './clientAddUpdate.vue'
import clientConfigUpdate from './clientConfigUpdate.vue'
//dom
const clientAddUpdateDom = ref(null);
//dom
const clientConfigUpdateDom = ref(null);
//
const props = defineProps(['checkForm', 'images']);
@ -168,14 +232,19 @@ const searchForm = reactive({
total: 0,
pageNum: 1,
pageSize: 20,
userNameQuery: "", //
loginNameQuery:"",
isAntifee:0,
clientIdQuery: "", //
clientNameQuery: "",
groupNameQuery: "",
startTime: "", //
endTime: "", //
});
//
const addUpdateForm = ref({});
//
const configForm = ref({});
//
const tableData = ref([]);
@ -191,6 +260,11 @@ const searchRoleList = ref([]);
// false true
const addOperatorsShow = ref(false);
// false true
const configShow = ref(false);
// false true
const searchShow = ref(false);
@ -274,16 +348,24 @@ function getOtherData() {
//
function addOperators() {
addOperatorsShow.value = true;
//
addTitle.value = true;
//
updateTitle.value = false;
//addUpdateForm
addUpdateForm.value = {};
function configClient() {
//
if (currentRow.value == null) {
ElMessage({
showClose: true,
message: '请选择要修改的数据!',
type: 'warning',
})
return;
}
//退
let current = { ...currentRow.value };
//退
configForm.value.ClientId = current.clientId;
configForm.value.PrivateKey = current.passwordKey;
configForm.value.ClientName = current.clientName;
configShow.value = true;
}
@ -307,12 +389,30 @@ function saveData() {
});
}
//
function saveConfigData() {
clientConfigUpdateDom.value.formDom.validate((valid) => {
if (valid) { // valid true;
clientConfigUpdateDom.value.saveConfigData();
} else {
return false
}
});
}
//
function addReload() {
//
addOperatorsShow.value = false;
//
configShow.value = false;
configForm.value = {};
//
reloadTableData();
}
@ -346,6 +446,17 @@ function updateOperators() {
//
function searchData() {
//()
if (searchForm.startTime !== "" && searchForm.endTime !== null
&& searchForm.startTime !== "" && searchForm.endTime !== null) {
let result = compareDates(searchForm.startTime, searchForm.endTime);
if (result == -1) {
ElMessage.warning("核销时间(起始) 不能大于 核销时间(终止)");
return;
}
}
searchForm.pageSize = 20;
searchForm.pageNum = 1;
searchForm.total = 0;
@ -353,11 +464,16 @@ function searchData() {
reloadTableData();
}
//
function resetSearchData() {
//
searchForm.userNameQuery = "";
searchForm.loginNameQuery = "";
searchForm.startTime = "" //
searchForm.endTime = ""; //4
searchForm.clientIdQuery = "";
searchForm.clientNameQuery = "";
searchForm.groupNameQuery = "";
searchForm.pageSize = 20;
searchForm.pageNum = 1;
searchForm.total = 0;
@ -366,6 +482,22 @@ function resetSearchData() {
}
function unlock(row) {
//
unLockClient(row).then(res => {
if (res.result == 1) {
ElMessage.success(res.msg);
} else if (res.result == -2) {
ElMessage.error(res.msg);
} else {
ElMessage.error(res.msg);
}
//
reloadTableData();
})
}
function del() {
if (null == currentRow.value && null == multipleSelection.value) {
ElMessage({
@ -433,6 +565,19 @@ function tableFormat(row, column) {
}
//
function compareDates(beginDate, endDate) {
let beginTime = new Date(beginDate);
let endTime = new Date(endDate);
// -1
if (beginTime > endTime) {
return -1;
//
} else if (beginTime <= endTime) {
return 0;
}
}
//
function handleSizeChange(pageSize) {

@ -0,0 +1,291 @@
<template>
<el-row>
<el-col :span="24">
<div style="padding: 10px 0;display: flex">
<el-button type="primary" style="margin-left: 0.5%;margin-top: 0px;" @click="searchShow = true">
<el-icon style="vertical-align: middle;">
<search />
</el-icon>
<span style="vertical-align: middle;"> 查找 </span>
</el-button>
</div>
<el-table :height=myHeight highlight-current-row="true" v-loading.fullscreen.lock="tableLoading"
:data="tableData" border style="width: 100%;" @current-change="tableHandleCurrentChange">
<el-table-column :resizable="false" fixed align="center" type="index" width="80" label="序号" />
<el-table-column :resizable="false" align="center" prop="userName" label="人员名称" />
<el-table-column :resizable="false" align="center" prop="loginName" label="用户登录名" />
<el-table-column width="180" :resizable="false" align="center" prop="operationTime" label="登录时间" />
<el-table-column :formatter="tableFormat" width="140" :resizable="false" align="center" prop="passWordType" label="校验类型" />
<el-table-column :resizable="false" align="center" prop="passWord" label="静态口令" />
<el-table-column :resizable="false" align="center" prop="dynamicPassword" label="动态口令" />
<el-table-column :resizable="false" align="center" prop="operationIp" label="登录客户端MAC地址" />
</el-table>
<el-config-provider :locale="locale">
<el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="searchForm.pageNum" :page-sizes="[20, 30, 50]" :page-size="searchForm.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="searchForm.total">
</el-pagination>
</el-config-provider>
</el-col>
</el-row>
<el-dialog title="查询" v-model="searchShow" width="35%" top="0.5%" draggable :modal="false">
<el-form :model="searchForm" size="medium" ref="searchFormElement">
<el-row>
<el-col :span="19" :offset="1">
<el-form-item label="客户端MAC地址" :label-width="formLabelWidth">
<el-input clearable placeholder="请输入" v-model="searchForm.clientIdQuery"
autocomplete="off"></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="用户登录名" :label-width="formLabelWidth">
<el-input placeholder="请输入" v-model="searchForm.loginNameQuery" autocomplete="off"
clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="登录时间(起始)" :label-width="formLabelWidth">
<el-date-picker clearable v-model="searchForm.operationStartTime" type="date"
format="YYYY-MM-DD" value-format="YYYY-MM-DD 00:00:00" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="19" :offset="1">
<el-form-item label="登录时间(终止)" :label-width="formLabelWidth">
<el-date-picker clearable v-model="searchForm.operationEndTime" type="date" format="YYYY-MM-DD"
value-format="YYYY-MM-DD 23:59:59" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="searchShow = false"> 取消</el-button>
<el-button type="primary" @click="resetSearchData">
<el-icon>
<Refresh />
</el-icon>
<span style="vertical-align: middle;"> 重置 </span>
</el-button>
<el-button type="primary" @click="searchData">
<el-icon style="vertical-align: middle;">
<search />
</el-icon>
<span style="vertical-align: middle;"> 搜索 </span>
</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { Download, View } from '@element-plus/icons-vue';
import pro from '../../util/tool.js';
import { onMounted, reactive, ref, toRefs, warn } from 'vue';
import { getLockScreenLoginLogList } from '@/util/api/api.js';
import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
//
const tableLoading = ref(true);
// label
const formLabelWidth = ref('130px');
//
const myHeight = ref(500);
//
const searchShow = ref(false);
//
const searchForm = reactive({
operationStartTime: pro.dateFormatDay(new Date().setMonth(new Date().getMonth() - 1)) + " 00:00:00",
operationEndTime: pro.dateFormatDay(new Date()) + " 23:59:59",
total: 0,
pageNum: 1,
pageSize: 20,
payType: null,
loginNameQuery: "",
clientIdQuery: "",
});
//
const tableData = ref([]);
//
const currentRow = ref(null);
const IntegralTypeList = ref(false);
onMounted(() => {
tableLoading.value = true;
//
getIntegraTableData();
});
function getIntegraTableData() {
getLockScreenLoginLogList(searchForm).then(res => {
if (res.records != null) {
tableData.value = res.records;
searchForm.total = res.total;
searchForm.pageNum = res.current;
searchForm.pageSize = res.size;
} else {
ElMessage.error('查询失败!')
}
//
myHeight.value = (document.documentElement.clientHeight) * 0.77;
tableLoading.value = false;
})
}
function reloadTableData() {
tableLoading.value = true;
getLockScreenLoginLogList(searchForm).then(res => {
if (res.records != null) {
tableData.value = res.records;
searchForm.total = res.total;
searchForm.pageNum = res.current;
searchForm.pageSize = res.size;
} else {
ElMessage.error('查询失败!')
}
tableLoading.value = false;
})
}
//
function searchData() {
//,null.
if (searchForm.payType != null && searchForm.payType == '') {
searchForm.payType = null;
}
//()
if (searchForm.operationStartTime !== "" && searchForm.operationEndTime !== null
&& searchForm.operationStartTime !== "" && searchForm.operationEndTime !== null) {
let result = compareDates(searchForm.operationStartTime, searchForm.operationEndTime);
if (result == -1) {
ElMessage.warning("操作时间(起始) 不能大于 操作时间(终止)");
return;
}
}
searchForm.pageSize = 20;
searchForm.pageNum = 1;
searchForm.total = 0;
//
reloadTableData();
}
//
function resetSearchData() {
//
searchForm.loginNameQuery = "";
//
searchForm.payType = null;
searchForm.operationStartTime = pro.dateFormatDay(new Date().setMonth(new Date().getMonth() - 1)) + " 00:00:00";
searchForm.operationEndTime = pro.dateFormatDay(new Date()) + " 23:59:59"
searchForm.clientIdQuery = "";
searchForm.pageSize = 20;
searchForm.pageNum = 1;
searchForm.total = 0;
//
reloadTableData();
}
//
function handleSizeChange(pageSize) {
//
tableLoading.value = true;
searchForm.pageSize = pageSize;
reloadTableData();
}
//
function handleCurrentChange(pageNum) {
//
tableLoading.value = true;
searchForm.pageNum = pageNum;
reloadTableData()
}
//
function compareDates(beginDate, endDate) {
let beginTime = new Date(beginDate);
let endTime = new Date(endDate);
// -1
if (beginTime > endTime) {
return -1;
//
} else if (beginTime <= endTime) {
return 0;
}
}
function tableHandleCurrentChange(row) {
currentRow.value = row;
}
function chnageDate() {
return currentRow.value;
}
function tableFormat(row, column) {
// DT YYYY-mm-dd HH:mm:ss
if (column.property == "passWordType") {
var passWordType = row[column.property];
if(passWordType == 1){
return "静态口令校验";
}else if(passWordType == 2){
return "动态口令校验";
}else if(passWordType == 3){
return "动态口令和静态口令一同校验";
}
}
}
//使
defineExpose({
chnageDate
});
</script>
<style scoped></style>
Loading…
Cancel
Save