cac首页
@ -0,0 +1,8 @@
|
||||
# 开发环境配置
|
||||
ENV = 'development'
|
||||
|
||||
# 管理系统/开发环境
|
||||
VUE_APP_BASE_API = '/api'
|
||||
|
||||
# 路由懒加载
|
||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
@ -0,0 +1,5 @@
|
||||
# 生产环境配置
|
||||
ENV = 'production'
|
||||
|
||||
# 管理系统/生产环境
|
||||
VUE_APP_BASE_API = '/prod-api'
|
@ -0,0 +1,7 @@
|
||||
NODE_ENV = production
|
||||
|
||||
# 测试环境配置
|
||||
ENV = 'staging'
|
||||
|
||||
# 管理系统/测试环境
|
||||
VUE_APP_BASE_API = '/stage-api'
|
@ -0,0 +1,29 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
// es6: true,
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:vue/essential"
|
||||
],
|
||||
parserOptions: {
|
||||
parser: 'babel-eslint',
|
||||
sourceType: 'module'
|
||||
},
|
||||
"globals": {
|
||||
"Atomics": "readonly",
|
||||
"SharedArrayBuffer": "readonly",
|
||||
"process": true
|
||||
},
|
||||
"plugins": [
|
||||
"vue"
|
||||
],
|
||||
"parser": "vue-eslint-parser",
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
"no-unused-vars": 'off'
|
||||
}
|
||||
};
|
@ -1,11 +1,23 @@
|
||||
# ---> Vue
|
||||
# gitignore template for Vue.js projects
|
||||
#
|
||||
# Recommended template: Node.gitignore
|
||||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
|
||||
# TODO: where does this rule come from?
|
||||
docs/_book
|
||||
|
||||
# TODO: where does this rule come from?
|
||||
test/
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
@ -1,3 +1,24 @@
|
||||
# oldcac
|
||||
# my-project
|
||||
|
||||
cac首页
|
||||
## Project setup
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
### Compiles and hot-reloads for development
|
||||
```
|
||||
npm run serve
|
||||
```
|
||||
|
||||
### Compiles and minifies for production
|
||||
```
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Lints and fixes files
|
||||
```
|
||||
npm run lint
|
||||
```
|
||||
|
||||
### Customize configuration
|
||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
||||
|
@ -0,0 +1,15 @@
|
||||
module.exports = {
|
||||
"presets": [
|
||||
"@vue/app"
|
||||
],
|
||||
"plugins": [
|
||||
[
|
||||
"component",
|
||||
{
|
||||
"libraryName": "element-ui",
|
||||
"styleLibraryName": "theme-chalk"
|
||||
},
|
||||
"syntax-dynamic-import"
|
||||
]
|
||||
]
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset'
|
||||
]
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
const { run } = require('runjs')
|
||||
const chalk = require('chalk')
|
||||
const config = require('../vue.config.js')
|
||||
const rawArgv = process.argv.slice(2)
|
||||
const args = rawArgv.join(' ')
|
||||
|
||||
if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
|
||||
const report = rawArgv.includes('--report')
|
||||
|
||||
run(`vue-cli-service build ${args}`)
|
||||
|
||||
const port = 9526
|
||||
const publicPath = config.publicPath
|
||||
|
||||
var connect = require('connect')
|
||||
var serveStatic = require('serve-static')
|
||||
const app = connect()
|
||||
|
||||
app.use(
|
||||
publicPath,
|
||||
serveStatic('./dist', {
|
||||
index: ['index.html', '/']
|
||||
})
|
||||
)
|
||||
|
||||
app.listen(port, function () {
|
||||
console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`))
|
||||
if (report) {
|
||||
console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`))
|
||||
}
|
||||
|
||||
})
|
||||
} else {
|
||||
run(`vue-cli-service build ${args}`)
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
{
|
||||
"name": "my-project",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"lint": "vue-cli-service lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@smallwei/avue": "^2.8.23",
|
||||
"autoprefixer": "^8.0.0",
|
||||
"axios": "^0.23.0",
|
||||
"chromedriver": "^94.0.0",
|
||||
"core-js": "^3.6.5",
|
||||
"echarts": "^4.9.0",
|
||||
"element-ui": "^2.15.6",
|
||||
"js-cookie": "^3.0.1",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"node-sass": "^4.14.1",
|
||||
"postcss-px-to-viewport": "^1.1.1",
|
||||
"script-ext-html-webpack-plugin": "^2.1.5",
|
||||
"vue": "^2.6.11",
|
||||
"vue-router": "^3.5.2",
|
||||
"vuex": "^3.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vue/cli-plugin-babel": "~4.5.0",
|
||||
"@vue/cli-plugin-eslint": "^4.5.14",
|
||||
"@vue/cli-service": "~4.5.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-plugin-vue": "^7.19.1",
|
||||
"sass-loader": "^7.3.1",
|
||||
"svg-sprite-loader": "^6.0.9",
|
||||
"vue-template-compiler": "^2.6.11"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
"plugins": [
|
||||
"example"
|
||||
],
|
||||
"env": {
|
||||
"example/custom": true
|
||||
},
|
||||
"extends": [
|
||||
"plugin:vue/essential",
|
||||
"eslint:recommended"
|
||||
],
|
||||
"parserOptions": {
|
||||
"parser": "babel-eslint"
|
||||
},
|
||||
"rules": {
|
||||
"generator-star-spacing": "off",
|
||||
"no-tabs": "off",
|
||||
"no-unused-vars": "off",
|
||||
"no-console": "off",
|
||||
"no-irregular-whitespace": "off",
|
||||
"no-debugger": "off"
|
||||
}
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not dead"
|
||||
],
|
||||
"postcss": {
|
||||
"plugins": {
|
||||
"autoprefixer": {},
|
||||
"postcss-px-to-viewport": {
|
||||
"viewportWidth": 1920,
|
||||
"minPixelValue": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 8.8 KiB |
@ -0,0 +1,28 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<title>欣影电力-抽水蓄能电站状态监测系统</title>
|
||||
<style>
|
||||
html,body{
|
||||
height: 100%;
|
||||
}
|
||||
@media screen and (max-width: 1440px) {
|
||||
html,body{
|
||||
height: auto;
|
||||
min-height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body style="margin: 0;overflow-x: hidden;">
|
||||
<noscript>
|
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,9 @@
|
||||
import request from '@/utils/request';
|
||||
export function queryCustomerInfos(query) {
|
||||
// 列表
|
||||
return request({
|
||||
url: '/web/xihari/customerInfo/queryCustomerInfos',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
@ -0,0 +1,214 @@
|
||||
import request from '@/utils/request';
|
||||
import { UPMS_SREVICE } from '@/api/module/urls'
|
||||
/**
|
||||
* 获取lxId
|
||||
*/
|
||||
export function getLxId(jgid,mtid) {
|
||||
return request({
|
||||
url: '/EquipController/queryLx/' + jgid + '/' + mtid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 获取EqmId
|
||||
*/
|
||||
export function getEqmId(jgid,lxid,mtid) {
|
||||
return request({
|
||||
url: '/EquipController/queryEqmId/' + jgid + '/' + lxid + '/' + mtid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
/**
|
||||
* 油色谱
|
||||
*/
|
||||
// 表格数据
|
||||
export function oilChromaControllerTable(eqmid) {
|
||||
return request({
|
||||
url: '/oilChromaController/queryTableData/' + eqmid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function oilChromaControllerLine(eqmid) {
|
||||
return request({
|
||||
url: '/oilChromaController/queryLineData/' + eqmid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 铁芯/夹件
|
||||
*/
|
||||
// 表格数据
|
||||
export function ironCoreJoinClampControllerTable({ ...idGather }) {
|
||||
return request({
|
||||
url: '/ironCoreJoinClampController/queryTableData/' + idGather.ironCoreId + '/' + idGather.clampId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function ironCoreJoinClampControllerLine({ ...idGather }) {
|
||||
return request({
|
||||
url: '/ironCoreJoinClampController/queryLineData/' + idGather.ironCoreId + '/' + idGather.clampId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 电缆环流
|
||||
*/
|
||||
// 表格数据
|
||||
export function cableCircleControllerTable(arr) {
|
||||
return request({
|
||||
url: '/cableCircleController/queryTableData/' + arr[0]+'/'+ arr[1]+'/'+ arr[2]+'/'+ arr[3]+'/'+ arr[4]+'/'+ arr[5],
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function cableCircleControllerLine(arr) {
|
||||
return request({
|
||||
url: '/cableCircleController/queryLineData/' + arr[0]+'/'+ arr[1]+'/'+ arr[2]+'/'+ arr[3]+'/'+ arr[4]+'/'+ arr[5],
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 红外
|
||||
*/
|
||||
// 表格数据
|
||||
export function InfraredThermographyControllerTable(arr) {
|
||||
return request({
|
||||
url: '/InfraredThermographyController/queryTableData/' + arr[0]+'/'+ arr[1]+'/'+ arr[2],
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function InfraredThermographyControllerLine(arr) {
|
||||
return request({
|
||||
url: '/InfraredThermographyController/queryLineData/' + arr[0]+'/'+ arr[1]+'/'+ arr[2],
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 局放
|
||||
*/
|
||||
// 表格数据
|
||||
export function CablePartialDischargeControllerTable(arr) {
|
||||
return request({
|
||||
url: '/cablePartialDischargeController/queryTableData/' + arr[0]+'/'+ arr[1]+'/'+ arr[2],
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function CablePartialDischargeControllerLine(arr) {
|
||||
return request({
|
||||
url: '/cablePartialDischargeController/queryLineData/' + arr[0]+'/'+ arr[1]+'/'+ arr[2],
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 监测装置
|
||||
*/
|
||||
|
||||
/**
|
||||
* GIS
|
||||
*/
|
||||
// 表格数据
|
||||
export function SF6ControllerTable(eqmid) {
|
||||
return request({
|
||||
url: '/SF6Controller/queryTableData/' + eqmid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function SF6ControllerLine(eqmid) {
|
||||
return request({
|
||||
url: '/SF6Controller/queryLineData/' + eqmid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 避雷器
|
||||
*/
|
||||
// 表格数据
|
||||
export function BlackBlqControllerTable(eqmid) {
|
||||
return request({
|
||||
url: '/BlqController/queryTableData/' + eqmid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 趋势图数据
|
||||
export function BlackBlqControllerLine(eqmid) {
|
||||
return request({
|
||||
url: '/BlqController/queryLineData/' + eqmid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 设备信息
|
||||
*/
|
||||
// 设备总数
|
||||
export function getEquNum() {
|
||||
return request({
|
||||
url: '/EquipController/queryEquipNum',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 告警详情
|
||||
*/
|
||||
// 变电设备类型
|
||||
export function getJgType() {
|
||||
return request({
|
||||
url: '/EquipController/queryJg',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 设备小类
|
||||
export function getLxType(jgid) {
|
||||
return request({
|
||||
url: '/EquipController/getLxType/' + jgid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 监测设备类型
|
||||
export function getEqType(jgid,lxid) {
|
||||
return request({
|
||||
url: '/EquipController/getEqType/' + jgid +'/'+ lxid,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 告警列表
|
||||
export function queryAlarm(params) {
|
||||
return request({
|
||||
url: '/cableCirculationController/page',
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 告警详情列表
|
||||
export function queryAlarmDetail(params) {
|
||||
return request({
|
||||
url: '/cableCirculationController/secondPage',
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
// 告警处理
|
||||
export function dealwarning(params) {
|
||||
return request({
|
||||
url: '/cableCirculationController/deal',
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
import request from '@/utils/request'
|
||||
import {
|
||||
UPMS_SREVICE,
|
||||
AUTH_SREVICE,
|
||||
SJZD_SREVICE
|
||||
} from '@/api/module/urls'
|
||||
|
||||
const client_id = 'web'
|
||||
const client_secret = '123456'
|
||||
const scope = 'server'
|
||||
|
||||
// 登录方法
|
||||
export function login(username, password, clienttype) {
|
||||
return request({
|
||||
url: '/login',
|
||||
method: 'post',
|
||||
params: {
|
||||
username,
|
||||
password,
|
||||
clienttype
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 刷新方法
|
||||
export function refreshToken() {
|
||||
return request({
|
||||
url: AUTH_SREVICE + '/auth/refresh',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
// 获取用户详细信息
|
||||
export function getInfo() {
|
||||
return request({
|
||||
url: UPMS_SREVICE + '/system/getInfo',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 退出方法
|
||||
export function logout() {
|
||||
return request({
|
||||
url: '/logout',
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 获取验证码
|
||||
export function getCodeImg() {
|
||||
return request({
|
||||
url: '/code',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
const UPMS_SREVICE='/api-upms';
|
||||
const AUTH_SREVICE='/prod-api';
|
||||
const LOGS_SREVICE='/api-logs';
|
||||
const GEN_CODE_SREVICE='/api-gen';
|
||||
const SJZD_SREVICE='http://127.0.0.1:8081';
|
||||
|
||||
|
||||
export { UPMS_SREVICE, AUTH_SREVICE, LOGS_SREVICE, GEN_CODE_SREVICE,SJZD_SREVICE}
|
@ -0,0 +1,9 @@
|
||||
import Vue from 'vue'
|
||||
import SvgIcon from '@/components/SvgIcon' // svg组件
|
||||
|
||||
// 注册到全局
|
||||
Vue.component('svg-icon', SvgIcon)
|
||||
|
||||
const requireAll = requireContext => requireContext.keys().map(requireContext)
|
||||
const req = require.context('./svg', false, /\.svg$/)
|
||||
requireAll(req)
|
@ -0,0 +1 @@
|
||||
<svg t="1634285040593" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="23714" width="120" height="120"><path d="M370.752 608L129.6 849.152a32 32 0 0 0 45.248 45.248L416 653.248V768a32 32 0 0 0 64 0v-192a31.904 31.904 0 0 0-32-32H256a32 32 0 0 0 0 64h114.752z m182.624-137.376A31.904 31.904 0 0 1 544 448V256a32 32 0 0 1 64 0v114.752l241.152-241.152a32 32 0 1 1 45.248 45.248L653.248 416H768a32 32 0 0 1 0 64h-192a31.904 31.904 0 0 1-22.624-9.376z" p-id="23715"></path></svg>
|
After Width: | Height: | Size: 518 B |
@ -0,0 +1 @@
|
||||
<svg t="1634285025582" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="23573" width="120" height="120"><path d="M818.752 160l-241.152 241.152a32 32 0 0 0 45.248 45.248L864 205.248V320a32 32 0 0 0 64 0V128a31.904 31.904 0 0 0-32-32h-192a32 32 0 0 0 0 64h114.752zM105.376 918.624A31.904 31.904 0 0 1 96 896v-192a32 32 0 0 1 64 0v114.752l241.152-241.152a32 32 0 0 1 45.248 45.248L205.248 864H320a32 32 0 0 1 0 64H128a31.904 31.904 0 0 1-22.624-9.376z" p-id="23574"></path></svg>
|
After Width: | Height: | Size: 519 B |
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575802846045" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2750" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M868.593046 403.832442c-30.081109-28.844955-70.037123-44.753273-112.624057-44.753273L265.949606 359.079168c-42.554188 0-82.510202 15.908318-112.469538 44.690852-30.236652 28.782533-46.857191 67.222007-46.857191 108.198258l0 294.079782c0 40.977273 16.619516 79.414701 46.702672 108.136859 29.959336 28.844955 70.069869 44.814672 112.624057 44.814672l490.019383 0c42.585911 0 82.696444-15.969717 112.624057-44.814672 30.082132-28.844955 46.579875-67.222007 46.579875-108.136859L915.172921 511.968278C915.171897 471.053426 898.675178 432.677397 868.593046 403.832442zM841.821309 806.049083c0 22.098297-8.882298 42.772152-25.099654 58.306964-16.154935 15.661701-37.81935 24.203238-60.752666 24.203238L265.949606 888.559285c-22.934339 0-44.567032-8.54256-60.877509-24.264637-16.186657-15.474436-25.067932-36.148291-25.067932-58.246589L180.004165 511.968278c0-22.035876 8.881274-42.772152 25.192775-58.307987 16.186657-15.536858 37.81935-24.139793 60.753689-24.139793l490.019383 0c22.933315 0 44.597731 8.602935 60.752666 24.139793 16.21838 15.535835 25.099654 36.272112 25.099654 58.307987L841.822332 806.049083zM510.974136 135.440715c114.914216 0 208.318536 89.75214 208.318536 200.055338l73.350588 0c0-149.113109-126.366036-270.496667-281.669124-270.496667-155.333788 0-281.699824 121.383558-281.699824 270.496667l73.350588 0C302.623877 225.193879 396.059919 135.440715 510.974136 135.440715zM474.299865 747.244792l73.350588 0L547.650453 629.576859l-73.350588 0L474.299865 747.244792z" p-id="2751"></path></svg>
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1 @@
|
||||
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
|
After Width: | Height: | Size: 440 B |
@ -0,0 +1,22 @@
|
||||
# replace default config
|
||||
|
||||
# multipass: true
|
||||
# full: true
|
||||
|
||||
plugins:
|
||||
|
||||
# - name
|
||||
#
|
||||
# or:
|
||||
# - name: false
|
||||
# - name: true
|
||||
#
|
||||
# or:
|
||||
# - name:
|
||||
# param1: 1
|
||||
# param2: 2
|
||||
|
||||
- removeAttrs:
|
||||
attrs:
|
||||
- 'fill'
|
||||
- 'fill-rule'
|
After Width: | Height: | Size: 476 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 1.8 MiB |
After Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 7.7 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 200 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,193 @@
|
||||
.iconSvg {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
border: 1px solid #03bcff;
|
||||
text-align: center;
|
||||
line-height: 20px;
|
||||
border-radius: 2px;
|
||||
.closeSvg {
|
||||
transform: rotate(-90deg);
|
||||
-webkit-transform: rotate(-90deg);
|
||||
-moz-transform: rotate(-90deg);
|
||||
-ms-transform: rotate(-90deg);
|
||||
}
|
||||
.svg {
|
||||
color: #03bcff;
|
||||
font-weight: bolder;
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
.pageCardTitle {
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 0px 60px 0px 20px;
|
||||
box-sizing: border-box;
|
||||
color: #03bcff;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: #08092419;
|
||||
box-shadow: inset 0px 4px 44px 0px #106cdeff;
|
||||
background-image: url('../../../assets/shrink.png');
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.pageCard .cardTitle {
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
padding: 0px 60px 0px 20px;
|
||||
box-sizing: border-box;
|
||||
color: #03bcff;
|
||||
text-align: left;
|
||||
display: flex;
|
||||
// font-size: 16px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.unfoldCloseIcon {
|
||||
font-size: 18px;
|
||||
color: #03bcff;
|
||||
font-weight: bolder;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.pageCard .cardContent {
|
||||
padding: 10px 60px 9px 20px;
|
||||
box-sizing: border-box;
|
||||
.project {
|
||||
height: 40px;
|
||||
margin-bottom: 11px;
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
flex-flow: column;
|
||||
span {
|
||||
height: 20px;
|
||||
line-height: 20px;
|
||||
}
|
||||
.projectVal {
|
||||
color: #03bcff;
|
||||
margin: 0;
|
||||
}
|
||||
.projectLable {
|
||||
color: #9eeeff;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
.cardDate {
|
||||
height: 25px;
|
||||
line-height: 25px;
|
||||
padding: 0 8px;
|
||||
box-sizing: border-box;
|
||||
border-left: 1px solid #03bcff;
|
||||
border-bottom: 1px solid #03bcff;
|
||||
border-right: 1px solid #03bcff;
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
text-align: left;
|
||||
}
|
||||
/* 修改标签页切换默认样式 */
|
||||
/deep/ .cardTab .el-tabs__nav {
|
||||
width: 100%;
|
||||
}
|
||||
/deep/ .cardTab .el-tabs__active-bar,
|
||||
/deep/ .cardTab .el-tabs__item {
|
||||
width: 20%;
|
||||
}
|
||||
/deep/ .cardTab .el-tabs__item {
|
||||
padding: 0 !important;
|
||||
color: #03bcff;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
/deep/ .cardTab .el-tabs__item.is-active {
|
||||
background: #ff8a00ff;
|
||||
color: #fff;
|
||||
}
|
||||
/deep/ .cardTab .el-tabs__nav-wrap {
|
||||
border: 1px solid #03bcff;
|
||||
margin-top: 10px;
|
||||
}
|
||||
/deep/ .cardTab .el-tabs__nav-wrap::after,
|
||||
/deep/ .cardTab .el-tabs__active-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.tendencyChartText {
|
||||
writing-mode: vertical-lr;
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
top: 15px;
|
||||
color: #fff;
|
||||
font-family: Source Han Sans SC;
|
||||
font-weight: regular;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
letter-spacing: 0px;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
}
|
||||
.backgroundTitle {
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.tabDropdown {
|
||||
height: 45px;
|
||||
line-height: 45px;
|
||||
ul {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
li {
|
||||
width: 140px;
|
||||
height: 34px;
|
||||
line-height: 34px;
|
||||
margin-right: 30px;
|
||||
list-style: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.el-dropdown-menu {
|
||||
background: #106cde;
|
||||
}
|
||||
.el-dropdown-menu__item {
|
||||
color: #fff;
|
||||
}
|
||||
.el-dropdown {
|
||||
color: #03bcff !important;
|
||||
font-size: 16px;
|
||||
// margin-left: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
// 设置滚动条的宽度
|
||||
/deep/ .el-table__body-wrapper::-webkit-scrollbar {
|
||||
width: 2px;
|
||||
height: 10px;
|
||||
}
|
||||
// 设置滚动条的背景色和圆角
|
||||
/deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb {
|
||||
background-color: #03bcff;
|
||||
border-radius: 8px;
|
||||
}
|
||||
// 表格不换行显示省略号
|
||||
/deep/ .el-table .el-table__body-wrapper .cell {
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
/deep/ .el-table__empty-text {
|
||||
color: #ffffff;
|
||||
}
|
||||
/deep/ .el-loading-mask {
|
||||
background-color: rgba(16, 108, 222, 0.3);
|
||||
}
|
||||
@media screen and (max-width: 1440px) {
|
||||
.cardTitle {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
<template>
|
||||
<div class="hello">
|
||||
<h1>{{ msg }}</h1>
|
||||
<p>
|
||||
For a guide and recipes on how to configure / customize this project,<br>
|
||||
check out the
|
||||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
|
||||
</p>
|
||||
<h3>Installed CLI Plugins</h3>
|
||||
<ul>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
|
||||
</ul>
|
||||
<h3>Essential Links</h3>
|
||||
<ul>
|
||||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
|
||||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
|
||||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
|
||||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
|
||||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
|
||||
</ul>
|
||||
<h3>Ecosystem</h3>
|
||||
<ul>
|
||||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
|
||||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
|
||||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
|
||||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
|
||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'HelloWorld',
|
||||
props: {
|
||||
msg: String
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||
<style scoped>
|
||||
h3 {
|
||||
margin: 40px 0 0;
|
||||
}
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
}
|
||||
a {
|
||||
color: #42b983;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,62 @@
|
||||
<template>
|
||||
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
|
||||
<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
|
||||
<use :xlink:href="iconName" />
|
||||
</svg>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
|
||||
import { isExternal } from '@/utils/validate'
|
||||
|
||||
export default {
|
||||
name: 'SvgIcon',
|
||||
props: {
|
||||
iconClass: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
className: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isExternal() {
|
||||
return isExternal(this.iconClass)
|
||||
},
|
||||
iconName() {
|
||||
return `#icon-${this.iconClass}`
|
||||
},
|
||||
svgClass() {
|
||||
if (this.className) {
|
||||
return 'svg-icon ' + this.className
|
||||
} else {
|
||||
return 'svg-icon'
|
||||
}
|
||||
},
|
||||
styleExternalIcon() {
|
||||
return {
|
||||
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
|
||||
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.svg-icon {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
vertical-align: -0.15em;
|
||||
fill: currentColor;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.svg-external-icon {
|
||||
background-color: currentColor;
|
||||
mask-size: cover!important;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,67 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-table
|
||||
:data="data"
|
||||
border
|
||||
style="width: 100%"
|
||||
:max-height="maxHeight"
|
||||
:resizable="false"
|
||||
v-loading="tableLoading"
|
||||
>
|
||||
<el-table-column
|
||||
v-for="(item, key) in option"
|
||||
:width="item.width"
|
||||
align="center"
|
||||
:key="key"
|
||||
:label="item.label"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip
|
||||
class="item"
|
||||
effect="dark"
|
||||
:content="scope.row[item.prop]"
|
||||
placement="top"
|
||||
>
|
||||
<span> {{ scope.row[item.prop] }}</span>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "Tablemodule",
|
||||
props: ["option", "data", "maxHeight",'tableLoading'],
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||
<style scoped rel="stylesheet/scss" lang="scss">
|
||||
/deep/.el-table,
|
||||
/deep/.el-table thead,
|
||||
/deep/.el-table tr,
|
||||
/deep/.el-table td.el-table__cell,
|
||||
/deep/.el-table th.el-table__cell.is-leaf {
|
||||
color: #03bcff !important;
|
||||
background: transparent !important;
|
||||
border-color: #03bcff !important;
|
||||
}
|
||||
/deep/.el-table::before,
|
||||
/deep/.el-table--border::after,
|
||||
/deep/.el-table--group::after {
|
||||
background-color: #03bcff;
|
||||
}
|
||||
/deep/.el-table td.el-table__cell,
|
||||
/deep/.el-table .el-table__cell {
|
||||
padding: 4px 0;
|
||||
}
|
||||
/deep/.el-table .cell,
|
||||
.el-table--border .el-table__cell:first-child .cell {
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
title: '电缆环流',
|
||||
logoTitle:'洪屛抽水蓄能电站' || config.logoTitle,
|
||||
isSinglePlatform:true
|
||||
}
|
||||
|
@ -0,0 +1,34 @@
|
||||
// The Vue build version to load with the `import` command
|
||||
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
|
||||
import Vue from 'vue'
|
||||
import App from './App'
|
||||
import router from './router'
|
||||
import axios from 'axios'
|
||||
import ElementUI from 'element-ui'
|
||||
import 'element-ui/lib/theme-chalk/index.css'
|
||||
import myChart from "echarts";
|
||||
import Avue from '@smallwei/avue';
|
||||
import store from './store'
|
||||
import {GetUrlParam} from '@/utils/index.js'
|
||||
import Cookies from 'js-cookie'
|
||||
import './permission'
|
||||
import './assets/icons'
|
||||
import '@/utils/request.js';
|
||||
// import '@smallwei/avue/lib/index.css';
|
||||
// import './assets/icons/index'
|
||||
|
||||
GetUrlParam('token') && Cookies.set('Admin-Token', GetUrlParam('token'));
|
||||
GetUrlParam('token') && store.commit('SET_TOKEN', GetUrlParam('token'))
|
||||
|
||||
Vue.prototype.$ajax = axios
|
||||
Vue.use(Avue);
|
||||
Vue.prototype.$echarts = myChart;
|
||||
Vue.config.productionTip = false
|
||||
Vue.use(ElementUI)
|
||||
Vue.use(myChart)
|
||||
|
||||
new Vue({
|
||||
router,
|
||||
store,
|
||||
render: h => h(App)
|
||||
}).$mount("#app")
|
@ -0,0 +1,32 @@
|
||||
import router from "./router";
|
||||
import store from "./store";
|
||||
import { Message } from "element-ui";
|
||||
import NProgress from "nprogress";
|
||||
import "nprogress/nprogress.css";
|
||||
import { getToken } from "@/utils/auth";
|
||||
|
||||
NProgress.configure({ showSpinner: false });
|
||||
|
||||
const whiteList = ["/login", "/auth-redirect", "/bind", "/register"];
|
||||
|
||||
router.beforeEach((to, from, next) => {
|
||||
NProgress.start();
|
||||
if (getToken()) {
|
||||
next();
|
||||
NProgress.done();
|
||||
} else {
|
||||
if (whiteList.indexOf(to.path) !== -1) {
|
||||
// 在免登录白名单,直接进入
|
||||
next();
|
||||
} else {
|
||||
// next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
|
||||
next("login"); // 否则全部重定向到登录页
|
||||
NProgress.done();
|
||||
}
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
router.afterEach(() => {
|
||||
NProgress.done();
|
||||
});
|
@ -0,0 +1,25 @@
|
||||
import Vue from "vue";
|
||||
import Router from "vue-router";
|
||||
|
||||
Vue.use(Router);
|
||||
|
||||
// 公共路由
|
||||
export const constantRoutes = [
|
||||
{
|
||||
path: "/login",
|
||||
name: "login",
|
||||
component: () => import("@/view/login"),
|
||||
hidden: true,
|
||||
},
|
||||
{
|
||||
path: "/",
|
||||
component: () => import("@/view/home/home"),
|
||||
hidden: true,
|
||||
},
|
||||
];
|
||||
|
||||
export default new Router({
|
||||
// mode: 'history', // 去掉url中的#
|
||||
// scrollBehavior: () => ({ y: 0 }),
|
||||
routes: constantRoutes,
|
||||
});
|
@ -0,0 +1,7 @@
|
||||
const getters = {
|
||||
token: state => state.user.token,
|
||||
roles: state => state.user.roles,
|
||||
permissions: state => state.user.permissions,
|
||||
}
|
||||
export default getters
|
||||
|
@ -0,0 +1,13 @@
|
||||
import Vue from 'vue'
|
||||
import user from './modules/user'
|
||||
import getters from './getters'
|
||||
import Vuex from 'vuex'
|
||||
|
||||
Vue.use(Vuex)
|
||||
const store = new Vuex.Store({
|
||||
modules: {
|
||||
user
|
||||
},
|
||||
getters
|
||||
})
|
||||
export default store
|
@ -0,0 +1,89 @@
|
||||
import { login, logout,loginSjzd } from '@/api/login'
|
||||
import { getToken, setToken, removeToken } from '@/utils/auth'
|
||||
|
||||
const user = {
|
||||
state: {
|
||||
token: getToken(),
|
||||
name: '',
|
||||
avatar: '',
|
||||
roles: [],
|
||||
permissions: []
|
||||
},
|
||||
|
||||
mutations: {
|
||||
SET_TOKEN: (state, token) => {
|
||||
state.token = token
|
||||
},
|
||||
SET_NAME: (state, name) => {
|
||||
state.name = name
|
||||
},
|
||||
SET_AVATAR: (state, avatar) => {
|
||||
state.avatar = avatar
|
||||
},
|
||||
SET_ROLES: (state, roles) => {
|
||||
state.roles = roles
|
||||
},
|
||||
SET_PERMISSIONS: (state, permissions) => {
|
||||
state.permissions = permissions
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
// 登录
|
||||
Login({ commit }, userInfo) {
|
||||
const username = userInfo.username.trim()
|
||||
const password = userInfo.password
|
||||
const code = userInfo.code
|
||||
const uuid = userInfo.uuid
|
||||
return new Promise((resolve, reject) => {
|
||||
login(username, password, code, uuid).then(res => {
|
||||
setToken(res.token)
|
||||
commit('SET_TOKEN', res.token)
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 退出系统
|
||||
LogOut({ commit, state }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
logout(state.token).then(() => {
|
||||
commit('SET_TOKEN', '')
|
||||
commit('SET_ROLES', [])
|
||||
commit('SET_PERMISSIONS', [])
|
||||
removeToken()
|
||||
resolve()
|
||||
}).catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 前端 登出
|
||||
FedLogOut({ commit }) {
|
||||
return new Promise(resolve => {
|
||||
commit('SET_TOKEN', '')
|
||||
removeToken()
|
||||
resolve()
|
||||
})
|
||||
},
|
||||
|
||||
//登录声级振动
|
||||
async loginSjzd({ state, commit, dispatch }) {
|
||||
const userName = sessionStorage.getItem('userName');
|
||||
const password = '123456';
|
||||
loginSjzd({ userName, password }).then((res) => {
|
||||
if (res && res.code === 200) {
|
||||
//声级震动前端页面访问地址
|
||||
window.open('http://127.0.0.1:9528/login?token=' + res.token, '_blank')
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export default user
|
@ -0,0 +1,15 @@
|
||||
import Cookies from 'js-cookie'
|
||||
|
||||
const TokenKey = 'Admin-Token'
|
||||
|
||||
export function getToken() {
|
||||
return Cookies.get(TokenKey)
|
||||
}
|
||||
|
||||
export function setToken(token) {
|
||||
return Cookies.set(TokenKey, token)
|
||||
}
|
||||
|
||||
export function removeToken() {
|
||||
return Cookies.remove(TokenKey)
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
/**
|
||||
* echart 数据为null处理
|
||||
*/
|
||||
export function echartData(data) {
|
||||
var newData = data.map((ele, index) => {
|
||||
if (ele === null) {
|
||||
return '- -';
|
||||
}
|
||||
return Number(ele);
|
||||
});
|
||||
return newData;
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'401': '认证失败,无法访问系统资源',
|
||||
'403': '当前操作没有权限',
|
||||
'404': '访问资源不存在',
|
||||
'default': '系统未知错误,请反馈给管理员'
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
import JSEncrypt from 'jsencrypt/bin/jsencrypt'
|
||||
|
||||
// 密钥对生成 http://web.chacuo.net/netrsakeypair
|
||||
|
||||
const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
|
||||
'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
|
||||
|
||||
const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
|
||||
'7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
|
||||
'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
|
||||
'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
|
||||
'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
|
||||
'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
|
||||
'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
|
||||
'UP8iWi1Qw0Y='
|
||||
|
||||
// 加密
|
||||
export function encrypt(txt) {
|
||||
const encryptor = new JSEncrypt()
|
||||
encryptor.setPublicKey(publicKey) // 设置公钥
|
||||
return encryptor.encrypt(txt) // 对数据进行加密
|
||||
}
|
||||
|
||||
// 解密
|
||||
export function decrypt(txt) {
|
||||
const encryptor = new JSEncrypt()
|
||||
encryptor.setPrivateKey(privateKey) // 设置私钥
|
||||
return encryptor.decrypt(txt) // 对数据进行解密
|
||||
}
|
||||
|
@ -0,0 +1,7 @@
|
||||
/**
|
||||
* @param {string} path
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
export function isExternal(path) {
|
||||
return /^(https?:|mailto:|tel:)/.test(path)
|
||||
}
|
@ -0,0 +1,525 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="app-container">
|
||||
<div class="searh">
|
||||
<el-form ref="queryParams" :model="queryParams">
|
||||
<el-row>
|
||||
<el-col :md="6" :lg="6" :xl="6">
|
||||
<el-form-item
|
||||
label="变电设备类型"
|
||||
label-width="120px"
|
||||
prop="jcType"
|
||||
>
|
||||
<el-select
|
||||
size="small"
|
||||
v-model="queryParams.jcType"
|
||||
placeholder="请选择变电设备类型"
|
||||
@change="getLxType"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in jcOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :md="6" :lg="6" :xl="6">
|
||||
<el-form-item label="设备小类" label-width="120px" prop="lxType">
|
||||
<el-select
|
||||
size="small"
|
||||
v-model="queryParams.lxType"
|
||||
placeholder="请选择设备小类"
|
||||
@change="getEqType"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in lxOptions"
|
||||
:key="item.value"
|
||||
:label="item.zmc"
|
||||
:value="item.lxid"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :md="6" :lg="6" :xl="6">
|
||||
<el-form-item
|
||||
label="被监测设备"
|
||||
label-width="120px"
|
||||
prop="eqType"
|
||||
>
|
||||
<el-select
|
||||
size="small"
|
||||
v-model="queryParams.eqType"
|
||||
placeholder="请选择被监测设备"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in eqOptions"
|
||||
:key="item.value"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- <el-col :md="6" :lg="6" :xl="6">
|
||||
<el-form-item label="告警类型" label-width="120px" prop="status">
|
||||
<el-select
|
||||
size="small"
|
||||
v-model="queryParams.gjType"
|
||||
placeholder="请选择告警类型"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in gjOptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col> -->
|
||||
<el-col :md="6" :lg="6" :xl="6">
|
||||
<el-form-item
|
||||
label="报警时间"
|
||||
label-width="120px"
|
||||
prop="warningTime"
|
||||
>
|
||||
<el-date-picker
|
||||
size="small"
|
||||
v-model="queryParams.warningTime"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
>
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :md="6" :lg="6" :xl="6">
|
||||
<el-form-item style="margin-left: 120px">
|
||||
<div class="searhButtons">
|
||||
<el-button
|
||||
size="mini"
|
||||
icon="el-icon-search"
|
||||
type="primary"
|
||||
@click="onResearchClick()"
|
||||
>查询</el-button
|
||||
>
|
||||
<el-button
|
||||
size="mini"
|
||||
icon="el-icon-refresh"
|
||||
@click="resetSearchForm()"
|
||||
style="margin-left: 20px"
|
||||
>重置</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="dataTable">
|
||||
<avue-crud
|
||||
style="margin-top: 10px"
|
||||
:table-loading="loading"
|
||||
:option="option"
|
||||
:data="data"
|
||||
:page.sync="tablePage"
|
||||
@size-change="sizeChange"
|
||||
@current-change="currentChange"
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<!-- 左边按钮 -->
|
||||
<!-- :disabled="single" -->
|
||||
<template slot="menuLeft">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-notebook-2"
|
||||
size="mini"
|
||||
class="operationBut"
|
||||
@click.stop="batchProcessing()"
|
||||
>批量处理</el-button
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
class="operationBut"
|
||||
@click.stop="allRemove()"
|
||||
>一键清除</el-button
|
||||
>
|
||||
</template>
|
||||
<template slot-scope="scope" slot="menu">
|
||||
<el-button
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
size="small"
|
||||
@click.stop="batchProcessing(scope.row)"
|
||||
>处理</el-button
|
||||
>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</div>
|
||||
<!-- 批量处理警告 -->
|
||||
</div>
|
||||
<el-dialog
|
||||
:title="dialogTitle"
|
||||
:visible.sync="dialogOpen"
|
||||
width="40%"
|
||||
append-to-body
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item :label="processingPrompt" prop="cljg">
|
||||
<el-input v-model="form.cljg"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">处 理</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
getJgType,
|
||||
getLxType,
|
||||
getEqType,
|
||||
queryAlarmDetail,
|
||||
dealwarning,
|
||||
} from "@/api/home/home";
|
||||
export default {
|
||||
name: "userManagement",
|
||||
props: {
|
||||
tableData: Object,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
queryParams: {
|
||||
jcType: "",
|
||||
lxType: "",
|
||||
eqType: "",
|
||||
gjType: "",
|
||||
warningTime: "",
|
||||
},
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 选中的用户id
|
||||
selectIds: [],
|
||||
selectStatus: [],
|
||||
single: true,
|
||||
tablePage: {
|
||||
limit: 10,
|
||||
total: 0,
|
||||
page: 1,
|
||||
},
|
||||
page: {
|
||||
total: 0,
|
||||
limit: 1,
|
||||
page: 10,
|
||||
},
|
||||
// 遮罩层
|
||||
loading: false,
|
||||
// 弹出层标题
|
||||
dialogTitle: "告警单批处理",
|
||||
jcOptions: [],
|
||||
lxOptions: [],
|
||||
eqOptions: [],
|
||||
gjOptions: [],
|
||||
processingPrompt:'批处理结果',
|
||||
// 是否显示弹出层
|
||||
dialogOpen: false,
|
||||
rules: {
|
||||
cljg: [
|
||||
{ required: true, message: "不能为空", trigger: "blur" },
|
||||
],
|
||||
},
|
||||
// 表格数据
|
||||
data: [
|
||||
{
|
||||
toType: "1111",
|
||||
},
|
||||
],
|
||||
option: {
|
||||
title: "",
|
||||
border: true,
|
||||
emptyText: "暂无数据!",
|
||||
align: "center",
|
||||
menuAlign: "center",
|
||||
menuWidth: 200,
|
||||
menuTitle: "操作",
|
||||
menuType: "text",
|
||||
addBtn: false,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
refreshBtn: false,
|
||||
selection: false,
|
||||
column: [
|
||||
{
|
||||
label: "监测设备",
|
||||
prop: "deviceName",
|
||||
},
|
||||
{
|
||||
label: "阈值",
|
||||
prop: "threadval",
|
||||
},
|
||||
{
|
||||
label: "当前值",
|
||||
prop: "warningValue",
|
||||
},
|
||||
{
|
||||
label: "告警信息",
|
||||
prop: "warnDesc",
|
||||
},
|
||||
{
|
||||
label: "报警时间",
|
||||
prop: "warnTime",
|
||||
},
|
||||
],
|
||||
},
|
||||
toDept: "1",
|
||||
// 表格选中的数据
|
||||
selectData: {},
|
||||
queryData: {
|
||||
state: "1",
|
||||
startTime: "",
|
||||
jgid: "",
|
||||
lxid: "",
|
||||
mtid: "",
|
||||
endTime: "",
|
||||
eqmId: "",
|
||||
page: 1,
|
||||
limit: 10,
|
||||
},
|
||||
form: {
|
||||
process: "",
|
||||
id: "",
|
||||
state: "",
|
||||
},
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
tableData: function (value) {
|
||||
this.tablePage.total = value.total;
|
||||
this.data = value.records;
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.getJgType();
|
||||
},
|
||||
methods: {
|
||||
getJgType() {
|
||||
getJgType().then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
const obj = [];
|
||||
for (const key in data) {
|
||||
obj.push({
|
||||
label: key,
|
||||
value: data[key],
|
||||
});
|
||||
}
|
||||
this.jcOptions = obj;
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
});
|
||||
},
|
||||
getLxType() {
|
||||
getLxType(this.queryParams.jcType).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.queryParams.lxType = "";
|
||||
this.queryParams.eqType = "";
|
||||
this.lxOptions = data;
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
});
|
||||
},
|
||||
getEqType() {
|
||||
getEqType(this.queryParams.jcType, this.queryParams.lxType).then(
|
||||
(response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.queryParams.eqType = "";
|
||||
this.eqOptions = data;
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
// 点击查询
|
||||
getList() {
|
||||
queryAlarmDetail(this.queryData).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.data = data.records;
|
||||
this.tablePage.total = data.total;
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
});
|
||||
},
|
||||
// 重置条件搜索表单
|
||||
resetSearchForm() {
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs["queryParams"] !== undefined) {
|
||||
this.$refs["queryParams"].resetFields();
|
||||
}
|
||||
});
|
||||
},
|
||||
//搜索
|
||||
onResearchClick() {
|
||||
this.queryData.startTime = this.queryParams.warningTime
|
||||
? this.queryParams.warningTime[0]
|
||||
: "";
|
||||
this.queryData.endTime = this.queryParams.warningTime
|
||||
? this.queryParams.warningTime[1]
|
||||
: "";
|
||||
this.queryData.jgid = this.queryParams.jcType
|
||||
? this.queryParams.jcType
|
||||
: "";
|
||||
this.queryData.lxid = this.queryParams.lxType
|
||||
? this.queryParams.lxType
|
||||
: "";
|
||||
this.queryData.eqmId = this.queryParams.eqType
|
||||
? this.queryParams.eqType
|
||||
: "";
|
||||
this.getList();
|
||||
},
|
||||
// 批量处理
|
||||
batchProcessing(row) {
|
||||
this.dialogTitle=row?'告警处理':'告警批处理'
|
||||
this.processingPrompt=row?'处理结果':'批处理结果'
|
||||
this.rules.cljg[0].message=this.processingPrompt+'不能为空'
|
||||
this.dialogOpen = true;
|
||||
this.form.id = row.id;
|
||||
this.form.state = row.state;
|
||||
},
|
||||
// 一键清除
|
||||
allRemove() {
|
||||
this.$confirm("确定要处理当前所有的告警吗?", "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
})
|
||||
.then(() => {
|
||||
dealwarning(this.form).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.dialogOpen = false;
|
||||
this.$message.success("处理成功!");
|
||||
this.getList();
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(function () {});
|
||||
},
|
||||
handleSelectionChange(selection) {
|
||||
this.selectIds = selection.map((item) => item.noticeId);
|
||||
this.single = selection.length != 1;
|
||||
},
|
||||
/** 页码大小改变操作 */
|
||||
sizeChange(val) {
|
||||
this.tablePage.limit = 10;
|
||||
this.tablePage.page = val;
|
||||
this.getList();
|
||||
},
|
||||
/** 翻页操作 */
|
||||
currentChange(val) {
|
||||
this.queryData.page = val;
|
||||
this.getList();
|
||||
},
|
||||
// 批量处理
|
||||
submitForm() {
|
||||
this.$refs['form'].validate((valid) => {
|
||||
if(valid){
|
||||
dealwarning(this.form).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.dialogOpen = false;
|
||||
this.$message.success("处理成功!");
|
||||
this.getList();
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
cancel() {
|
||||
this.dialogOpen = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.dataTable {
|
||||
box-shadow: 0 0 5px 4px #e7e7e7;
|
||||
.operationBut {
|
||||
margin-right: 10px !important;
|
||||
}
|
||||
}
|
||||
.searh {
|
||||
background-color: #ffffff;
|
||||
padding: 20px 30px;
|
||||
box-sizing: border-box;
|
||||
margin-top: 20px;
|
||||
box-shadow: 0 0 5px 4px #e7e7e7;
|
||||
}
|
||||
.avue-crud__right {
|
||||
display: none;
|
||||
}
|
||||
.el-dialog__body {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
.el-select {
|
||||
width: 100%;
|
||||
}
|
||||
.el-form {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.el-dialog.is-fullscreen {
|
||||
background-color: rgb(240, 240, 240);
|
||||
}
|
||||
.el-dialog__header {
|
||||
background-color: #106cde;
|
||||
padding: 20px 30px !important;
|
||||
color: #ffffff;
|
||||
.el-dialog__title {
|
||||
color: #ffffff;
|
||||
}
|
||||
.el-dialog__headerbtn .el-dialog__close {
|
||||
color: #ffffff;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
.el-card__body {
|
||||
min-height: 500px;
|
||||
box-shadow: 0 0 5px 4px #e7e7e7;
|
||||
}
|
||||
.el-date-editor {
|
||||
width: 100% !important;
|
||||
}
|
||||
.el-table__empty-block {
|
||||
padding: 50px 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,176 @@
|
||||
<template>
|
||||
<div class="login">
|
||||
<!-- 1#主变 油色谱 -->
|
||||
<!-- 标题和内容 -->
|
||||
<div class="pageCardTitle" v-show="hideSwitchShow">
|
||||
<div><span>监测装置总数</span><span> | </span><span>{{ number.totalNum }}</span></div>
|
||||
<div class="iconSvg closeSvg" @click="changeStatus(true)">
|
||||
<svg-icon slot="prefix" icon-class="close" className="svg" />
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="pageCard backgroundTitle monitoringDevice"
|
||||
:style="'background-image:url(' + monitoringDevice + ');'"
|
||||
v-show="cardShow"
|
||||
>
|
||||
<div class="cardTitle">
|
||||
<div>
|
||||
<span>监测装置总数</span><span> | </span><span>{{ number.totalNum }}</span>
|
||||
</div>
|
||||
<div class="iconSvg" @click="changeStatus(false)">
|
||||
<svg-icon slot="prefix" icon-class="open" className="svg" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="cardContent">
|
||||
<Tablemodule
|
||||
:table-loading="loading"
|
||||
:option="tableData.column"
|
||||
:data="tableData.data"
|
||||
></Tablemodule>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getEquNum } from "@/api/home/home";
|
||||
// 左边
|
||||
import monitoringDevice from "@/assets/page_right/monitoringDevice.png";
|
||||
// 引入table组件
|
||||
import Tablemodule from "@/components/Tablemodule/index";
|
||||
export default {
|
||||
name: "Login",
|
||||
components: {
|
||||
Tablemodule,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
// 左边
|
||||
monitoringDevice: monitoringDevice,
|
||||
// 卡片显示与否
|
||||
cardShow: true,
|
||||
tabPosition: "bottom",
|
||||
// 开关状态
|
||||
switchValue: true,
|
||||
// 标题内容是否显示
|
||||
hideSwitchShow: false,
|
||||
pageCardTitle: "",
|
||||
tableData: {
|
||||
column: [
|
||||
{
|
||||
label: "主设备类型",
|
||||
prop: "type",
|
||||
},
|
||||
{
|
||||
label: "装置数量(个)",
|
||||
prop: "num",
|
||||
},
|
||||
],
|
||||
data: [
|
||||
{
|
||||
type: "变压器",
|
||||
num: '0',
|
||||
prop: "byqNum",
|
||||
},
|
||||
{
|
||||
type: "GIS",
|
||||
num: '0',
|
||||
prop: "gisNum",
|
||||
},
|
||||
{
|
||||
type: "避雷器",
|
||||
num: '0',
|
||||
prop: "blqNum",
|
||||
},
|
||||
{
|
||||
type: "开关柜",
|
||||
num: '0',
|
||||
prop: "cwNum",
|
||||
},
|
||||
{
|
||||
type: "电缆",
|
||||
num: '0',
|
||||
prop: "dlNum",
|
||||
},
|
||||
{
|
||||
type: "发电机",
|
||||
num: '0',
|
||||
prop: "otherNum",
|
||||
},
|
||||
],
|
||||
},
|
||||
samplingDate: "2021-10-11 15:15:30",
|
||||
number: {},
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getEquNum();
|
||||
},
|
||||
methods: {
|
||||
// 点击开关
|
||||
changeStatus: function ($event) {
|
||||
if (!$event) {
|
||||
this.cardShow = false;
|
||||
this.hideSwitchShow = true;
|
||||
this.switchValue = false;
|
||||
} else {
|
||||
this.cardShow = true;
|
||||
this.hideSwitchShow = false;
|
||||
this.switchValue = true;
|
||||
}
|
||||
},
|
||||
tendencyChartChange(type) {
|
||||
let unit = "mA";
|
||||
let legendData = ["铁芯泄露电流", "夹件泄漏电流"];
|
||||
let xAxisData = ["10-01", "10-02", "10-03", "10-04", "10-05", "10-06"];
|
||||
let seriesData = [
|
||||
{ name: "铁芯泄露电流", data: [10, 25, 2, 100, 59, 78, 36] },
|
||||
];
|
||||
this.$emit("dataDispose", unit, legendData, xAxisData, seriesData);
|
||||
},
|
||||
// 获取数量
|
||||
getEquNum() {
|
||||
this.loading=true
|
||||
getEquNum().then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
if (code === 200) {
|
||||
this.number = data;
|
||||
const arr = this.tableData.data;
|
||||
for (let index = 0; index < arr.length; index++) {
|
||||
const element = arr[index];
|
||||
for (const key in data) {
|
||||
if (element.prop === key) {
|
||||
arr[index].num = data[key].toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style rel="stylesheet/scss" lang="scss" scoped>
|
||||
@import "~@/assets/stylesheet/card";
|
||||
// 开光样式
|
||||
.pageCard {
|
||||
// min-height: 370px!important;
|
||||
.cardTitle {
|
||||
padding: 0px 30px 0px 20px;
|
||||
}
|
||||
.cardTitle span {
|
||||
// padding: 0 5px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
|
||||
.pageCard .cardContent {
|
||||
padding: 30px !important;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,326 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="app-container">
|
||||
<div class="searh">
|
||||
<el-form ref="queryParams" :model="queryParams">
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="报警时间" label-width="120px" prop="warningTime">
|
||||
<el-date-picker
|
||||
size="small"
|
||||
v-model="queryParams.warningTime"
|
||||
type="daterange"
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
>
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item style="margin-left: 120px">
|
||||
<div class="searhButtons">
|
||||
<el-button
|
||||
size="mini"
|
||||
icon="el-icon-search"
|
||||
type="primary"
|
||||
@click="onResearchClick()"
|
||||
>查询</el-button
|
||||
>
|
||||
<el-button
|
||||
size="mini"
|
||||
icon="el-icon-refresh"
|
||||
@click="resetSearchForm()"
|
||||
style="margin-left: 20px"
|
||||
>重置</el-button
|
||||
>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="dataTable">
|
||||
<avue-crud
|
||||
style="margin-top: 10px"
|
||||
:table-loading="loading"
|
||||
:option="option"
|
||||
:data="tableData"
|
||||
:page.sync="tablePage"
|
||||
@size-change="sizeChange"
|
||||
@current-change="currentChange"
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<!-- 左边按钮 -->
|
||||
<!-- :disabled="single" -->
|
||||
<template slot="menuLeft">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-notebook-2"
|
||||
size="mini"
|
||||
class="operationBut"
|
||||
@click.stop="batchProcessing()"
|
||||
>批量处理</el-button
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
class="operationBut"
|
||||
@click.stop="allRemove()"
|
||||
>一键清除</el-button
|
||||
>
|
||||
</template>
|
||||
<template slot-scope="scope" slot="menu">
|
||||
<el-button
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
size="small"
|
||||
@click.stop="batchProcessing(scope.row)"
|
||||
>处理</el-button
|
||||
>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</div>
|
||||
<!-- 批量处理警告 -->
|
||||
</div>
|
||||
<el-dialog
|
||||
:title="dialogTitle"
|
||||
:visible.sync="dialogOpen"
|
||||
width="40%"
|
||||
append-to-body
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="处理结果" prop="process">
|
||||
<el-input v-model="form.process"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">处 理</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {queryAlarmDetail,dealwarning} from "@/api/home/home";
|
||||
export default {
|
||||
name: "userManagement",
|
||||
props: {
|
||||
data: Object
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
queryParams: {
|
||||
jcType: "",
|
||||
gjType: "",
|
||||
warningTime: "",
|
||||
},
|
||||
form: {
|
||||
process: "",
|
||||
id : "",
|
||||
state : "",
|
||||
},
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 选中的用户id
|
||||
selectIds: [],
|
||||
selectStatus: [],
|
||||
single: true,
|
||||
tablePage: {
|
||||
limit: 10,
|
||||
total: 0,
|
||||
page: 1,
|
||||
},
|
||||
queryData:{
|
||||
state:"1",
|
||||
startTime:"",
|
||||
endTime:"",
|
||||
eqmId:"",
|
||||
page: 1,
|
||||
limit: 10,
|
||||
},
|
||||
// 遮罩层
|
||||
loading: false,
|
||||
// 弹出层标题
|
||||
dialogTitle: "告警单批处理",
|
||||
jcOptions: [],
|
||||
gjOptions: [],
|
||||
// 是否显示弹出层
|
||||
dialogOpen: false,
|
||||
rules: {
|
||||
cljg: [
|
||||
{ required: true, message: "处理结果不能为空", trigger: "blur" },
|
||||
],
|
||||
},
|
||||
option: {
|
||||
title: "",
|
||||
border: true,
|
||||
emptyText: "暂无数据!",
|
||||
align: "center",
|
||||
menuAlign: "center",
|
||||
menuWidth: 200,
|
||||
menuTitle: "操作",
|
||||
menuType: "text",
|
||||
addBtn: false,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
refreshBtn: false,
|
||||
selection: false,
|
||||
// multiple: false,
|
||||
column: [
|
||||
{
|
||||
label: "监测设备",
|
||||
prop: "deviceName",
|
||||
},
|
||||
{
|
||||
label: "阈值",
|
||||
prop: "threadval",
|
||||
},
|
||||
{
|
||||
label: "当前值",
|
||||
prop: "warningValue",
|
||||
},
|
||||
{
|
||||
label: "告警信息",
|
||||
prop: "warnDesc",
|
||||
},
|
||||
{
|
||||
label: "报警时间",
|
||||
prop: "warnTime",
|
||||
},
|
||||
],
|
||||
},
|
||||
toDept: "1",
|
||||
// 表格选中的数据
|
||||
selectData: {},
|
||||
tableData: [],
|
||||
};
|
||||
},
|
||||
watch:{
|
||||
data:function(value){
|
||||
this.tablePage.total=value.total
|
||||
this.tableData=value.records
|
||||
this.queryData.eqmId = value.records[0].eqmId
|
||||
}
|
||||
},
|
||||
created() {},
|
||||
methods: {
|
||||
onResearchClick(){
|
||||
this.queryData.startTime = this.queryParams.warningTime[0]
|
||||
this.queryData.endTime = this.queryParams.warningTime[1]
|
||||
this.getList()
|
||||
},
|
||||
getList(){
|
||||
queryAlarmDetail(this.queryData).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.tableData = data.records
|
||||
this.tablePage.total = data.total
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
})
|
||||
},
|
||||
// 重置条件搜索表单
|
||||
resetSearchForm() {
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs["queryParams"] !== undefined) {
|
||||
this.$refs["queryParams"].resetFields();
|
||||
}
|
||||
});
|
||||
},
|
||||
// 批量处理
|
||||
batchProcessing(row) {
|
||||
this.dialogOpen = true;
|
||||
this.form.id = row.id
|
||||
this.form.state = row.state
|
||||
},
|
||||
// 一键清除
|
||||
allRemove() {
|
||||
this.$confirm("确定要处理当前所有的告警吗?", "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
})
|
||||
.then(() => {
|
||||
dealwarning(this.form).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.dialogOpen = false
|
||||
this.$message.success('处理成功!')
|
||||
this.getList()
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(function () {});
|
||||
},
|
||||
handleSelectionChange(selection) {
|
||||
this.selectIds = selection.map((item) => item.noticeId);
|
||||
this.single = selection.length != 1;
|
||||
},
|
||||
/** 页码大小改变操作 */
|
||||
sizeChange(val) {
|
||||
this.tablePage.limit = 10;
|
||||
this.tablePage.page = val;
|
||||
this.getList();
|
||||
},
|
||||
/** 翻页操作 */
|
||||
currentChange(val) {
|
||||
// this.tablePage.page = val;
|
||||
this.queryData.page = val
|
||||
this.getList();
|
||||
},
|
||||
// 批量处理
|
||||
submitForm() {
|
||||
dealwarning(this.form).then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.dialogOpen = false
|
||||
this.$message.success('处理成功!')
|
||||
this.getList()
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
})
|
||||
},
|
||||
cancel() {
|
||||
this.dialogOpen = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.dataTable {
|
||||
.operationBut {
|
||||
margin-right: 10px !important;
|
||||
}
|
||||
}
|
||||
.avue-crud__right {
|
||||
display: none;
|
||||
}
|
||||
.el-dialog__body{
|
||||
padding: 0px 20px;
|
||||
}
|
||||
.el-select{
|
||||
width: 100%;
|
||||
}
|
||||
.el-form {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.el-table__empty-block {
|
||||
padding: 50px 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,187 @@
|
||||
<template>
|
||||
<div class="login">
|
||||
<!-- 1#主变 油色谱 -->
|
||||
<!-- 标题和内容 -->
|
||||
<div class="pageCardTitle" v-show="hideSwitchShow">
|
||||
{{ pageCardTitle }}
|
||||
<div class="iconSvg closeSvg" @click="changeStatus(true)">
|
||||
<svg-icon slot="prefix" icon-class="close" className="svg" />
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="pageCard backgroundTitle"
|
||||
:style="'background-image:url(' + clamp + ');'"
|
||||
v-show="cardShow"
|
||||
>
|
||||
<!-- tendencyChart文字标题 -->
|
||||
<div class="tendencyChartText" @click="tendencyChartChange()">趋势图</div>
|
||||
<!-- 标题和内容 -->
|
||||
<div class="cardTitle">
|
||||
{{ pageCardTitle }}
|
||||
<div class="iconSvg" @click="changeStatus(false)">
|
||||
<svg-icon slot="prefix" icon-class="open" className="svg" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="cardContent">
|
||||
<Tablemodule
|
||||
:table-loading="loading"
|
||||
:option="tableData.column"
|
||||
:data="tableData.data"
|
||||
></Tablemodule>
|
||||
<div class="cardTab">
|
||||
<el-tabs :tab-position="tabPosition" @tab-click="handleChangeChart">
|
||||
<el-tab-pane label="1#"></el-tab-pane>
|
||||
<el-tab-pane label="2#"></el-tab-pane>
|
||||
<el-tab-pane label="3#"></el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { oilChromaControllerTable,oilChromaControllerLine } from "@/api/home/home";
|
||||
// 左边
|
||||
import clamp from "@/assets/page_left/clamp.png";
|
||||
// 引入table组件
|
||||
import Tablemodule from "@/components/Tablemodule/index";
|
||||
export default {
|
||||
name: "Login",
|
||||
components: {
|
||||
Tablemodule,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
// 左边
|
||||
clamp: clamp,
|
||||
// 卡片显示与否
|
||||
cardShow: true,
|
||||
tabPosition: "bottom",
|
||||
// 开关状态
|
||||
switchValue: true,
|
||||
// 标题内容是否显示
|
||||
hideSwitchShow: false,
|
||||
tendencyChartTitle: "1#主变 绕阻测温",
|
||||
pageCardTitle: "1#主变 绕阻测温",
|
||||
tableData: {
|
||||
column: [
|
||||
{
|
||||
label: "相位",
|
||||
prop: "nodeCode",
|
||||
},
|
||||
{
|
||||
label: "温度",
|
||||
prop: "nodeCode",
|
||||
},
|
||||
],
|
||||
data: [],
|
||||
},
|
||||
samplingDate: "",
|
||||
egendData:[],
|
||||
xAxisData:[],
|
||||
seriesData:[]
|
||||
};
|
||||
},
|
||||
created() {
|
||||
// 表格数据
|
||||
// this.tableDatas()
|
||||
// // 趋势图数据
|
||||
// this.tendencyChartData()
|
||||
},
|
||||
methods: {
|
||||
tableDatas() {
|
||||
oilChromaControllerTable('237')
|
||||
.then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
this.data = data.records;
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
this.msgError(err.msg);
|
||||
});
|
||||
},
|
||||
tendencyChartData() {
|
||||
oilChromaControllerLine('237')
|
||||
.then((response) => {
|
||||
const { code, data, msg } = response;
|
||||
this.loading = false;
|
||||
if (code === 200) {
|
||||
for (let index = 0; index < data.length; index++) {
|
||||
const element = data[index];
|
||||
this.legendData.push(element.gas)
|
||||
this.seriesData.push({
|
||||
name:element.gas,
|
||||
data:element.currentVals
|
||||
})
|
||||
}
|
||||
this.xAxisData=data[0].dtimes
|
||||
} else {
|
||||
this.msgError(msg);
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
this.msgError(err.msg);
|
||||
});
|
||||
},
|
||||
// 点击标签页
|
||||
handleChangeChart(tab) {
|
||||
this.tendencyChartTitle = tab.label + "主变 绕阻测温";
|
||||
this.pageCardTitle= tab.label + "主变 绕阻测温";
|
||||
this.tendencyChartChange()
|
||||
},
|
||||
// 点击开关
|
||||
changeStatus: function ($event) {
|
||||
if (!$event) {
|
||||
this.cardShow = false;
|
||||
this.hideSwitchShow = true;
|
||||
this.switchValue = false;
|
||||
} else {
|
||||
this.cardShow = true;
|
||||
this.hideSwitchShow = false;
|
||||
this.switchValue = true;
|
||||
}
|
||||
},
|
||||
tendencyChartChange(type) {
|
||||
this.$emit(
|
||||
"dataDispose",
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
this.tendencyChartTitle
|
||||
);
|
||||
// let legendData = ["A项 温度"];
|
||||
// let xAxisData = ["10-01", "10-02", "10-03", "10-04", "10-05", "10-06"];
|
||||
// let seriesData = [
|
||||
// { name: "A项 温度", data: [10, 25, 2, 100, 59, 78, 36] },
|
||||
// ];
|
||||
// this.$emit("dataDispose", unit, this.legendData, this.xAxisData, this.seriesData,this.tendencyChartTitle);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style rel="stylesheet/scss" lang="scss" scoped>
|
||||
.backgroundTitle{
|
||||
margin-bottom: 0px!important
|
||||
}
|
||||
.backgroundTitle{
|
||||
margin-bottom: 0!important;
|
||||
}
|
||||
@import "~@/assets/stylesheet/card";
|
||||
// 开光样式
|
||||
/deep/ .el-table__empty-block {
|
||||
padding: 30px 0!important;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
@media screen and (max-width: 1440px){
|
||||
.pageCard .cardContent{
|
||||
padding-bottom:15px
|
||||
}
|
||||
}
|
||||
</style>
|
@ -0,0 +1,223 @@
|
||||
<template>
|
||||
<div class="login">
|
||||
<el-form
|
||||
ref="loginForm"
|
||||
:model="loginForm"
|
||||
:rules="loginRules"
|
||||
class="login-form"
|
||||
>
|
||||
<h3 class="title">用户登陆</h3>
|
||||
<el-form-item prop="username">
|
||||
<el-input
|
||||
v-model="loginForm.username"
|
||||
type="text"
|
||||
auto-complete="off"
|
||||
placeholder="账号"
|
||||
>
|
||||
<svg-icon
|
||||
slot="prefix"
|
||||
icon-class="user"
|
||||
class="el-input__icon input-icon"
|
||||
/>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="password">
|
||||
<el-input
|
||||
v-model="loginForm.password"
|
||||
type="password"
|
||||
auto-complete="off"
|
||||
placeholder="密码"
|
||||
@keyup.enter.native="handleLogin"
|
||||
show-password
|
||||
>
|
||||
<svg-icon
|
||||
slot="prefix"
|
||||
icon-class="password"
|
||||
class="el-input__icon input-icon"
|
||||
/>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-checkbox
|
||||
v-model="loginForm.rememberMe"
|
||||
style="margin:0px 0px 25px 0px;"
|
||||
>记住密码</el-checkbox
|
||||
>
|
||||
<el-form-item style="width:100%;">
|
||||
<el-button
|
||||
:loading="loading"
|
||||
size="medium"
|
||||
type="primary"
|
||||
style="width:100%;"
|
||||
@click.native.prevent="handleLogin"
|
||||
>
|
||||
<span v-if="!loading">登 录</span>
|
||||
<span v-else>登 录 中...</span>
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!-- 底部 -->
|
||||
<div class="el-login-footer">
|
||||
<span>Copyright © 2018-2019 ruoyi.vip All Rights Reserved.</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Cookies from "js-cookie";
|
||||
import { encrypt, decrypt } from "@/utils/jsencrypt";
|
||||
export default {
|
||||
name: "Login",
|
||||
data() {
|
||||
return {
|
||||
codeUrl: "",
|
||||
cookiePassword: "",
|
||||
loginForm: {
|
||||
username: "",
|
||||
password: "",
|
||||
rememberMe: false,
|
||||
},
|
||||
loginRules: {
|
||||
username: [
|
||||
{ required: true, trigger: "blur", message: "用户名不能为空" },
|
||||
],
|
||||
password: [
|
||||
{ required: true, trigger: "blur", message: "密码不能为空" },
|
||||
],
|
||||
},
|
||||
loading: false,
|
||||
redirect: undefined,
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
$route: {
|
||||
handler: function(route) {
|
||||
this.redirect = route.query && route.query.redirect;
|
||||
},
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
created() {
|
||||
Cookies.remove("Admin-Token");
|
||||
this.getCookie();
|
||||
},
|
||||
methods: {
|
||||
getCookie() {
|
||||
const username = Cookies.get("username");
|
||||
const password = decrypt(Cookies.get("password"));
|
||||
const rememberMe = Cookies.get("rememberMe");
|
||||
this.loginForm = {
|
||||
username: !username ? this.loginForm.username : username,
|
||||
password: !password ? this.loginForm.password : password,
|
||||
rememberMe: !rememberMe ? false : Boolean(rememberMe),
|
||||
};
|
||||
},
|
||||
handleLogin() {
|
||||
this.$refs.loginForm.validate((valid) => {
|
||||
// if (this.loginForm.password !== this.cookiePass) {
|
||||
// this.loginForm.password = encrypt(user.password)
|
||||
// }
|
||||
if (valid) {
|
||||
this.loading = true;
|
||||
if (this.loginForm.rememberMe) {
|
||||
Cookies.set("username", this.loginForm.username, { expires: 30 });
|
||||
Cookies.set("password", encrypt(this.loginForm.password), {
|
||||
expires: 30,
|
||||
});
|
||||
Cookies.set("rememberMe", this.loginForm.rememberMe, {
|
||||
expires: 30,
|
||||
});
|
||||
} else {
|
||||
Cookies.remove("username");
|
||||
Cookies.remove("password");
|
||||
Cookies.remove("rememberMe");
|
||||
}
|
||||
let user = {
|
||||
username: this.loginForm.username,
|
||||
rememberMe: this.loginForm.rememberMe,
|
||||
password: encrypt(this.loginForm.password),
|
||||
};
|
||||
this.$store
|
||||
.dispatch("Login", user)
|
||||
.then((res) => {
|
||||
sessionStorage.setItem("userName", this.loginForm.username);
|
||||
sessionStorage.setItem("password", user.password);
|
||||
console.log("登录信息==========", this.loginForm);
|
||||
this.$router.push({ path: this.redirect || "/" });
|
||||
this.loading = false;
|
||||
})
|
||||
.catch(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
} else {
|
||||
return this.$router.go(0);
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style rel="stylesheet/scss" lang="scss" scoped>
|
||||
.login {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
background-image: url("../assets/loginLeft.png");
|
||||
background-color: #1c92a0;
|
||||
background-size: cover;
|
||||
-webkit-background-size: cover;
|
||||
-o-background-size: cover;
|
||||
background-position: center 0;
|
||||
}
|
||||
.title {
|
||||
margin: 0px auto 30px auto;
|
||||
text-align: center;
|
||||
color: #707070;
|
||||
}
|
||||
.login-form {
|
||||
border-radius: 6px;
|
||||
background: #ffffff;
|
||||
width: 400px;
|
||||
margin-left: 50%;
|
||||
padding: 25px 25px 5px 25px;
|
||||
text-align: left;
|
||||
.el-input {
|
||||
height: 38px;
|
||||
input {
|
||||
height: 38px;
|
||||
}
|
||||
}
|
||||
.input-icon {
|
||||
height: 39px;
|
||||
width: 14px;
|
||||
margin-left: 2px;
|
||||
}
|
||||
}
|
||||
.login-tip {
|
||||
font-size: 13px;
|
||||
text-align: center;
|
||||
color: #bfbfbf;
|
||||
}
|
||||
.login-code {
|
||||
width: 33%;
|
||||
height: 38px;
|
||||
float: right;
|
||||
img {
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
.el-login-footer {
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
font-family: Arial;
|
||||
font-size: 12px;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,12 @@
|
||||
<script>
|
||||
export default {
|
||||
created() {
|
||||
const { params, query } = this.$route
|
||||
const { path } = params
|
||||
this.$router.replace({ path: '/' + path, query })
|
||||
},
|
||||
render: function(h) {
|
||||
return h() // avoid warning message
|
||||
}
|
||||
}
|
||||
</script>
|