From fa50b581e097537d3f0b9f379b0ff7d22c5b8fb6 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Tue, 11 Mar 2025 16:05:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0shell=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=88=86=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/shell.js | 45 ++++ src/router/index.js | 6 + src/views/DeviceRealVPV2.vue | 2 +- src/views/Menu.vue | 7 + src/views/ShellList.vue | 466 +++++++++++++++++++++++++++++++++++ 5 files changed, 525 insertions(+), 1 deletion(-) create mode 100644 src/api/shell.js create mode 100644 src/views/ShellList.vue diff --git a/src/api/shell.js b/src/api/shell.js new file mode 100644 index 0000000..d2ac778 --- /dev/null +++ b/src/api/shell.js @@ -0,0 +1,45 @@ +import request from '@/utils/request.js' + + + +export const updateConfigShellService = (data) => { + const params = new URLSearchParams(); + const jsonString = encodeURIComponent(JSON.stringify(data)); + params.append('data', jsonString); + return request.post('/shell/update', params, { "headers": { 'token': data.token } }); +} + +export const deleteConfigShellService = (data) => { + const params = new URLSearchParams(); + for (let key in data) { + params.append(key, data[key]) + } + return request.post('/shell/delete', params, { "headers": { 'token': data.token } }); +} + +export const addConfigShellService = (data) => { + const params = new URLSearchParams(); + for (let key in data) { + if(key === 'token'){ + continue; + } + params.append(key, data[key]) + } + return request.post('/shell/create', params, { "headers": { 'token': data.token },'Content-Type': 'application/json' }); +} + +export const getConfigShellListService = (data) => { + const params = new URLSearchParams(); + for (let d in data) { + params.append(d, data[d]); + } + // request.headers["Content-Type"] = "application/json + let request1 = request; + request1.defaults.headers["token"] = data.token.value; + return request1.post('/shell/list', params, { + headers: { + 'token': data.token, // 将 token 替换为您的令牌值 + } + } + ); +} diff --git a/src/router/index.js b/src/router/index.js index 37604c3..d90018b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -12,6 +12,7 @@ import DeviceRealVP from "@/views/DeviceRealVP.vue"; import Chat from "@/views/Chat.vue" import Group from "@/views/Group.vue" import File from "@/views/FileList.vue" +import Shell from "@/views/ShellList.vue" const routes = [ { @@ -74,6 +75,11 @@ const routes = [ name:"file", component:File }, + { + path:"/shell", + name:"shell", + component:Shell + }, { path: '/', redirect: '/login' diff --git a/src/views/DeviceRealVPV2.vue b/src/views/DeviceRealVPV2.vue index 0a2d21f..6254f71 100644 --- a/src/views/DeviceRealVPV2.vue +++ b/src/views/DeviceRealVPV2.vue @@ -27,7 +27,7 @@ export default { methods: { initWebSocket() { let socketUrl = - "wss://vps.ljsea.top/tool/video_real_time?device_id=" + + "wss://vps.ljsea.top/tool/video_real_time?device_id=" + //wss://gep.ljsea.top/device/get_real_time_image?device_id= this.device_id + "&token=" + this.tokenData.token; diff --git a/src/views/Menu.vue b/src/views/Menu.vue index 491bbf4..1c843d2 100644 --- a/src/views/Menu.vue +++ b/src/views/Menu.vue @@ -27,6 +27,13 @@ @click.prevent="handleMenuSelect('/file')" >文件 + 执行命令 +import axios from "axios"; +import router from "@/router/index.js"; +import Cookies from "js-cookie"; +import { ElMessage } from "element-plus"; +import CryptoJS from "crypto-js"; +import Menu from "@/views/Menu.vue"; + +import { getConfigShellListService } from "@/api/shell.js"; +import { addConfigShellService } from "@/api/shell.js"; +import { deleteConfigShellService } from "@/api/shell.js"; +import { updateConfigShellService } from "@/api/shell.js"; + +export default { + data() { + return { + ip: "", + tableData: [], + search_id: 2002, + ConfigShellUpdateForm: {}, + keyword: "", + updateDialogVisible: false, + addConfigFileVisible: false, + ConfigFileCurrentPageData: [], + pageSize: 10, + currentPage: 1, + upload_file: null, //文件上传 + file_md5: "", //文件上传的md5 + addForm: { + shell_name: "", + shel_content: "", + server:"" + }, + + role: "", + tokenData: { + token: localStorage.getItem("token"), + ip: localStorage.getItem("ip"), + userId: localStorage.getItem("userId"), + username: localStorage.getItem("username"), + id: 2002, + server: "gep.ljsea.top", + keyword: "", + }, + }; + }, + + // methods 是一些用来更改状态与触发更新的函数 + // 它们可以在模板中作为事件处理器绑定 + methods: { + async getConfigFileList() { + let result = {}; + try { + //判断search_id是字符串还是数字 + let req = { + token: this.tokenData.token, + type: "all", + }; + result = await getConfigShellListService(req); + } catch (e) { + console.log(e); + } + let data = result.data; + if (data !== undefined && data !== null) { + this.tableData = data; + } + this.currentPageData(); + }, + addConfigFileV() { + this.addConfigFileVisible = true; + }, + handleServerChange() { + localStorage.setItem("config_file_server", this.tokenData.server); + this.getConfigFileList(); + }, + async addConfigFile() { + this.addDialogVisible = false; + let result = {}; + try { + let req = { + token: this.tokenData.token, + shell_name: this.addForm.shell_name, + shell_content: this.addForm.shell_content, + server: this.addForm.server + }; + result = await addConfigShellService(req); + if (result.code == 0) { + ElMessage.success("添加成功"); + this.getConfigFileList(); + this.addConfigFileVidibale = false; + } else { + //alert("添加失败"); + ElMessage.error("添加失败"); + } + } catch (e) { + console.log(e); + } + }, + async updateConfigShellInfo() { + let result = {}; + try { + let d={} + // for (var key in this.ConfigShellUpdateForm) { + // d[key] = this.ConfigShellUpdateForm[key]; + // } + let req = { + token: this.tokenData.token, + shells: [{"id":this.ConfigShellUpdateForm.ID,"shell_result":this.ConfigShellUpdateForm.ShellResult,"status":this.ConfigShellUpdateForm.Status}], + }; + result = await updateConfigShellService(req); + if (result.code === 0) { + ElMessage.success("更新成功"); + this.updateDialogVisible = false; + } else { + ElMessage.error("更新失败"); + } + } catch (e) { + console.log(e); + } + }, + async deleteConfigFile(index) { + // 是否删除 + let isDelete = confirm("是否删除?"); + if (!isDelete) { + return; + } + // alert("删除 index: " + index); + // return ; + let is_delete_file = confirm("是否删除文件?"); + + let result = {}; + try { + let req = { + token: this.tokenData.token, + id: this.ConfigFileCurrentPageData[index].ID, + del_file: is_delete_file, + }; + result = await deleteConfigFileService(req); + if (result.code == 0) { + ElMessage.success("删除成功"); + this.getConfigFileList(); + } else { + ElMessage.error("删除失败"); + } + } catch (e) { + console.log(e); + } + }, + async updateConfigShell(index) { + //console.log("index:", index); + let cf = this.ConfigFileCurrentPageData[index]; + // console.log("cf:", cf); + // let req = { + // token: this.tokenData.token, + // id: cf.ID, + // type: "one", + // }; + // let result = await getConfigShellListService(req); + // let data = result.data; + this.ConfigShellUpdateForm = cf; + this.updateDialogVisible = true; + }, + async createAgain(index) { + let cf = this.ConfigFileCurrentPageData[index]; + this.addForm.shell_name = cf.ShellName; + this.addForm.shell_content = cf.ShellContent; + this.addForm.server = cf.Server; + + await this.addConfigFile(); + + }, + + onSubmit() { + getConfigFileList(); + }, + currentPageData() { + this.ConfigFileCurrentPageData = this.tableData.slice( + (this.currentPage - 1) * this.pageSize, + this.currentPage * this.pageSize + ); + }, + handleSizeChange(val) { + //console.log(`每页 ${val} 条`); + this.pageSize = val; + this.currentPageData(); + }, + handleCurrentChange(val) { + //console.log(`当前页: ${val}`); + this.currentPage = val; + this.currentPageData(); + }, + + async displayMyInfo() { + await this.getMyUserInfo(this.tokenData.user_id); + this.updateDialogVisible = true; + }, + async displayUserInfo(id) { + await this.getMyUserInfo(id); + this.updateDialogVisible = true; + }, + + handleMenuSelect(val) { + router.push(val); + }, + toVideoList() { + router.push("/videoList"); + }, + // 修改条纹颜色 + tableRowClassName({ row, rowIndex }) { + switch (row.Status) { + case 0: + return 'rgba(243, 243, 248, 0.1)'; // 浅蓝色 + case 1: + return 'rgba(0, 0, 255, 0.5)'; // 中等深度蓝色 + case 2: + return 'rgba(0, 0, 255, 0.9)'; // 深蓝色 + default: + return 'transparent'; // 默认透明 + } + }, + }, + + // 生命周期钩子会在组件生命周期的各个不同阶段被调用 + // 例如这个函数就会在组件挂载完成后被调用 + async mounted() { + let now = new Date(); + if (localStorage.getItem("token") === null) { + router.push("/login"); + } + await this.getConfigFileList(); + //await this.getMyUserInfo(localStorage.getItem("userId")); + }, +}; + + + + \ No newline at end of file