添加获取本机ip并发送到服务器

This commit is contained in:
junleea 2024-04-19 19:34:39 +08:00
parent 3de238a215
commit 3d45f5259c
10 changed files with 235 additions and 52 deletions

29
package-lock.json generated
View File

@ -9,6 +9,7 @@
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"axios": "^1.6.5", "axios": "^1.6.5",
"cors": "^2.8.5",
"element-plus": "^2.4.4", "element-plus": "^2.4.4",
"video.js": "^8.9.0", "video.js": "^8.9.0",
"vue": "^3.3.11", "vue": "^3.3.11",
@ -1019,6 +1020,18 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/csstype": { "node_modules/csstype": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@ -1416,6 +1429,14 @@
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
}, },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -1591,6 +1612,14 @@
"resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz",
"integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg=="
}, },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/video.js": { "node_modules/video.js": {
"version": "8.9.0", "version": "8.9.0",
"resolved": "https://registry.npmjs.org/video.js/-/video.js-8.9.0.tgz", "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.9.0.tgz",

View File

@ -10,6 +10,7 @@
}, },
"dependencies": { "dependencies": {
"axios": "^1.6.5", "axios": "^1.6.5",
"cors": "^2.8.5",
"element-plus": "^2.4.4", "element-plus": "^2.4.4",
"video.js": "^8.9.0", "video.js": "^8.9.0",
"vue": "^3.3.11", "vue": "^3.3.11",

View File

@ -5,7 +5,7 @@ export const loginService = (loginData) => {
for (let key in loginData) { for (let key in loginData) {
params.append(key, loginData[key]) params.append(key, loginData[key])
} }
return request.post('/user/login', params,) return request.post('/user/login', params)
} }
export const registerService = (registerData) => { export const registerService = (registerData) => {

View File

@ -7,19 +7,33 @@ export const playVideoService = (data) => {
} }
return request.post('/video', params, Headers = { 'Accept': 'application/vnd.apple.mpegurl', Authorization: data.Authorization }); return request.post('/video', params, Headers = { 'Accept': 'application/vnd.apple.mpegurl', Authorization: data.Authorization });
} }
export const delayVideoService = (data) => {
const params = new URLSearchParams();
for (let key in data) {
params.append(key, data[key])
}
return request.post('/video/delay_video', params, Headers = {Authorization: data.Authorization });
}
export const getVideoListService = (data) => { export const getVideoListService = (data) => {
const params = new URLSearchParams(); const params = new URLSearchParams();
let hour = data['hour'];
for (let key in data) { for (let key in data) {
if (key === 'entrydate' && data[key].length > 0) { if (key === 'entrydate' && data[key].length > 0) {
console.log(data[key]); if (hour === "33") {
let begin=data[key][0].toLocaleString().slice(0,10)+" 00:00:00"; let begin = data[key][0].toLocaleString().slice(0, 10) + " 00:00:00"; //begin=data[key][0].toLocaleString().slice(0,10)+hour+":00:00";
console.log("begin="+begin.toString());
params.append("begin", begin); params.append("begin", begin);
let end = data[key][1].toLocaleString().slice(0, 10) + " 23:59:59"; let end = data[key][1].toLocaleString().slice(0, 10) + " 23:59:59";
console.log("end="+end.toString());
params.append("end", end); params.append("end", end);
continue; continue;
} else {
let begin = data[key][0].toLocaleString().slice(0, 10) + hour + ":00:00"; //begin=data[key][0].toLocaleString().slice(0,10)+hour+":00:00";
params.append("begin", begin);
let end = data[key][1].toLocaleString().slice(0, 10) + hour + ":59:59";
params.append("end", end);
continue;
}
} }
params.append(key, data[key]) params.append(key, data[key])
} }

View File

@ -7,7 +7,7 @@ import App from './App.vue'
import router from '@/router' import router from '@/router'
import globalData from '@/utils/global.js' import globalData from '@/utils/global.js'
const app=createApp(App); const app=createApp(App);
app.provide('globalData',globalData); app.provide('globalData',globalData);
app.use(router).use(ElementPlus).mount('#app'); app.use(router).use(ElementPlus).mount('#app');

View File

@ -1,6 +1,6 @@
import axios from "axios"; import axios from "axios";
import router from "@/router/index.js"; import router from "@/router/index.js";
const baseURL = "/api"; const baseURL = "https://jp.ljsea.top/";
const request = axios.create({ const request = axios.create({
baseURL: baseURL, baseURL: baseURL,
}); });

View File

@ -99,10 +99,11 @@ if (localStorage.getItem("token") !== null) {
const globalData = inject("globalData"); const globalData = inject("globalData");
const loginData = ref({ var loginData = ref({
username: "", username: "",
email: "lijun.lj@foxmail.com", email: "lijun.lj@foxmail.com",
password: "", password: "",
ip:"",
}); });
const registerData = ref({ const registerData = ref({
username: "", username: "",
@ -159,9 +160,25 @@ const login = async () => {
localStorage.setItem("token", result.data.token); localStorage.setItem("token", result.data.token);
localStorage.setItem("userId", result.data.id); localStorage.setItem("userId", result.data.id);
localStorage.setItem("username", result.data.username); localStorage.setItem("username", result.data.username);
let now=new Date();
localStorage.setItem("end_time", now.setDate(now.getHours() + 12));//
//token.value= result.data; //token.value= result.data;
router.push("/videoList"); router.push("/videoList");
}; };
const getIpClient= async() => {
try {
const response = await axios.get("https://ipinfo.io/json");
loginData.value.ip =response.data.ip;
// console.log("ip:",response.data.ip);
// console.log("login ip:",loginData.ip);
// console.log(response.data);
// console.log(loginData);
} catch (error) {
console.error(error);
}
};
getIpClient();
const register = async () => { const register = async () => {
let result = registerService(registerData.value); let result = registerService(registerData.value);
if (result.code === 0) { if (result.code === 0) {

View File

@ -30,10 +30,12 @@ nextTick(() => {
sources: [ sources: [
{ {
src: src:
"/api/video/m3u8?filename=" + "https://jp.ljsea.top/video/m3u8?filename=" +
localStorage.getItem("video_name") + localStorage.getItem("video_name") +
"&id=" + "&id=" +
localStorage.getItem("video_id") + localStorage.getItem("video_id") +
"&ip=" +
localStorage.getItem("ip")+
"&userId=" + "&userId=" +
localStorage.getItem("userId") + localStorage.getItem("userId") +
"&token=" + "&token=" +

View File

@ -2,6 +2,7 @@
import axios from "axios"; import axios from "axios";
import { inject } from "vue"; import { inject } from "vue";
import { getVideoListService } from "@/api/video.js"; import { getVideoListService } from "@/api/video.js";
import { delayVideoService } from "@/api/video.js";
import router from "@/router/index.js"; import router from "@/router/index.js";
export default { export default {
@ -14,9 +15,12 @@ export default {
// }, // },
data() { data() {
return { return {
ip: "",
tableData: [], tableData: [],
file_sum_size: 0,
tokenData: { tokenData: {
token: localStorage.getItem("token"), token: localStorage.getItem("token"),
ip: localStorage.getItem("ip"),
userId: localStorage.getItem("userId"), userId: localStorage.getItem("userId"),
username: localStorage.getItem("username"), username: localStorage.getItem("username"),
hour: 0, hour: 0,
@ -33,15 +37,23 @@ export default {
// //
methods: { methods: {
async getVideoList() { async getVideoList() {
console.log(this.tokenData.token);
let result = {}; let result = {};
try { try {
result = await getVideoListService(this.tokenData); result = await getVideoListService(this.tokenData);
} catch (e) { } catch (e) {
console.log(e); console.log(e);
} }
this.tableData = JSON.parse(result.data); let data = result.data;
console.log(this.tableData[0]); let len = data.length;
for (let i = 0; i < len; i++) {
//this.file_sum_size += parseFloat(data[i].file_size);
data[i].file_size = parseFloat(data[i].file_size / 1024 / 1024).toFixed(
2
);
}
console.log("file_size", this.file_sum_size, "len=", len);
this.tableData = data;
}, },
onSubmit() { onSubmit() {
getVideoList({ token: token }); getVideoList({ token: token });
@ -60,6 +72,84 @@ export default {
//alert("id=" + id + " name=" + name); //alert("id=" + id + " name=" + name);
router.push("/video"); router.push("/video");
}, },
async downloadVideo(index) {
var id = this.tableData[index].id;
var name = this.tableData[index].video_name;
var vurl =
"https://jp.ljsea.top/video/m3u8?filename=" +
name +
"&id=" +
id +
"&userId=" +
localStorage.getItem("userId") +
"&ip=" +
this.ip +
"&token=" +
localStorage.getItem("token"); //
//
try {
//
const response = await axios({
url: vurl,
method: "GET",
responseType: "blob", // axiosblob
headers: {
//
"Content-Type": "video/mp4",
},
});
// Blob
const videoBlob = new Blob([response.data], { type: "video/mp4" });
// BlobURL
const videoUrl = URL.createObjectURL(videoBlob);
// 使a
const link = document.createElement("a");
link.href = videoUrl;
link.download = name; //
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// URL
URL.revokeObjectURL(videoUrl);
} catch (error) {
console.error("下载视频时发生错误:", error);
}
},
async delayVideo(index) {
var id = this.tableData[index].id;
var days = 10;
var delay_data = {
id: id,
ip:this.ip,
delay: days,
userId: this.tokenData.userId,
token: this.tokenData.token,
};
try {
var d_re = await delayVideoService(delay_data);
if (d_re.code == 0) {
alert("延迟成功");
} else {
alert("操作失败");
}
} catch (e) {
console.log(e);
}
},
async getIpClient() {
try {
const response = await axios.get("https://ipinfo.io/json");
this.ip=response.data.ip;
localStorage.setItem("ip", this.ip);
//console.log(response);
} catch (error) {
console.error(error);
}
},
// //
tableRowClassName({ row, rowIndex }) { tableRowClassName({ row, rowIndex }) {
if (row.human === 1) { if (row.human === 1) {
@ -74,11 +164,13 @@ export default {
// //
// //
mounted() { async mounted() {
let now=new Date();
if (localStorage.getItem("token") === null ) { if (localStorage.getItem("token") === null ) {
router.push("/login"); router.push("/login");
} }
console.log("mounted"); // console.log("mounted");
await this.getIpClient();
this.getVideoList(); this.getVideoList();
}, },
}; };
@ -105,17 +197,18 @@ export default {
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<!-- <el-select v-model="tokenData.hour"> <el-select v-model="tokenData.hour">
<el-option label="0点" value="24"></el-option> <el-option label="不选" value="33"></el-option>
<el-option label="1点" value="1"></el-option> <el-option label="0点" value="00"></el-option>
<el-option label="2点" value="2"></el-option> <el-option label="1点" value="01"></el-option>
<el-option label="3点" value="3"></el-option> <el-option label="2点" value="02"></el-option>
<el-option label="4点" value="4"></el-option> <el-option label="3点" value="03"></el-option>
<el-option label="5点" value="5"></el-option> <el-option label="4点" value="04"></el-option>
<el-option label="6点" value="6"></el-option> <el-option label="5点" value="05"></el-option>
<el-option label="7点" value="7"></el-option> <el-option label="6点" value="06"></el-option>
<el-option label="8点" value="8"></el-option> <el-option label="7点" value="07"></el-option>
<el-option label="9点" value="9"></el-option> <el-option label="8点" value="08"></el-option>
<el-option label="9点" value="09"></el-option>
<el-option label="10点" value="10"></el-option> <el-option label="10点" value="10"></el-option>
<el-option label="11点" value="11"></el-option> <el-option label="11点" value="11"></el-option>
<el-option label="12点" value="12"></el-option> <el-option label="12点" value="12"></el-option>
@ -130,41 +223,56 @@ export default {
<el-option label="21点" value="21"></el-option> <el-option label="21点" value="21"></el-option>
<el-option label="22点" value="22"></el-option> <el-option label="22点" value="22"></el-option>
<el-option label="23点" value="23"></el-option> <el-option label="23点" value="23"></el-option>
</el-select> --> </el-select>
<el-form-item> <el-form-item>
<el-button type="primary" @click="getVideoList()">查询</el-button> <el-button type="primary" @click="getVideoList()">查询</el-button>
</el-form-item> </el-form-item>
<!-- <el-form-item>
所有文件大小 {{ parseFloat(this.file_sum_size/1024/1024).toFixed(2) }} GB
</el-form-item> -->
</el-form> </el-form>
<!-- 表格 --> <!-- 表格 :row-style="this.tableRowClassName"-->
<el-table <el-table :data="tableData" width="100%" border>
:data="tableData"
:row-style="this.tableRowClassName" :row-style="this.tableRowClassName"
border <el-table-column prop="id" label="id" width="80"></el-table-column>
>
<el-table-column prop="id" label="id" width="50"></el-table-column>
<el-table-column <el-table-column
prop="video_name" prop="video_name"
label="视频名称" label="视频名称"
width="250" width="250"
></el-table-column> ></el-table-column>
<el-table-column label="是否有人" width="50" prop="human"> <el-table-column label="是否有人" width="30" prop="human">
<template #default="scope"> <template #default="scope">
{{ scope.row.human == 1 ? "有" : "无" }} {{ scope.row.human == 1 ? "有" : "无" }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="create_time" prop="create_time"
label="创建时间" label="开始时间"
width="250" width="180"
></el-table-column>
<el-table-column
prop="end_time"
label="结束时间"
width="180"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
prop="delete_time" prop="delete_time"
label="预期删除时间" label="预期删除时间"
width="250" width="180"
></el-table-column> ></el-table-column>
<el-table-column label="操作" width="250"> <el-table-column
prop="file_size"
label="文件大小(MB)"
width="80"
></el-table-column>
<el-table-column
prop="camera_id"
label="摄像头"
width="50"
></el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope"> <template #default="scope">
<el-button <el-button
type="primary" type="primary"
@ -172,6 +280,18 @@ export default {
@click.prevent="playVideo(scope.$index)" @click.prevent="playVideo(scope.$index)"
>播放</el-button >播放</el-button
> >
<el-button
type="primary"
size="mini"
@click.prevent="delayVideo(scope.$index)"
>延迟删除</el-button
>
<el-button
type="primary"
size="mini"
@click.prevent="downloadVideo(scope.$index)"
>下载</el-button
>
<!-- <el-button type="danger" size="mini">删除</el-button> --> <!-- <el-button type="danger" size="mini">删除</el-button> -->
</template> </template>

View File

@ -13,13 +13,13 @@ export default defineConfig({
'@': fileURLToPath(new URL('./src', import.meta.url)) '@': fileURLToPath(new URL('./src', import.meta.url))
} }
}, },
server : { // server : {
proxy: { // proxy: {
'/api': { // '/api': {
target: 'https://jp.ljsea.top', // target: 'https://jp.ljsea.top',
changeOrigin: true, // changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '') // rewrite: path => path.replace(/^\/api/, '')
} // }
} // }
} // }
}) })