添加登录验证码

master
fanluyan 2 years ago
parent 98e915aa7c
commit 9badc25dc7

48
package-lock.json generated

@ -14,6 +14,7 @@
"element-ui": "^2.15.13", "element-ui": "^2.15.13",
"moment": "^2.29.4", "moment": "^2.29.4",
"update-element-ui-theme": "^1.0.0", "update-element-ui-theme": "^1.0.0",
"v-viewer": "^1.6.4",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-router": "^3.5.1", "vue-router": "^3.5.1",
"vuex": "^3.6.2" "vuex": "^3.6.2"
@ -10830,6 +10831,27 @@
"uuid": "dist/bin/uuid" "uuid": "dist/bin/uuid"
} }
}, },
"node_modules/v-viewer": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/v-viewer/-/v-viewer-1.6.4.tgz",
"integrity": "sha512-LVkiUHpmsbsZXebeNXnu8krRCi5i2n07FeLFxoIVGhw8lVvTBO0ffpbDC6mLEuacCjrIh09HjIqpciwUtWE8lQ==",
"dependencies": {
"throttle-debounce": "^2.0.1",
"viewerjs": "^1.5.0"
},
"engines": {
"node": ">=4",
"npm": ">=3"
}
},
"node_modules/v-viewer/node_modules/throttle-debounce": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
"integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/v8-compile-cache": { "node_modules/v8-compile-cache": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
@ -10855,6 +10877,11 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/viewerjs": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.3.tgz",
"integrity": "sha512-efG3U61Umuj/1x6JAtdvnY9m407C/RkrkFilsMcLEWKDivpjNU3/FeL+feCY1Vkur9aQeBJ+z6K4CCPP7hv6vA=="
},
"node_modules/vue": { "node_modules/vue": {
"version": "2.7.14", "version": "2.7.14",
"resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz", "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz",
@ -19954,6 +19981,22 @@
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true "dev": true
}, },
"v-viewer": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/v-viewer/-/v-viewer-1.6.4.tgz",
"integrity": "sha512-LVkiUHpmsbsZXebeNXnu8krRCi5i2n07FeLFxoIVGhw8lVvTBO0ffpbDC6mLEuacCjrIh09HjIqpciwUtWE8lQ==",
"requires": {
"throttle-debounce": "^2.0.1",
"viewerjs": "^1.5.0"
},
"dependencies": {
"throttle-debounce": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
"integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="
}
}
},
"v8-compile-cache": { "v8-compile-cache": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
@ -19976,6 +20019,11 @@
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true "dev": true
}, },
"viewerjs": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.3.tgz",
"integrity": "sha512-efG3U61Umuj/1x6JAtdvnY9m407C/RkrkFilsMcLEWKDivpjNU3/FeL+feCY1Vkur9aQeBJ+z6K4CCPP7hv6vA=="
},
"vue": { "vue": {
"version": "2.7.14", "version": "2.7.14",
"resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz", "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz",

@ -14,6 +14,7 @@
"element-ui": "^2.15.13", "element-ui": "^2.15.13",
"moment": "^2.29.4", "moment": "^2.29.4",
"update-element-ui-theme": "^1.0.0", "update-element-ui-theme": "^1.0.0",
"v-viewer": "^1.6.4",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-router": "^3.5.1", "vue-router": "^3.5.1",
"vuex": "^3.6.2" "vuex": "^3.6.2"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Before

Width:  |  Height:  |  Size: 553 KiB

After

Width:  |  Height:  |  Size: 553 KiB

@ -1,11 +1,13 @@
<template> <template>
<div class="header"> <div class="header">
<div class="logo"> <div class="logo">
<img <!-- <img
src="../../assets/img/logo.png" src="../../assets/img/logo.png"
alt="欣影" alt="欣影"
width="110px" width="110px"
/> />-->
视频监控可视化平台
</div> </div>
<v-sidebar></v-sidebar> <v-sidebar></v-sidebar>
<div class="header-right"> <div class="header-right">

@ -33,6 +33,14 @@ import moment from "moment"; // 导入文件
// 注册全局 moment // 注册全局 moment
Vue.prototype.$moment = moment; Vue.prototype.$moment = moment;
Vue.config.productionTip = false; Vue.config.productionTip = false;
//图片预览
import "viewerjs/dist/viewer.css";
import Viewer from "v-viewer";
Vue.use(Viewer);
// 这里是插件的默认设置
Viewer.setDefaults({
zIndexInline: 9999,
});
new Vue({ new Vue({
router, router,

@ -4,8 +4,7 @@
<div class="loginFilter"> <div class="loginFilter">
<div class="ms-login"> <div class="ms-login">
<div class="ms-title"> <div class="ms-title">
<img src="../assets/img/logo.png" alt="欣影" /> <h3>视频监控可视化平台</h3>
<h3>可视化智能管控系统</h3>
</div> </div>
<el-form <el-form
:model="userInfo" :model="userInfo"
@ -31,6 +30,20 @@
<el-button slot="prepend" icon="el-icon-lock"></el-button> <el-button slot="prepend" icon="el-icon-lock"></el-button>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="verificationCode" class="verifyItem">
<el-input
v-model="userInfo.verificationCode"
placeholder="请输入验证码"
>
<el-button slot="prepend" icon="el-icon-unlock"></el-button>
</el-input>
<div @click="refreshCode" class="verifyBox">
<!--验证码组件-->
<s-identify :identifyCode="identifyCode"></s-identify>
</div>
</el-form-item>
<div class="login-btn"> <div class="login-btn">
<el-button type="primary" @click="submitForm()"></el-button> <el-button type="primary" @click="submitForm()"></el-button>
</div> </div>
@ -38,27 +51,37 @@
</el-form> </el-form>
</div> </div>
</div> </div>
<p class="webInfo">© 2023 可视化智能管控系统.All right reserved.</p> <p class="webInfo">© 2023 视频监控可视化平台.All right reserved.</p>
</div> </div>
</template> </template>
<script> <script>
import { mapMutations } from "vuex"; import { mapMutations } from "vuex";
import { login } from "@/utils/api/index"; import { login } from "@/utils/api/index";
import SIdentify from "./components/SIdentify";
export default { export default {
components: {
SIdentify,
},
data: function () { data: function () {
return { return {
userInfo: { userInfo: {
username: "xytest", username: "xytest",
password: "123456", password: "123456",
verificationCode: "",
}, },
rules: { rules: {
username: [ username: [
{ required: true, message: "请输入用户名", trigger: "blur" }, { required: true, message: "请输入用户名", trigger: "blur" },
], ],
password: [{ required: true, message: "请输入密码", trigger: "blur" }], password: [{ required: true, message: "请输入密码", trigger: "blur" }],
verificationCode: [
{ required: true, message: "验证码不能为空", trigger: "blur" },
],
}, },
token: "", token: "",
identifyCode: "",
identifyCodes: "1234567890abcdefjhijklinopqrsduvwxyz",
}; };
}, },
computed: { computed: {
@ -69,6 +92,7 @@ export default {
this.$refs.loginForm.validate((valid) => { this.$refs.loginForm.validate((valid) => {
if (valid) { if (valid) {
console.log(valid); console.log(valid);
//console.log(this.userInfo.verificationCode);
//this.userInfo.password = this.$md5(this.userInfo.password); // //this.userInfo.password = this.$md5(this.userInfo.password); //
this.token = this.$md5(this.userInfo.password); //token this.token = this.$md5(this.userInfo.password); //token
this.$store.commit("SET_TOKEN", this.token); //tokenvuex this.$store.commit("SET_TOKEN", this.token); //tokenvuex
@ -83,8 +107,27 @@ export default {
}); });
}, },
getLogin() {}, getLogin() {},
//
refreshCode() {
this.identifyCode = "";
this.makeCode(this.identifyCodes, 4);
},
makeCode(o, l) {
for (let i = 0; i < l; i++) {
this.identifyCode +=
this.identifyCodes[this.randomNum(0, this.identifyCodes.length)];
}
},
randomNum(min, max) {
return Math.floor(Math.random() * (max - min) + min);
},
}, },
created() {}, created() {},
mounted() {
//
this.identifyCode = "";
this.makeCode(this.identifyCodes, 4);
},
}; };
</script> </script>
@ -101,15 +144,15 @@ export default {
width: 100%; width: 100%;
height: 100%; height: 100%;
//background: #86b7ff; //background: #86b7ff;
-webkit-backdrop-filter: blur(30px);
backdrop-filter: blur(30px); //backdrop-filter: blur(12px);
} }
.loginFilter { .loginFilter {
width: 420px; width: 420px;
height: 454px; height: 450px;
background: transparent; background: rgba(255, 255, 255, 0.6);
box-shadow: 0px 4px 12px 0px rgba(51, 51, 51, 0.15); box-shadow: 0px 4px 12px 0px rgba(51, 51, 51, 0.15);
border-radius: 4px; border-radius: 10px;
left: 50%; left: 50%;
top: 50%; top: 50%;
transform: translate(-50%;-50%); transform: translate(-50%;-50%);
@ -127,10 +170,7 @@ export default {
text-align: center; text-align: center;
border-bottom: 1px solid #dcdfe6; border-bottom: 1px solid #dcdfe6;
padding: 40px 16px; padding: 40px 16px;
img {
margin-bottom: 8px;
//width: 160px;
}
h3 { h3 {
font-size: 30px; font-size: 30px;
//background: linear-gradient(0deg, #86b7ff, #4293fd 99.46289%); //background: linear-gradient(0deg, #86b7ff, #4293fd 99.46289%);
@ -144,6 +184,13 @@ export default {
.el-form-item { .el-form-item {
margin-bottom: 30px; margin-bottom: 30px;
} }
.verifyItem {
.el-form-item__content {
display: flex;
align-items: center;
justify-content: space-between;
}
}
.login-btn { .login-btn {
text-align: center; text-align: center;
button { button {

@ -0,0 +1,165 @@
<template>
<div class="s-canvas">
<canvas
id="s-canvas"
:width="contentWidth"
:height="contentHeight"
></canvas>
</div>
</template>
<script>
export default {
name: "SIdentify",
props: {
identifyCode: {
type: String,
default: "1234",
},
fontSizeMin: {
type: Number,
default: 25,
},
fontSizeMax: {
type: Number,
default: 30,
},
backgroundColorMin: {
type: Number,
default: 255,
},
backgroundColorMax: {
type: Number,
default: 255,
},
colorMin: {
type: Number,
default: 0,
},
colorMax: {
type: Number,
default: 160,
},
lineColorMin: {
type: Number,
default: 100,
},
lineColorMax: {
type: Number,
default: 255,
},
dotColorMin: {
type: Number,
default: 0,
},
dotColorMax: {
type: Number,
default: 255,
},
contentWidth: {
type: Number,
default: 112,
},
contentHeight: {
type: Number,
default: 36,
},
},
methods: {
//
randomNum(min, max) {
return Math.floor(Math.random() * (max - min) + min);
},
//
randomColor(min, max) {
let r = this.randomNum(min, max);
let g = this.randomNum(min, max);
let b = this.randomNum(min, max);
return "rgb(" + r + "," + g + "," + b + ")";
},
drawPic() {
let canvas = document.getElementById("s-canvas");
let ctx = canvas.getContext("2d");
ctx.textBaseline = "bottom";
//
ctx.fillStyle = this.randomColor(
this.backgroundColorMin,
this.backgroundColorMax
);
ctx.fillRect(0, 0, this.contentWidth, this.contentHeight);
//
for (let i = 0; i < this.identifyCode.length; i++) {
this.drawText(ctx, this.identifyCode[i], i);
}
this.drawLine(ctx);
this.drawDot(ctx);
},
drawText(ctx, txt, i) {
ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax);
ctx.font =
this.randomNum(this.fontSizeMin, this.fontSizeMax) + "px SimHei";
let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1));
let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5);
var deg = this.randomNum(-45, 45);
//
ctx.translate(x, y);
ctx.rotate((deg * Math.PI) / 180);
ctx.fillText(txt, 0, 0);
//
ctx.rotate((-deg * Math.PI) / 180);
ctx.translate(-x, -y);
},
drawLine(ctx) {
// 线
for (let i = 0; i < 5; i++) {
ctx.strokeStyle = this.randomColor(
this.lineColorMin,
this.lineColorMax
);
ctx.beginPath();
ctx.moveTo(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight)
);
ctx.lineTo(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight)
);
ctx.stroke();
}
},
drawDot(ctx) {
//
for (let i = 0; i < 80; i++) {
ctx.fillStyle = this.randomColor(0, 255);
ctx.beginPath();
ctx.arc(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight),
1,
0,
2 * Math.PI
);
ctx.fill();
}
},
},
watch: {
identifyCode() {
this.drawPic();
},
},
mounted() {
this.drawPic();
},
};
</script>
<style scoped>
.s-canvas {
height: 36px;
}
.s-canvas canvas {
margin-left: 8px;
}
</style>

@ -11,7 +11,9 @@
v-for="item in terminalPhoto" v-for="item in terminalPhoto"
:key="item.id" :key="item.id"
> >
<viewer class="bigimg">
<img :src="item.path" alt="" /> <img :src="item.path" alt="" />
</viewer>
</swiper-slide> </swiper-slide>
<div <div
class="swiper-button-next swiper-button-white" class="swiper-button-next swiper-button-white"
@ -35,17 +37,19 @@
> >
<img :src="item.path" alt="" /> <img :src="item.path" alt="" />
<p class="timeInfo"> <p class="timeInfo">
{{ $moment(item.photoTime).format("YYYY-MM-DD HH:mm:ss") }} {{ $moment(item.photoTime).format("YYYY-MM-DD ") }}
</p> </p>
</swiper-slide> </swiper-slide>
<div <!-- <div
v-if="terminalPhoto.length !== 1"
class="swiper-button-next swiper-button-white" class="swiper-button-next swiper-button-white"
slot="button-next" slot="button-next"
></div> ></div>
<div <div
v-if="terminalPhoto.length !== 1"
class="swiper-button-prev swiper-button-white" class="swiper-button-prev swiper-button-white"
slot="button-prev" slot="button-prev"
></div> ></div> -->
</swiper> </swiper>
</div> </div>
</template> </template>
@ -74,8 +78,8 @@ export default {
loop: true, loop: true,
loopedSlides: 5, // looped slides should be the same loopedSlides: 5, // looped slides should be the same
//spaceBetween: 10, //spaceBetween: 10,
//observer: true, //swiperswiper observer: true, //swiperswiper
//observeParents: true, //swiperswiper observeParents: true, //swiperswiper
// autoplay: { // autoplay: {
// // // //
// delay: 2000, // delay: 2000,
@ -121,11 +125,14 @@ export default {
.slide-1 { .slide-1 {
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
.bigimg {
width: 100%;
height: 100%;
}
img { img {
width: 1360px; width: 100%;
height: auto; height: 100%;
object-fit: cover; // object-fit: cover;
} }
} }
} }
@ -137,10 +144,14 @@ export default {
border: 3px solid transparent; border: 3px solid transparent;
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
display: flex;
align-items: center;
img { img {
width: 320px; width: 100%;
height: auto; height: 100%;
object-fit: cover;
//object-fit: cover;
} }
} }
@ -155,14 +166,38 @@ export default {
color: @color-text-primary; color: @color-text-primary;
} }
} }
.nopic {
.swiper-button-next.swiper-button-white,
.swiper-container-rtl .swiper-button-prev.swiper-button-white,
.swiper-button-prev.swiper-button-white,
.swiper-container-rtl .swiper-button-next.swiper-button-white {
width: 40px;
height: 40px;
border-radius: 30px;
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: rgba(0, 0, 0, 0.5);
display: flex; display: flex;
align-items: center;
justify-content: center; justify-content: center;
img { align-items: center;
object-fit: fill; font-size: 30px;
width: 100% !important; color: #fff;
height: 100% !important; text-align: center;
line-height: 60px;
}
.swiper-button-next.swiper-button-white,
.swiper-container-rtl .swiper-button-prev.swiper-button-white,
.swiper-button-prev.swiper-button-white,
.swiper-container-rtl .swiper-button-next.swiper-button-white {
background-size: 45% 45%;
}
.gallery-thumbs {
.swiper-button-next.swiper-button-white,
.swiper-container-rtl .swiper-button-prev.swiper-button-white,
.swiper-button-prev.swiper-button-white,
.swiper-container-rtl .swiper-button-next.swiper-button-white {
top: 60%;
} }
} }
} }

@ -0,0 +1,134 @@
<template>
<!-- banner区域 -->
<div class="banner">
<div class="wrapper">
<div class="swiper-box" style="height: 500px" v-if="childDataList.length">
<!-- swiper1 -->
<swiper :options="swiperOptionTop" class="gallery-top" ref="swiperTop">
<swiper-slide class="" v-for="item in childDataList" :key="item.id">
<img :src="item.path" alt="" style="width: 100%" />
</swiper-slide>
<div
class="swiper-button-next swiper-button-white"
slot="button-next"
></div>
<div
class="swiper-button-prev swiper-button-white"
slot="button-prev"
></div>
</swiper>
<!-- swiper2 Thumbs -->
<swiper
:options="swiperOptionThumbs"
class="gallery-thumbs"
ref="swiperThumbs"
>
<swiper-slide class="" v-for="item in childDataList" :key="item.id">
<img :src="item.path" alt="" style="height: 100%; width: 100%" />
</swiper-slide>
</swiper>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
terminalPhoto: {
type: Array,
default: () => [],
},
},
data() {
return {
childDataList: [],
swiperOptionTop: {
loop: true,
loopedSlides: 5, // looped slides should be the same
spaceBetween: 10,
observer: true, //swiperswiper
observeParents: true, //swiperswiper
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
},
swiperOptionThumbs: {
loop: true,
loopedSlides: 5, // looped slides should be the same
spaceBetween: 10,
centeredSlides: true,
slidesPerView: "auto",
touchRatio: 0.2,
slideToClickedSlide: true,
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
},
};
},
watch: {
terminalPhoto: {
handler(val) {
console.log("dataObj deep change", val);
this.childDataList = val;
console.log(this.childDataList);
},
deep: true, //
immediate: true, //
},
},
methods: {},
mounted() {
this.$nextTick(() => {
const swiperTop = this.$refs.swiperTop.swiper;
const swiperThumbs = this.$refs.swiperThumbs.swiper;
swiperTop.controller.control = swiperThumbs;
swiperThumbs.controller.control = swiperTop;
});
},
};
</script>
<style lang="less" scoped>
.banner {
.wrapper {
width: 100%;
//margin: 300px auto;
}
}
.swiper-container {
background-color: #fff;
}
swiper-slide {
img {
width: 100%;
height: 100%;
}
}
.swiper-slide {
background-size: cover;
background-position: center;
}
.gallery-top {
height: 80% !important;
width: 100%;
}
.gallery-thumbs {
height: 20% !important;
box-sizing: border-box;
padding: 10px 0;
}
.gallery-thumbs .swiper-slide {
width: 25%;
height: 100%;
opacity: 0.4;
}
.gallery-thumbs .swiper-slide-active {
opacity: 1;
}
</style>

@ -4,20 +4,17 @@
:title="title" :title="title"
:visible.sync="isShow" :visible.sync="isShow"
:close-on-click-modal="false" :close-on-click-modal="false"
width="40%" width="470px"
> >
<el-form <el-form
label-position="left" label-position="left"
ref="formInfo" ref="formInfo"
label-width="100px" label-width="80px"
:rules="rules" :rules="rules"
:model="formdata" :model="formdata"
> >
<el-form-item label="名称:" prop="name"> <el-form-item label="名称:" prop="name">
<el-input <el-input v-model="formdata.name" autocomplete="off"></el-input>
v-model="formdata.name"
autocomplete="off"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="时间:" prop="time"> <el-form-item label="时间:" prop="time">
<el-time-picker <el-time-picker
@ -26,12 +23,13 @@
range-separator="至" range-separator="至"
start-placeholder="开始时间" start-placeholder="开始时间"
end-placeholder="结束时间" end-placeholder="结束时间"
value-format="HH:mm:ss"> value-format="HH:mm:ss"
>
</el-time-picker> </el-time-picker>
</el-form-item> </el-form-item>
<el-form-item label="间隔:" prop="span"> <el-form-item label="间隔:" prop="span">
<!-- <el-input v-model="formdata.span" autocomplete="off" type="number"></el-input> --> <!-- <el-input v-model="formdata.span" autocomplete="off" type="number"></el-input> -->
<el-input-number v-model="formdata.span" :min="1" ></el-input-number> <el-input-number v-model="formdata.span" :min="1"></el-input-number>
</el-form-item> </el-form-item>
<el-form-item label="备注:" prop="remark"> <el-form-item label="备注:" prop="remark">
<el-input v-model="formdata.remark" autocomplete="off"></el-input> <el-input v-model="formdata.remark" autocomplete="off"></el-input>
@ -47,53 +45,45 @@
import { addScheduleRulel, updateScheduleRulel } from "@/utils/api/index"; import { addScheduleRulel, updateScheduleRulel } from "@/utils/api/index";
export default { export default {
props: { props: {
title:String title: String,
}, },
data() { data() {
return { return {
isShow: false, isShow: false,
formdata: {}, formdata: {},
rules: { rules: {
name: [ name: [{ required: true, message: "请输入名称", trigger: "blur" }],
{ required: true, message: "请输入名称", trigger: "blur" }, time: [{ required: true, message: "请选择时间", trigger: "blur" }],
], span: [{ required: true, message: "请输入间隔", trigger: "blur" }],
time: [ remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
{ required: true, message: "请选择时间", trigger: "blur" }, },
],
span: [
{ required: true, message: "请输入间隔", trigger: "blur", },
],
remark: [
{ required: true, message: "请输入备注", trigger: "blur", },
],
}
}; };
}, },
methods: { methods: {
// //
getdataform(val){ getdataform(val) {
console.log(val) console.log(val);
if (val==null) { if (val == null) {
return this.formdata = {} return (this.formdata = {});
} }
this.formdata = val this.formdata = val;
this.$set(this.formdata,'time',[val.startTime, val.endTime]) this.$set(this.formdata, "time", [val.startTime, val.endTime]);
}, },
// //
submitForm() { submitForm() {
this.$refs.formInfo.validate((valid) => { this.$refs.formInfo.validate((valid) => {
if (valid) { if (valid) {
this.formdata.startTime=this.formdata.time[0] this.formdata.startTime = this.formdata.time[0];
this.formdata.endTime=this.formdata.time[1] this.formdata.endTime = this.formdata.time[1];
delete this.formdata.time delete this.formdata.time;
if (this.title == "新增") { if (this.title == "新增") {
let formArr=[] let formArr = [];
formArr.push(this.formdata) formArr.push(this.formdata);
addScheduleRulel({ list: formArr }) addScheduleRulel({ list: formArr })
.then((res) => { .then((res) => {
this.isShow = false this.isShow = false;
this.$message.success("添加成功"); this.$message.success("添加成功");
this.$parent.deviceList() this.$parent.deviceList();
}) })
.catch((err) => { .catch((err) => {
this.$message.error("添加失败"); this.$message.error("添加失败");
@ -101,9 +91,9 @@ export default {
} else { } else {
updateScheduleRulel(this.formdata) updateScheduleRulel(this.formdata)
.then((res) => { .then((res) => {
this.isShow = false this.isShow = false;
this.$message.success("修改成功"); this.$message.success("修改成功");
this.$parent.deviceList() this.$parent.deviceList();
}) })
.catch((err) => { .catch((err) => {
this.$message.error("修改失败"); this.$message.error("修改失败");
@ -116,15 +106,12 @@ export default {
}); });
}, },
display() { display() {
this.isShow = true this.isShow = true;
}, },
hide() { hide() {
this.isShow = false this.isShow = false;
}
}, },
mounted() {
}, },
mounted() {},
}; };
</script> </script>

@ -2,7 +2,8 @@
<el-dialog <el-dialog
class="addLineDialog" class="addLineDialog"
:title="lineDialogTitle" :title="lineDialogTitle"
:visible.sync="lineDialog" :visible.sync="isShow"
:close-on-click-modal="false"
width="420px" width="420px"
> >
<el-form <el-form
@ -10,16 +11,16 @@
label-width="92px" label-width="92px"
ref="formLineInfo" ref="formLineInfo"
:rules="rules" :rules="rules"
:model="lineForm" :model="formdata"
> >
<el-form-item label="单位:" prop="bsManufacturer"> <el-form-item label="单位:" prop="bsManufacturer">
<el-input <el-input
v-model="lineForm.bsManufacturer" v-model="formdata.bsManufacturer"
autocomplete="off" autocomplete="off"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="DY等级" prop="dyLevel"> <el-form-item label="DY等级" prop="dyLevel">
<el-select v-model="lineForm.dyLevelid" placeholder="请选择电压等级"> <el-select v-model="formdata.dyLevelid" placeholder="请选择电压等级">
<el-option <el-option
v-for="items in dyOptions" v-for="items in dyOptions"
:key="items.id" :key="items.id"
@ -29,11 +30,11 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="线路名称:" prop="name"> <el-form-item label="线路名称:" prop="name">
<el-input v-model="lineForm.name" autocomplete="off"></el-input> <el-input v-model="formdata.name" autocomplete="off"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="closeDialog(0)"> </el-button> <el-button @click="isShow = false"> </el-button>
<el-button type="primary" @click="submitForm()"> </el-button> <el-button type="primary" @click="submitForm()"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -47,24 +48,13 @@ import {
export default { export default {
props: { props: {
lineDialog: { lineDialogTitle: String,
type: Boolean,
},
lineDialogTitle: {
type: String,
default: "新增",
},
formItem: {
type: Object,
default: function () {
return {};
},
},
}, },
data() { data() {
return { return {
lineForm: {}, isShow: false,
formdata: {},
dyOptions: "", dyOptions: "",
rules: { rules: {
bsManufacturer: [ bsManufacturer: [
@ -72,7 +62,6 @@ export default {
], ],
dyLevelid: [ dyLevelid: [
{ required: true, message: "请选择DY等级", trigger: "blur" }, { required: true, message: "请选择DY等级", trigger: "blur" },
{ type: "number", message: "DY等级数字值" },
], ],
name: [ name: [
{ {
@ -82,52 +71,45 @@ export default {
}, },
], ],
}, },
//
formArr: [],
}; };
}, },
methods: { methods: {
//
getdataform(val) {
console.log(val);
if (val == null) {
return (this.formdata = {});
}
this.formdata = val;
this.$set(this.formdata);
},
// //
submitForm() { submitForm() {
this.$refs.formLineInfo.validate((valid) => { this.$refs.formLineInfo.validate((valid) => {
if (valid) { if (valid) {
console.log(this.lineForm);
let formObj = {
bsManufacturer: this.lineForm.bsManufacturer,
dyLevelid: this.lineForm.dyLevelid,
name: this.lineForm.name,
};
this.formArr.push(formObj);
console.log(this.formArr);
// //
if (this.lineDialogTitle == "新增") { if (this.lineDialogTitle == "新增") {
addLineJoggle({ list: this.formArr }) let formArr = [];
formArr.push(this.formdata);
console.log(formArr);
addLineJoggle({ list: formArr })
.then((res) => { .then((res) => {
console.log(res); this.isShow = false;
this.$emit("lineDialogClose", 1); //
this.formArr = [];
this.$message.success("添加成功"); this.$message.success("添加成功");
this.$parent.lineList();
}) })
.catch((err) => { .catch((err) => {
console.log(err); // console.log(err); //
this.$message.error("添加失败"); this.$message.error("添加失败");
}); });
} else if (this.lineDialogTitle == "修改") { } else {
let changeformObj = { updateLineJoggle(this.formdata)
bsManufacturer: this.lineForm.bsManufacturer,
dyLevelid: this.lineForm.dyLevelid,
name: this.lineForm.name,
id: this.lineForm.id,
};
updateLineJoggle(changeformObj)
.then((res) => { .then((res) => {
console.log(res); this.isShow = false;
this.$emit("lineDialogClose", 1); //
this.$message.success("修改成功"); this.$message.success("修改成功");
this.$parent.lineList();
}) })
.catch((err) => { .catch((err) => {
console.log(err); //
this.$message.error("修改失败"); this.$message.error("修改失败");
}); });
} }
@ -137,29 +119,14 @@ export default {
} }
}); });
}, },
// display() {
closeDialog(flag) { this.isShow = true;
this.$refs.formLineInfo.resetFields();
this.$emit("lineDialogClose", flag);
}, },
}, hide() {
mounted() { this.isShow = false;
console.log("打印传过来的对象", this.formItem);
console.log("打印传过来的对象", this.formItem.bsManufacturer);
this.lineForm = JSON.parse(JSON.stringify(this.formItem));
},
watch: {
formItem: {
handler(newVal, oldVal) {
//
this.$nextTick(() => {
this.lineForm = JSON.parse(JSON.stringify(this.formItem));
});
},
immediate: true,
deep: true,
}, },
}, },
created() { created() {
getdyListJoggle().then((res) => { getdyListJoggle().then((res) => {
console.log(res); console.log(res);

@ -5,9 +5,6 @@
<el-button type="primary" icon="el-icon-plus" @click="handleAddLine()" <el-button type="primary" icon="el-icon-plus" @click="handleAddLine()"
>新增</el-button >新增</el-button
> >
<!-- <el-button type="primary" @click="handleResive()"></el-button>
<el-button type="primary" @click="handleDelete()"></el-button> -->
</div> </div>
<div class="lineTable"> <div class="lineTable">
<el-table <el-table
@ -85,10 +82,8 @@
</div> </div>
<!-- 新增线路 --> <!-- 新增线路 -->
<add-lineDialog <add-lineDialog
:lineDialog="lineDialog"
:lineDialogTitle="lineDialogTitle" :lineDialogTitle="lineDialogTitle"
:formItem="formLineInfo" ref="addlineDialogref"
@lineDialogClose="lineDialogClose"
></add-lineDialog> ></add-lineDialog>
</div> </div>
</template> </template>
@ -103,37 +98,32 @@ export default {
data() { data() {
return { return {
lineDialogTitle: "", // lineDialogTitle: "", //
lineDialog: false,
formLineInfo: {}, //
lineTableData: [], lineTableData: [],
//multipleSelection: [], // //multipleSelection: [], //
//
deleteArr: [],
page: 1, // page: 1, //
pageSize: 10, // pageSize: 10, //
total: 0, // total: 0, //
}; };
}, },
created() {
this.lineList();
},
methods: { methods: {
//线 //线
lineList(page, pageSize) { lineList() {
getLineListJoggle({ getLineListJoggle({
pageindex: page, pageindex: this.page,
pagesize: pageSize, pagesize: this.pageSize,
}) })
.then((res) => { .then((res) => {
console.log(res);
this.lineTableData = res.data.list; this.lineTableData = res.data.list;
this.total = res.data.total; this.total = res.data.total;
}) })
.catch((err) => { .catch((err) => {});
console.log(err); //
});
}, },
// //
handleRowClick(row, column, event) { handleRowClick(row, column, event) {
this.$refs.multipleTable.toggleRowSelection(row); this.$refs.multipleTable.toggleRowSelection(row);
// console.log(column, row, event);
}, },
// //
handleSelectionChange(val) { handleSelectionChange(val) {
@ -142,66 +132,45 @@ export default {
// //
handleAddLine() { handleAddLine() {
this.lineDialog = true;
this.lineDialogTitle = "新增"; this.lineDialogTitle = "新增";
this.$refs.addlineDialogref.display();
this.$refs.addlineDialogref.getdataform(null);
}, },
//handleResive 线 //handleResive 线
handleResive(data) { handleResive(data) {
console.log(data);
this.lineDialogTitle = "修改"; this.lineDialogTitle = "修改";
this.formLineInfo = Object.assign({}, data); this.$refs.addlineDialogref.display();
this.lineDialog = true; this.$refs.addlineDialogref.getdataform(data);
},
//
lineDialogClose(flag) {
if (flag) {
//
this.lineList(this.page, this.pageSize);
}
this.lineDialog = false;
this.formLineInfo = {};
}, },
// //
handleDelete(data) { handleDelete(data) {
console.log(data); let deleteArr = [];
this.deleteArr.push({ deleteArr.push({
id: data.id, id: data.id,
}); });
console.log(this.deleteArr);
this.$confirm("确定要删除记录吗,同时删除关联关系?", "提示", { this.$confirm("确定要删除记录吗,同时删除关联关系?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning", type: "warning",
}) })
.then(() => { .then(() => {
// deleteLineJoggle({ list: deleteArr }).then((res) => {
deleteLineJoggle({ list: this.deleteArr }).then((res) => { this.lineList(); //
console.log(res);
this.lineList(this.page, this.pageSize);
});
this.$message({
type: "success",
message: "删除成功!",
}); });
this.$message({ type: "success", message: "删除成功!" });
}) })
.catch(() => { .catch(() => {
this.$message({ this.$message({ type: "info", message: "已取消删除" });
type: "info",
message: "已取消删除",
});
}); });
}, },
// //
handleCurrentChange(val) { handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.page = val; this.page = val;
this.lineList(val, this.pageSize); this.lineList();
}, },
}, },
created() {
this.lineList(this.page, this.pageSize);
},
}; };
</script> </script>
<style lang="less"> <style lang="less">

@ -1,81 +0,0 @@
<template>
<el-row :gutter="10">
<el-col :span="12">
<el-tree :data="treeData" :props="props" node-key="id" default-expand-all @node-click="handleNodeClick" ref="tree"></el-tree>
</el-col>
<el-col :span="12">
<div v-if="selectedNode">
<p>{{ selectedNode.label }} 的数据:</p>
<pre>{{ JSON.stringify(selectedNode.data, null, 2) }}</pre>
</div>
</el-col>
</el-row>
</template>
<script>
export default {
data() {
return {
treeData: [
{
id: 1,
label: '节点1',
children: [
{
id: 2,
label: '子节点1',
data: { name: '节点1-子节点1' }
},
{
id: 3,
label: '子节点2',
data: { name: '节点1-子节点2' }
}
]
},
{
id: 4,
label: '节点2',
children: [
{
id: 5,
label: '子节点3',
data: { name: '节点2-子节点3' }
},
{
id: 6,
label: '子节点4',
data: { name: '节点2-子节点4' }
}
]
}
],
props: {
children: 'children',
label: 'label'
},
selectedNode: null
};
},
methods: {
handleNodeClick(node) {
this.selectedNode = node.data || null;
},
selectNodeById(id) {
const node = this.$refs.tree.getNode(id);
if (node) {
this.$refs.tree.setCurrentKey(node.key);
this.selectedNode = node.data || null;
}
}
},
mounted() {
//
const firstNode = this.treeData[0];
if (firstNode) {
this.$refs.tree.setCurrentKey(firstNode.id);
this.selectedNode = firstNode.children && firstNode.children.length ? firstNode.children[0].data : null;
}
}
};
</script>

@ -76,13 +76,12 @@ import {
getTerminalPhotoListJoggle, getTerminalPhotoListJoggle,
} from "@/utils/api/index"; } from "@/utils/api/index";
import carouselChart from "../components/carouselChart.vue"; import carouselChart from "../components/carouselChart.vue";
import treeSide from "./components/treeSide.vue";
import picturemain from "./picturemain.vue"; // import picturemain from "./picturemain.vue"; //
import paramArea from "./paramArea.vue"; // import paramArea from "./paramArea.vue"; //
export default { export default {
components: { components: {
treeSide,
picturemain, picturemain,
paramArea, paramArea,
carouselChart, carouselChart,
@ -104,6 +103,7 @@ export default {
channelValue: "", channelValue: "",
terminalPhoto: [], // terminalPhoto: [], //
dateValue: "", // dateValue: "", //
nopicPath: require("@/assets/img/noPhoto.png"),
}; };
}, },
watch: {}, watch: {},
@ -200,8 +200,16 @@ export default {
}) })
.then((res) => { .then((res) => {
console.log(res); console.log(res);
if (res.data.list.length == 0) {
this.terminalPhoto = [
{
path: this.nopicPath,
},
];
//alert("");
} else {
this.terminalPhoto = res.data.list; this.terminalPhoto = res.data.list;
}
console.log(this.terminalPhoto); console.log(this.terminalPhoto);
}) })
.catch((err) => { .catch((err) => {
@ -216,7 +224,6 @@ export default {
return i.value === val; return i.value === val;
}); });
console.log(channelObj); console.log(channelObj);
this.getTerminalPhotoList(val, this.dateValue, channelObj.termid); this.getTerminalPhotoList(val, this.dateValue, channelObj.termid);
}, },
}, },

Loading…
Cancel
Save