From 18dfd3d183e68db6306b34500813cca8f8c689c9 Mon Sep 17 00:00:00 2001 From: heyujie <516346543@qq.com> Date: 星期四, 29 四月 2021 10:08:30 +0800 Subject: [PATCH] 系统维护和系统设置 --- src/pages/maintain/views/backUp.vue | 326 +++++ src/pages/maintain/index/App.vue | 628 ++++++++++ src/pages/humanPoseTrack/index/main.ts | 30 src/pages/maintain/views/systemClean.vue | 215 +++ src/pages/systemSettings/index/App.vue | 373 ++++- src/pages/systemSettings/views/generalSettings.vue | 221 +++ public/apps.json | 47 src/pages/maintain/views/generalSettings.vue | 456 +++++++ src/pages/maintain/views/restartSettings.vue | 384 ++++++ src/pages/maintain/index/main.ts | 16 src/pages/vindicate/index/App.vue | 1 src/pages/maintain/components/CloudNode.vue | 149 ++ src/pages/maintain/components/switchBar.vue | 42 src/components/subComponents/CardItem.vue | 2 src/pages/humanPoseTrack/index/mixins.ts | 25 src/pages/systemSettings/views/keyboardLanguage.vue | 7 src/pages/maintain/views/updateSettings.vue | 478 ++++++++ src/pages/systemSettings/views/NetSettings.vue | 7 src/pages/humanPoseTrack/index/App.vue | 82 + src/pages/systemSettings/views/clusterManagement.vue | 4 20 files changed, 3,340 insertions(+), 153 deletions(-) diff --git a/public/apps.json b/public/apps.json index a8d2ce6..a418d8a 100644 --- a/public/apps.json +++ b/public/apps.json @@ -232,6 +232,53 @@ "progressMsg": "" }, { + "id": "ee64fe23-7631-4ef9-9aca-ea09673693bf", + "name": "绯荤粺缁存姢(鏂扮増)", + "package": "maintain", + "type": "2", + "url": "/view/maintain/", + "title": "绯荤粺缁存姢(鏂扮増)", + "width": 1200, + "height": 650, + "iconBlob": "", + "icon": "../../images/app-mid/vindicate.png", + "version": "1.0.0", + "create_time": "2020-10-09 14:00:11", + "create_by": "", + "update_time": "", + "update_by": "", + "isDelete": 0, + "isDefault": true, + "remoteVersion": "", + "installed": true, + "isUpgrade": false, + "progressMsg": "" + }, + + { + "id": "ee64fe23-7631-4ef9-9aca-ea09673693df", + "name": "浜轰綋楠ㄩ璺熻釜", + "package": "humanPoseTrack", + "type": "2", + "url": "/view/humanPoseTrack/", + "title": "浜轰綋楠ㄩ璺熻釜", + "width": 1200, + "height": 650, + "iconBlob": "", + "icon": "../../images/app-mid/vindicate.png", + "version": "1.0.0", + "create_time": "2020-10-09 14:00:11", + "create_by": "", + "update_time": "", + "update_by": "", + "isDelete": 0, + "isDefault": true, + "remoteVersion": "", + "installed": true, + "isUpgrade": false, + "progressMsg": "" + }, + { "id": "1e51abbf-a4dd-4cf9-9eee-2149102d6d62", "name": "姣斿搴撶鐞�", "package": "library", diff --git a/src/components/subComponents/CardItem.vue b/src/components/subComponents/CardItem.vue index 348baf1..063f9af 100644 --- a/src/components/subComponents/CardItem.vue +++ b/src/components/subComponents/CardItem.vue @@ -295,7 +295,7 @@ <!-- 娌℃湁搴曞簱锛岄潪姣斿锛屾櫘閫氭ā寮� 涓�瀹氭湁targetInfo锛屽苟涓攖argetInfo涓暟涓�1--> <div - v-else-if="data.targetInfo !== null && data.targetInfo[0].picSmUrl !== '' && data.targetInfo.length == 1" + v-else-if="data.targetInfo !== null && data.targetInfo[0].picSmUrl !== ''" class="s-card-right-signal" > <div diff --git a/src/pages/humanPoseTrack/index/App.vue b/src/pages/humanPoseTrack/index/App.vue new file mode 100644 index 0000000..aeda321 --- /dev/null +++ b/src/pages/humanPoseTrack/index/App.vue @@ -0,0 +1,82 @@ +<template> + <div class="column"> + + </div> +</template> + +<script> +export default { + name: "VideoManage", + components: {}, + data() { + return { + + }; + }, + mounted() { + // debugger + let arr= window.location.host.split(":") + const newURL = 'http://'+ arr[0]+":8082" + window.location.href = newURL; + this.screenHeight = document.documentElement.clientHeight; + window.onresize = () => { + return (() => { + this.screenHeight = document.documentElement.clientHeight; + })(); + }; + // this.$refs[`item_${0}`][0].style.backgroundColor = "#353A8A"; + }, + methods: { + + }, + directives: { + drag(el, binding) { + const dialogHeaderEl = el.querySelector(".el-dialog__header"); + const dragDom = el.querySelector(".el-dialog"); + dialogHeaderEl.style.cursor = "move"; + const sty = + dragDom.currentStyle || window.getComputedStyle(dragDom, null); + dialogHeaderEl.onmousedown = (e) => { + const disX = e.clientX - dialogHeaderEl.offsetLeft; + const disY = e.clientY - dialogHeaderEl.offsetTop; + let styL, styT; + + if (sty.left.includes("%")) { + styL = + +document.body.clientWidth * (+sty.left.replace(/\%/g, "") / 100); + styT = + +document.body.clientHeight * (+sty.top.replace(/\%/g, "") / 100); + } else { + styL = +sty.left.replace(/\px/g, ""); + styT = +sty.top.replace(/\px/g, ""); + } + document.onmousemove = function (e) { + const l = e.clientX - disX; + const t = e.clientY - disY; + dragDom.style.left = `${l + styL}px`; + dragDom.style.top = `${t + styT}px`; + }; + document.onmouseup = function (e) { + document.onmousemove = null; + document.onmouseup = null; + }; + }; + }, + }, + watch: { + + }, +}; +</script> + +<style lang="scss" scoped> +.column { + height: 100%; + display: flex; + flex-direction: row; + flex: 1; + flex-basis: auto; + box-sizing: border-box; +} + +</style> diff --git a/src/pages/humanPoseTrack/index/main.ts b/src/pages/humanPoseTrack/index/main.ts new file mode 100644 index 0000000..36c7ac2 --- /dev/null +++ b/src/pages/humanPoseTrack/index/main.ts @@ -0,0 +1,30 @@ +import Vue from "vue"; +import App from './App.vue'; + +import ElementUI from 'element-ui'; +import 'element-ui/lib/theme-chalk/index.css'; +import "@/assets/css/element-variables.scss"; + +import ToggleButton from 'vue-js-toggle-button'; +import VueAwesomeSwiper from "vue-awesome-swiper"; +import "swiper/dist/css/swiper.css"; +import * as VueWindow from "@hscmap/vue-window"; +import moment from 'moment'; +import Mixin from "./mixins"; + +Vue.prototype.$moment = moment; +Vue.use(ElementUI); +Vue.use(ToggleButton); +Vue.use(VueAwesomeSwiper as any); +Vue.use(VueWindow); +Vue.filter('moment', function (value, formatString) { + formatString = formatString || 'YYYY-MM-DD HH:mm:ss'; + return moment(value).format(formatString); + +}); +Vue.mixin(Mixin); + +new Vue({ + el: '#app', + render: h => h(App) +}) diff --git a/src/pages/humanPoseTrack/index/mixins.ts b/src/pages/humanPoseTrack/index/mixins.ts new file mode 100644 index 0000000..52fb92b --- /dev/null +++ b/src/pages/humanPoseTrack/index/mixins.ts @@ -0,0 +1,25 @@ +import TreeDataPool from "@/Pool/TreeData"; +import DataStackPool from "@/Pool/dataStack" +import DataPool from "@/Pool/PollData" +import VideoManageData from "@/Pool/VideoManageData"; +import TaskMange from '@/Pool/TaskMange' + +/* eslint-disable */ +const onlyTreeDataPool = new TreeDataPool +const onlyDataStack = new DataStackPool +const onlyDataPool = new DataPool +const onlyVideoManageData = new VideoManageData +const onlyTaskMange = new TaskMange + +const mixin = { + data() { + return { + TreeDataPool: onlyTreeDataPool, + DataStackPool: onlyDataStack, + VideoManageData: onlyVideoManageData, + TaskMange: onlyTaskMange, + PollData: onlyDataPool + }; + }, +}; +export default mixin; \ No newline at end of file diff --git a/src/pages/maintain/components/CloudNode.vue b/src/pages/maintain/components/CloudNode.vue new file mode 100644 index 0000000..800651a --- /dev/null +++ b/src/pages/maintain/components/CloudNode.vue @@ -0,0 +1,149 @@ +<template> + <div class="cloud"> + <div class="inner"> + <div class="rect"> + <serfDiagram + ref="inside-nodes" + :members="insideNodes" + :agent="agentName" + :sizeX="insideSizeX" + :sizeY="insideSizeY" + :startX="insideStartX" + :isShowHover="true" + class="inside-nodes" + ></serfDiagram> + </div> + </div> + <div class="outer" v-if="outsideNodes.length"> + <serfDiagram + ref="outer-nodes" + :members="outsideNodes" + :agent="agentName" + :sizeX="280" + :sizeY="370" + :startX="60" + class="outer-nodes" + ></serfDiagram> + </div> + </div> +</template> +<script> +import SerfDiagram from "@/components/serfDiagram"; +export default { + name: "cloudNode", + props: { + nodes: Array, + }, + components: { + SerfDiagram, + }, + data() { + return { + agentName: "", + nodeIcons: [], + //insideNodes: [], + BaseWidth: 150, + BaseHeight: 70, + minWidth: 0, + minHeight: 0, + }; + }, + mounted() { + console.log(this.nodes); + //this.getInsideNodes(); + }, + methods: { + getRandom(index) { + if (index % 2 == 0) { + return Math.random() * 20; + } else { + return Math.random() * 50; + } + }, + getInsideNodes() { + let arr = this.nodes.filter( + (item) => item.hardwareType == "01" || item.hardwareType == "02" + ); + let len = arr.length; + let lefts = []; + let tops = []; + this.insideNodes = arr.map((item, index) => { + lefts.push((20 - len) * (index + 1) + this.getRandom(index)); + tops.push(30 * (index + 1)); + return { + l: 10 + this.getRandom(index), + t: 30 * (index + 1), + nodeName: item.nodeName, + id: item.id, + workType: item.workType, + }; + }); + this.minWidth = Math.max(...lefts) - Math.min(...lefts); + this.minHeight = Math.max(...tops) - Math.min(...tops); + console.log("w,h", this.minWidth, this.minHeight); + }, + }, + computed: { + cloudPic() { + return "/images/settings/cloud.png"; + }, + insideNodes() { + return this.nodes.filter( + (item) => item.hardwareType == "01" || item.hardwareType == "02" + ); + }, + insideSizeX() { + return 160 + 200 * 0.2 * this.insideNodes.length <= 400 + ? 160 + 200 * 0.2 * this.insideNodes.length + : 400; + }, + insideSizeY() { + return 140 + 200 * 0.2 * this.insideNodes.length <= 380 + ? 140 + 200 * 0.2 * this.insideNodes.length + : 380; + }, + insideStartX() { + return this.insideSizeX / 3; + }, + outsideNodes() { + return this.nodes.filter((item) => item.hardwareType == "03"); + }, + }, +}; +</script> +<style lang="scss"> +.cloud { + width: 100%; + display: flex; + .inner { + background: url("/images/settings/easy-cloud.png") no-repeat; + background-size: 100%; + margin-top: -55px; + margin-left: 55px; + + .rect { + position: relative; + margin: 130px 100px 70px; + .node { + position: absolute; + .node-icon { + width: 40px; + height: 40px; + } + .node-name { + font-size: 14px; + color: #333; + } + } + } + } + .outer { + width: 40%; + position: relative; + text-align: left; + .node { + position: absolute; + } + } +} +</style> \ No newline at end of file diff --git a/src/pages/maintain/components/switchBar.vue b/src/pages/maintain/components/switchBar.vue new file mode 100644 index 0000000..0cbc558 --- /dev/null +++ b/src/pages/maintain/components/switchBar.vue @@ -0,0 +1,42 @@ +<template> + <div class="switch-bar"> + <div class="name">{{ barName }}</div> + <el-switch + v-model="value" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange" + > + </el-switch> + </div> +</template> + +<script> +export default { + data() { + return { + // value: false, + }; + }, + props: ["barName","value"], + methods: { + switchChange(val) { + this.$emit("switchChange",val); + }, + }, +}; +</script> +<style lang="scss"> +.switch-bar { + display: flex; + align-items: center; + height: 50px; + padding: 0 25px; + background-color: rgba(248, 248, 248, 1); + justify-content: space-between; + border-radius: 12px; + margin-bottom: 10px; + .name { + font-size: 14px; + } +} +</style> diff --git a/src/pages/maintain/index/App.vue b/src/pages/maintain/index/App.vue new file mode 100644 index 0000000..3f6e78e --- /dev/null +++ b/src/pages/maintain/index/App.vue @@ -0,0 +1,628 @@ +<template> + <div class="container"> + <div class="container-left"> + <div + class="left-card" + v-for="(item, index) in menuArr" + :key="index" + @click="openMenu(item, index)" + > + <span class="icon iconfont"></span> + <span class="card-text">{{ item.name }}</span> + </div> + </div> + <systemClean + v-if="activePage == '绯荤粺娓呯悊'" + style="width: 100%" + ></systemClean> + <updateSettings + v-if="activePage == '鏇存柊璁剧疆'" + style="width: 100%" + ></updateSettings> + <back-up + v-if="activePage == '澶囦唤杩樺師'" + style="width: 100%" + ></back-up> + <restartSettings + v-if="activePage == '閲嶅惎璁剧疆'" + style="width: 100%" + ></restartSettings> + </div> +</template> + +<script> +import { + getClockInfo, + saveClockInfo, + testNTPserver, +} from "@/api/system"; +import switchBar from "../components/switchBar"; +import ipInput from "@/components/subComponents/IPInput"; +import systemClean from "../views/systemClean"; +import updateSettings from "../views/updateSettings"; +import BackUp from "../views/backUp"; +import restartSettings from "../views/restartSettings"; +export default { + name: "settings", + components: { + switchBar, + ipInput, + systemClean, + updateSettings, + BackUp, + restartSettings, + }, + data() { + return { + browserTimer: null, + menuArr: [ + { name: "鏇存柊璁剧疆" }, + { name: "澶囦唤杩樺師" }, + { name: "绯荤粺娓呯悊" }, + { name: "閲嶅惎璁剧疆" }, + ], + jpgArr: [{}, {}, {}, {}, {}, {}, {}, {}, {}], + activePage: "鏇存柊璁剧疆", + activeIndex: 0, + clockTimer: null, + }; + }, + beforeDestroy() { + clearTimeout(this.clockTimer); + clearInterval(this.browserTimer); + }, + mounted() { + const s = document.getElementsByClassName("left-card")[0]; + s.style.backgroundColor = "rgba(61, 104, 225, 1)"; + s.style.color = "#fff"; + }, + methods: { + openMenu(item, i) { + const old = document.getElementsByClassName("left-card")[ + this.activeIndex + ]; + old.style.backgroundColor = "initial"; + old.style.color = "rgba(81, 81, 81, 1)"; + + this.activePage = item.name; + this.activeIndex = i; + const s = document.getElementsByClassName("left-card")[i]; + s.style.backgroundColor = "rgba(61, 104, 225, 1)"; + s.style.color = "#fff"; + }, + }, +}; +</script> +<style lang="scss"> +.container { + height: 100%; + display: flex; + flex-direction: row; + flex: 1; + flex-basis: auto; + box-sizing: border-box; + .container-left { + height: 100%; + width: 210px; + overflow: auto; + box-sizing: border-box; + flex-shrink: 0; + padding: 10px; + border-right: 5px solid rgba(248, 248, 248, 1); + box-sizing: border-box; + .left-card { + height: 55px; + cursor: pointer; + border-radius: 12px; + margin-bottom: 10px; + display: flex; + align-items: center; + .iconfont { + margin-left: 25px; + margin-right: 10px; + font-size: 24px; + } + .card-text { + font-size: 16px; + } + } + .left-card:hover { + background-color: rgba(61, 104, 225, 1); + color: #fff; + } + } + .container-center { + height: 100%; + width: 280px; + overflow: auto; + flex-shrink: 0; + padding: 10px; + border-right: 5px solid rgba(248, 248, 248, 1); + box-sizing: border-box; + .account-left { + + .add-account { + color: rgba(61, 104, 225, 1); + margin-top: 50px; + + .iconfont { + cursor: pointer; + font-size: 32px; + } + } + .account-card { + height: 50px; + background-color: rgba(248, 248, 248, 1); + margin-bottom: 10px; + display: flex; + align-items: center; + padding: 0 20px; + box-sizing: border-box; + border-radius: 10px; + cursor: pointer; + .touxiang { + height: 35px; + width: 35px; + background-color: bisque; + border-radius: 17.5px; + } + .user-name { + margin-left: 10px; + font-size: 14px; + } + } + + } + .datetime-left { + .time-card { + height: 105px; + background-color: rgba(248, 248, 248, 1); + margin-bottom: 30px; + border-radius: 10px; + .head { + height: 30px; + line-height: 30px; + text-align: left; + box-sizing: border-box; + padding: 0 10px; + font-size: 14px; + .icon { + margin-right: 5px; + color: rgba(61, 104, 225, 1); + } + } + .time-main { + height: 42px; + line-height: 42px; + font-family: Consolas; + font-size: 36px; + } + .date-bot { + height: 25px; + font-size: 14px; + line-height: 25px; + color: #868686; + display: flex; + justify-content: space-evenly; + } + } + .line { + display: flex; + align-items: center; + height: 50px; + padding: 0 25px; + background-color: rgba(248, 248, 248, 1); + justify-content: space-between; + border-radius: 12px; + margin-bottom: 10px; + .name { + font-size: 14px; + } + } + } + } + .container-right { + flex: 1; + flex-basis: auto; + overflow: auto; + box-sizing: border-box; + position: relative; + + padding: 20px 40px; + .account-right { + .account-content { + .content-top { + height: 120px; + width: 350px; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 20px; + .touxiang-big { + width: 100px; + height: 100px; + background-color: bisque; + border-radius: 50px; + } + .user-desc { + height: 100px; + display: flex; + flex-direction: column; + align-items: baseline; + min-width: 200px; + .username { + margin: 5px 15px; + height: 30px; + line-height: 30px; + width: 90px; + text-align: left; + font-size: 15px; + display: flex; + align-items: center; + } + .nickname { + margin: 5px 15px; + font-size: 14px; + .input-nick { + width: 50px; + margin-right: 5px; + } + .iconfont { + font-size: 14px; + margin-left: 5px; + } + } + } + } + .list-btn { + display: flex; + + flex-direction: column; + align-items: center; + .item-btn { + width: 500px; + height: 45px; + background-color: #f0f0f0; + margin-bottom: 15px; + border-radius: 10px; + line-height: 45px; + font-size: 15px; + cursor: pointer; + } + .item-btn:hover { + color: rgba(255, 153, 102, 1); + } + } + } + .title { + height: 30px; + line-height: 30px; + /* background-color: aliceblue; */ + margin-bottom: 10px; + font-size: 16px; + font-weight: 600; + } + .change-pw { + .p-title { + text-align: left; + font-size: 15px; + margin-top: 5px; + } + } + .el-form-item { + margin-bottom: 0; + .el-input__inner { + background-color: rgba(240, 240, 240, 1); + border: none; + border-radius: 12px; + height: 45px; + padding: 0 20px; + font-size: 15px; + } + .el-input__clear { + color: dimgray; + font-size: 17px; + line-height: 45px; + } + .el-input__suffix { + right: 1px; + top: -0.5px; + width: 45px; + // background-color: rgba(61, 104, 225, 1); + /* color: white; */ + border-radius: 12px; + } + } + .permission { + .line { + display: flex; + align-items: center; + height: 50px; + padding: 0 25px; + background-color: rgba(248, 248, 248, 1); + justify-content: space-between; + border-radius: 12px; + margin-bottom: 10px; + .name { + font-size: 14px; + } + } + } + + .add-account-page { + // background-color: lightcyan; + // padding: 10px 50px; + .upload-group { + height: 120px; + width: 350px; + margin: 0 auto; + overflow: hidden; + .upload-jpg { + height: 50px; + width: 50px; + float: left; + margin: 0 10px; + background-color: antiquewhite; + margin-bottom: 20px; + border-radius: 25px; + } + } + .fill-group { + .p-title { + text-align: left; + } + } + } + } + .datetime-right { + .el-form-item.is-required:not(.is-no-asterisk) + > .el-form-item__label:before, + .el-form-item.is-required:not(.is-no-asterisk) + .el-form-item__label-wrap + > .el-form-item__label:before { + display: none; + } + .el-form-item { + margin-bottom: 10px; + height: 50px; + background: #f8f8f8; + padding: 4px 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 10px; + .el-form-item__label { + text-align: left; + line-height: 42px; + } + } + .el-form-item__content { + line-height: 40px; + position: relative; + font-size: 14px; + } + .ip-input-container { + max-width: none !important; + } + .ntp-time { + .right { + display: flex; + align-items: baseline; + .el-input-number--small { + width: 100%; + } + .el-button--text { + margin-left: 10px; + text-decoration: underline; + } + } + .ntp-bar { + height: 40px; + background-color: rgba(248, 248, 248, 1); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 10px; + border-radius: 10px; + margin-bottom: 10px; + .title { + min-width: 70px; + } + .input-area { + width: 450px; + height: 30px; + background-color: rgba(240, 240, 240, 1); + border-radius: 10px; + line-height: 30px; + font-size: 14px; + } + } + .int-bar { + height: 40px; + background-color: rgba(248, 248, 248, 1); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 10px; + border-radius: 10px; + margin-bottom: 10px; + .title { + min-width: 130px; + } + .right { + width: 450px; + display: flex; + align-items: center; + height: 30px; + + .input-area { + // width: 410px; + background-color: rgba(240, 240, 240, 1); + border-radius: 10px; + line-height: 30px; + width: -webkit-fill-available; + + font-size: 14px; + } + .test { + width: 40px; + } + } + } + } + .manual-time { + .clock-wrap { + height: 75px; + + background-color: #f8f8f8; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 10px; + border-radius: 10px; + .clock { + display: flex; + align-items: center; + height: 90px; + justify-content: space-evenly; + .iconfont { + cursor: pointer; + color: rgba(134, 134, 134, 1); + } + .iconfont:hover { + background-color: gainsboro; + } + .hour { + background-color: rgba(240, 240, 240, 1); + display: flex; + align-items: center; + width: 100px; + height: 50px; + justify-content: space-evenly; + border-radius: 10px; + } + .dnum { + width: 40px; + height: 40px; + line-height: 40px; + font-size: 34px; + font-family: Consolas; + display: flex; + align-items: center; + .input-box { + width: inherit; + border: none; + border-radius: 5px; + height: 35px; + font-size: 28px; + text-align: center; + } + + .input-box:focus { + outline: none; + } + } + .control { + width: 20px; + .fanzhuan { + display: inline-block; + -moz-transform: scaleY(-1); + -webkit-transform: scaleY(-1); + -o-transform: scaleY(-1); + transform: scaleY(-1); + } + } + .sep { + font-family: Consolas; + width: 40px; + font-size: 34px; + height: 40px; + line-height: 40px; + } + .mins { + background-color: #f0f0f0; + display: flex; + align-items: center; + width: 110px; + height: 50px; + justify-content: space-evenly; + border-radius: 10px; + } + } + } + .adjust-bar { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; + border-radius: 10px; + height: 50px; + background-color: rgba(248, 248, 248, 1); + .middle { + font-size: 14px; + } + .input-box { + width: 80px; + border: none; + border-radius: 5px; + height: 25px; + font-size: 18px; + text-align: center; + } + + .input-box:focus { + outline: none; + } + .minus { + width: 50px; + height: 50px; + background-color: #f0f0f0; + font-size: 35px; + border-radius: 10px; + cursor: pointer; + line-height: 50px; + color: rgba(134, 134, 134, 1); + } + .plus { + width: 50px; + height: 50px; + cursor: pointer; + background-color: #f0f0f0; + font-size: 35px; + border-radius: 10px; + line-height: 50px; + color: rgba(134, 134, 134, 1); + } + } + } + } + .btns { + display: flex; + justify-content: space-between; + margin-top: 20px; + + .cancel { + height: 40px; + width: 48%; + cursor: pointer; + border-radius: 8px; + background-color: rgba(240, 240, 240, 1); + line-height: 40px; + font-size: 14px; + } + .ok { + height: 40px; + width: 48%; + cursor: pointer; + border-radius: 8px; + background-color: rgba(61, 104, 225, 1); + color: #fff; + line-height: 40px; + font-size: 14px; + } + } + } +} +</style> + + diff --git a/src/pages/maintain/index/main.ts b/src/pages/maintain/index/main.ts new file mode 100644 index 0000000..51740ca --- /dev/null +++ b/src/pages/maintain/index/main.ts @@ -0,0 +1,16 @@ +import Vue from 'vue'; +import App from './App.vue'; + +import ElementUI from 'element-ui'; +import 'element-ui/lib/theme-chalk/index.css'; +import "@/assets/css/element-variables.scss"; +import moment from 'moment'; + +Vue.use(ElementUI) +Vue.prototype.$moment = moment; + + +new Vue({ + el: '#app', + render: h => h(App) +}) diff --git a/src/pages/maintain/views/backUp.vue b/src/pages/maintain/views/backUp.vue new file mode 100644 index 0000000..6f2d951 --- /dev/null +++ b/src/pages/maintain/views/backUp.vue @@ -0,0 +1,326 @@ +<template> + <div class="all"> + <div class="backup-content"> + <div class="backup-center" ref="left"> + <div class="menu-item" @click="openRight(0)"> + <div class="con"> + <span class="icon iconfont"></span> + <span class="menu-text">鑷姩澶囦唤璁剧疆</span> + </div> + </div> + <div class="menu-item" @click="openRight(1)"> + <div class="con"> + <span class="icon iconfont"></span> + + <span class="menu-text">浠庡浠戒腑鎭㈠</span> + </div> + </div> + </div> + <div class="backup-right"> + <div class="auto" v-if="activePage == 0"> + <div class="bar"> + <div class="name">鑷姩澶囦唤</div> + <el-switch + v-model="isBackUp" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange" + > + </el-switch> + </div> + <div class="bar"> + <div class="name">澶囦唤鐩綍</div> + <input type="file" id="file_input" webkitdirectory directory /> + </div> + <div class="bar"> + <div class="name">澶囦唤闂撮殧 / 澶�</div> + <el-input + v-model="interval" + :placeholder="'璇疯緭鍏ュぉ鏁�'" + @change="handleChange" + size="small" + ></el-input> + <!-- :controls="false" --> + </div> + <div class="bar"> + <div class="name">澶囦唤鏁版嵁淇濆瓨鏃堕棿 / 澶�</div> + <el-input + v-model="lifeSpan" + placeholder="璇疯緭鍏ュぉ鏁�" + @change="handleChange" + size="small" + ></el-input> + </div> + <div class="bar"> + <div class="name">鑷姩澶囦唤</div> + <el-button type="primary" size="small" @click="backUpNow" + >绔嬪嵆澶囦唤</el-button + > + </div> + </div> + <div class="recover" v-if="activePage == 1"> + <div class="title">鏄剧ず澶囦唤鐨勬枃浠惰寖鍥达細{{ 5 }}</div> + + <div class="table-head"> + <span class="line1">鑷姩澶囦唤鏃堕棿</span> + <span class="line1">澶囦唤鏂囦欢鍚嶇О</span> + <span class="line2">鎿嶄綔</span> + </div> + + <div class="bar" v-for="(item, i) in fileList" :key="i"> + <span class="time">{{ item.time }}</span> + <span class="time">{{ item.name }}</span> + <span class="operation">鎭㈠</span> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +export default { + mounted() {}, + data() { + return { + langList: [ + { name: "绠�浣撲腑鏂�" }, + { name: "鑻辨枃" }, + { name: "绻佷綋涓枃锛堥娓級" }, + ], + fileList: [ + { time: "2010-10-02 12:30:09", name: "鏂囦欢1" }, + { time: "2010-10-02 12:30:09", name: "鏂囦欢12121212121" }, + { time: "2010-10-02", name: "鏂囦欢2211" }, + { time: "2011", name: "澶囦唤鏂囦欢2" }, + ], + activePage: 0, + interval: "", + lifeSpan: "", + options: [ + { + value: "閫夐」1", + label: "鎵嬪姩", + }, + { + value: "閫夐」2", + label: "鑷姩", + }, + ], + isBackUp: true, + }; + }, + methods: { + openRight(typ) { + const es = document.getElementsByClassName("menu-item"); + es[this.activePage].style.backgroundColor = "#f8f8f8"; + es[this.activePage].style.color = "rgba(54, 54, 54, 1)"; + es[typ].style.backgroundColor = "rgba(61, 104, 225, 1)"; + es[typ].style.color = "#fff"; + this.activePage = typ; + }, + handleChange() {}, + backUpNow() { + this.$confirm("鎮ㄦ槸鍚︾‘璁ょ珛鍗冲浠芥墍鏈夊簲鐢ㄧ殑閰嶇疆鏁版嵁锛�", "绔嬪嵆澶囦唤", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + }).then(() => { + this.$message({ + type: "success", + message: "澶囦唤鎴愬姛", + }); + }); + // .then((resp) => { + // if (resp.success) { + // this.$message({ + // type: "success", + // message: "鍒犻櫎鏁版嵁鎴愬姛", + // }); + // this.loading = false; + // } + // }) + // .catch((err) => { + // this.$message({ + // type: "error", + // message: "鍒犻櫎鏁版嵁澶辫触锛�", + // }); + // this.loading = false; + // }); + }, + switchChange(val) { + console.log(val); + }, + }, +}; +</script> +<style lang="scss"> +.all { + width: 100%; +} + +.backup-content { + height: 100%; + display: flex; + flex-direction: row; + flex: 1; + flex-basis: auto; + box-sizing: border-box; + .backup-center { + height: 100%; + width: 280px; + overflow: auto; + box-sizing: border-box; + flex-shrink: 0; + padding: 10px; + border-right: 5px solid #f8f8f8; + .menu-item { + background-color: #f8f8f8; + height: 50px; + margin-bottom: 10px; + border-radius: 8px; + line-height: 50px; + box-sizing: border-box; + font-size: 14px; + cursor: pointer; + padding: 0 20px; + display: flex; + justify-content: space-between; + .con { + .iconfont { + margin-right: 10px; + } + .menu-text { + font-size: 15px; + } + } + } + } + .backup-right { + flex: 1; + flex-basis: auto; + overflow: auto; + box-sizing: border-box; + position: relative; + padding: 20px 40px; + .el-form-item.is-required:not(.is-no-asterisk) + > .el-form-item__label:before, + .el-form-item.is-required:not(.is-no-asterisk) + .el-form-item__label-wrap + > .el-form-item__label:before { + display: none; + } + .el-select { + width: 100%; + } + .el-form-item { + margin-bottom: 10px; + height: 50px; + background: #f8f8f8; + padding: 4px 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 10px; + .el-form-item__label { + text-align: left; + line-height: 42px; + } + } + .el-form-item__content { + line-height: 40px; + position: relative; + font-size: 14px; + } + .ip-input-container { + max-width: none !important; + } + .auto { + .bar { + display: flex; + align-items: center; + height: 50px; + padding: 0 25px; + background-color: #f8f8f8; + justify-content: space-between; + border-radius: 12px; + margin-bottom: 10px; + .name { + font-size: 15px; + text-align: left; + min-width: 180px; + } + .el-input { + width: 100%; + .el-input { + height: auto; + } + .el-input__inner { + border: none; + border-radius: 8px; + background-color: rgba(240, 240, 240, 1); + text-align: left; + } + } + } + } + .recover { + .title { + font-size: 13px; + color: #868686; + text-align: left; + padding: 0 10px; + margin-bottom: 10px; + } + .table-head { + height: 30px; + line-height: 30px; + display: flex; + // justify-content: space-between; + box-sizing: border-box; + font-size: 15px; + padding: 0 10px; + margin-bottom: 5px; + .line1 { + flex: 4; + text-align: left; + } + .line2 { + flex: 1; + text-align: right; + } + } + .bar { + height: 40px; + background-color: rgba(248, 248, 248, 1); + display: flex; + box-sizing: border-box; + padding: 0 10px; + align-items: center; + border-radius: 8px; + color: #797979; + font-size: 14px; + margin-bottom: 10px; + .time { + width: 45%; + text-align: left; + } + .operation { + color: rgba(26, 115, 232, 1); + cursor: pointer; + width: 10%; + text-align: right; + } + } + } + .save-btn { + background-color: #3d68e1; + width: 240px; + height: 40px; + margin: 0 auto; + border-radius: 10px; + color: #fff; + line-height: 40px; + font-size: 14px; + margin-top: 20px; + } + } +} +</style> diff --git a/src/pages/maintain/views/generalSettings.vue b/src/pages/maintain/views/generalSettings.vue new file mode 100644 index 0000000..7507fbc --- /dev/null +++ b/src/pages/maintain/views/generalSettings.vue @@ -0,0 +1,456 @@ +<template> + <div class="all"> + <div class="cluster-content"> + <div class="cluster-center" ref="left"> + <div class="menu-item" @click="openRight('basic')"> + <div>璁惧淇℃伅</div> + </div> + <div class="menu-item" @click="openRight('video')"> + <div>浜嬩欢褰曞儚鏃堕暱</div> + </div> + <div class="menu-item" @click="openRight('sound')"> + <div>浜嬩欢澹伴煶</div> + </div> + </div> + <div class="cluster-right"> + <div class="lang" v-if="activePage == 'basic'"> + <div class="bar" v-for="(item, i) in basioInfoList" :key="i"> + <span class="name">{{ item.name }}</span> + <span class="desc">{{ item.desc }}</span> + </div> + </div> + <div class="lang" v-if="activePage == 'video'"> + <div class="min-dur"> + <div class="title">瑙嗛鎴彇鏈�鐭椂闀�</div> + <div class="entity"> + <div class="sec">{{ alarmConf.min_video_len }}s</div> + <div class="block"> + <el-slider + v-model="alarmConf.min_video_len" + id="cut_min_duration" + :min="0" + :max="100" + :show-tooltip="false" + > + </el-slider> + </div> + <el-input-number + v-model="alarmConf.min_video_len" + controls-position="right" + :min="0" + :max="100" + size="mini" + ></el-input-number> + s + </div> + </div> + <div class="min-dur"> + <div class="title">瑙嗛鎴彇鏈�闀挎椂闀�</div> + <div class="entity"> + <div class="sec">{{ alarmConf.max_video_len }}s</div> + <div class="block"> + <el-slider + v-model="alarmConf.max_video_len" + id="cut_max_duration" + :min="0" + :max="100" + :show-tooltip="false" + > + </el-slider> + </div> + <el-input-number + v-model="alarmConf.max_video_len" + controls-position="right" + :min="0" + :max="100" + size="mini" + ></el-input-number> + s + </div> + </div> + + <div class="save-btn" @click="submitAlarm">淇濆瓨</div> + </div> + <div class="lang" v-if="activePage == 'sound'"> + <div class="title">浜嬩欢澹伴煶</div> + <div + class="bar" + v-for="(item, i) in soundList" + :key="i" + @click="clickSound(item, i)" + ref="soundBar" + > + <div class="left-part"> + <span class="icon iconfont"></span> + <span class="name"> {{ item.name }}</span> + </div> + <div class="btns"> + <span class="icon iconfont"></span> + <span class="icon iconfont"></span> + </div> + </div> + <div class="add-group"> + <el-upload + class="upload-demo" + drag + action="https://jsonplaceholder.typicode.com/posts/" + multiple + v-show="showUpload" + > + <i class="el-icon-upload"></i> + <div class="el-upload__text"> + 浜嬩欢澹伴煶鏂囦欢鎷栧埌姝ゅ锛屾垨<em>鐐瑰嚮涓婁紶</em> <br /> + 浠呮敮鎸乵p3/wma绛夋牸寮� + </div> + </el-upload> + <div v-show="!showUpload" +></div> + <div class="add-btn"> + <span class="icon iconfont" @click="showUpload=!showUpload"></span> + </div> + + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import { saveAlarmConfig } from "@/api/system"; + +import cloudNode from "../components/CloudNode"; +import ipInput from "@/components/subComponents/IPInput"; +import { isIPv4 } from "@/scripts/validate"; +import switchBar from "../components/switchBar"; + +export default { + data() { + const checkPwd = (rule, value, callback) => { + if (!value) { + return callback(new Error("瀵嗙爜涓嶈兘涓虹┖")); + } + setTimeout(() => { + if (value.length != 6) { + callback(new Error("瀵嗙爜搴斾负6浣�!")); + } else { + callback(); + } + }, 1000); + }; + return { + isHighClass: false, + + ruleForm: { + deviceName: "", + port: "", + }, + wifiForm: { + name: "", + password: "", + }, + wireArr: [{ name: "鏈夌嚎缃戠粶1" }, { name: "鏈夌嚎缃戠粶2" }], + inWifiDetail: false, + wifiList: [{ name: "鏃犵嚎缃戠粶1" }, { name: "鏃犵嚎缃戠粶2" }], + isOpenWifi: false, + inWireDetail: false, + wireForm: {}, + showUpload:false, + alarmConf: { + min_video_len: 0, + max_video_len: 0, + }, + basioInfoList: [ + { name: "绠�浣撲腑鏂�", desc: "fesF" }, + { name: "鑻辨枃", desc: "fesF" }, + { name: "绻佷綋涓枃锛堥娓級", desc: "fesF" }, + ], + soundList: [{ name: "2.mp3" }, { name: "3.mp3" }], + + wireFormRules: {}, + activePage: "basic", + rules: { + deviceName: [ + { required: true, message: "璇疯緭鍏ヨ澶囧悕绉�", trigger: "change" }, + ], + }, + ipv4Form: {}, + ipv6Form: {}, + ipv4FormRules: {}, + ipv6FormRules: {}, + options: [ + { + value: "閫夐」1", + label: "鎵嬪姩", + }, + { + value: "閫夐」2", + label: "鑷姩", + }, + ], + value: "", + }; + }, + components: { + cloudNode, + ipInput, + switchBar, + }, + mounted() {}, + beforeDestroy() {}, + props: ["barName"], + methods: { + openRight(typ) { + this.activePage = typ; + }, + wifiControl(val) {}, + checkWifi() { + this.inWifiDetail = true; + }, + checkWire(item) { + this.inWireDetail = true; + }, + clickSound(item, i) { + this.$refs["soundBar"].forEach((x) => { + x.style.backgroundColor = "rgba(248, 248, 248, 1)"; + }); + this.$refs["soundBar"][i].style.backgroundColor = + "rgba(233, 233, 233, 1)"; + }, + submitAlarm() { + saveAlarmConfig(this.alarmConf).then((res) => { + if (res && res.success) { + this.$notify({ + type: "success", + message: "淇濆瓨鎴愬姛", + }); + } + }); + }, + }, +}; +</script> +<style lang="scss"> +.all { + width: 100%; +} + +.cluster-content { + height: 100%; + display: flex; + flex-direction: row; + flex: 1; + flex-basis: auto; + box-sizing: border-box; + .cluster-center { + height: 100%; + width: 280px; + overflow: auto; + box-sizing: border-box; + flex-shrink: 0; + padding: 10px; + border-right: 5px solid #f8f8f8; + + // background-color: lavender; + .menu-item { + background-color: #f8f8f8; + height: 40px; + margin-bottom: 10px; + border-radius: 8px; + line-height: 40px; + box-sizing: border-box; + font-size: 14px; + padding: 0 20px; + display: flex; + justify-content: space-between; + } + } + .cluster-right { + flex: 1; + flex-basis: auto; + overflow: auto; + // background-color: rgba(240, 242, 245, 1); + box-sizing: border-box; + position: relative; + padding: 20px 40px; + // .create-new .join-exist { + .el-form-item.is-required:not(.is-no-asterisk) + > .el-form-item__label:before, + .el-form-item.is-required:not(.is-no-asterisk) + .el-form-item__label-wrap + > .el-form-item__label:before { + display: none; + } + .el-select { + width: 100%; + } + .el-form-item { + margin-bottom: 10px; + height: 50px; + background: #f8f8f8; + padding: 4px 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 10px; + .el-form-item__label { + text-align: left; + line-height: 42px; + } + } + .el-form-item__content { + line-height: 40px; + position: relative; + font-size: 14px; + } + .ip-input-container { + max-width: none !important; + } + .lang { + .title { + height: 35px; + line-height: 35px; + font-size: 16px; + text-align: left; + margin-bottom: 5px; + } + .bar { + height: 50px; + background-color: rgba(248, 248, 248, 1); + border-radius: 10px; + line-height: 50px; + box-sizing: border-box; + padding: 0 30px 0 20px; + display: flex; + justify-content: space-between; + margin-bottom: 10px; + cursor: pointer; + .left-part { + .icon { + color: rgba(191, 191, 191, 1); + font-size: 16px; + margin-right: 5px; + } + } + .name { + font-size: 15px; + } + .btns { + width: 50px; + display: flex; + justify-content: space-between; + color: rgba(191, 191, 191, 1); + } + .desc { + font-size: 14px; + color: rgba(134, 134, 134, 1); + } + } + .bar:hover { + background-color: rgba(233, 233, 233, 1); + } + .add-group{ + margin-top: 170px; + height: 235px; + display: flex; + flex-direction: column; + justify-content: space-between; + + } + .upload-demo { + .el-upload-dragger { + width: 290px; + } + } + .add-btn { + height: 40px; + line-height: 40px; + margin-top: 10px; + .icon { + font-size: 30px; + color: rgba(61, 104, 225, 1); + } + } + .min-dur { + box-sizing: border-box; + padding: 0 20px; + background-color: rgba(248, 248, 248, 1); + height: 95px; + margin-bottom: 20px; + border-radius: 15px; + .title { + height: 45px; + line-height: 45px; + + text-align: left; + box-sizing: border-box; + padding: 0 6px; + font-size: 14px; + } + } + + .entity { + display: flex; + align-items: center; + height: 30px; + + .sec { + min-width: 30px; + line-height: 80px; + margin-right: 10px; + color: rgba(120, 120, 120, 1); + font-size: 14px; + } + .block { + flex: 1; + margin: 0 20px 0 6px; + } + .el-input-number--mini { + width: 80px; + } + .el-input-number.is-controls-right[class*="mini"] [class*="increase"], + .el-input-number.is-controls-right[class*="mini"] [class*="decrease"] { + width: 23px; + } + .el-input-number.is-controls-right .el-input__inner { + padding-left: 13px; + padding-right: 37px; + } + #cut_min_duration { + .el-slider__bar { + background-color: #3d68e1; + } + .el-slider__button-wrapper .el-tooltip { + width: 18px; + height: 18px; + border: 4px solid #3d68e1; + box-sizing: border-box; + } + } + + #cut_max_duration { + .el-slider__bar { + background-color: #ff9e6e; + } + .el-slider__button-wrapper .el-tooltip { + width: 18px; + height: 18px; + border: 4px solid #ff9e6e; + box-sizing: border-box; + } + } + } + } + .save-btn { + background-color: #3d68e1; + width: 240px; + height: 40px; + margin: 0 auto; + border-radius: 10px; + color: #fff; + line-height: 40px; + font-size: 14px; + margin-top: 20px; + } + } +} +</style> diff --git a/src/pages/maintain/views/restartSettings.vue b/src/pages/maintain/views/restartSettings.vue new file mode 100644 index 0000000..4b0ee47 --- /dev/null +++ b/src/pages/maintain/views/restartSettings.vue @@ -0,0 +1,384 @@ +<template> + <div class="restart"> + <div class="restart-set"> + <div class="t">閲嶅惎璁剧疆</div> + + <div class="bar"> + <div class="name">閲嶅惎鑺傜偣</div> + <el-button + class="reset-btn" + type="primary" + size="small" + @click="restart" + >閲嶅惎</el-button + > + </div> + </div> + + <div class="restart-set"> + <div class="t">瀹氭椂閲嶅惎</div> + <div class="bar"> + <div class="name">閲嶅惎鍛ㄦ湡</div> + <el-select + v-model="every" + placeholder="鍏抽棴" + size="small" + @change="changeEvery" + > + <el-option + v-for="item in options" + :key="item.value" + :label="item.label" + :value="item.value" + > + </el-option> + </el-select> + </div> + + <div class="bar" v-if="every == 'monthly'"> + <div class="name">閲嶅惎鏃ユ湡</div> + <el-select + v-model="cronValueObj.day" + placeholder="璇烽�夋嫨" + size="small" + @change="updateExpression" + > + <el-option + v-for="item in days" + :key="item.value" + :label="item.label" + :value="item.value" + ></el-option> + </el-select> + </div> + + <div class="bar" v-if="every == 'weekly'"> + <div class="name">閲嶅惎鏃ユ湡</div> + <el-select + v-model="cronValueObj.week" + placeholder="璇烽�夋嫨" + size="small" + @change="updateExpression" + > + <el-option label="鏄熸湡涓�" value="1"></el-option> + <el-option label="鏄熸湡浜�" value="2"></el-option> + <el-option label="鏄熸湡涓�" value="3"></el-option> + <el-option label="鏄熸湡鍥�" value="4"></el-option> + <el-option label="鏄熸湡浜�" value="5"></el-option> + <el-option label="鏄熸湡鍏�" value="6"></el-option> + <el-option label="鏄熸湡鏃�" value="7"></el-option> + </el-select> + </div> + + <div class="bar" v-if="every != 'close'"> + <div class="name">閲嶅惎鏃堕棿</div> + <el-time-picker + v-model="time" + :picker-options="{ selectableRange: '00:00:00 - 23:59:59' }" + value-format="HH:mm" + format="HH:mm" + placeholder="浠绘剰鏃堕棿鐐�" + size="small" + @change="updateExpression" + ></el-time-picker> + </div> + </div> + + <el-button class="save-btn" type="primary" @click="save">淇濆瓨</el-button> + </div> +</template> + +<script> +import { + rebootServer, + getDevInfo, + getRebootTask, + setRebootTask, + fileUpload, + doUpgrade, + deleteDate, +} from "@/api/system"; +export default { + data() { + return { + time: "", + saveBtn: false, + timer: null, + probeSum: 0, + cronText: "", + cronValueObj: { + min: "*", + hour: "*", + day: "*", + month: "*", + week: "*", + }, + options: [ + { + value: "close", + label: "鍏抽棴", + }, + { + value: "daily", + label: "姣忔棩", + }, + { + value: "weekly", + label: "姣忓懆", + }, + { + value: "monthly", + label: "姣忔湀", + }, + ], + every: "close", + rebootCron: "", + }; + }, + computed: { + days: () => { + let arr = []; + for (let i = 1; i < 32; i++) { + arr.push({ + label: i + "鏃�", + value: i + "", + }); + } + return arr; + }, + }, + components: {}, + mounted() { + this.getRebootCron(); + }, + beforeDestroy() {}, + methods: { + resolveExp() { + // "鍑嗗鍙嶈В鏋�", this.expression; + if (this.rebootCron.length) { + let arr = this.rebootCron.split(" "); + if (arr.length >= 5) { + //6 浣嶄互涓婃槸鍚堟硶琛ㄨ揪寮� + this.cronValueObj.min = arr[0]; + this.cronValueObj.hour = arr[1]; + this.cronValueObj.day = arr[2]; + this.cronValueObj.month = "*"; + this.cronValueObj.week = arr[4]; + } + + if (this.cronValueObj.week != "*") { + this.every = "weekly"; + } else if (this.cronValueObj.day != "*") { + this.every = "monthly"; + } else { + this.every = "daily"; + } + this.time = this.cronValueObj.hour + ":" + this.cronValueObj.min; + } else { + //娌℃湁浼犲叆鐨勮〃杈惧紡 鍒欒繕鍘� + this.clearCron(); + } + }, + clearCron() { + this.cronValueObj.min = "*"; + this.cronValueObj.hour = "*"; + this.cronValueObj.day = "*"; + this.cronValueObj.month = "*"; + this.cronValueObj.week = "*"; + }, + getRebootCron() { + getRebootTask().then((rsp) => { + this.rebootCron = rsp.data; + }); + }, + reLogin() { + this.$router.push("/"); + }, + restart() { + this.$confirm("纭畾瑕侀噸鍚鑺傜偣鍚�?", { + center: true, + cancelButtonClass: "comfirm-class-cancle", + confirmButtonClass: "comfirm-class-sure", + }).then(() => { + // this.loading = true; + // this.loadingText = "鏅鸿兘璁$畻鑺傜偣姝e湪閲嶅惎锛岃鑰愬績绛夊緟..." + rebootServer() + .then((rsp) => { + this.probeServer(this.reLogin); + }) + .catch((err) => { + if (err.status == 400) { + // this.loading = false; + this.$notify({ + type: "error", + message: "閲嶅惎璁$畻鑺傜偣澶辫触", + }); + } else { + this.probeServer(this.reLogin); + } + }); + }); + }, + probeServer(cb) { + this.probeSum++; + let _this = this; + if (this.probeSum > 60) { + this.$confirm("杩炴帴鏈嶅姟鍣ㄥけ璐�, 璇峰埛鏂伴〉闈㈡垨鑱旂郴绠$悊鍛�", "澶辫触", { + type: "error", + cancelButtonClass: "comfirm-class-cancle", + confirmButtonClass: "comfirm-class-sure", + }).then(() => { + cb(); + }); + return; + } + this.timer = setTimeout(() => { + getDevInfo() + .then(() => { + cb(); + }) + .catch((err) => { + _this.probeServer(cb); + }); + }, 10000); + }, + save() { + this.rebootCron = this.cronText; + setRebootTask({ task: this.cronText }) + .then((rsp) => { + if (rsp && rsp.success) { + this.$notify({ + type: "success", + message: "閰嶇疆鎴愬姛", + }); + } + }) + .catch((err) => { + this.$notify({ + type: "error", + message: "閰嶇疆澶辫触", + }); + }); + }, + changeEvery() { + this.saveBtn = true; + if (this.every === "close") { + this.cronText = ""; + return; + } + if (this.every === "monthly") { + this.cronValueObj.week = "*"; + this.cronValueObj.day = "1"; + if (!this.time.length) { + this.time = "00:00"; + } + } + if (this.every === "weekly") { + this.cronValueObj.day = "*"; + this.cronValueObj.week = "1"; + if (!this.time.length) { + this.time = "00:00"; + } + } + if (this.every === "daily") { + this.cronValueObj.day = "*"; + this.cronValueObj.week = "*"; + } + this.updateExpression(); + }, + updateExpression() { + this.saveBtn = true; + if (this.time.length) { + let arr = this.time.split(":"); + this.cronValueObj.hour = arr[0]; + this.cronValueObj.min = arr[1]; + } + this.crontabValueString(); + }, + crontabValueString() { + let obj = this.cronValueObj; + this.cronText = + obj.min + + " " + + obj.hour + + " " + + obj.day + + " " + + obj.month + + " " + + obj.week; + }, + }, + watch: { + rebootCron() { + this.resolveExp(); + }, + }, +}; +</script> +<style lang="scss"> +.all { + width: 100%; +} +.restart { + margin: 0 auto; + padding: 20px; + .t { + box-sizing: border-box; + text-align: left; + width: 70%; + margin: 0 auto; + padding: 10px; + font-size: 16px; + } + .bar { + height: 50px; + + width: 70%; + background: rgba(248, 248, 248, 1); + margin: 0 auto; + min-width: 300px; + display: flex; + justify-content: space-between; + box-sizing: border-box; + padding: 0 20px; + align-items: center; + border-radius: 10px; + margin-bottom: 10px; + .reset-btn { + width: 70px; + height: 32px; + border-radius: 5px; + } + .el-select { + width: 100%; + } + .name { + min-width: 150px; + text-align: left; + font-size: 14px; + } + .el-input__inner::placeholder { + color: rgba(107, 107, 107, 1); + } + .el-input--small .el-input__inner { + height: 32px; + line-height: 32px; + border: none; + background: rgba(240, 240, 240, 1); + } + .el-select .el-input .el-select__caret { + color: rgba(138, 138, 138, 1); + font-size: 15px; + } + .el-date-editor.el-input, + .el-date-editor.el-input__inner { + width: 100%; + } + } + .save-btn { + width: 260px; + margin-top: 50px; + } +} +</style> diff --git a/src/pages/maintain/views/systemClean.vue b/src/pages/maintain/views/systemClean.vue new file mode 100644 index 0000000..ca5bb8f --- /dev/null +++ b/src/pages/maintain/views/systemClean.vue @@ -0,0 +1,215 @@ +<template> + <div class="clear" + + v-loading="loading" + :element-loading-text="loadingText" + > + <div class="head"> + <span class="t">璇烽�夋嫨瑕佹竻鐞嗙殑鏁版嵁鑼冨洿</span> + <el-date-picker + style="width: 100%" + v-model="dataRange" + type="daterange" + align="right" + size="small" + range-separator="鑷�" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :picker-options="pickerOptions" + > + </el-date-picker> + </div> + + <div class="desc"> + <div class="disk-img"></div> + <div class="cap"> + <div class="cap-text">纾佺洏鍙敤锛歿{ 21 }}%</div> + <div class="cap-bar"> + <div class="inner-bar"></div> + </div> + </div> + + <el-button type="primary" @click="deleteData">鏁版嵁娓呯悊</el-button> + + <div class="warm"> + <!-- <span class="icon iconfont" style="margin-right:5px"></span> --> + <i class="iconfont icontishi-zhuyi"></i> + <span class="text" + >璇锋敞鎰忥紝鎸変互涓婃棩鏈熻寖鍥村垹闄ょ殑鏁版嵁涓嶅彲鎭㈠锛岀珛鍗崇敓鏁堬紝璇疯皑鎱庢搷浣�!</span + > + </div> + </div> + </div> +</template> + +<script> +import { deleteDate } from "@/api/system"; +export default { + data() { + return { + pickerOptions: { + disabledDate(time) { + var day = new Date(); + day.setTime(day.getTime() - 24 * 60 * 60 * 1000); + return time.getTime() > day; + }, + }, + loading: false, + loadingText: '', + dataRange: [ + this.$moment().format("YYYY-MM-DD HH:mm:ss"), + this.$moment().format("YYYY-MM-DD HH:mm:ss"), + ], + pickerOptions: { + disabledDate(time) { + var day = new Date(); + day.setTime(day.getTime() - 24 * 60 * 60 * 1000); + return time.getTime() > day; + }, + }, + }; + }, + mounted() {}, + + methods: { + deleteData() { + var timeRange = this.format(this.dataRange); + var showStartTime = timeRange[0]; + var showEndTime = timeRange[1]; + this.$confirm( + "鎻愮ず锛�" + + showStartTime + + " 鑷� " + + showEndTime + + " 浜х敓鐨勫叏閮ㄦ暟鎹皢琚垹闄わ紝姝ゆ搷浣滅珛鍗崇敓鏁堬紝涓嶅彲鎭㈠锛屾槸鍚﹀垹闄わ紵", + { + center: true, + cancelButtonClass: "comfirm-class-cancle", + confirmButtonClass: "comfirm-class-sure", + } + ) + .then(() => { + this.loading = true + this.loadingText = "姝e湪鍒犻櫎鏁版嵁锛岃绋嶅�欙紒" + deleteDate({ + startTime: showStartTime, + endTime: showEndTime, + }) + .then((resp) => { + if (resp.success) { + this.$message({ + type: "success", + message: "鍒犻櫎鏁版嵁鎴愬姛", + }); + this.loading = false + } + }) + .catch((err) => { + this.$message({ + type: "error", + message: "鍒犻櫎鏁版嵁澶辫触锛�", + }); + this.loading = false + }); + }) + .catch(() => {}); + }, + format(array) { + return [ + this.$moment(array[0]).format("YYYY-MM-DD"), + this.$moment(array[1]).format("YYYY-MM-DD"), + ]; + }, + }, +}; +</script> +<style lang="scss"> +.all { + width: 100%; +} +.clear { + margin: 0 auto; + padding: 20px; + .head { + height: 50px; + background-color: rgba(248, 248, 248, 1); + border-radius: 10px; + display: flex; + align-items: center; + justify-content: space-around; + box-sizing: border-box; + padding: 0 20px; + width: 560px; + margin: 0 auto; + .t { + font-size: 14px; + min-width: 175px; + text-align: left; + } + + .el-range-editor--small.el-input__inner { + border: none; + } + .el-range-editor--small .el-range-separator { + line-height: 26px; +} + } + .desc { + margin-top: 50px; + .disk-img { + height: 100px; + width: 100px; + margin: 0 auto; + margin-bottom: 10px; + background-color: aquamarine; + } + .cap { + height: 50px; + margin: 0 auto; + width: 160px; + margin-bottom: 20px; + .cap-bar { + height: 8px; + background: rgba(242, 242, 242, 1); + // + margin: 0 auto; + border-radius: 2px; + .inner-bar { + background: #3a8120; + width: 40%; + height: 100%; + border-radius: 2px; + } + } + .cap-text { + text-align: right; + height: 25px; + line-height: 25px; + font-size: 12px; + } + } + .el-button--primary { + width: 200px; + font-size: 15px; + } + .warm { + line-height: 30px; + height: 30px; + margin-top: 10px; + display: flex; + align-items: center; + justify-content: center; + .iconfont { + font-size: 16px; + + color: #e99038; + margin-right: 5px; + } + .text { + color: rgba(187, 187, 187, 1); + font-size: 14px; + } + } + } +} +</style> diff --git a/src/pages/maintain/views/updateSettings.vue b/src/pages/maintain/views/updateSettings.vue new file mode 100644 index 0000000..7a000e2 --- /dev/null +++ b/src/pages/maintain/views/updateSettings.vue @@ -0,0 +1,478 @@ +<template> + <div class="all"> + <div class="cluster-content"> + <div class="cluster-center" ref="left"> + <div class="menu-item" @click="openRight(0)"> + <div class="con"> + <span class="icon iconfont"></span> + <span class="menu-text">绯荤粺鏇存柊</span> + </div> + </div> + <div class="menu-item" @click="openRight(1)"> + <div class="con"> + <span class="icon iconfont"></span> + + <span class="menu-text">鏇存柊璁剧疆</span> + </div> + </div> + </div> + <div class="cluster-right"> + <div class="net-set" v-if="activePage == 0"> + <el-radio-group v-model="radio2" size="medium"> + <el-radio-button label="妫�鏌ユ洿鏂�"></el-radio-button> + <el-radio-button label="涓婁紶鏇存柊"></el-radio-button> + </el-radio-group> + + <div class="update-center" v-if="radio2 == '妫�鏌ユ洿鏂�'"> + <div class="spin-bg"></div> + <div class="line"></div> + <div class="desc">{{ "妫�鏌ュ埌鏈�鏂扮増鏈細1.0.2" }}</div> + <el-button type="primary" size="small">鏇存柊</el-button> + </div> + <div class="upload-center" v-if="radio2 == '涓婁紶鏇存柊'"> + <!-- uploadPlaceholder="涓婁紶鍗囩骇鏂囦欢" --> + <div class="top"> + <div class="up-text">涓婁紶鏇存柊鏂囦欢</div> + <fileUploader + single + url="/data/api-v/sysset/patchUpdate" + @complete="onFileUpload" + @file-added="onFileAdded" + /> + <el-button + type="primary" + size="small" + style="width: 80px" + @click="upgrade" + :disabled="!fileAdded" + :loading="upgrading" + >鍗囩骇</el-button + > + </div> + + <div class="update-center"> + <div class="spin-bg"></div> + <div class="line"></div> + <div class="desc">{{ "妫�鏌ュ埌鏈�鏂扮増鏈細1.0.2" }}</div> + <el-button type="primary" size="small">鏇存柊</el-button> + </div> + <!-- <span v-html="patchUpdateStatus"></span> --> + </div> + + <div class="cur-version">褰撳墠鐗堟湰锛歿{ "1.0.1" }}</div> + </div> + + <div class="wifi" v-if="activePage == 1"> + <div class="content"> + <div class="title">绯荤粺鏇存柊璁剧疆</div> + + <div class="bar"> + <div class="name">鑷姩娓呯悊杞欢鍖呯紦瀛�</div> + <el-switch + v-model="sys_auto_clear" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange('sys_auto_clear')" + > + </el-switch> + </div> + + <div class="bar"> + <div class="name">鏇存柊鎻愰啋</div> + <el-switch + v-model="sys_remind" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange('sys_remind')" + > + </el-switch> + </div> + + <div class="bar" v-if="sys_remind"> + <div class="name">鑷姩涓嬭浇鏇存柊</div> + <el-switch + v-model="sys_auto_download" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange('sys_auto_download')" + > + </el-switch> + </div> + </div> + + <div class="content"> + <div class="title">搴旂敤/绠楁硶鏇存柊璁剧疆</div> + + <div class="bar"> + <div class="name">鑷姩娓呯悊杞欢鍖呯紦瀛�</div> + <el-switch + v-model="app_auto_clear" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange('app_auto_clear')" + > + </el-switch> + </div> + + <div class="bar"> + <div class="name">鏇存柊鎻愰啋</div> + <el-switch + v-model="app_remind" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange('app_remind')" + > + </el-switch> + </div> + + <div class="bar" v-if="app_remind"> + <div class="name">鑷姩涓嬭浇鏇存柊</div> + <el-switch + v-model="app_auto_download" + active-color="rgba(61, 104, 225, 1)" + @change="switchChange('app_auto_download')" + > + </el-switch> + </div> + </div> + </div> + </div> + </div> + </div> +</template> + +<script> +import { getDevInfo, fileUpload, doUpgrade } from "@/api/system"; +import FileUploader from "@/components/subComponents/FileUpload/index"; + +export default { + components: { + FileUploader, + }, + data() { + return { + wifiList: [{ name: "鏃犵嚎缃戠粶1" }, { name: "鏃犵嚎缃戠粶2" }], + radio2: "妫�鏌ユ洿鏂�", + activePage: 0, + patchUpdateStatus: "", + probeSum: 0, + sys_auto_clear: false, + sys_remind: false, + sys_auto_download: false, + app_auto_clear: false, + app_remind: false, + app_auto_download: false, + timer: null, + patchFile: {}, + + fileAdded: false, + upgrading: false, + }; + }, + mounted() {}, + methods: { + onFileUpload(file) { + this.patchUpdateStatus = `<span style="color:green">涓婁紶鎴愬姛, 鐐瑰嚮鍗囩骇鎸夐挳寮�濮嬪崌绾�</span>`; + this.patchFile = { ...file }; + this.fileAdded = true; + }, + onFileAdded() { + this.patchUpdateStatus = ""; + }, + upgrade() { + this.upgrading = true; + this.patchUpdateStatus = `<span style="color:red">姝e湪鍗囩骇...</span>`; + doUpgrade(this.patchFile) + .then((rsp) => { + this.upgrading = false; + if (rsp && rsp.success) { + clearTimeout(this.timer); + this.doneUpgrade(); + } + }) + .catch((err) => { + if (err.code) { + this.upgrading = false; + this.patchUpdateStatus = `<span style="color:red">${err.data}</span>`; + clearTimeout(this.timer); + } else { + this.probeServer(this.doneUpgrade); + } + }); + }, + doneUpgrade() { + this.upgrading = false; + this.patchUpdateStatus = `<span style="color:green">鍗囩骇鎴愬姛</span>`; + let _this = this; + this.$confirm("鍗囩骇鎴愬姛, 璇烽噸鏂扮櫥褰曠郴缁�", "鎴愬姛", { + type: "success", + cancelButtonClass: "comfirm-class-cancle", + confirmButtonClass: "comfirm-class-sure", + }).then(() => { + _this.reLogin(); + }); + }, + reLogin() { + this.$router.push("/"); + }, + probeServer(cb) { + this.probeSum++; + let _this = this; + if (this.probeSum > 60) { + this.$confirm("杩炴帴鏈嶅姟鍣ㄥけ璐�, 璇峰埛鏂伴〉闈㈡垨鑱旂郴绠$悊鍛�", "澶辫触", { + type: "error", + cancelButtonClass: "comfirm-class-cancle", + confirmButtonClass: "comfirm-class-sure", + }).then(() => { + cb(); + }); + return; + } + this.timer = setTimeout(() => { + getDevInfo() + .then(() => { + cb(); + }) + .catch((err) => { + _this.probeServer(cb); + }); + }, 10000); + }, + openRight(typ) { + const es = document.getElementsByClassName("menu-item"); + es[this.activePage].style.backgroundColor = "#f8f8f8"; + es[this.activePage].style.color = "rgba(54, 54, 54, 1)"; + es[typ].style.backgroundColor = "rgba(61, 104, 225, 1)"; + es[typ].style.color = "#fff"; + this.activePage = typ; + }, + switchChange(typ) { + console.log(this[typ]); + }, + }, +}; +</script> +<style lang="scss"> +.all { + width: 100%; +} + +.cluster-content { + height: 100%; + display: flex; + flex-direction: row; + flex: 1; + flex-basis: auto; + box-sizing: border-box; + .cluster-center { + height: 100%; + width: 280px; + overflow: auto; + box-sizing: border-box; + flex-shrink: 0; + padding: 10px; + border-right: 5px solid #f8f8f8; + + // background-color: lavender; + .menu-item { + background-color: #f8f8f8; + height: 50px; + margin-bottom: 10px; + border-radius: 8px; + line-height: 50px; + box-sizing: border-box; + font-size: 14px; + cursor: pointer; + padding: 0 20px; + display: flex; + justify-content: space-between; + .con { + .iconfont { + margin-right: 10px; + } + .menu-text { + font-size: 15px; + } + } + } + } + .cluster-right { + flex: 1; + flex-basis: auto; + overflow: auto; + box-sizing: border-box; + position: relative; + padding: 20px 40px; + .el-form-item.is-required:not(.is-no-asterisk) + > .el-form-item__label:before, + .el-form-item.is-required:not(.is-no-asterisk) + .el-form-item__label-wrap + > .el-form-item__label:before { + display: none; + } + .el-select { + width: 100%; + } + .el-form-item { + margin-bottom: 10px; + height: 50px; + background: #f8f8f8; + padding: 4px 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 10px; + .el-form-item__label { + text-align: left; + line-height: 42px; + } + } + .el-form-item__content { + line-height: 40px; + position: relative; + font-size: 14px; + } + .ip-input-container { + max-width: none !important; + } + .net-set { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 95%; + // .el-radio-button__inner { + // // color: #333333; + // border: none; + // } + .update-center { + height: 160px; + .spin-bg { + width: 70px; + height: 70px; + background: rgba(230, 230, 230, 1); + margin: 0 auto; + border-radius: 35px; + } + .line { + width: 180px; + height: 5px; + background: #e6e6e6; + border-radius: 5px; + margin: 5px auto; + } + .desc { + height: 20px; + line-height: 20px; + font-size: 14px; + color: rgba(161, 161, 161, 1); + margin-bottom: 10px; + } + .el-button { + width: 120px; + } + .el-button--small { + font-size: 14px; + } + } + .upload-center { + height: 340px; + + // margin: 0 auto; + .update-center { + height: 160px; + .spin-bg { + width: 70px; + height: 70px; + background: rgba(230, 230, 230, 1); + margin: 0 auto; + border-radius: 35px; + } + .line { + width: 180px; + height: 5px; + background: #e6e6e6; + border-radius: 5px; + margin: 5px auto; + } + .desc { + height: 20px; + line-height: 20px; + font-size: 14px; + color: rgba(161, 161, 161, 1); + margin-bottom: 10px; + } + .el-button { + width: 120px; + } + .el-button--small { + font-size: 14px; + } + } + .top { + display: flex; + justify-content: space-evenly; + align-items: center; + background: rgba(248, 248, 248, 1); + box-sizing: border-box; + padding: 8px 10px; + border-radius: 8px; + .el-input--small .el-input__inner { + border: none; + } + .uploader-btn { + padding: 6px 8px; + .el-icon-upload2 { + font-size: 21px; + font-weight: 600; + } + } + } + .up-text { + height: 32px; + line-height: 32px; + font-size: 14px; + min-width: 105px; + margin-right: 5px; + } + .file-uploader { + width: 100%; + margin-right: 20px; + min-width: 150px; + } + } + .cur-version { + font-size: 14px; + } + } + .wifi { + .content { + margin-bottom: 20px; + } + .bar { + display: flex; + align-items: center; + height: 50px; + padding: 0 25px; + background-color: #f8f8f8; + justify-content: space-between; + border-radius: 12px; + margin-bottom: 10px; + .name { + font-size: 15px; + } + } + .title { + text-align: left; + padding: 10px; + font-size: 16px; + } + } + + .save-btn { + background-color: #3d68e1; + width: 240px; + height: 40px; + margin: 0 auto; + border-radius: 10px; + color: #fff; + line-height: 40px; + font-size: 14px; + margin-top: 20px; + } + } +} +</style> diff --git a/src/pages/systemSettings/index/App.vue b/src/pages/systemSettings/index/App.vue index b13a647..34950a2 100644 --- a/src/pages/systemSettings/index/App.vue +++ b/src/pages/systemSettings/index/App.vue @@ -22,6 +22,8 @@ class="account-card" v-for="(item, index) in accountArr" :key="index" + ref="account-card" + @click="openAccount(item, index)" > <div class="touxiang"> <img src="" alt="" /> @@ -64,14 +66,35 @@ v-if="activePage == '璐︽埛' || activePage == '鏃ユ湡鏃堕棿'" > <div class="account-right" v-if="activePage == '璐︽埛'"> - <div class="account-content" v-if="inAccountDetail == false"> + <div + class="account-content" + v-if="inAccountDetail == false && isAddAccount == false" + > <div class="content-top"> <div class="touxiang-big"></div> <div class="user-desc"> - <div class="username">椋炲埄娴�</div> + <div class="username"> + <span class="icon iconfont" style="margin-right: 5px" + ></span + > + + <span>椋炲埄娴�</span> + </div> <div class="nickname"> - <span>鍏斿厰</span> - <span class="icon iconfont"></span> + <span>鏄电О锛�</span> + <span v-show="!showInputNickName">{{ inputNickName }}</span> + <input + type="text" + class="input-nick" + ref="input-nick" + v-show="showInputNickName" + v-model="inputNickName" + @blur="hideInputNick" + @keydown.enter="hideInputNick" + /> + <span class="icon iconfont" @click="editNickName" + ></span + > </div> </div> </div> @@ -85,26 +108,38 @@ <div class="change-pw" v-if="inAccountDetail && isChangePw"> <div class="title">淇敼瀵嗙爜</div> - <div class="p-title">褰撳墠瀵嗙爜锛�</div> + <el-form + :model="passwordForm" + :rules="rules" + ref="passwordForm" + class="password-form" + > + <el-form-item> + <div class="p-title">褰撳墠瀵嗙爜锛�</div> - <el-input - placeholder="蹇呭~" - v-model="input1" - show-password - ></el-input> - <div class="p-title">鏂板瘑鐮侊細</div> - <el-input - placeholder="蹇呭~" - v-model="input2" - show-password - ></el-input> - <div class="p-title">纭瀵嗙爜锛�</div> - <el-input - placeholder="蹇呭~" - v-model="input3" - show-password - ></el-input> - + <el-input + placeholder="蹇呭~" + v-model="passwordForm.curPassword" + show-password + ></el-input> + </el-form-item> + <el-form-item> + <div class="p-title">鏂板瘑鐮侊細</div> + <el-input + placeholder="蹇呭~" + v-model="passwordForm.newPassword" + show-password + ></el-input> + </el-form-item> + <el-form-item> + <div class="p-title">纭瀵嗙爜锛�</div> + <el-input + placeholder="蹇呭~" + v-model="passwordForm.confirmPassword" + show-password + ></el-input> + </el-form-item> + </el-form> <div class="btns"> <div class="cancel" @click="cancelChangePassword">鍙栨秷</div> <div class="ok">淇濆瓨</div> @@ -142,7 +177,7 @@ </div> </div> - <div class="add-account-page" v-if="inAccountDetail && isAddAccount"> + <div class="add-account-page" v-if="isAddAccount"> <div class="title">娣诲姞璐︽埛</div> <div class="upload-group"> <div @@ -150,7 +185,7 @@ v-for="(item, index) in jpgArr" :key="index" ></div> - <div + <!-- <div class="upload-jpg" style="height: 0px; visibility: hidden" ></div> @@ -165,33 +200,47 @@ <div class="upload-jpg" style="height: 0px; visibility: hidden" - ></div> + ></div> --> </div> <div class="fill-group"> - <div class="p-title">鐢ㄦ埛鍚嶏細</div> - <el-input - placeholder="蹇呭~" - v-model="input1" - show-password - ></el-input> - <div class="p-title">鏄电О</div> - <el-input - placeholder="閫夊~" - v-model="input2" - show-password - ></el-input> - <div class="p-title">瀵嗙爜锛�</div> - <el-input - placeholder="蹇呭~" - v-model="input3" - show-password - ></el-input> - <div class="p-title">纭瀵嗙爜锛�</div> - <el-input - placeholder="蹇呭~" - v-model="input3" - show-password - ></el-input> + <el-form + :model="addForm" + :rules="rules" + ref="addForm" + class="add-form" + > + <el-form-item> + <div class="p-title">鐢ㄦ埛鍚嶏細</div> + + <el-input + placeholder="蹇呭~" + v-model="addForm.userName" + ></el-input> + </el-form-item> + <el-form-item> + <div class="p-title">鏄电О锛�</div> + <el-input + placeholder="蹇呭~" + v-model="addForm.nickName" + ></el-input> + </el-form-item> + <el-form-item> + <div class="p-title">瀵嗙爜锛�</div> + <el-input + placeholder="蹇呭~" + v-model="addForm.password" + show-password + ></el-input> + </el-form-item> + <el-form-item> + <div class="p-title">纭瀵嗙爜锛�</div> + <el-input + placeholder="蹇呭~" + v-model="addForm.confirmPassword" + show-password + ></el-input> + </el-form-item> + </el-form> </div> <div class="btns"> <div class="cancel" @click="cancelAdd">鍙栨秷</div> @@ -337,31 +386,39 @@ </div> <div class="adjust-bar"> <div class="minus" @click="minusOne('mth')">-</div> - <div class="middle"> - - <span v-show="!showMonthInput">{{ syncMonth }}</span> + <div class="middle" @click="showInput('Month')"> + <span v-show="!showMonthInput">{{ syncMonth }}</span> <input class="input-box" v-show="showMonthInput" - ref="iptYrs" - oninput="value=value.replace(/[^\d]/g,'');if(value.length>4)value=value.slice(0,4);" + ref="iptMonth" + oninput="value=value.replace(/[^\d]/g,'');if(value.length>2)value=value.slice(0,2);if(+value>12)value='12'" type="text" v-model="inputMonth" @blur="hideInput('Month')" @keydown.enter="hideInput('Month')" /> 鏈� - - </div> - - <div class="plus" @click="plusOne('mth')">+</div> </div> <div class="adjust-bar"> <div class="minus" @click="minusOne('day')">-</div> - <div class="middle">{{ syncDay }} 鏃�</div> + <div class="middle" @click="showInput('Day')"> + <span v-show="!showDayInput">{{ syncDay }}</span> + <input + class="input-box" + v-show="showDayInput" + ref="iptDay" + oninput="value=value.replace(/[^\d]/g,'');if(value.length>2)value=value.slice(0,2);if(+value>31)value='31'" + type="text" + v-model="inputDay" + @blur="hideInput('Day')" + @keydown.enter="hideInput('Day')" + /> + 鏃� + </div> <div class="plus" @click="plusOne('day')">+</div> </div> </div> @@ -437,10 +494,13 @@ browserTimer: null, timezone: "", isRealtime: false, + inputNickName: "鍏斿厰", showHourInput: false, showMinInput: false, showSecInput: false, showYrsInput: false, + showMonthInput: false, + showDayInput: false, timestamp: 0, inAccountDetail: false, @@ -473,6 +533,21 @@ inputMin: "", inputSec: "", inputYrs: "", + showInputNickName: false, + inputMonth: "", + inputDay: "", + passwordForm: { + curPassword: "", + newPassword: "", + confirmPassword: "", + }, + activeAccount: 0, + addForm: { + userName: "", + nickName: "", + password: "", + confirmPassword: "", + }, }; }, beforeDestroy() { @@ -490,6 +565,22 @@ }); }, methods: { + editNickName() { + this.showInputNickName = true; + this.$refs["input-nick"].focus(); + }, + hideInputNick() { + this.showInputNickName = false; + }, + openAccount(item, i) { + this.$refs[`account-card`].forEach((x) => { + x.style.backgroundColor = "rgba(248, 248, 248, 1)"; + x.style.color = "#2c3e50"; + }); + this.$refs[`account-card`][i].style.backgroundColor = + "rgba(61, 104, 225, 1)"; + this.$refs[`account-card`][i].style.color = "#fff"; + }, minusOne(typ) { this.isSyncBrowser = false; this.syncBrowser(false); @@ -602,6 +693,7 @@ } }, submitClock() { + debugger; if (this.syncType === "1") { if (this.ntpServer === "") { this.$notify({ @@ -612,7 +704,7 @@ } else if (this.timeInterval === "") { this.timeInterval = 1; } - } else { + } else if (this.isSyncBrowser) { if (this.settime === "") { this.$notify({ type: "error", @@ -620,6 +712,8 @@ }); return false; } + } else { + this.settime = `${this.syncYrs}-${this.syncMonth}-${this.syncDay} ${this.syncHour}:${this.syncMin}:${this.syncSec}`; } let requestBody = { timeZone: this.timezone, @@ -727,7 +821,7 @@ }, openChangePw() {}, showAddAccount() { - this.inAccountDetail = true; + this.inAccountDetail = false; this.isAddAccount = true; }, cancelAdd() { @@ -803,11 +897,9 @@ this.isNtp = !v; v && (this.syncType = "2"); if (v) { - [ - this.syncYrs, - this.syncMonth, - this.syncDay, - ] = this.equipmentDate.split("-"); + [this.syncYrs, this.syncMonth, this.syncDay] = this.equipmentDate.split( + "-" + ); [this.syncHour, this.syncMin, this.syncSec] = this.equipmentTime.split( ":" ); @@ -867,32 +959,38 @@ border-right: 5px solid rgba(248, 248, 248, 1); box-sizing: border-box; .account-left { - .account-list { - height: 530px; - } + .add-account { color: rgba(61, 104, 225, 1); + margin-top: 50px; + .iconfont { cursor: pointer; - font-size: 30px; + font-size: 32px; } } .account-card { - height: 40px; - background-color: goldenrod; + height: 50px; + background-color: rgba(248, 248, 248, 1); margin-bottom: 10px; display: flex; align-items: center; padding: 0 20px; + box-sizing: border-box; + border-radius: 10px; + cursor: pointer; .touxiang { - height: 30px; - width: 30px; - background-color: green; + height: 35px; + width: 35px; + background-color: bisque; + border-radius: 17.5px; } .user-name { margin-left: 10px; + font-size: 14px; } } + } .datetime-left { .time-card { @@ -953,28 +1051,46 @@ .account-right { .account-content { .content-top { - height: 150px; - background-color: antiquewhite; + height: 120px; + width: 350px; + margin: 0 auto; display: flex; align-items: center; justify-content: center; + margin-bottom: 20px; .touxiang-big { width: 100px; height: 100px; - background-color: indigo; + background-color: bisque; + border-radius: 50px; } .user-desc { - background-color: khaki; height: 100px; - width: 150px; display: flex; flex-direction: column; align-items: baseline; + min-width: 200px; .username { margin: 5px 15px; + height: 30px; + line-height: 30px; + width: 90px; + text-align: left; + font-size: 15px; + display: flex; + align-items: center; } .nickname { margin: 5px 15px; + font-size: 14px; + .input-nick { + width: 50px; + margin-right: 5px; + } + .iconfont { + font-size: 14px; + margin-left: 5px; + } } } } @@ -985,15 +1101,56 @@ align-items: center; .item-btn { width: 500px; - height: 50px; - background-color: rgba(240, 240, 240, 1); - margin-bottom: 10px; + height: 45px; + background-color: #f0f0f0; + margin-bottom: 15px; + border-radius: 10px; + line-height: 45px; + font-size: 15px; + cursor: pointer; + } + .item-btn:hover { + color: rgba(255, 153, 102, 1); } } + } + .title { + height: 30px; + line-height: 30px; + /* background-color: aliceblue; */ + margin-bottom: 10px; + font-size: 16px; + font-weight: 600; } .change-pw { .p-title { text-align: left; + font-size: 15px; + margin-top: 5px; + } + } + .el-form-item { + margin-bottom: 0; + .el-input__inner { + background-color: rgba(240, 240, 240, 1); + border: none; + border-radius: 12px; + height: 45px; + padding: 0 20px; + font-size: 15px; + } + .el-input__clear { + color: dimgray; + font-size: 17px; + line-height: 45px; + } + .el-input__suffix { + right: 1px; + top: -0.5px; + width: 45px; + // background-color: rgba(61, 104, 225, 1); + /* color: white; */ + border-radius: 12px; } } .permission { @@ -1013,17 +1170,21 @@ } .add-account-page { - background-color: lightcyan; - padding: 10px 50px; + // background-color: lightcyan; + // padding: 10px 50px; .upload-group { - background-color: lightgrey; - height: 100px; - display: flex; + height: 120px; + width: 350px; + margin: 0 auto; + overflow: hidden; .upload-jpg { - height: 40px; - width: 40px; - background-color: lightcoral; + height: 50px; + width: 50px; + float: left; + margin: 0 10px; + background-color: antiquewhite; margin-bottom: 20px; + border-radius: 25px; } } .fill-group { @@ -1219,18 +1380,18 @@ .middle { font-size: 14px; } - .input-box { - width: 80px; - border: none; - border-radius: 5px; - height: 25px; - font-size: 18px; - text-align: center; - } + .input-box { + width: 80px; + border: none; + border-radius: 5px; + height: 25px; + font-size: 18px; + text-align: center; + } - .input-box:focus { - outline: none; - } + .input-box:focus { + outline: none; + } .minus { width: 50px; height: 50px; @@ -1257,12 +1418,12 @@ .btns { display: flex; justify-content: space-between; - margin-top: 200px; + margin-top: 20px; .cancel { height: 40px; width: 48%; - + cursor: pointer; border-radius: 8px; background-color: rgba(240, 240, 240, 1); line-height: 40px; @@ -1271,7 +1432,7 @@ .ok { height: 40px; width: 48%; - + cursor: pointer; border-radius: 8px; background-color: rgba(61, 104, 225, 1); color: #fff; diff --git a/src/pages/systemSettings/views/NetSettings.vue b/src/pages/systemSettings/views/NetSettings.vue index b2e0eac..246006a 100644 --- a/src/pages/systemSettings/views/NetSettings.vue +++ b/src/pages/systemSettings/views/NetSettings.vue @@ -428,12 +428,13 @@ box-sizing: border-box; .cluster-center { height: 100%; - width: 260px; + width: 280px; overflow: auto; box-sizing: border-box; flex-shrink: 0; - padding: 10px; - background-color: lavender; + padding: 10px; border-right: 5px solid #f8f8f8; + + // background-color: lavender; .menu-item { background-color: #f8f8f8; height: 40px; diff --git a/src/pages/systemSettings/views/clusterManagement.vue b/src/pages/systemSettings/views/clusterManagement.vue index 89b4dc2..dbd06bf 100644 --- a/src/pages/systemSettings/views/clusterManagement.vue +++ b/src/pages/systemSettings/views/clusterManagement.vue @@ -594,12 +594,12 @@ box-sizing: border-box; .cluster-center { height: 100%; - width: 260px; + width: 280px; overflow: auto; box-sizing: border-box; flex-shrink: 0; padding: 10px; - background-color: lightpink; + // background-color: lightpink; .menu-item { background-color: #f8f8f8; height: 40px; diff --git a/src/pages/systemSettings/views/generalSettings.vue b/src/pages/systemSettings/views/generalSettings.vue index b07b8b5..7507fbc 100644 --- a/src/pages/systemSettings/views/generalSettings.vue +++ b/src/pages/systemSettings/views/generalSettings.vue @@ -16,54 +16,100 @@ <div class="lang" v-if="activePage == 'basic'"> <div class="bar" v-for="(item, i) in basioInfoList" :key="i"> <span class="name">{{ item.name }}</span> - <span class="name">{{ item.desc }}</span> + <span class="desc">{{ item.desc }}</span> </div> </div> <div class="lang" v-if="activePage == 'video'"> <div class="min-dur"> <div class="title">瑙嗛鎴彇鏈�鐭椂闀�</div> <div class="entity"> - <div class="sec">{{ alarmConf.min_video_len }} s</div> + <div class="sec">{{ alarmConf.min_video_len }}s</div> <div class="block"> <el-slider v-model="alarmConf.min_video_len" + id="cut_min_duration" :min="0" :max="100" - show-input + :show-tooltip="false" > </el-slider> </div> + <el-input-number + v-model="alarmConf.min_video_len" + controls-position="right" + :min="0" + :max="100" + size="mini" + ></el-input-number> s </div> </div> <div class="min-dur"> <div class="title">瑙嗛鎴彇鏈�闀挎椂闀�</div> <div class="entity"> - <div class="sec">{{ alarmConf.max_video_len }} s</div> + <div class="sec">{{ alarmConf.max_video_len }}s</div> <div class="block"> <el-slider v-model="alarmConf.max_video_len" + id="cut_max_duration" :min="0" :max="100" - show-input + :show-tooltip="false" > </el-slider> </div> + <el-input-number + v-model="alarmConf.max_video_len" + controls-position="right" + :min="0" + :max="100" + size="mini" + ></el-input-number> s </div> </div> + + <div class="save-btn" @click="submitAlarm">淇濆瓨</div> </div> <div class="lang" v-if="activePage == 'sound'"> - <div class="title">浜嬩欢澹伴煶</div> - <div class="bar" v-for="(item, i) in keyboardList" :key="i"> - <span class="name"> - <span class="icon iconfont"></span>{{ item.name }}</span - > + <div class="title">浜嬩欢澹伴煶</div> + <div + class="bar" + v-for="(item, i) in soundList" + :key="i" + @click="clickSound(item, i)" + ref="soundBar" + > + <div class="left-part"> + <span class="icon iconfont"></span> + <span class="name"> {{ item.name }}</span> + </div> <div class="btns"> <span class="icon iconfont"></span> <span class="icon iconfont"></span> </div> </div> + <div class="add-group"> + <el-upload + class="upload-demo" + drag + action="https://jsonplaceholder.typicode.com/posts/" + multiple + v-show="showUpload" + > + <i class="el-icon-upload"></i> + <div class="el-upload__text"> + 浜嬩欢澹伴煶鏂囦欢鎷栧埌姝ゅ锛屾垨<em>鐐瑰嚮涓婁紶</em> <br /> + 浠呮敮鎸乵p3/wma绛夋牸寮� + </div> + </el-upload> + <div v-show="!showUpload" +></div> + <div class="add-btn"> + <span class="icon iconfont" @click="showUpload=!showUpload"></span> + </div> + + </div> </div> </div> </div> @@ -71,22 +117,8 @@ </template> <script> -import { - createSerfCluster, - randomPwd, - search, - getSearchNodes, - stopSearching, - findCluster, - updateClusterName, - joinCluster, - leave, - getVrrp, - setVrrp, - createESNode, - addESNode, - getEsClusterInfo, -} from "@/api/clusterManage"; +import { saveAlarmConfig } from "@/api/system"; + import cloudNode from "../components/CloudNode"; import ipInput from "@/components/subComponents/IPInput"; import { isIPv4 } from "@/scripts/validate"; @@ -123,6 +155,7 @@ isOpenWifi: false, inWireDetail: false, wireForm: {}, + showUpload:false, alarmConf: { min_video_len: 0, max_video_len: 0, @@ -132,7 +165,7 @@ { name: "鑻辨枃", desc: "fesF" }, { name: "绻佷綋涓枃锛堥娓級", desc: "fesF" }, ], - keyboardList: [{ name: "Hanyu Pinyin(algtr)" }, { name: "ENG" }], + soundList: [{ name: "2.mp3" }, { name: "3.mp3" }], wireFormRules: {}, activePage: "basic", @@ -177,6 +210,23 @@ checkWire(item) { this.inWireDetail = true; }, + clickSound(item, i) { + this.$refs["soundBar"].forEach((x) => { + x.style.backgroundColor = "rgba(248, 248, 248, 1)"; + }); + this.$refs["soundBar"][i].style.backgroundColor = + "rgba(233, 233, 233, 1)"; + }, + submitAlarm() { + saveAlarmConfig(this.alarmConf).then((res) => { + if (res && res.success) { + this.$notify({ + type: "success", + message: "淇濆瓨鎴愬姛", + }); + } + }); + }, }, }; </script> @@ -194,12 +244,14 @@ box-sizing: border-box; .cluster-center { height: 100%; - width: 260px; + width: 280px; overflow: auto; box-sizing: border-box; flex-shrink: 0; padding: 10px; - background-color: lavender; + border-right: 5px solid #f8f8f8; + + // background-color: lavender; .menu-item { background-color: #f8f8f8; height: 40px; @@ -254,32 +306,88 @@ max-width: none !important; } .lang { + .title { + height: 35px; + line-height: 35px; + font-size: 16px; + text-align: left; + margin-bottom: 5px; + } .bar { height: 50px; - background-color: aliceblue; + background-color: rgba(248, 248, 248, 1); border-radius: 10px; line-height: 50px; box-sizing: border-box; - padding: 0 20px; + padding: 0 30px 0 20px; display: flex; justify-content: space-between; margin-bottom: 10px; + cursor: pointer; + .left-part { + .icon { + color: rgba(191, 191, 191, 1); + font-size: 16px; + margin-right: 5px; + } + } + .name { + font-size: 15px; + } + .btns { + width: 50px; + display: flex; + justify-content: space-between; + color: rgba(191, 191, 191, 1); + } + .desc { + font-size: 14px; + color: rgba(134, 134, 134, 1); + } + } + .bar:hover { + background-color: rgba(233, 233, 233, 1); + } + .add-group{ + margin-top: 170px; + height: 235px; + display: flex; + flex-direction: column; + justify-content: space-between; + + } + .upload-demo { + .el-upload-dragger { + width: 290px; + } + } + .add-btn { + height: 40px; + line-height: 40px; + margin-top: 10px; + .icon { + font-size: 30px; + color: rgba(61, 104, 225, 1); + } } .min-dur { box-sizing: border-box; - padding: 0 10px; + padding: 0 20px; background-color: rgba(248, 248, 248, 1); - height: 100px; + height: 95px; margin-bottom: 20px; border-radius: 15px; .title { - height: 50px; - line-height: 50px; + height: 45px; + line-height: 45px; + text-align: left; box-sizing: border-box; - padding: 0 10px; + padding: 0 6px; + font-size: 14px; } } + .entity { display: flex; align-items: center; @@ -288,10 +396,47 @@ .sec { min-width: 30px; line-height: 80px; - margin-right: 15px; + margin-right: 10px; + color: rgba(120, 120, 120, 1); + font-size: 14px; } .block { - flex: auto; + flex: 1; + margin: 0 20px 0 6px; + } + .el-input-number--mini { + width: 80px; + } + .el-input-number.is-controls-right[class*="mini"] [class*="increase"], + .el-input-number.is-controls-right[class*="mini"] [class*="decrease"] { + width: 23px; + } + .el-input-number.is-controls-right .el-input__inner { + padding-left: 13px; + padding-right: 37px; + } + #cut_min_duration { + .el-slider__bar { + background-color: #3d68e1; + } + .el-slider__button-wrapper .el-tooltip { + width: 18px; + height: 18px; + border: 4px solid #3d68e1; + box-sizing: border-box; + } + } + + #cut_max_duration { + .el-slider__bar { + background-color: #ff9e6e; + } + .el-slider__button-wrapper .el-tooltip { + width: 18px; + height: 18px; + border: 4px solid #ff9e6e; + box-sizing: border-box; + } } } } diff --git a/src/pages/systemSettings/views/keyboardLanguage.vue b/src/pages/systemSettings/views/keyboardLanguage.vue index e916747..33cdca9 100644 --- a/src/pages/systemSettings/views/keyboardLanguage.vue +++ b/src/pages/systemSettings/views/keyboardLanguage.vue @@ -152,12 +152,13 @@ box-sizing: border-box; .cluster-center { height: 100%; - width: 260px; + width: 280px; overflow: auto; box-sizing: border-box; flex-shrink: 0; - padding: 10px; - background-color: lavender; + padding: 10px; border-right: 5px solid #f8f8f8; + + // background-color: lavender; .menu-item { background-color: #f8f8f8; height: 40px; diff --git a/src/pages/vindicate/index/App.vue b/src/pages/vindicate/index/App.vue index 7f0e417..33c3b3b 100644 --- a/src/pages/vindicate/index/App.vue +++ b/src/pages/vindicate/index/App.vue @@ -293,6 +293,7 @@ startTime: showStartTime, endTime: showEndTime } + debugger deleteDate(param).then(resp => { if (resp.success) { this.$message({ -- Gitblit v1.8.0