Compare commits
19 Commits
8b72cc93a0
...
feature/vi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a5dbdbe778 | ||
|
|
cef8dad5f0 | ||
|
|
da8e8f0d65 | ||
|
|
e91d1f73dc | ||
|
|
d0e18eb2f6 | ||
|
|
82535aff40 | ||
|
|
65fb4ac65b | ||
|
|
93d0e0aafe | ||
|
|
1eb9c532f3 | ||
|
|
3174382666 | ||
|
|
92890111ee | ||
|
|
9b35506181 | ||
|
|
73f300cd7a | ||
|
|
2f79210970 | ||
|
|
8744f115cf | ||
|
|
2174909bb8 | ||
|
|
bd512c3caa | ||
|
|
861e7c688f | ||
|
|
4f0178c627 |
24
.gitignore
vendored
@@ -1,24 +1,28 @@
|
|||||||
.DS_Store
|
# Logs
|
||||||
node_modules
|
logs
|
||||||
/dist
|
*.log
|
||||||
|
|
||||||
# local env files
|
|
||||||
.env.local
|
|
||||||
.env.*.local
|
|
||||||
|
|
||||||
# Log files
|
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
.idea
|
.idea
|
||||||
.vscode
|
.DS_Store
|
||||||
*.suo
|
*.suo
|
||||||
*.ntvs*
|
*.ntvs*
|
||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
/package-lock.json
|
/package-lock.json
|
||||||
/lib
|
/lib
|
||||||
.prettierrc
|
.prettierrc
|
||||||
|
|||||||
13
.npmignore
@@ -1,13 +0,0 @@
|
|||||||
# 忽略目录
|
|
||||||
examples/
|
|
||||||
packages/
|
|
||||||
subPackages/
|
|
||||||
core/
|
|
||||||
public/
|
|
||||||
project/
|
|
||||||
.idea/
|
|
||||||
|
|
||||||
# 忽略指定文件
|
|
||||||
vue.config.js
|
|
||||||
babel.config.js
|
|
||||||
*.map
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: [
|
|
||||||
'@vue/app',
|
|
||||||
],
|
|
||||||
plugins: [
|
|
||||||
// 可选链插件, 其他babel插件也是一样的安装方式
|
|
||||||
"@babel/plugin-proposal-optional-chaining",
|
|
||||||
"@babel/plugin-proposal-nullish-coalescing-operator",
|
|
||||||
"@babel/plugin-proposal-logical-assignment-operators"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,6 @@ import store from './store';
|
|||||||
import dataV from '@jiaminghi/data-view';
|
import dataV from '@jiaminghi/data-view';
|
||||||
import dvui from '../project/dvui/entries'
|
import dvui from '../project/dvui/entries'
|
||||||
|
|
||||||
Vue.use(dataV);
|
|
||||||
Vue.use(ui);
|
Vue.use(ui);
|
||||||
Vue.use(vcUI);
|
Vue.use(vcUI);
|
||||||
Vue.use(dvui)
|
Vue.use(dvui)
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
import store from "../store";
|
import store from "../store";
|
||||||
|
import appEntry from "../views/appEntry";
|
||||||
import {waiting} from "../utils";
|
import {waiting} from "../utils";
|
||||||
import appEntry from "../views/apps/appEntry";
|
|
||||||
import router from "./router";
|
import router from "./router";
|
||||||
import axios from "./axios";
|
import axios from "./axios";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
routes: () => store.state.apps,
|
routes: [],
|
||||||
init() {
|
init() {
|
||||||
//约束正则式
|
//约束正则式
|
||||||
store.commit("cleanApps")
|
store.commit("cleanApps")
|
||||||
|
this.routes = []
|
||||||
// 自动化本工程应用
|
// 自动化本工程应用
|
||||||
this.loadApps()
|
return this.loadApps()
|
||||||
},
|
},
|
||||||
loadApps() {
|
loadApps() {
|
||||||
//新App的自动化格式
|
//新App的自动化格式
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import Vue from 'vue'
|
|
||||||
import VueRouter from 'vue-router'
|
import VueRouter from 'vue-router'
|
||||||
import autoRoutes from './autoRoutes'
|
import autoRoutes from './autoRoutes'
|
||||||
|
import Vue from "vue";
|
||||||
|
|
||||||
Vue.use(VueRouter)
|
|
||||||
autoRoutes.init()
|
autoRoutes.init()
|
||||||
|
Vue.use(VueRouter)
|
||||||
export default new VueRouter({
|
export default new VueRouter({
|
||||||
mode: 'history',
|
mode: 'history',
|
||||||
hashbang: false,
|
hashbang: false,
|
||||||
routes: autoRoutes.routes(),
|
routes: [{path: "/", redirect: "/v", name: "产品库", component: import('../App')}],
|
||||||
scrollBehavior(to) {
|
scrollBehavior(to) {
|
||||||
if (to.hash) {
|
if (to.hash) {
|
||||||
return {
|
return {
|
||||||
|
|||||||
15
index.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>村务云应用库-展示页面</title>
|
||||||
|
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
|
||||||
|
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/examples/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
95
package.json
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "cw-webapps",
|
"name": "dvcp-vite-webapps",
|
||||||
"version": "2.0.0",
|
|
||||||
"private": false,
|
"private": false,
|
||||||
"author": "kubbo",
|
"version": "0.0.0",
|
||||||
"main": "lib/cw-webapps.common.js",
|
"main": "lib/dvcp-vite-webapps.umd.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vue-cli-service serve",
|
"dev": "vite",
|
||||||
"lib": "vue-cli-service build --no-clean --target lib --dest lib packages/index.js&&npm unpublish --force&&npm publish",
|
"preview": "vite preview",
|
||||||
"lib:core": "vue-cli-service build --target lib --dest core/dist core/index.js --name dvcp-core&&npm unpublish dvcp-core --force&&npm publish core/",
|
"lib": "vite build --outDir lib --emptyOutDir&&npm unpublish --force&&npm publish",
|
||||||
|
"lib:core": "vue-cli-service build --target lib --dest core/dist core/index.js --name vc-app-core&&npm unpublish --force&&npm publish",
|
||||||
"lib:project": "node project/build.js",
|
"lib:project": "node project/build.js",
|
||||||
"lib:all": "node project/allProject.js&&npm unpublish --workspaces --force&&npm publish --workspaces",
|
"lib:all": "node project/allProject.js&&npm unpublish --workspaces --force&&npm publish --workspaces",
|
||||||
"ui": "npm i dvcp-ui@latest"
|
"ui": "npm i dvcp-ui@latest"
|
||||||
@@ -15,79 +15,22 @@
|
|||||||
"workspaces": [
|
"workspaces": [
|
||||||
"project/*"
|
"project/*"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
|
||||||
"@amap/amap-jsapi-loader": "^1.0.1",
|
|
||||||
"@jiaminghi/c-render": "^0.4.3",
|
|
||||||
"@jiaminghi/charts": "^0.2.18",
|
|
||||||
"@jiaminghi/data-view": "^2.10.0",
|
|
||||||
"bin-code-editor": "^0.9.0",
|
|
||||||
"dayjs": "^1.8.35",
|
|
||||||
"dvcp-ui": "^1.42.2",
|
|
||||||
"echarts": "^5.1.2",
|
|
||||||
"mp4box": "^0.4.1",
|
|
||||||
"print-js": "^1.0.63",
|
|
||||||
"serialize-javascript": "^6.0.0",
|
|
||||||
"sortablejs": "^1.12.0",
|
|
||||||
"vue-draggable-resizable": "^2.3.0",
|
|
||||||
"vue-json-editor": "^1.4.3",
|
|
||||||
"vue-ruler-tool": "^1.2.4",
|
|
||||||
"vuedraggable": "^2.24.3"
|
|
||||||
},
|
|
||||||
"publishConfig": {
|
|
||||||
"registry": "http://192.168.1.87:4873/"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/plugin-proposal-logical-assignment-operators": "^7.10.4",
|
|
||||||
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
|
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.10.4",
|
|
||||||
"@vue/cli-plugin-babel": "^3.6.0",
|
|
||||||
"@vue/cli-plugin-eslint": "^3.6.0",
|
|
||||||
"@vue/cli-service": "^3.6.0",
|
|
||||||
"axios": "^0.19.2",
|
|
||||||
"babel-eslint": "^10.1.0",
|
|
||||||
"core-js": "^2.6.11",
|
|
||||||
"element-ui": "^2.15.9",
|
|
||||||
"eslint": "^5.16.0",
|
|
||||||
"eslint-plugin-vue": "^5.0.0",
|
|
||||||
"image-webpack-loader": "^6.0.0",
|
|
||||||
"inquirer": "^6.5.2",
|
|
||||||
"readline": "^1.3.0",
|
|
||||||
"sass": "~1.32.12",
|
|
||||||
"sass-loader": "^7.3.1",
|
|
||||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
|
||||||
"v-viewer": "^1.6.4",
|
"v-viewer": "^1.6.4",
|
||||||
|
"vite": "^2.9.5",
|
||||||
|
"vite-plugin-vue2": "^2.0.0",
|
||||||
"vue": "^2.6.14",
|
"vue": "^2.6.14",
|
||||||
"vue-router": "^3.3.4",
|
"vue-router": "^3.3.4",
|
||||||
"vue-style-loader": "^4.1.3",
|
|
||||||
"vue-template-compiler": "^2.6.14",
|
"vue-template-compiler": "^2.6.14",
|
||||||
"vuex": "^3.5.1",
|
"vuex-persistedstate": "^3.2.1"
|
||||||
"vuex-persistedstate": "^2.7.1"
|
|
||||||
},
|
},
|
||||||
"vetur": {
|
"dependencies": {
|
||||||
"attributes": "./attributes.json"
|
"dvcp-dv-ui": "^2.0.1",
|
||||||
},
|
"dvcp-ui": "^1.42.2",
|
||||||
"eslintConfig": {
|
"element-ui": "^2.15.8",
|
||||||
"root": true,
|
"mp4box": "^0.4.1",
|
||||||
"env": {
|
"print-js": "^1.0.63",
|
||||||
"node": true
|
"sass": "^1.51.0",
|
||||||
},
|
"vue-draggable-resizable": "^2.3.0"
|
||||||
"extends": [
|
}
|
||||||
"plugin:vue/essential",
|
|
||||||
"eslint:recommended"
|
|
||||||
],
|
|
||||||
"rules": {},
|
|
||||||
"parserOptions": {
|
|
||||||
"parser": "babel-eslint"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"postcss": {
|
|
||||||
"plugins": {
|
|
||||||
"autoprefixer": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"browserslist": [
|
|
||||||
"> 1%",
|
|
||||||
"last 2 versions",
|
|
||||||
"not ie <= 8"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AppDesigner">
|
|
||||||
<component :is="currentPage" v-bind="$props"/>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import List from './components/List.vue'
|
|
||||||
import Add from './components/Add'
|
|
||||||
import SourceData from './components/SourceData'
|
|
||||||
import Preview from "./components/preview";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AppDesigner',
|
|
||||||
label: '大屏设计',
|
|
||||||
components: {Preview, List, Add, SourceData},
|
|
||||||
props: {
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
permissions: Function,
|
|
||||||
urlPrefix: {
|
|
||||||
type: String,
|
|
||||||
default: '/app'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
|
||||||
currentPage() {
|
|
||||||
const {hash} = this.$route
|
|
||||||
return hash == "#sourceData" ? SourceData :
|
|
||||||
hash == "#add" ? Add :
|
|
||||||
hash == "#preview" ? Preview : List
|
|
||||||
},
|
|
||||||
tabs() {
|
|
||||||
return [
|
|
||||||
{label: '大屏列表', name: 'FormList', comp: List, permission: ''}
|
|
||||||
].filter(() => {
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
currIndex: '0',
|
|
||||||
componentName: '',
|
|
||||||
params: {},
|
|
||||||
areaId: '',
|
|
||||||
isShowDetail: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
onChange(data) {
|
|
||||||
if (data.type === 'list') {
|
|
||||||
this.componentName = 'List'
|
|
||||||
this.isShowDetail = false
|
|
||||||
this.params = data.params
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.type === 'add') {
|
|
||||||
this.componentName = 'Add'
|
|
||||||
this.isShowDetail = true
|
|
||||||
this.params = data.params
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.type === 'SourceData') {
|
|
||||||
this.componentName = 'SourceData'
|
|
||||||
this.isShowDetail = true
|
|
||||||
this.params = data.params
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AppDesigner {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,300 +0,0 @@
|
|||||||
<template>
|
|
||||||
<ai-detail>
|
|
||||||
<template slot="title">
|
|
||||||
<ai-title :title="id ? '编辑项目' : '添加项目'" isShowBack isShowBottomBorder @onBackClick="cancel"/>
|
|
||||||
</template>
|
|
||||||
<template slot="content">
|
|
||||||
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
|
||||||
<ai-card title="基本信息">
|
|
||||||
<template #content>
|
|
||||||
<div class="ai-form">
|
|
||||||
<el-form-item label="名称" prop="name" :rules="[{ required: true, message: '请输入大屏项目名称', trigger: 'blur' }]">
|
|
||||||
<el-input size="small" :maxlength="30" placeholder="请输入大屏项目名称" v-model="form.name"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="描述" style="width: 100%;" prop="description">
|
|
||||||
<el-input size="small" :maxlength="200" :rows="5" type="textarea" style="width: 100%;" placeholder="请输入描述" v-model="form.description"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="是否开启" style="width: 100%;" prop="status">
|
|
||||||
<el-switch
|
|
||||||
v-model="form.status"
|
|
||||||
active-value="1"
|
|
||||||
inactive-value="0">
|
|
||||||
</el-switch>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</ai-card>
|
|
||||||
<ai-card title="大屏">
|
|
||||||
<template #right>
|
|
||||||
<el-button @click="add('')" type="primary">添加大屏</el-button>
|
|
||||||
<el-button @click="dialog=true" type="primary">定制大屏</el-button>
|
|
||||||
</template>
|
|
||||||
<template #content>
|
|
||||||
<ai-table
|
|
||||||
:tableData="tableData"
|
|
||||||
:col-configs="colConfigs"
|
|
||||||
:total="total"
|
|
||||||
style="margin-top: 6px;"
|
|
||||||
:border="true"
|
|
||||||
row-key="id"
|
|
||||||
:isShowPagination="false"
|
|
||||||
@getList="() => {}">
|
|
||||||
<el-table-column slot="options" label="状态" align="center">
|
|
||||||
<template slot-scope="{ row }">
|
|
||||||
<el-switch
|
|
||||||
v-model="row.status"
|
|
||||||
active-value="1"
|
|
||||||
@change="() => onStatusChange(row.id)">
|
|
||||||
</el-switch>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column slot="options" width="160px" fixed="right" label="操作" align="center">
|
|
||||||
<template slot-scope="{ row, column, $index }">
|
|
||||||
<div class="table-options">
|
|
||||||
<el-button type="text" @click="toEdit(row.id, row.isCustom, row)">编辑</el-button>
|
|
||||||
<el-button type="text" @click="toViewer(row.id)">预览</el-button>
|
|
||||||
<el-button type="text" @click="remove($index)">删除</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</ai-table>
|
|
||||||
</template>
|
|
||||||
</ai-card>
|
|
||||||
</el-form>
|
|
||||||
<Layout
|
|
||||||
v-if="isShowLayout"
|
|
||||||
:instance="instance"
|
|
||||||
:dict="dict"
|
|
||||||
:params="query"
|
|
||||||
@change="onChange"
|
|
||||||
:urlPrefix="urlPrefix"
|
|
||||||
:theme="config.theme"
|
|
||||||
@close="isShowLayout = false">
|
|
||||||
</Layout>
|
|
||||||
<ai-dialog :visible.sync="dialog" title="定制大屏" @closed="custom={}" @onConfirm="handleCustomizedDV">
|
|
||||||
<el-form ref="CustomDVFrom" size="small" :model="custom" :rules="rules" label-width="80px">
|
|
||||||
<el-form-item label="大屏标题" prop="title">
|
|
||||||
<el-input v-model="custom.title" clearable placeholder="请填写"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="选择大屏" prop="dv">
|
|
||||||
<ai-select v-model="custom.dv" :selectList="dict.getDict('customizedDVs')"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="静态数据">
|
|
||||||
<el-input type="textarea" rows="5" v-model="custom.meta"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</ai-dialog>
|
|
||||||
</template>
|
|
||||||
<template #footer>
|
|
||||||
<el-button @click="cancel">取消</el-button>
|
|
||||||
<el-button type="primary" @click="confirm">提交</el-button>
|
|
||||||
</template>
|
|
||||||
</ai-detail>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Layout from './Layout.vue'
|
|
||||||
import Sortable from 'sortablejs'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Add',
|
|
||||||
props: {
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
urlPrefix: String
|
|
||||||
},
|
|
||||||
inject: {
|
|
||||||
home: {default: ''}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Layout
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
info: {},
|
|
||||||
department: [],
|
|
||||||
form: {
|
|
||||||
name: '',
|
|
||||||
relationLsIds: '',
|
|
||||||
relationLsNames: '',
|
|
||||||
status: '1',
|
|
||||||
description: ''
|
|
||||||
},
|
|
||||||
screenId: '',
|
|
||||||
query: {},
|
|
||||||
total: 0,
|
|
||||||
colConfigs: [
|
|
||||||
{prop: 'title', label: '标题'},
|
|
||||||
{prop: 'id', label: 'ID'}
|
|
||||||
],
|
|
||||||
tableData: [],
|
|
||||||
isShowLayout: false,
|
|
||||||
id: '',
|
|
||||||
dialog: false,
|
|
||||||
custom: {},
|
|
||||||
rules: {
|
|
||||||
dv: [{required: true, message: "请选择 定制大屏"}],
|
|
||||||
title: [{required: true, message: "请输入 大屏标题"}],
|
|
||||||
},
|
|
||||||
config: {
|
|
||||||
backgroundImage: []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
this.dict.load('customizedDVs')
|
|
||||||
this.getInfo()
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
getInfo() {
|
|
||||||
let {id} = this.$route.query
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryLargeScreenProjectDetailById?id=${id}`).then(res => {
|
|
||||||
if (res?.data) {
|
|
||||||
this.form = {
|
|
||||||
...res.data
|
|
||||||
}
|
|
||||||
if (res.data.relationLsIds) {
|
|
||||||
this.tableData = res.data.lsList.map(v => {
|
|
||||||
let conf = JSON.parse(v.config || '') || {}
|
|
||||||
return {
|
|
||||||
id: v.id,
|
|
||||||
title: v.title,
|
|
||||||
dv: conf.custom || '',
|
|
||||||
meta: JSON.stringify(conf.meta),
|
|
||||||
isCustom: !!conf.custom,
|
|
||||||
status: v.status
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.total = res.data.lsList.length
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.rowDrop()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onStatusChange (id) {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/enableLargeScreen?id=${id}`).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.getInfo()
|
|
||||||
this.$message.success('操作成功')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
rowDrop() {
|
|
||||||
const tbody = document.querySelector('.el-table__body-wrapper tbody')
|
|
||||||
const _this = this
|
|
||||||
Sortable.create(tbody, {
|
|
||||||
onEnd({newIndex, oldIndex}) {
|
|
||||||
const currRow = _this.tableData.splice(oldIndex, 1)[0]
|
|
||||||
_this.tableData.splice(newIndex, 0, currRow)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
toViewer(id) {
|
|
||||||
this.$router.push({query: {id}, hash: "#preview"})
|
|
||||||
},
|
|
||||||
onChange(e) {
|
|
||||||
const ids = this.tableData.map(v => v.id)
|
|
||||||
if (ids.indexOf(e.id) < 0) {
|
|
||||||
this.tableData.push({
|
|
||||||
title: e.title,
|
|
||||||
id: e.id
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
const index = this.tableData.findIndex(v => v.id === e.id)
|
|
||||||
this.$set(this.tableData[index], 'title', e.title)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add() {
|
|
||||||
this.query = {
|
|
||||||
id: '',
|
|
||||||
name: this.form.name
|
|
||||||
}
|
|
||||||
this.isShowLayout = true
|
|
||||||
},
|
|
||||||
|
|
||||||
toEdit(id, isCustom, form) {
|
|
||||||
if (!isCustom) {
|
|
||||||
this.query = {
|
|
||||||
id,
|
|
||||||
name: this.form.name
|
|
||||||
}
|
|
||||||
|
|
||||||
this.isShowLayout = true
|
|
||||||
} else {
|
|
||||||
this.dialog = true
|
|
||||||
this.custom = {
|
|
||||||
...form,
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
remove(index) {
|
|
||||||
this.tableData.splice(index, 1)
|
|
||||||
},
|
|
||||||
|
|
||||||
confirm() {
|
|
||||||
this.$refs.form.validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
const ids = this.tableData.map(v => v.id).join(',')
|
|
||||||
const names = this.tableData.map(v => v.name).join(',')
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreenProject`, {
|
|
||||||
...this.form,
|
|
||||||
relationLsIds: ids,
|
|
||||||
relationLsNames: names
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success('提交成功')
|
|
||||||
|
|
||||||
this.home && this.home.refreshDvOptions && this.home.refreshDvOptions()
|
|
||||||
setTimeout(() => {
|
|
||||||
this.cancel()
|
|
||||||
}, 600)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel() {
|
|
||||||
this.$router.push({})
|
|
||||||
},
|
|
||||||
|
|
||||||
handleCustomizedDV() {
|
|
||||||
this.$refs.CustomDVFrom.validate(v => {
|
|
||||||
if (v) {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateLargeScreen`, {
|
|
||||||
config: JSON.stringify({
|
|
||||||
custom: this.custom.dv,
|
|
||||||
meta: JSON.parse(this.custom.meta?.replace(/\\n/g, '') || null)
|
|
||||||
}),
|
|
||||||
status: 1,
|
|
||||||
id: this.custom.id,
|
|
||||||
title: this.custom.title,
|
|
||||||
}).then(res => {
|
|
||||||
if (res?.code == 0 && res?.data) {
|
|
||||||
this.$message.success('保存成功')
|
|
||||||
this.onChange(res.data)
|
|
||||||
this.dialog = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
</style>
|
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
<template>
|
|
||||||
<ai-list>
|
|
||||||
<ai-title slot="title" title="大屏列表" isShowBottomBorder/>
|
|
||||||
<template slot="content">
|
|
||||||
<ai-search-bar>
|
|
||||||
<template #left>
|
|
||||||
<ai-select
|
|
||||||
v-model="search.status"
|
|
||||||
@change="search.current = 1, getList()"
|
|
||||||
placeholder="发布状态"
|
|
||||||
:selectList="dict.getDict('cwpStatus')">
|
|
||||||
</ai-select>
|
|
||||||
<el-button type="primary" @click="toEdit('')">添加大屏</el-button>
|
|
||||||
<el-button type="primary" @click="toAddData">数据源管理</el-button>
|
|
||||||
</template>
|
|
||||||
<template #right>
|
|
||||||
<el-input
|
|
||||||
v-model="search.name"
|
|
||||||
size="small"
|
|
||||||
placeholder="请输入模板名称或创建人"
|
|
||||||
clearable
|
|
||||||
v-throttle="() => {search.current = 1, getList()}"
|
|
||||||
@clear="search.current = 1, search.title = '', getList()"
|
|
||||||
suffix-icon="iconfont iconSearch">
|
|
||||||
</el-input>
|
|
||||||
</template>
|
|
||||||
</ai-search-bar>
|
|
||||||
<ai-table
|
|
||||||
:tableData="tableData"
|
|
||||||
:col-configs="colConfigs"
|
|
||||||
:total="total"
|
|
||||||
v-loading="loading"
|
|
||||||
style="margin-top: 6px;"
|
|
||||||
:current.sync="search.current"
|
|
||||||
:size.sync="search.size"
|
|
||||||
@getList="getList">
|
|
||||||
<el-table-column slot="options" width="160px" fixed="right" label="操作" align="center">
|
|
||||||
<template slot-scope="{ row }">
|
|
||||||
<div class="table-options">
|
|
||||||
<el-button type="text" @click="toEdit(row.id)">编辑</el-button>
|
|
||||||
<el-button type="text" @click="copy(row.id)">复制</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</ai-table>
|
|
||||||
<ai-dialog
|
|
||||||
:visible.sync="isShowAdd"
|
|
||||||
width="780px"
|
|
||||||
title="复制大屏"
|
|
||||||
@close="onClose"
|
|
||||||
@onConfirm="onConfirm">
|
|
||||||
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
|
||||||
<div class="ai-form" :model="form" label-width="110px" label-position="right">
|
|
||||||
<el-form-item label="名称" prop="name" style="width: 100%;" :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }]">
|
|
||||||
<el-input size="small" placeholder="请输入名称" v-model="form.name"></el-input>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
</el-form>
|
|
||||||
</ai-dialog>
|
|
||||||
</template>
|
|
||||||
</ai-list>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'FormList',
|
|
||||||
props: {
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
areaId: String,
|
|
||||||
urlPrefix: String
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
search: {
|
|
||||||
current: 1,
|
|
||||||
status: '',
|
|
||||||
size: 10,
|
|
||||||
name: ''
|
|
||||||
},
|
|
||||||
form: {
|
|
||||||
name: ''
|
|
||||||
},
|
|
||||||
id: '',
|
|
||||||
isShowAdd: false,
|
|
||||||
colConfigs: [
|
|
||||||
{prop: 'name', label: '模板名称'},
|
|
||||||
{prop: 'createUserName', align: 'center', label: '创建人'},
|
|
||||||
{prop: 'description', align: 'center', label: '描述'},
|
|
||||||
{prop: 'status', align: 'center', label: '状态', formart: v => this.dict.getLabel('cwpStatus', v)},
|
|
||||||
{prop: 'createTime', align: 'center', label: '创建时间'}
|
|
||||||
],
|
|
||||||
tableData: [],
|
|
||||||
total: 0,
|
|
||||||
loading: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
|
|
||||||
this.dict.load('cwpStatus').then(() => {
|
|
||||||
this.getList()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
this.loading = true
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
copy(id) {
|
|
||||||
this.id = id
|
|
||||||
this.isShowAdd = true
|
|
||||||
},
|
|
||||||
|
|
||||||
onClose() {
|
|
||||||
this.id = ''
|
|
||||||
this.form.name = ''
|
|
||||||
},
|
|
||||||
|
|
||||||
onConfirm() {
|
|
||||||
this.$refs.form.validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/copyLargeScreenProject`, null, {
|
|
||||||
params: {
|
|
||||||
...this.form,
|
|
||||||
id: this.id
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.$message.success('复制成功')
|
|
||||||
this.isShowAdd = false
|
|
||||||
|
|
||||||
this.getList()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getList() {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allLargeScreenProjectByPage`, null, {
|
|
||||||
params: {
|
|
||||||
...this.search
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.tableData = res.data.records
|
|
||||||
this.total = res.data.total
|
|
||||||
this.loading = false
|
|
||||||
} else {
|
|
||||||
this.loading = false
|
|
||||||
}
|
|
||||||
}).catch(() => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
},
|
|
||||||
toEdit(id) {
|
|
||||||
this.$router.push({hash: "#add", query: {id}})
|
|
||||||
},
|
|
||||||
toAddData() {
|
|
||||||
this.$router.push({hash: "#sourceData"})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,459 +0,0 @@
|
|||||||
<template>
|
|
||||||
<ai-detail>
|
|
||||||
<template slot="title">
|
|
||||||
<ai-title title="数据源" isShowBack isShowBottomBorder @onBackClick="cancel">
|
|
||||||
</ai-title>
|
|
||||||
</template>
|
|
||||||
<template slot="content">
|
|
||||||
<ai-card title="数据源列表">
|
|
||||||
<template #right>
|
|
||||||
<el-button type="primary" @click="isShow = true">添加数据源</el-button>
|
|
||||||
</template>
|
|
||||||
<template #content>
|
|
||||||
<ai-search-bar class="search-bar">
|
|
||||||
<template slot="right">
|
|
||||||
<el-input
|
|
||||||
v-model="search.name"
|
|
||||||
size="small"
|
|
||||||
v-throttle="() => {search.current = 1, getList()}"
|
|
||||||
placeholder="请输入名字"
|
|
||||||
clearable
|
|
||||||
@clear="search.current = 1, search.name = '', getList()"
|
|
||||||
suffix-icon="iconfont iconSearch">
|
|
||||||
</el-input>
|
|
||||||
</template>
|
|
||||||
</ai-search-bar>
|
|
||||||
<ai-table
|
|
||||||
:tableData="tableData"
|
|
||||||
:col-configs="colConfigs"
|
|
||||||
:total="total"
|
|
||||||
style="margin-top: 6px;"
|
|
||||||
:border="true"
|
|
||||||
:current.sync="search.current"
|
|
||||||
:size.sync="search.size"
|
|
||||||
@getList="getList">
|
|
||||||
<el-table-column slot="options" width="160px" fixed="right" label="操作" align="center">
|
|
||||||
<template slot-scope="{ row }">
|
|
||||||
<div class="table-options">
|
|
||||||
<el-button type="text" @click="toEdit(row)">编辑</el-button>
|
|
||||||
<el-button type="text" @click="remove(row.id)">删除</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</ai-table>
|
|
||||||
</template>
|
|
||||||
</ai-card>
|
|
||||||
<ai-dialog
|
|
||||||
:visible.sync="isShow"
|
|
||||||
width="920px"
|
|
||||||
title="数据源"
|
|
||||||
@close="onClose"
|
|
||||||
@onConfirm="onConfirm">
|
|
||||||
<el-form ref="form" :model="form" label-width="110px" label-position="right">
|
|
||||||
<div class="ai-form">
|
|
||||||
<el-form-item label="数据源描述" style="width: 100%;" prop="description" :rules="[{ required: true, message: '请输入数据源描述', trigger: 'blur' }]">
|
|
||||||
<el-input
|
|
||||||
size="small"
|
|
||||||
placeholder="请输入数据源描述"
|
|
||||||
v-model="form.description">
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="类型" style="width: 100%;" prop="dataRange" :rules="[{ required: true, message: '请选择数据范围', trigger: 'change' }]">
|
|
||||||
<el-radio-group v-model="form.type">
|
|
||||||
<el-radio label="0">村微应用</el-radio>
|
|
||||||
<el-radio label="1">SQL</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item v-if="form.type === '1'" label="sql语句" style="width: 100%;" prop="description"
|
|
||||||
:rules="[{ required: true, message: '请输入sql语句', trigger: 'blur' }]">
|
|
||||||
<el-input
|
|
||||||
:rows="8"
|
|
||||||
size="small"
|
|
||||||
type="textarea"
|
|
||||||
placeholder="请输入数据源描述"
|
|
||||||
v-model="form.sqlContent">
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item v-if="form.type === '0'" label="村微应用" style="width: 100%;" prop="appId"
|
|
||||||
:rules="[{ required: true, message: '请选择村微应用', trigger: 'change' }]">
|
|
||||||
<el-select size="small" style="width: 100%;" v-model="form.appId" placeholder="请选择村微应用" @change="onAppChange">
|
|
||||||
<el-option
|
|
||||||
v-for="item in appList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.appName"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item v-if="form.type === '0'" label="数据范围" style="width: 100%;" prop="dataRange"
|
|
||||||
:rules="[{ required: true, message: '请选择数据范围', trigger: 'change' }]">
|
|
||||||
<el-radio-group v-model="form.dataRange">
|
|
||||||
<el-radio label="0">全部</el-radio>
|
|
||||||
<el-radio label="1">自定义条数</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="数据条数" style="width: 100%;" v-if="form.dataRange === '1' && form.type === '0'" prop="count"
|
|
||||||
:rules="[{ required: true, message: '请输入数据条数', trigger: 'blur' }]">
|
|
||||||
<el-input
|
|
||||||
size="small"
|
|
||||||
placeholder="请输入数据条数"
|
|
||||||
v-model="form.count">
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<div v-if="form.type === '0'">
|
|
||||||
<el-form-item :label="'统计项' + index" style="width: 100%;" v-for="(item, index) in form.statisticsConfigs" :key="'statisticsConfigs' + index">
|
|
||||||
<div class="form-flex">
|
|
||||||
<div>
|
|
||||||
<el-select size="small" style="width: 160px;" v-model="item.fieldName" @change="e => onChooseField('statisticsConfigs', e, index)"
|
|
||||||
placeholder="请选择" clearable>
|
|
||||||
<el-option
|
|
||||||
v-for="(item, index) in filedList"
|
|
||||||
:key="index"
|
|
||||||
:label="item.fieldCnName"
|
|
||||||
:value="item.fieldName">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
<el-select size="small" style="margin: 0 10px; width: 160px;" v-model="item.calcType" placeholder="请选择" clearable>
|
|
||||||
<el-option
|
|
||||||
v-for="item in dict.getDict('diyLargeScreenDatasourceCalcType2')"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.dictName"
|
|
||||||
:value="item.dictValue">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
<el-input size="small" style="width: 165px;" placeholder="请输入别名" v-model="item.alias"></el-input>
|
|
||||||
</div>
|
|
||||||
<el-button type="danger" v-if="index > 0" @click="removeConfig('statisticsConfigs', index)">删除</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
<el-form-item style="width: 100%;" v-if="form.type === '0'">
|
|
||||||
<el-button type="primary" @click="add('statisticsConfigs')">添加统计项</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
<div v-if="form.type === '0'">
|
|
||||||
<el-form-item :label="'分组' + index" style="width: 100%;" v-for="(item, index) in form.groupConfigs" :key="'groupConfigs' + item.fieldName">
|
|
||||||
<div class="form-flex">
|
|
||||||
<div>
|
|
||||||
<el-select size="small" style="width: 160px;" v-model="item.fieldName" placeholder="请选择" clearable>
|
|
||||||
<el-option
|
|
||||||
v-for="item in filedList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.fieldCnName"
|
|
||||||
:value="item.fieldName">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
<el-button type="danger" @click="removeConfig('groupConfigs', index)">删除</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
<el-form-item style="width: 100%;" v-if="form.type === '0'">
|
|
||||||
<el-button type="primary" @click="add('groupConfigs')">添加分组</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
<div v-if="form.type === '0'">
|
|
||||||
<el-form-item :label="'统计项' + index" style="width: 100%;" v-for="(item, index) in form.orderConfigs" :key="'orderConfigs' + item.fieldName">
|
|
||||||
<div class="form-flex">
|
|
||||||
<div>
|
|
||||||
<el-select size="small" style="width: 160px;" v-model="item.fieldName" placeholder="请选择" clearable>
|
|
||||||
<el-option
|
|
||||||
v-for="item in filedList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.fieldCnName"
|
|
||||||
:value="item.fieldName">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
<el-select size="small" style="width: 160px; margin-left: 10px;" v-model="item.orderType" placeholder="请选择" clearable>
|
|
||||||
<el-option
|
|
||||||
v-for="item in orderTypeDict"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
<el-button type="danger" @click="removeConfig('orderConfigs', index)">删除</el-button>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
<el-form-item style="width: 100%;" v-if="form.type === '0'">
|
|
||||||
<el-button type="primary" @click="add('orderConfigs')">添加排序</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
</el-form>
|
|
||||||
</ai-dialog>
|
|
||||||
</template>
|
|
||||||
</ai-detail>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'SourceData',
|
|
||||||
|
|
||||||
props: {
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
params: Object,
|
|
||||||
urlPrefix: String
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isShow: false,
|
|
||||||
search: {
|
|
||||||
current: 1,
|
|
||||||
size: 10,
|
|
||||||
name: ''
|
|
||||||
},
|
|
||||||
total: 0,
|
|
||||||
colConfigs: [
|
|
||||||
{prop: 'appName', label: '应用名'},
|
|
||||||
{prop: 'appTableName', align: 'center', label: '表名'},
|
|
||||||
{prop: 'description', align: 'center', label: '描述'},
|
|
||||||
{prop: 'type', align: 'center', label: '类型', formart: v => v === '0' ? '村微应用' : 'sql语句'},
|
|
||||||
{prop: 'createUserName', align: 'center', label: '创建人'},
|
|
||||||
{prop: 'createTime', align: 'center', label: '创建时间'}
|
|
||||||
],
|
|
||||||
tableData: [],
|
|
||||||
filedList: [],
|
|
||||||
appList: [],
|
|
||||||
form: {
|
|
||||||
orderType: 'asc',
|
|
||||||
dataRange: '0',
|
|
||||||
type: '0',
|
|
||||||
sqlContent: '',
|
|
||||||
appId: '',
|
|
||||||
description: '',
|
|
||||||
appName: '',
|
|
||||||
appTableName: '',
|
|
||||||
count: '100',
|
|
||||||
statisticsConfigs: [{
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
}],
|
|
||||||
orderConfigs: [{
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
}],
|
|
||||||
groupConfigs: [{
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
id: '',
|
|
||||||
orderTypeDict: [
|
|
||||||
{
|
|
||||||
value: 'asc',
|
|
||||||
label: '升序'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'desc',
|
|
||||||
label: '降序'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
this.dict.load(['diyLargeScreenDatasourceCalcType2']).then(() => {
|
|
||||||
this.getList()
|
|
||||||
this.getAppList()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
getInfo(id) {
|
|
||||||
this.instance.post(`${this.urlPrefix}/wxcp/wxuser/queryDetailById?id=${id}`).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.form = {
|
|
||||||
...res.data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onChooseField(type, fieldName, index) {
|
|
||||||
const dictCode = this.filedList.filter(v => v.fieldName === fieldName)[0].dictCode
|
|
||||||
this.$set(this.form[type][index], 'dictCode', dictCode)
|
|
||||||
},
|
|
||||||
|
|
||||||
add(type) {
|
|
||||||
this.form[type].push({
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
removeConfig(type, index) {
|
|
||||||
this.form[type].splice(index, 1)
|
|
||||||
},
|
|
||||||
|
|
||||||
toEdit(e) {
|
|
||||||
this.id = e.id
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryDatasourceDetailById?id=${e.id}`).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.form = {
|
|
||||||
...res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
this.form.dataRange = this.form.dataRange === '0' ? '0' : '1'
|
|
||||||
this.form.count = res.data.dataRange
|
|
||||||
this.filedList = this.appList.filter(v => v.id === res.data.appId).length && this.appList.filter(v => v.id === res.data.appId)[0].fields.map(item => {
|
|
||||||
let value = []
|
|
||||||
res.data.configs.forEach(v => {
|
|
||||||
if (v.fieldName === item.fieldName) {
|
|
||||||
value.push(v.calcType)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
...item,
|
|
||||||
value
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.isShow = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
remove(id) {
|
|
||||||
this.$confirm('确定删除该数据?').then(() => {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appquestionnairetemplate/delete?id=${id}`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success('删除成功!')
|
|
||||||
this.getList()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getList() {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceByPage`, null, {
|
|
||||||
params: {
|
|
||||||
...this.search
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.tableData = res.data.records
|
|
||||||
this.total = res.data.total
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getAppList() {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceApp`).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.appList = res.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onClose() {
|
|
||||||
this.id = ''
|
|
||||||
this.form.orderType = 'asc'
|
|
||||||
this.form.dataRange = 0
|
|
||||||
this.form.appId = ''
|
|
||||||
this.form.description = ''
|
|
||||||
this.form.appName = ''
|
|
||||||
this.form.appTableName = ''
|
|
||||||
this.form.count = 100
|
|
||||||
},
|
|
||||||
|
|
||||||
onAppChange(e) {
|
|
||||||
const value = this.appList.filter(v => v.id === e)[0]
|
|
||||||
this.form.appTableName = value.appTableName
|
|
||||||
this.form.appName = value.appName
|
|
||||||
this.form.statisticsConfigs = [{
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
}]
|
|
||||||
this.form.orderConfigs = [{
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
}]
|
|
||||||
this.form.groupConfigs = [{
|
|
||||||
alias: '',
|
|
||||||
calcType: '',
|
|
||||||
dictCode: '',
|
|
||||||
fieldCnName: '',
|
|
||||||
fieldName: ''
|
|
||||||
}]
|
|
||||||
this.filedList = value.fields.map(v => {
|
|
||||||
return {
|
|
||||||
...v,
|
|
||||||
value: ''
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onConfirm() {
|
|
||||||
this.$refs.form.validate((valid) => {
|
|
||||||
if (valid) {
|
|
||||||
let configs = []
|
|
||||||
|
|
||||||
if (this.filedList.length) {
|
|
||||||
this.filedList.forEach(item => {
|
|
||||||
if (item.value.length) {
|
|
||||||
item.value.forEach(v => {
|
|
||||||
configs.push({
|
|
||||||
alias: item.fieldCnName,
|
|
||||||
calcType: v,
|
|
||||||
fieldCnName: item.fieldCnName,
|
|
||||||
fieldName: item.fieldName,
|
|
||||||
dictCode: item.dictCode,
|
|
||||||
orderType: this.orderType
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/addOrUpdateDatasource`, {
|
|
||||||
...this.form,
|
|
||||||
configs,
|
|
||||||
id: this.id ? this.id : '',
|
|
||||||
dataRange: this.form.dataRange === '0' ? 0 : this.form.count
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.$message.success(this.id ? '编辑成功' : '添加成功')
|
|
||||||
this.search.current = 1
|
|
||||||
this.isShow = false
|
|
||||||
|
|
||||||
this.getList()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel() {
|
|
||||||
this.$router.push({})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.form-flex {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,463 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="layout-config__group--wrapper">
|
|
||||||
<ai-dialog
|
|
||||||
append-to-body
|
|
||||||
:visible.sync="isShowEditor"
|
|
||||||
width="1000px"
|
|
||||||
class="layout-config__edit"
|
|
||||||
title="编辑器"
|
|
||||||
@onConfirm="onConfirm">
|
|
||||||
<div>
|
|
||||||
<code-editor v-model="json" :lint="true" auto-format height="440px"></code-editor>
|
|
||||||
</div>
|
|
||||||
</ai-dialog>
|
|
||||||
<div class="layout-config__group" v-if="options.monitorType !== 'hik' && options.monitorType !== 'dahua'">
|
|
||||||
<h2>基础设置</h2>
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>数据类型</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-select size="mini" v-model="options.dataType" placeholder="请选择数据类型">
|
|
||||||
<el-option
|
|
||||||
v-for="item in dataTypes"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layout-config__code" v-if="options.dataType === 'staticData'">
|
|
||||||
<el-button @click="showEditor" class="layout-config__code--btn" title="编辑" type="text" icon="iconfont iconjdq_led_edit"></el-button>
|
|
||||||
<vue-json-editor
|
|
||||||
:value="options.staticData"
|
|
||||||
:show-btns="false"
|
|
||||||
mode="view"
|
|
||||||
lang="zh">
|
|
||||||
</vue-json-editor>
|
|
||||||
</div>
|
|
||||||
<template v-else-if="options.dataType === 'dynamicData'">
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>数据源</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-select size="mini" v-model="options.sourceDataId" placeholder="请选择数据源" @change="onDataChange">
|
|
||||||
<el-option
|
|
||||||
v-for="item in sourceData"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.description"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>接口地址</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-input size="mini" v-model="options.api" @blur="onApiChange"></el-input>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
<div class="layout-config__group" v-if="options.monitorType === 'hik' || options.monitorType === 'dahua'">
|
|
||||||
<h2>基础设置</h2>
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>视频地址</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-input size="mini" v-model="options.src"></el-input>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layout-config__group" v-if="options.dataType !== 'staticData' && options.type === 'monitor' && (options.monitorType === 'cmcc' || options.monitorType === 'slw')">
|
|
||||||
<h2>字段设置</h2>
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>监控视频</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-select size="mini" v-model="options.moniterId" placeholder="请选择监控视频" @change="onMoniterId">
|
|
||||||
<el-option
|
|
||||||
v-for="(item, index) in monitorList"
|
|
||||||
:key="index"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layout-config__group" v-if="options.dataType !== 'staticData' && options.type !== 'monitor' && keys.length && options.type !== 'table'">
|
|
||||||
<h2>字段设置</h2>
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>X轴设置</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-select size="mini" v-model="options.dataX" placeholder="请选择X轴" @change="onChooseChange">
|
|
||||||
<el-option
|
|
||||||
v-for="(item, index) in keys"
|
|
||||||
:key="index"
|
|
||||||
:label="item"
|
|
||||||
:value="item">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layout-config__item">
|
|
||||||
<label>Y轴设置</label>
|
|
||||||
<div class="layout-config__item--right">
|
|
||||||
<el-select size="mini" multiple :multiple-limit="options.type.indexOf('pie') > -1 ? 1 : 100" v-model="options.dataY" collapse-tags placeholder="请选择Y轴" @change="onChooseChange">
|
|
||||||
<el-option
|
|
||||||
v-for="(item, index) in keys"
|
|
||||||
:key="index"
|
|
||||||
:label="item"
|
|
||||||
:value="item">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import vueJsonEditor from 'vue-json-editor'
|
|
||||||
import { CodeEditor } from 'bin-code-editor'
|
|
||||||
import 'bin-code-editor/lib/styles/index.css'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'dataCofing',
|
|
||||||
|
|
||||||
props: {
|
|
||||||
options: Object,
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
params: Object,
|
|
||||||
urlPrefix: String
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
dataTypes: [
|
|
||||||
{
|
|
||||||
value: 'staticData',
|
|
||||||
label: '静态数据'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'dynamicData',
|
|
||||||
label: '动态数据'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'apiData',
|
|
||||||
label: '接口'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
isShowEditor: false,
|
|
||||||
json: {},
|
|
||||||
sourceDataId: '',
|
|
||||||
sourceData: [],
|
|
||||||
keys: [],
|
|
||||||
monitorList: [],
|
|
||||||
list: [],
|
|
||||||
jsonData: `{"title":"测试json数据","children":[{"name":"子项名称", "desc":"子项说明" },{"name":"子项名称1", "desc":"子项说明1" }]}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
components: {
|
|
||||||
vueJsonEditor,
|
|
||||||
CodeEditor
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted () {
|
|
||||||
this.getDataList()
|
|
||||||
|
|
||||||
if ((this.options.dataY && this.options.dataY.length && this.options.dataX) || this.options.type === 'monitor') {
|
|
||||||
const api = this.options.dataType === 'apiData' ? this.options.api : `${this.urlPrefix}/appdiylargescreen/statisticsByLsid?id=${this.options.sourceDataId}`
|
|
||||||
this.instance.post(api).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
if (res.data.length && this.options.type !== 'monitor') {
|
|
||||||
this.list = res.data
|
|
||||||
this.keys = Object.keys(res.data[0])
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.onChooseChange()
|
|
||||||
})
|
|
||||||
} else if (this.options.type === 'monitor') {
|
|
||||||
this.monitorList = res.data
|
|
||||||
|
|
||||||
if (this.options.src) {
|
|
||||||
const obj = res.data.filter(v => this.options.title === v.name)
|
|
||||||
|
|
||||||
if (obj.length) {
|
|
||||||
this.options.src = obj[0].url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
showEditor () {
|
|
||||||
this.json = JSON.stringify(this.options.staticData)
|
|
||||||
this.isShowEditor = true
|
|
||||||
},
|
|
||||||
|
|
||||||
onMoniterId (e) {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appzyvideoequipment/getWebSdkUrl?deviceId=${e}`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.options.src = JSON.parse(res.data).url
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getDataList () {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/allDatasourceByPage`, null, {
|
|
||||||
params: {
|
|
||||||
current: 1,
|
|
||||||
size: 10000
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.sourceData = res.data.records
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onApiChange () {
|
|
||||||
this.options.dataX = ''
|
|
||||||
this.options.dataY = []
|
|
||||||
this.instance.post(this.options.api).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
if (res.data.length) {
|
|
||||||
if (this.options.type === 'table') {
|
|
||||||
const keys = Object.keys(res.data[0])
|
|
||||||
const list = res.data
|
|
||||||
this.options.apiData = keys.map(v => {
|
|
||||||
let obj = {}
|
|
||||||
list.forEach((item, index) => {
|
|
||||||
obj[`v${index}`] = item[v]
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
row: v,
|
|
||||||
...obj
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else if (this.options.type === 'summary') {
|
|
||||||
if (this.options.display === 'summary9') {
|
|
||||||
this.options.apiData = res.data
|
|
||||||
} else {
|
|
||||||
this.options.apiData = Object.keys(res.data[0]).map(item => {
|
|
||||||
return {
|
|
||||||
key: item,
|
|
||||||
value: res.data[0][item]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else if (this.options.type === 'monitor') {
|
|
||||||
this.monitorList = res.data
|
|
||||||
} else {
|
|
||||||
this.list = res.data
|
|
||||||
this.keys = Object.keys(res.data[0])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.options.dynamicData = []
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onChooseChange () {
|
|
||||||
let arr = []
|
|
||||||
if (this.options.dataX && this.options.dataY.length) {
|
|
||||||
this.list.forEach(item => {
|
|
||||||
let obj = {}
|
|
||||||
this.options.dataY.forEach(v => {
|
|
||||||
obj[v] = item[v]
|
|
||||||
})
|
|
||||||
arr.push({
|
|
||||||
[this.options.dataX]: item[this.options.dataX],
|
|
||||||
...obj
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
this.options[this.options.dataType] = arr
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onDataChange (e) {
|
|
||||||
this.options.dataX = ''
|
|
||||||
this.options.dataY = []
|
|
||||||
this.instance.post(`${this.urlPrefix}/appdiylargescreen/statisticsByLsid?id=${e}`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
if (res.data.length) {
|
|
||||||
if (this.options.type === 'table') {
|
|
||||||
const keys = Object.keys(res.data[0])
|
|
||||||
const list = res.data
|
|
||||||
this.options.dynamicData = keys.map(v => {
|
|
||||||
let obj = {}
|
|
||||||
list.forEach((item, index) => {
|
|
||||||
obj[`v${index}`] = item[v]
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
row: v,
|
|
||||||
...obj
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else if (this.options.type === 'summary') {
|
|
||||||
this.options.dynamicData = Object.keys(res.data[0]).map(item => {
|
|
||||||
return {
|
|
||||||
key: item,
|
|
||||||
value: res.data[0][item]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
this.list = res.data
|
|
||||||
this.keys = Object.keys(res.data[0])
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.options.dynamicData = []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
onConfirm () {
|
|
||||||
this.$set(this.options, 'staticData', JSON.parse(this.json))
|
|
||||||
this.isShowEditor = false
|
|
||||||
this.$emit('change')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.el-dialog__body {
|
|
||||||
.jsoneditor-vue {
|
|
||||||
height: 480px;
|
|
||||||
|
|
||||||
.jsoneditor-poweredBy {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.layout-config__group--wrapper {
|
|
||||||
.layout-config__code .jsoneditor-vue {
|
|
||||||
.jsoneditor-menu {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsoneditor {
|
|
||||||
border: 1px solid #030411;
|
|
||||||
background: #0e1013;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsoneditor-field {
|
|
||||||
color: gray;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jsoneditor-tree button:focus {
|
|
||||||
background-color: transparent;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-config__group {
|
|
||||||
padding: 10px 10px 20px;
|
|
||||||
border-bottom: 1px solid #000000;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-config__code {
|
|
||||||
position: relative;
|
|
||||||
padding-left: 10px;
|
|
||||||
|
|
||||||
.layout-config__code--btn {
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
color: gray;
|
|
||||||
z-index: 1;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
opacity: 0.8 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > h2 {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-config__item {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
flex-shrink: 0;
|
|
||||||
width: 60px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
font-size: 12px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-config__item--right {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-end;
|
|
||||||
width: 200px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-select .el-tag {
|
|
||||||
color: #fff;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
input {
|
|
||||||
background: #262C33;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #fff;
|
|
||||||
border: 1px solid #030411;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-input__icon {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-switch__label {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-select {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
input {
|
|
||||||
background: #262C33;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #fff;
|
|
||||||
border: 1px solid #030411;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-input__icon {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,734 +0,0 @@
|
|||||||
const components = [
|
|
||||||
{
|
|
||||||
type: 'chart',
|
|
||||||
label: '图表',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
label: '柱状图',
|
|
||||||
type: 'bar',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart1',
|
|
||||||
label: '柱状图1',
|
|
||||||
title: '柱状图',
|
|
||||||
border: 'border1',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar1.png',
|
|
||||||
width: 500,
|
|
||||||
sourceDataId: '',
|
|
||||||
height: 300,
|
|
||||||
dataX: '',
|
|
||||||
zIndex: 1,
|
|
||||||
dataY: [],
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart1',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart2',
|
|
||||||
label: '柱状图2',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
title: '柱状图2',
|
|
||||||
width: 500,
|
|
||||||
border: 'border1',
|
|
||||||
sourceDataId: '',
|
|
||||||
height: 300,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar2.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
top: 0,
|
|
||||||
zIndex: 1,
|
|
||||||
left: 0,
|
|
||||||
dataType: 'staticData',
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart2',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart3',
|
|
||||||
label: '柱状图3',
|
|
||||||
title: '柱状图3',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
sourceDataId: '',
|
|
||||||
height: 300,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar3.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
border: 'border1',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
zIndex: 1,
|
|
||||||
dataType: 'staticData',
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart3',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart5',
|
|
||||||
label: '柱状图4',
|
|
||||||
title: '柱状图4',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
sourceDataId: '',
|
|
||||||
height: 300,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
zIndex: 1,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar5.png',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
border: 'border1',
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart5',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart7',
|
|
||||||
label: '柱状图5',
|
|
||||||
title: '柱状图5',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
sourceDataId: '',
|
|
||||||
height: 300,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar7.png',
|
|
||||||
dataX: '',
|
|
||||||
zIndex: 1,
|
|
||||||
dataY: [],
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart7',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart8',
|
|
||||||
label: '柱状图6',
|
|
||||||
title: '柱状图6',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
sourceDataId: '',
|
|
||||||
border: 'border1',
|
|
||||||
height: 300,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar8.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart8',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'barChart9',
|
|
||||||
label: '柱状图7',
|
|
||||||
title: '柱状图7',
|
|
||||||
border: 'border1',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/bar9.png',
|
|
||||||
sourceDataId: '',
|
|
||||||
height: 300,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23},
|
|
||||||
{name: '水电费', v1: 12},
|
|
||||||
{name: '凡哥', v1: 67},
|
|
||||||
{name: '党费', v1: 98}
|
|
||||||
],
|
|
||||||
config: 'barChart9',
|
|
||||||
dynamicData: []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '折线图',
|
|
||||||
type: 'line',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'lineChart1',
|
|
||||||
label: '折线图1',
|
|
||||||
title: '折线图1',
|
|
||||||
border: 'border1',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
zIndex: 1,
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line1.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'lineChart1',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'lineChart2',
|
|
||||||
label: '折线图2',
|
|
||||||
title: '折线图2',
|
|
||||||
border: 'border1',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line2.png',
|
|
||||||
height: 300,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
zIndex: 1,
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'lineChart2',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'lineChart3',
|
|
||||||
label: '折线图3',
|
|
||||||
title: '折线图3',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
border: 'border1',
|
|
||||||
value: '',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line3.png',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'lineChart3',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'lineChart4',
|
|
||||||
label: '折线图4',
|
|
||||||
title: '折线图4',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
border: 'border1',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line4.png',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'lineChart4',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'lineChart5',
|
|
||||||
label: '折线图5',
|
|
||||||
title: '折线图5',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
border: 'border1',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
dataX: '',
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/line5.png',
|
|
||||||
dataY: [],
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'lineChart5',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '饼图',
|
|
||||||
type: 'pie',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'pieChart2',
|
|
||||||
config: 'pieChart2',
|
|
||||||
label: '饼图',
|
|
||||||
title: '饼图',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
border: 'border1',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'pieChart1',
|
|
||||||
label: '饼图',
|
|
||||||
title: '饼图',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
border: 'border1',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'pieChart1',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
code: 'widget-linechart',
|
|
||||||
type: 'pieChart3',
|
|
||||||
label: '饼图',
|
|
||||||
title: '饼图',
|
|
||||||
icon: 'icontext_box',
|
|
||||||
value: '',
|
|
||||||
border: 'border1',
|
|
||||||
width: 500,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{name: '阿斯达', v1: 23, v2: 33},
|
|
||||||
{name: '水电费', v1: 12, v2: 34},
|
|
||||||
{name: '凡哥', v1: 67, v2: 25},
|
|
||||||
{name: '党费', v1: 98, v2: 85}
|
|
||||||
],
|
|
||||||
config: 'pieChart1',
|
|
||||||
sourceDataId: '',
|
|
||||||
dynamicData: []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'table',
|
|
||||||
label: '表格',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
label: '表格',
|
|
||||||
type: 'table',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'table',
|
|
||||||
label: '表格',
|
|
||||||
title: '表格',
|
|
||||||
border: 'border1',
|
|
||||||
width: 650,
|
|
||||||
height: 400,
|
|
||||||
zIndex: 1,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/table.png',
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
rowNum: 7,
|
|
||||||
isShowIndex: '1',
|
|
||||||
sourceDataId: '',
|
|
||||||
api: '',
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
dynamicData: [],
|
|
||||||
staticData: [
|
|
||||||
{name: '列1', v: 23, v2: 3},
|
|
||||||
{name: '列2', v: 12, v2: 4},
|
|
||||||
{name: '列2', v: 12, v2: 4}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'ai3d', label: "3D", list: [
|
|
||||||
{
|
|
||||||
label: "3D楼栋", type: 'building', list: [{
|
|
||||||
type: 'building1', label: "楼栋模型1",
|
|
||||||
width: 840,
|
|
||||||
height: 800,
|
|
||||||
zIndex: 1,
|
|
||||||
title: "楼栋模型1",
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'other',
|
|
||||||
label: '其他',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
label: '地图',
|
|
||||||
type: 'map',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'map',
|
|
||||||
label: '地图',
|
|
||||||
display: 'map',
|
|
||||||
width: 840,
|
|
||||||
height: 534,
|
|
||||||
left: 0,
|
|
||||||
top: 0,
|
|
||||||
mask: '2',
|
|
||||||
pulseLines: 1,
|
|
||||||
mapStyle: "e51987628aee5206d4c9ca8c6e98b4f7",
|
|
||||||
areaId: '',
|
|
||||||
zIndex: 1,
|
|
||||||
apiData: [],
|
|
||||||
dataType: 'staticData',
|
|
||||||
dynamicData: [],
|
|
||||||
staticData: [
|
|
||||||
{
|
|
||||||
content: '中卫慧通',
|
|
||||||
lng: 117.1339399,
|
|
||||||
lat: 36.7190487,
|
|
||||||
地区: '中卫慧通',
|
|
||||||
经度: 117.1339399,
|
|
||||||
纬度: 36.7190487
|
|
||||||
}
|
|
||||||
],
|
|
||||||
api: '',
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/map.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '党组织',
|
|
||||||
type: 'partyOrg',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'partyOrg',
|
|
||||||
label: '党组织',
|
|
||||||
width: 840,
|
|
||||||
height: 800,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
title: '党组织',
|
|
||||||
border: 'border3',
|
|
||||||
sourceDataId: '',
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{
|
|
||||||
key: '个人服务办理',
|
|
||||||
value: 247
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: '同比上月',
|
|
||||||
value: 247
|
|
||||||
}
|
|
||||||
],
|
|
||||||
dynamicData: [],
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '边框',
|
|
||||||
type: 'panel',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'panel',
|
|
||||||
label: '边框',
|
|
||||||
title: '边框',
|
|
||||||
border: 'border0',
|
|
||||||
width: 400,
|
|
||||||
height: 400,
|
|
||||||
isZoom: false,
|
|
||||||
zIndex: 1,
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/border.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '装饰',
|
|
||||||
type: 'display',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'display',
|
|
||||||
label: '装饰',
|
|
||||||
display: 'display0',
|
|
||||||
width: 840,
|
|
||||||
height: 540,
|
|
||||||
isZoom: false,
|
|
||||||
zIndex: 1,
|
|
||||||
title: '标题',
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/display.png',
|
|
||||||
sourceDataId: '',
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{
|
|
||||||
label: '个人服务办理',
|
|
||||||
value: 247
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '同比上月',
|
|
||||||
value: 247
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '轮播图',
|
|
||||||
type: 'swiper',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'swiper',
|
|
||||||
label: '轮播图',
|
|
||||||
width: 400,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
border: 'border2',
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{
|
|
||||||
img: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie.png',
|
|
||||||
title: '湖羊',
|
|
||||||
content: `歙县众城湖羊养殖专业合作社
|
|
||||||
徐晓红 - 18273645627
|
|
||||||
歙县郑村镇唐跃村碉墅`
|
|
||||||
}
|
|
||||||
],
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '视频播放器',
|
|
||||||
type: 'video',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'video',
|
|
||||||
label: '视频播放器',
|
|
||||||
width: 400,
|
|
||||||
height: 300,
|
|
||||||
zIndex: 1,
|
|
||||||
src: '',
|
|
||||||
border: 'border2',
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/swiper.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '数据统计',
|
|
||||||
type: 'summary',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'summary',
|
|
||||||
label: '数据统计',
|
|
||||||
display: 'summary0',
|
|
||||||
width: 480,
|
|
||||||
height: 240,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
dataX: '',
|
|
||||||
dataY: [],
|
|
||||||
summaryTitle: '',
|
|
||||||
border: 'border3',
|
|
||||||
sourceDataId: '',
|
|
||||||
title: '数据统计',
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: [
|
|
||||||
{
|
|
||||||
key: '个人服务办理',
|
|
||||||
value: 247
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: '同比上月',
|
|
||||||
value: 247
|
|
||||||
}
|
|
||||||
],
|
|
||||||
dynamicData: [],
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/total.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '视频监控',
|
|
||||||
type: 'monitor',
|
|
||||||
list: [
|
|
||||||
{
|
|
||||||
type: 'monitor',
|
|
||||||
label: '视频监控',
|
|
||||||
src: '',
|
|
||||||
width: 480,
|
|
||||||
height: 240,
|
|
||||||
zIndex: 1,
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
title: '',
|
|
||||||
moniterId: '',
|
|
||||||
monitorType: 'cmcc',
|
|
||||||
api: '/app/appzyvideoequipment/list2',
|
|
||||||
border: 'border2',
|
|
||||||
sourceDataId: '',
|
|
||||||
dataType: 'staticData',
|
|
||||||
staticData: '',
|
|
||||||
dynamicData: '',
|
|
||||||
thumb: 'https://cdn.cunwuyun.cn/dvcp/dv/tpl/video.png'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
export {components}
|
|
||||||
@@ -1,211 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AppGigscreenViewer">
|
|
||||||
<div v-if="!component">
|
|
||||||
<div
|
|
||||||
class="component-item"
|
|
||||||
:style="{
|
|
||||||
width: item.width + 'px',
|
|
||||||
height: item.height + 'px',
|
|
||||||
left: item.left * scale + 'px',
|
|
||||||
top: item.top * scale + 'px',
|
|
||||||
position: 'absolute',
|
|
||||||
zIndex: item.zIndex,
|
|
||||||
transform: `scale(${scale})`
|
|
||||||
}"
|
|
||||||
v-for="(item, index) in componentList"
|
|
||||||
:key="index">
|
|
||||||
<ai-dv-render :instance="instance" :data="item" :index="index" :theme="dashboard.theme"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<components v-else :is="component" :dict="dict" :instance="instance" :nav="meta"/>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AppGigscreenViewer',
|
|
||||||
label: '大屏预览',
|
|
||||||
props: {
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
id: String,
|
|
||||||
urlPrefix: {
|
|
||||||
type: String,
|
|
||||||
default: '/app'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
id(v) {
|
|
||||||
this.getInfo(v)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
component: '',
|
|
||||||
dashboard: {
|
|
||||||
title: '大屏',
|
|
||||||
width: 1920,
|
|
||||||
height: 1080,
|
|
||||||
backgroundColor: '',
|
|
||||||
theme: '0',
|
|
||||||
backgroundImage: []
|
|
||||||
},
|
|
||||||
componentList: [],
|
|
||||||
scale: 1,
|
|
||||||
meta: {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.getInfo(this.id)
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.$nextTick(() => {
|
|
||||||
let content = document.querySelector('#dv-full-screen-container')
|
|
||||||
if (content) {
|
|
||||||
const transform = content.style.transform
|
|
||||||
const scale = transform.replace('scale', '').replace('(', '').replace(')', '')
|
|
||||||
if (scale == 1) {
|
|
||||||
this.scale = document.body.clientWidth / 1920
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getInfo(id) {
|
|
||||||
this.component = null
|
|
||||||
id && this.instance.post(`${this.urlPrefix}/appdiylargescreen/queryLargeScreenDetailById?id=${id}`).then(res => {
|
|
||||||
if (res?.data) {
|
|
||||||
const config = JSON.parse(res.data.config)
|
|
||||||
if (config.custom) {
|
|
||||||
this.component = config.custom
|
|
||||||
this.meta = config?.meta || {}
|
|
||||||
} else {
|
|
||||||
this.componentList = JSON.parse(res.data.config).config
|
|
||||||
this.dashboard = JSON.parse(res.data.config).dashboard
|
|
||||||
|
|
||||||
this.componentList.forEach((item, index) => {
|
|
||||||
if (item.dataType !== 'staticData' && ((item.type.indexOf('Chart') > -1) || ['display', 'table', 'map', 'summary'].includes(item.type))) {
|
|
||||||
this.getSourceData(item, index)
|
|
||||||
}
|
|
||||||
if (item.type === 'monitor' && item.monitorType === 'cmcc') {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appzyvideoequipment/getWebSdkUrl?deviceId=${item.moniterId}`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$set(this.componentList[index], 'src', JSON.parse(res.data).url)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if (item.type === 'monitor' && item.monitorType === 'slw') {
|
|
||||||
this.instance.post(`${this.urlPrefix}/appzyvideoequipment/getWebSdkUrl?deviceId=${item.moniterId}`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$set(this.componentList[index], 'src', res.data)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getSourceData(item, index) {
|
|
||||||
const api = item.dataType === 'apiData' ? item.api : `${this.urlPrefix}/appdiylargescreen/statisticsByLsid?id=${item.sourceDataId}`
|
|
||||||
this.instance.post(api).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
if (res.data.length) {
|
|
||||||
const keys = Object.keys(res.data[0])
|
|
||||||
const list = res.data
|
|
||||||
let dynamicData = []
|
|
||||||
if (item.type === 'table') {
|
|
||||||
dynamicData = keys.map(v => {
|
|
||||||
let obj = {}
|
|
||||||
list.forEach((item, index) => {
|
|
||||||
obj[`v${index}`] = item[v]
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
row: v,
|
|
||||||
...obj
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else if (item.type === 'summary') {
|
|
||||||
if (item.display === 'summary9') {
|
|
||||||
dynamicData = res.data
|
|
||||||
} else {
|
|
||||||
dynamicData = Object.keys(res.data[0]).map(item => {
|
|
||||||
return {
|
|
||||||
key: item,
|
|
||||||
value: res.data[0][item]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else if (item.dataType === 'dynamicData' && !item.dataX && !item.dataY.length) {
|
|
||||||
dynamicData = Object.keys(res.data[0]).map(item => {
|
|
||||||
return {
|
|
||||||
label: item,
|
|
||||||
value: res.data[0][item]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
if (item.dataX && item.dataY.length) {
|
|
||||||
list.forEach(i => {
|
|
||||||
let obj = {}
|
|
||||||
item.dataY.forEach(v => {
|
|
||||||
obj[v] = i[v]
|
|
||||||
})
|
|
||||||
dynamicData.push({
|
|
||||||
[item.dataX]: i[item.dataX],
|
|
||||||
...obj
|
|
||||||
})
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
dynamicData = res.data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.$set(this.componentList[index], item.dataType, dynamicData)
|
|
||||||
} else {
|
|
||||||
this.$set(this.componentList[index], item.dataType, [])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
close() {
|
|
||||||
this.$emit('close')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.AppGigscreenViewer {
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
background: transparent !important;
|
|
||||||
|
|
||||||
.component-item {
|
|
||||||
transform-origin: 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dv-scroll-board {
|
|
||||||
height: calc(100%) !important;
|
|
||||||
|
|
||||||
.header-item {
|
|
||||||
color: #7e8697;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.index {
|
|
||||||
display: inline-block;
|
|
||||||
width: 26px;
|
|
||||||
height: 26px;
|
|
||||||
line-height: 26px;
|
|
||||||
font-size: 16px;
|
|
||||||
background-color: #4F57FF !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.vdr {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script lang="jsx">
|
||||||
import {mapState} from "vuex"
|
import {mapState} from "vuex"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -34,12 +34,12 @@
|
|||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script lang="jsx">
|
||||||
import { mapState } from 'vuex'
|
import {mapState} from 'vuex'
|
||||||
import DeviceSlider from '../components/deviceSlider'
|
import DeviceSlider from "../components/deviceSlider"
|
||||||
import LocateDialog from '../components/locateDialog'
|
import LocateDialog from "../components/locateDialog"
|
||||||
import AiMonitor from '../components/AiSlwVideo'
|
import AiMonitor from "../components/AiSlwVideo"
|
||||||
import Synergy from '../components/Synergy'
|
import Synergy from "../components/Synergy"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AppISManage',
|
name: 'AppISManage',
|
||||||
|
|||||||
@@ -26,168 +26,169 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</ai-dialog>
|
</ai-dialog>
|
||||||
<locate-dialog v-model="locate" :ins="instance" :latlng="latlng" @confirm="v=>handleLocate(selected,v)"/>
|
<locate-dialog v-model="locate" :ins="instance" :latlng="latlng" @confirm="v=>handleLocate(selected,v)"/>
|
||||||
<ai-area custom-clicker :input-clicker="false" v-model="selected.areaId" :hideLevel="disabledLevel" :instance="instance" ref="BindArea"
|
<ai-area custom-clicker :input-clicker="false" v-model="selected.areaId" :hideLevel="disabledLevel"
|
||||||
|
:instance="instance" ref="BindArea"
|
||||||
@change="handleSubmit(selected)"/>
|
@change="handleSubmit(selected)"/>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script lang="jsx">
|
||||||
import { mapState } from 'vuex'
|
import {mapState} from 'vuex'
|
||||||
import DeviceSlider from "../components/deviceSlider";
|
import DeviceSlider from "../components/deviceSlider";
|
||||||
import LocateDialog from "../components/locateDialog";
|
import LocateDialog from "../components/locateDialog";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "AppMonitorManage",
|
name: "AppMonitorManage",
|
||||||
components: {LocateDialog, DeviceSlider},
|
components: {LocateDialog, DeviceSlider},
|
||||||
label: "监控实况",
|
label: "监控实况",
|
||||||
props: {
|
props: {
|
||||||
instance: Function,
|
instance: Function,
|
||||||
dict: Object,
|
dict: Object,
|
||||||
permissions: Function
|
permissions: Function
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
splitOps() {
|
||||||
|
return [
|
||||||
|
{label: "单分屏", value: 1, per: "100%"},
|
||||||
|
{label: "四分屏", value: 4, per: "49%"},
|
||||||
|
{label: "九分屏", value: 9, per: "32%"}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
computed: {
|
currentSplitStyle() {
|
||||||
splitOps() {
|
let per = this.splitOps.find(e => e.value == this.splitScreen)?.per || "100%"
|
||||||
return [
|
return {width: per, height: per}
|
||||||
{label: "单分屏", value: 1, per: "100%"},
|
|
||||||
{label: "四分屏", value: 4, per: "49%"},
|
|
||||||
{label: "九分屏", value: 9, per: "32%"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
currentSplitStyle() {
|
|
||||||
let per = this.splitOps.find(e => e.value == this.splitScreen)?.per || "100%"
|
|
||||||
return {width: per, height: per}
|
|
||||||
},
|
|
||||||
...mapState(['user'])
|
|
||||||
},
|
},
|
||||||
|
...mapState(['user'])
|
||||||
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
slider: true,
|
slider: true,
|
||||||
fullscreen: false,
|
fullscreen: false,
|
||||||
splitScreen: 1,
|
splitScreen: 1,
|
||||||
monitors: [],
|
monitors: [],
|
||||||
dialog: false,
|
dialog: false,
|
||||||
locate: false,
|
locate: false,
|
||||||
selected: {
|
selected: {
|
||||||
areaId: ''
|
areaId: ''
|
||||||
},
|
},
|
||||||
latlng: null,
|
latlng: null,
|
||||||
disabledLevel: 0,
|
disabledLevel: 0,
|
||||||
rules: {
|
rules: {
|
||||||
name: [{required: true, message: "请填写 设备名称"}]
|
name: [{required: true, message: "请填写 设备名称"}]
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
},
|
||||||
|
|
||||||
created () {
|
created() {
|
||||||
this.selected.areaId = this.user.info.areaId
|
this.selected.areaId = this.user.info.areaId
|
||||||
this.disabledLevel = this.user.info.areaList.length
|
this.disabledLevel = this.user.info.areaList.length
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
handleFullscreen() {
|
handleFullscreen() {
|
||||||
this.fullscreen = !this.fullscreen
|
this.fullscreen = !this.fullscreen
|
||||||
this.$fullscreen(this.fullscreen)
|
this.$fullscreen(this.fullscreen)
|
||||||
},
|
},
|
||||||
handleSelectMonitor(monitor) {
|
handleSelectMonitor(monitor) {
|
||||||
let {id} = monitor,
|
let {id} = monitor,
|
||||||
index = this.monitors.findIndex(e => e.id == id)
|
index = this.monitors.findIndex(e => e.id == id)
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
this.monitors.splice(index, 1)
|
this.monitors.splice(index, 1)
|
||||||
this.monitors.map((e, i) => {
|
this.monitors.map((e, i) => {
|
||||||
if (i > index) {
|
if (i > index) {
|
||||||
this.showMonitor(e, true)
|
this.showMonitor(e, true)
|
||||||
}
|
|
||||||
})
|
|
||||||
} else if (this.monitors.length >= this.splitScreen && this.splitScreen > 1) {
|
|
||||||
this.$message.warning("可分屏监控已满,请先取消其他的监控")
|
|
||||||
} else {
|
|
||||||
this.showMonitor(monitor)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
showMonitor(monitor, refresh = false) {
|
|
||||||
let {id: deviceId} = monitor
|
|
||||||
deviceId && this.instance.post("/app/appzyvideoequipment/getWebSdkUrl", null, {
|
|
||||||
params: {deviceId}
|
|
||||||
}).then(res => {
|
|
||||||
if (res?.data) {
|
|
||||||
let data = JSON.parse(res.data)
|
|
||||||
if (refresh) {
|
|
||||||
monitor.url = data.url
|
|
||||||
} else if (this.splitScreen == 1) {
|
|
||||||
this.monitors = [{...monitor, ...data}]
|
|
||||||
} else {
|
|
||||||
this.monitors.push({...monitor, ...data})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
} else if (this.monitors.length >= this.splitScreen && this.splitScreen > 1) {
|
||||||
renderTreeItem: function (h, {node, data}) {
|
this.$message.warning("可分屏监控已满,请先取消其他的监控")
|
||||||
let show = data.deviceStatus==1 ? 'show' : ''
|
} else {
|
||||||
if (node.isLeaf) {
|
this.showMonitor(monitor)
|
||||||
return (
|
}
|
||||||
<div class="flexRow">
|
},
|
||||||
<i class={['iconfont', 'iconshipinjiankong', show]}/>
|
showMonitor(monitor, refresh = false) {
|
||||||
<div>{node.label}</div>
|
let {id: deviceId} = monitor
|
||||||
<el-dropdown class="menuBtn" onCommand={e => this.handleSliderOption(e, data)}>
|
deviceId && this.instance.post("/app/appzyvideoequipment/getWebSdkUrl", null, {
|
||||||
<i class="iconfont iconMore"/>
|
params: {deviceId}
|
||||||
<el-dropdown-menu slot="dropdown">
|
}).then(res => {
|
||||||
<el-dropdown-item command="edit">修改名称</el-dropdown-item>
|
if (res?.data) {
|
||||||
<el-dropdown-item command="area">行政地区</el-dropdown-item>
|
let data = JSON.parse(res.data)
|
||||||
<el-dropdown-item command="locate">地图标绘</el-dropdown-item>
|
if (refresh) {
|
||||||
</el-dropdown-menu>
|
monitor.url = data.url
|
||||||
</el-dropdown>
|
} else if (this.splitScreen == 1) {
|
||||||
</div>
|
this.monitors = [{...monitor, ...data}]
|
||||||
)
|
} else {
|
||||||
} else return (
|
this.monitors.push({...monitor, ...data})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
renderTreeItem: function (h, {node, data}) {
|
||||||
|
let show = data.deviceStatus == 1 ? 'show' : ''
|
||||||
|
if (node.isLeaf) {
|
||||||
|
return (
|
||||||
<div class="flexRow">
|
<div class="flexRow">
|
||||||
|
<i class={['iconfont', 'iconshipinjiankong', show]}/>
|
||||||
<div>{node.label}</div>
|
<div>{node.label}</div>
|
||||||
{data.id != 'no_area' ? <div class="sta">
|
<el-dropdown class="menuBtn" onCommand={e => this.handleSliderOption(e, data)}>
|
||||||
<p>{data.online || 0}</p>/{data.sum || 0}
|
<i class="iconfont iconMore"/>
|
||||||
</div>
|
<el-dropdown-menu slot="dropdown">
|
||||||
: <div/>}
|
<el-dropdown-item command="edit">修改名称</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="area">行政地区</el-dropdown-item>
|
||||||
|
<el-dropdown-item command="locate">地图标绘</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
} else return (
|
||||||
handleSliderOption(command, data) {
|
<div class="flexRow">
|
||||||
this.selected = JSON.parse(JSON.stringify({...data, command}))
|
<div>{node.label}</div>
|
||||||
if (command == "edit") {//修改名称
|
{data.id != 'no_area' ? <div class="sta">
|
||||||
this.dialog = true
|
<p>{data.online || 0}</p>/{data.sum || 0}
|
||||||
} else if (command == "area") {//绑定areaId
|
</div>
|
||||||
this.$refs.BindArea?.chooseArea()
|
: <div/>}
|
||||||
} else if (command == "locate") {//地图标绘
|
</div>
|
||||||
this.latlng = data.lat && data.lng ? {
|
)
|
||||||
lat: data.lat,
|
},
|
||||||
lng: data.lng
|
handleSliderOption(command, data) {
|
||||||
} : ''
|
this.selected = JSON.parse(JSON.stringify({...data, command}))
|
||||||
this.locate = true
|
if (command == "edit") {//修改名称
|
||||||
}
|
this.dialog = true
|
||||||
},
|
} else if (command == "area") {//绑定areaId
|
||||||
handleSubmit(row) {
|
this.$refs.BindArea?.chooseArea()
|
||||||
delete row.createTime
|
} else if (command == "locate") {//地图标绘
|
||||||
return this.instance.post("/app/appzyvideoequipment/addOrUpdate", {
|
this.latlng = data.lat && data.lng ? {
|
||||||
...row
|
lat: data.lat,
|
||||||
}).then(res => {
|
lng: data.lng
|
||||||
if (res?.code == 0) {
|
} : ''
|
||||||
this.$message.success("提交成功!")
|
this.locate = true
|
||||||
this.dialog = false
|
|
||||||
this.$refs.DeviceSlider?.getDevices()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
handleLocate(row, locate) {
|
|
||||||
if (locate) {
|
|
||||||
let {lat, lng} = locate.location
|
|
||||||
this.handleSubmit({...row, lat, lng}).then(() => {
|
|
||||||
this.locate = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
handleSubmit(row) {
|
||||||
this.monitors = []
|
delete row.createTime
|
||||||
|
return this.instance.post("/app/appzyvideoequipment/addOrUpdate", {
|
||||||
|
...row
|
||||||
|
}).then(res => {
|
||||||
|
if (res?.code == 0) {
|
||||||
|
this.$message.success("提交成功!")
|
||||||
|
this.dialog = false
|
||||||
|
this.$refs.DeviceSlider?.getDevices()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleLocate(row, locate) {
|
||||||
|
if (locate) {
|
||||||
|
let {lat, lng} = locate.location
|
||||||
|
this.handleSubmit({...row, lat, lng}).then(() => {
|
||||||
|
this.locate = false
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.monitors = []
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -11,22 +11,16 @@ const install = function (Vue, params) {
|
|||||||
if (install.installed) return
|
if (install.installed) return
|
||||||
// 遍历注册全局组件
|
// 遍历注册全局组件
|
||||||
let apps = []
|
let apps = []
|
||||||
let contexts = require.context('.', true, /\.(\/.+)\/App[^\/]+\.vue$/)
|
let contexts = import.meta.glob('./**/App*.vue')
|
||||||
if (contexts) {
|
if (contexts) {
|
||||||
contexts.keys().map(e => {
|
Object.keys(contexts).map(path => {
|
||||||
if (contexts(e).default) {
|
if (/App[A-Z]\w+\.vue/.test(path)) {
|
||||||
if (params?.apps) {
|
return contexts?.[path]()?.then(file => {
|
||||||
if (params?.apps.includes(contexts(e).default.name)) {
|
apps.push(file.default)
|
||||||
apps.push(contexts(e).default)
|
return Vue.component(file.default.name, file.default)
|
||||||
Vue.component(contexts(e).default.name, contexts(e).default)
|
})
|
||||||
}
|
|
||||||
} else {
|
|
||||||
apps.push(contexts(e).default)
|
|
||||||
Vue.component(contexts(e).default.name, contexts(e).default)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
!!params?.showList && console.log(apps.map(e => e.name))
|
|
||||||
}
|
}
|
||||||
core?.map(app => {
|
core?.map(app => {
|
||||||
apps.push(app.component)
|
apps.push(app.component)
|
||||||
|
|||||||
@@ -7,63 +7,67 @@
|
|||||||
<template #content>
|
<template #content>
|
||||||
<ai-search-bar>
|
<ai-search-bar>
|
||||||
<template slot="left">
|
<template slot="left">
|
||||||
<el-button type="primary" icon="iconfont iconAdd" @click="handleAdd"
|
<el-button type="primary" icon="iconfont iconAdd" @click="handleAdd">添加</el-button>
|
||||||
>添加</el-button
|
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
<template slot="right">
|
<template slot="right">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="search.title"
|
v-model="search.title"
|
||||||
class="search-input"
|
class="search-input"
|
||||||
size="small"
|
size="small"
|
||||||
placeholder="请输入课程主题"
|
placeholder="请输入课程主题"
|
||||||
clearable
|
clearable
|
||||||
v-throttle="
|
v-throttle="
|
||||||
() => {
|
() => {
|
||||||
(search.current = 1), getList();
|
(search.current = 1), getList();
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
@clear="(search.current = 1), (search.title = ''), getList()"
|
@clear="(search.current = 1), (search.title = ''), getList()"
|
||||||
suffix-icon="iconfont iconSearch"
|
suffix-icon="iconfont iconSearch"
|
||||||
>
|
>
|
||||||
</el-input>
|
</el-input>
|
||||||
</template>
|
</template>
|
||||||
</ai-search-bar>
|
</ai-search-bar>
|
||||||
<ai-table
|
<ai-table
|
||||||
:tableData="tableData"
|
:tableData="tableData"
|
||||||
:col-configs="colConfigs"
|
:col-configs="colConfigs"
|
||||||
stripe
|
stripe
|
||||||
:total="total"
|
:total="total"
|
||||||
:current.sync="page.current"
|
:current.sync="page.current"
|
||||||
:size.sync="page.size"
|
:size.sync="page.size"
|
||||||
style="margin-top: 10px"
|
style="margin-top: 10px"
|
||||||
@getList="getList"
|
@getList="getList"
|
||||||
|
:dict="dict"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
slot="options"
|
slot="options"
|
||||||
label="操作"
|
label="操作"
|
||||||
align="center"
|
align="center"
|
||||||
width="230px"
|
width="230px"
|
||||||
fixed="right"
|
fixed="right"
|
||||||
>
|
>
|
||||||
<div slot-scope="{ row }" class="table-options">
|
<div slot-scope="{ row }" class="table-options">
|
||||||
<el-button
|
<el-button
|
||||||
type="text"
|
type="text"
|
||||||
:title="row.status == 0 ? '发布' : '取消发布'"
|
:title="row.status == 0 ? '发布' : '取消发布'"
|
||||||
@click="handleChange(row)"
|
@click="handleChange(row)"
|
||||||
>{{ row.status == 0 ? "发布" : "取消发布" }}</el-button
|
>{{ row.status == 0 ? "发布" : "取消发布" }}
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
<el-button type="text" title="添加" @click="handleAddSeries(row)"
|
<el-button type="text" title="添加" @click="handleAddSeries(row)"
|
||||||
>添加剧集</el-button
|
>添加剧集
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
<el-button type="text" title="详情" @click="handleDetail(row)"
|
<el-button type="text" title="详情" @click="handleDetail(row)"
|
||||||
>详情</el-button
|
>详情
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
<el-button type="text" title="编辑" @click="handleEdit(row)"
|
<el-button type="text" title="编辑" @click="handleEdit(row)"
|
||||||
>编辑</el-button
|
>编辑
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
<el-button type="text" title="删除" @click="handleDelete(row)"
|
<el-button type="text" title="删除" @click="handleDelete(row)"
|
||||||
>删除</el-button
|
>删除
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -71,14 +75,14 @@
|
|||||||
</template>
|
</template>
|
||||||
</ai-list>
|
</ai-list>
|
||||||
<component
|
<component
|
||||||
:is="comp"
|
:is="comp"
|
||||||
v-else
|
v-else
|
||||||
:row="row"
|
:row="row"
|
||||||
:instance="instance"
|
:instance="instance"
|
||||||
:dict="dict"
|
:dict="dict"
|
||||||
:permissions="permissions"
|
:permissions="permissions"
|
||||||
@back="back"
|
@back="back"
|
||||||
:isEdit="isEdit"
|
:isEdit="isEdit"
|
||||||
></component>
|
></component>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
@@ -86,12 +90,12 @@
|
|||||||
<script>
|
<script>
|
||||||
import partyClassAdd from "./components/partyClassAdd";
|
import partyClassAdd from "./components/partyClassAdd";
|
||||||
import seriesManage from "./components/seriesManage";
|
import seriesManage from "./components/seriesManage";
|
||||||
import { mapState } from "vuex";
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "AppPartyHistoryClass",
|
name: "AppPartyHistoryClass",
|
||||||
label: "党员学习",
|
label: "党员学习",
|
||||||
components: { partyClassAdd, seriesManage },
|
components: {partyClassAdd, seriesManage},
|
||||||
props: {
|
props: {
|
||||||
instance: Function,
|
instance: Function,
|
||||||
dict: Object,
|
dict: Object,
|
||||||
@@ -121,37 +125,21 @@ export default {
|
|||||||
...mapState(["user"]),
|
...mapState(["user"]),
|
||||||
colConfigs() {
|
colConfigs() {
|
||||||
return [
|
return [
|
||||||
{ label: "课程主题", prop: "title" },
|
{label: "课程主题", prop: "title"},
|
||||||
{
|
{label: "更新状态", dict: "classroomUpdateStatus", prop: "updateStatus"},
|
||||||
label: "更新状态",
|
{label: "更新时间", prop: "updateDate"},
|
||||||
render: (h, { row }) => [
|
{label: "发布时间", prop: "createDate"},
|
||||||
<span>
|
{label: "发布状态", prop: "status", dict: "newsCenterStatus"},
|
||||||
{" "}
|
{label: "发布组织", prop: "organizationName"},
|
||||||
{this.dict.getLabel(
|
{slot: "options"},
|
||||||
"classroomUpdateStatus",
|
|
||||||
row.updateStatus
|
|
||||||
)}{" "}
|
|
||||||
</span>,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{ label: "更新时间", prop: "updateDate" },
|
|
||||||
{ label: "发布时间", prop: "createDate" },
|
|
||||||
{
|
|
||||||
label: "发布状态",
|
|
||||||
render: (h, { row }) => [
|
|
||||||
<span> {this.dict.getLabel("newsCenterStatus", row.status)} </span>,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{ label: "发布组织", prop: "organizationName" },
|
|
||||||
{ slot: "options" },
|
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
handleChange(row) {
|
handleChange(row) {
|
||||||
this.$confirm(`是否确定要${row.status == 0 ? "发布" : "取消发布"}?`).then(
|
this.$confirm(`是否确定要${row.status == 0 ? "发布" : "取消发布"}?`).then(
|
||||||
(_) => {
|
(_) => {
|
||||||
this.instance
|
this.instance
|
||||||
.post("/app/apppartyclassroom/addOrUpdate", {
|
.post("/app/apppartyclassroom/addOrUpdate", {
|
||||||
id: row.id,
|
id: row.id,
|
||||||
status: row.status == 0 ? 1 : 0,
|
status: row.status == 0 ? 1 : 0,
|
||||||
@@ -159,12 +147,12 @@ export default {
|
|||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.code == 0) {
|
if (res.code == 0) {
|
||||||
this.$message.success(
|
this.$message.success(
|
||||||
`${row.status == 0 ? "发布成功" : "取消发布成功"}`
|
`${row.status == 0 ? "发布成功" : "取消发布成功"}`
|
||||||
);
|
);
|
||||||
this.getList();
|
this.getList();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
handleAddSeries(row) {
|
handleAddSeries(row) {
|
||||||
@@ -172,20 +160,20 @@ export default {
|
|||||||
this.comp = "seriesManage";
|
this.comp = "seriesManage";
|
||||||
this.row = row;
|
this.row = row;
|
||||||
},
|
},
|
||||||
handleDelete({ id }) {
|
handleDelete({id}) {
|
||||||
this.$confirm("确定要删除吗?").then((_) => {
|
this.$confirm("确定要删除吗?").then((_) => {
|
||||||
this.instance
|
this.instance
|
||||||
.post("/app/apppartyclassroom/delete", null, {
|
.post("/app/apppartyclassroom/delete", null, {
|
||||||
params: {
|
params: {
|
||||||
ids: id,
|
ids: id,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.code == 0) {
|
if (res.code == 0) {
|
||||||
this.$message.success("删除成功");
|
this.$message.success("删除成功");
|
||||||
this.getList();
|
this.getList();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
handleEdit(row) {
|
handleEdit(row) {
|
||||||
@@ -228,18 +216,18 @@ export default {
|
|||||||
},
|
},
|
||||||
getList() {
|
getList() {
|
||||||
this.instance
|
this.instance
|
||||||
.post("/app/apppartyclassroom/list", null, {
|
.post("/app/apppartyclassroom/list", null, {
|
||||||
params: {
|
params: {
|
||||||
...this.page,
|
...this.page,
|
||||||
...this.search,
|
...this.search,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res?.data) {
|
if (res?.data) {
|
||||||
this.tableData = res.data.records;
|
this.tableData = res.data.records;
|
||||||
this.total = res.data.total;
|
this.total = res.data.total;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ export default {
|
|||||||
...mapState(["user"]),
|
...mapState(["user"]),
|
||||||
colConfigs() {
|
colConfigs() {
|
||||||
return [
|
return [
|
||||||
{label: "类型", render: (h, {row}) => [< span> {row.type == 1 ? '单选题' : '多选题'} < /span>]},
|
{label: "类型", render: (h, {row}) =>h('p',row.type == 1 ? '单选题' : '多选题')},
|
||||||
{label: "题目", prop: "title"},
|
{label: "题目", prop: "title"},
|
||||||
{label: "创建时间", prop: "createDate"},
|
{label: "创建时间", prop: "createDate"},
|
||||||
{slot: "options"}
|
{slot: "options"}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
:total="total"
|
:total="total"
|
||||||
:current.sync="page.current"
|
:current.sync="page.current"
|
||||||
:size.sync="page.size"
|
:size.sync="page.size"
|
||||||
|
:dict="dict"
|
||||||
@getList="getList">
|
@getList="getList">
|
||||||
<el-table-column slot="option" label="操作" fixed="right" width="300" align="center">
|
<el-table-column slot="option" label="操作" fixed="right" width="300" align="center">
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
@@ -80,7 +81,7 @@
|
|||||||
{prop: 'viewTotal', label: '浏览数', align: 'center'},
|
{prop: 'viewTotal', label: '浏览数', align: 'center'},
|
||||||
{prop: 'publishUserName', label: '发布人'},
|
{prop: 'publishUserName', label: '发布人'},
|
||||||
{prop: 'publishTime', label: '发布时间'},
|
{prop: 'publishTime', label: '发布时间'},
|
||||||
{prop: 'status', label: '发布状态', align: 'center',render:(h,{row})=>[<span>{this.$dict.getLabel('newsCenterStatus',row.status)}</span>]},
|
{prop: 'status', label: '发布状态', align: 'center',dict:"newsCenterStatus"},
|
||||||
{slot: 'option'},
|
{slot: 'option'},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,13 +15,14 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</ai-search-bar>
|
</ai-search-bar>
|
||||||
<ai-table :tableData="tableData"
|
<ai-table :tableData="tableData"
|
||||||
:col-configs="colConfigs"
|
:col-configs="colConfigs"
|
||||||
:total="total"
|
:total="total"
|
||||||
ref="aitableex"
|
ref="aitableex"
|
||||||
:current.sync="search.current"
|
:current.sync="search.current"
|
||||||
:size.sync="search.size"
|
:size.sync="search.size"
|
||||||
@getList="getAppLeaveMessage">
|
:dict="dict"
|
||||||
|
@getList="getAppLeaveMessage">
|
||||||
<el-table-column label="是否公示" slot="isPublic" align="center" width="150">
|
<el-table-column label="是否公示" slot="isPublic" align="center" width="150">
|
||||||
<template v-slot="{row}">
|
<template v-slot="{row}">
|
||||||
<el-switch v-model="row.isPublic" @change="onChange(row)" active-value="0" inactive-value="1"
|
<el-switch v-model="row.isPublic" @change="onChange(row)" active-value="0" inactive-value="1"
|
||||||
@@ -31,7 +32,9 @@
|
|||||||
|
|
||||||
<el-table-column label="操作" slot="options" align="center" width="150">
|
<el-table-column label="操作" slot="options" align="center" width="150">
|
||||||
<template v-slot="{row}">
|
<template v-slot="{row}">
|
||||||
<el-button type="text" title="详情" @click="toDetail(row.id)" v-if="$permissions('app_appleavemessagereply_detail')">详情</el-button>
|
<el-button type="text" title="详情" @click="toDetail(row.id)"
|
||||||
|
v-if="$permissions('app_appleavemessagereply_detail')">详情
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</ai-table>
|
</ai-table>
|
||||||
@@ -123,7 +126,6 @@ export default {
|
|||||||
onChange({id, isPublic}) {
|
onChange({id, isPublic}) {
|
||||||
this.instance.post(`/app/appleavemessage/public?id=${id}`).then(res => {
|
this.instance.post(`/app/appleavemessage/public?id=${id}`).then(res => {
|
||||||
if (res.code == 0) {
|
if (res.code == 0) {
|
||||||
console.log(isPublic)
|
|
||||||
this.$message.success(isPublic == 1 ? "已公示" : "不公示")
|
this.$message.success(isPublic == 1 ? "已公示" : "不公示")
|
||||||
this.getAppLeaveMessage()
|
this.getAppLeaveMessage()
|
||||||
}
|
}
|
||||||
@@ -213,15 +215,14 @@ export default {
|
|||||||
...mapState(['user']),
|
...mapState(['user']),
|
||||||
colConfigs() {
|
colConfigs() {
|
||||||
return [
|
return [
|
||||||
{ prop: 'msgCode', label: '编号', align: 'center' },
|
{prop: 'msgCode', label: '编号', align: 'center'},
|
||||||
{ prop: 'title', label: '标题', align: 'center' },
|
{prop: 'title', label: '标题', align: 'center'},
|
||||||
{ prop: 'type', label: '类型', align: 'center',
|
{prop: 'type', label: '类型', align: 'center', dict: "leaveMessageType"},
|
||||||
render:(h,{row})=>[<span>{this.dict.getLabel('leaveMessageType', row.type)}</span>] },
|
{prop: 'leaveName', label: '留言人', align: 'center'},
|
||||||
{ prop: 'leaveName', label: '留言人', align: 'center' },
|
{prop: 'createTime', label: '留言提交时间', align: 'center'},
|
||||||
{ prop: 'createTime', label: '留言提交时间', align: 'center' },
|
{prop: 'lastReplyTime', label: '最后回复时间', align: 'center'},
|
||||||
{ prop: 'lastReplyTime', label: '最后回复时间', align: 'center' },
|
{slot: 'isPublic'},
|
||||||
{ slot: 'isPublic'},
|
{slot: 'options'},
|
||||||
{ slot: 'options'},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,58 +7,62 @@
|
|||||||
<el-select v-model="search.department" placeholder="请选择所属部门" @change="page.current=1,getList()"
|
<el-select v-model="search.department" placeholder="请选择所属部门" @change="page.current=1,getList()"
|
||||||
size="small" clearable>
|
size="small" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="(item,i) in dict.getDict('hbDepartment')" :key="i"
|
v-for="(item,i) in dict.getDict('hbDepartment')" :key="i"
|
||||||
:label="item.dictName"
|
:label="item.dictName"
|
||||||
:value="item.dictValue">
|
:value="item.dictValue">
|
||||||
</el-option>
|
</el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-select v-model="search.classificationId" placeholder="请选择所属分类" @change="page.current=1,getList()"
|
<el-select v-model="search.classificationId" placeholder="请选择所属分类" @change="page.current=1,getList()"
|
||||||
size="small" clearable>
|
size="small" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="(item,i) in classList" :key="i"
|
v-for="(item,i) in classList" :key="i"
|
||||||
:label="item.name"
|
:label="item.name"
|
||||||
:value="item.id">
|
:value="item.id">
|
||||||
</el-option>
|
</el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
<template #right>
|
<template #right>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="search.processName"
|
v-model="search.processName"
|
||||||
size="small"
|
size="small"
|
||||||
placeholder="事项名称/创建人"
|
placeholder="事项名称/创建人"
|
||||||
@clear="search={},page.current=1,getList()"
|
@clear="search={},page.current=1,getList()"
|
||||||
v-throttle="() => {page.current = 1, getList()}"
|
v-throttle="() => {page.current = 1, getList()}"
|
||||||
clearable
|
clearable
|
||||||
suffix-icon="iconfont iconSearch"/>
|
suffix-icon="iconfont iconSearch"/>
|
||||||
</template>
|
</template>
|
||||||
</ai-search-bar>
|
</ai-search-bar>
|
||||||
<ai-search-bar>
|
<ai-search-bar>
|
||||||
<template #left>
|
<template #left>
|
||||||
<el-button type="primary" icon="iconfont iconAdd" @click="goPage(tab.value==0 ? 'addConfig':'guidance')">添加{{tab.value==0?'事项':'办事指南'}}</el-button>
|
<el-button type="primary" icon="iconfont iconAdd" @click="goPage(tab.value==0 ? 'addConfig':'guidance')">
|
||||||
|
添加{{ tab.value == 0 ? '事项' : '办事指南' }}
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</ai-search-bar>
|
</ai-search-bar>
|
||||||
<ai-table
|
<ai-table
|
||||||
:tableData="tableData"
|
:tableData="tableData"
|
||||||
:col-configs="colConfigs"
|
:col-configs="colConfigs"
|
||||||
:header-cell-style="{fontWeight:'bold',color:'#333'}"
|
:header-cell-style="{fontWeight:'bold',color:'#333'}"
|
||||||
:total="page.total"
|
:total="page.total"
|
||||||
:current.sync="page.current"
|
:current.sync="page.current"
|
||||||
:size.sync="page.size"
|
:size.sync="page.size"
|
||||||
@getList="getList">
|
:dict="dict"
|
||||||
|
@getList="getList">
|
||||||
<el-table-column label="是否启用" slot="processDefStatus" align="center" width="150">
|
<el-table-column label="是否启用" slot="processDefStatus" align="center" width="150">
|
||||||
<template v-slot="{row}">
|
<template v-slot="{row}">
|
||||||
<el-switch
|
<el-switch
|
||||||
v-model="row.processDefStatus"
|
v-model="row.processDefStatus"
|
||||||
@change="onChange(row)" active-value="1" inactive-value="0"
|
@change="onChange(row)" active-value="1" inactive-value="0"
|
||||||
active-color="#5088FF"
|
active-color="#5088FF"
|
||||||
inactive-color="#D0D4DC">
|
inactive-color="#D0D4DC">
|
||||||
</el-switch>
|
</el-switch>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" slot="options" align="center" width="150">
|
<el-table-column label="操作" slot="options" align="center" width="150">
|
||||||
<template v-slot="{row}">
|
<template v-slot="{row}">
|
||||||
<div class="table-options">
|
<div class="table-options">
|
||||||
<el-button type="text" title="编辑" @click="goPage(tab.value==0 ? 'addConfig':'guidance',row)">编辑</el-button>
|
<el-button type="text" title="编辑" @click="goPage(tab.value==0 ? 'addConfig':'guidance',row)">编辑
|
||||||
|
</el-button>
|
||||||
<el-button type="text" title="删除" @click="delInfo(row)">删除</el-button>
|
<el-button type="text" title="删除" @click="delInfo(row)">删除</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -70,145 +74,141 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import day from 'dayjs'
|
import day from 'dayjs'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "configList",
|
name: "configList",
|
||||||
props: {
|
props: {
|
||||||
instance: Function,
|
instance: Function,
|
||||||
dict: Object,
|
dict: Object,
|
||||||
permissions: Function,
|
permissions: Function,
|
||||||
tab: Object,
|
tab: Object,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
search: {
|
search: {
|
||||||
department: "",
|
department: "",
|
||||||
classificationId: "",
|
classificationId: "",
|
||||||
processName: "",
|
processName: "",
|
||||||
|
},
|
||||||
|
page: {current: 1, size: 10},
|
||||||
|
total: 0,
|
||||||
|
row: {},
|
||||||
|
tableData: [],
|
||||||
|
classList: [],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
colConfigs() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
prop: 'processName',
|
||||||
|
align: 'left',
|
||||||
|
label: '事项名称',
|
||||||
},
|
},
|
||||||
page: {current: 1, size: 10},
|
{
|
||||||
total: 0,
|
prop: 'department',
|
||||||
row: {},
|
align: 'left',
|
||||||
tableData: [],
|
label: '所属部门',
|
||||||
classList: [],
|
dict: "hbDepartment"
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
prop: 'classificationName',
|
||||||
|
align: 'center',
|
||||||
|
label: '所属分类',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'timeLimit',
|
||||||
|
align: 'center',
|
||||||
|
label: '办结时限(日)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'createUserName',
|
||||||
|
align: 'center',
|
||||||
|
label: '创建人',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: 'createTime',
|
||||||
|
align: 'center',
|
||||||
|
label: '最后修改时间',
|
||||||
|
render: (h, {row}) => h('p', day(row.createTime).format("YYYY-MM-DD HH:mm"))
|
||||||
|
},
|
||||||
|
{slot: 'processDefStatus', align: 'center', label: '是否启用',},
|
||||||
|
{slot: 'options', align: 'center', label: '操作',},
|
||||||
|
].filter(e => this.tab.value == 0 ? true : (e.prop != "timeLimit"))
|
||||||
},
|
},
|
||||||
computed: {
|
},
|
||||||
colConfigs() {
|
methods: {
|
||||||
return [
|
goPage(comp, row = {}) {
|
||||||
{
|
this.$emit("goPage", {comp, row})
|
||||||
prop: 'processName',
|
|
||||||
align: 'left',
|
|
||||||
label: '事项名称',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'department',
|
|
||||||
align: 'left',
|
|
||||||
label: '所属部门',
|
|
||||||
render: (h, {row}) => [ < span > {this.dict.getLabel('hbDepartment', row.department)} < /span>]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'classificationName',
|
|
||||||
align: 'center',
|
|
||||||
label: '所属分类',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'timeLimit',
|
|
||||||
align: 'center',
|
|
||||||
label: '办结时限(日)',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'createUserName',
|
|
||||||
align: 'center',
|
|
||||||
label: '创建人',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'createTime',
|
|
||||||
align: 'center',
|
|
||||||
label: '最后修改时间',
|
|
||||||
render: (h, {row}) => [ < span > {day(row.createTime
|
|
||||||
).
|
|
||||||
format("YYYY-MM-DD HH:mm")
|
|
||||||
}<
|
|
||||||
/span>]
|
|
||||||
},
|
|
||||||
{slot: 'processDefStatus', align:'center', label:'是否启用',},
|
|
||||||
{ slot: 'options',align:'center',label:'操作',},
|
|
||||||
].filter(e=>this.tab.value==0 ? true : (e.prop!="timeLimit"))
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
methods: {
|
/**
|
||||||
goPage(comp, row = {}) {
|
* 获取分类
|
||||||
this.$emit("goPage", {comp, row})
|
*/
|
||||||
},
|
getClassification() {
|
||||||
/**
|
this.instance.post(`/app/zwspapprovalclassification/list`, null, {
|
||||||
* 获取分类
|
params: {
|
||||||
*/
|
current: 1,
|
||||||
getClassification() {
|
status: 1,
|
||||||
this.instance.post(`/app/zwspapprovalclassification/list`, null, {
|
size: 9999
|
||||||
params:{
|
}
|
||||||
current: 1,
|
}).then(res => {
|
||||||
status: 1,
|
if (res && res.data) {
|
||||||
size: 9999
|
this.classList = res.data.records
|
||||||
}
|
}
|
||||||
}).then(res => {
|
})
|
||||||
if (res && res.data) {
|
},
|
||||||
this.classList = res.data.records
|
/**
|
||||||
}
|
* 删除
|
||||||
})
|
* */
|
||||||
},
|
delInfo({id}) {
|
||||||
/**
|
this.$confirm("是否删除").then(() => {
|
||||||
* 删除
|
this.instance.post(`/app/approval-process-def/delete?id=${id}`).then(res => {
|
||||||
* */
|
|
||||||
delInfo({id}) {
|
|
||||||
this.$confirm("是否删除").then(() => {
|
|
||||||
this.instance.post(`/app/approval-process-def/delete?id=${id}`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$message.success("删除成功")
|
|
||||||
this.getList()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 启用,停用
|
|
||||||
*/
|
|
||||||
onChange({id, processDefStatus}) {
|
|
||||||
this.instance.post(`/app/approval-process-def/enable-disable`, null, {
|
|
||||||
params: {id}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
if (res.code == 0) {
|
||||||
this.$message.success(processDefStatus == 0 ? "不启用" : "已启用")
|
this.$message.success("删除成功")
|
||||||
this.getList()
|
this.getList()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
})
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 启用,停用
|
||||||
|
*/
|
||||||
|
onChange({id, processDefStatus}) {
|
||||||
|
this.instance.post(`/app/approval-process-def/enable-disable`, null, {
|
||||||
|
params: {id}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$message.success(processDefStatus == 0 ? "不启用" : "已启用")
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
getList() {
|
getList() {
|
||||||
this.instance.post(`/app/approval-process-def/list`, null, {
|
this.instance.post(`/app/approval-process-def/list`, null, {
|
||||||
params: {
|
params: {
|
||||||
...this.page,
|
...this.page,
|
||||||
...this.search,
|
...this.search,
|
||||||
processType: this.tab.value
|
processType: this.tab.value
|
||||||
},
|
},
|
||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (res?.data) {
|
if (res?.data) {
|
||||||
this.tableData = res.data.records
|
this.tableData = res.data.records
|
||||||
this.page.total = res.data.total;
|
this.page.total = res.data.total;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
|
||||||
},
|
},
|
||||||
mounted() {
|
},
|
||||||
this.getList()
|
mounted() {
|
||||||
this.getClassification()
|
this.getList()
|
||||||
},
|
this.getClassification()
|
||||||
}
|
},
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.config-list {
|
.config-list {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -53,6 +53,7 @@
|
|||||||
:total="total"
|
:total="total"
|
||||||
:current.sync="search.current"
|
:current.sync="search.current"
|
||||||
:size.sync="search.size"
|
:size.sync="search.size"
|
||||||
|
:dict="dict"
|
||||||
@getList="getList">
|
@getList="getList">
|
||||||
<el-table-column slot="readUserName" label="姓名" align="center">
|
<el-table-column slot="readUserName" label="姓名" align="center">
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
@@ -103,9 +104,8 @@ export default {
|
|||||||
{slot: "unitName"},
|
{slot: "unitName"},
|
||||||
{
|
{
|
||||||
prop: "readStatus", label: "查阅状态", align: "center",
|
prop: "readStatus", label: "查阅状态", align: "center",
|
||||||
render: (h, {row}) => [<span
|
render: (h, {row}) => h('p', {color: this.dict.getColor("announcementReadStatus", row.readStatus)}, this.dict.getLabel("announcementReadStatus", row.readStatus))
|
||||||
style={{color: this.dict.getColor("announcementReadStatus", row.readStatus)}}>{this.dict.getLabel("announcementReadStatus", row.readStatus)}</span>]
|
}
|
||||||
},
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
:total="total"
|
:total="total"
|
||||||
:current.sync="search.current"
|
:current.sync="search.current"
|
||||||
:size.sync="search.size"
|
:size.sync="search.size"
|
||||||
|
:dict="dict"
|
||||||
@getList="getList">
|
@getList="getList">
|
||||||
<el-table-column slot="releaseUserName" label="发布人" align="center">
|
<el-table-column slot="releaseUserName" label="发布人" align="center">
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
@@ -123,17 +124,20 @@ export default {
|
|||||||
{prop: 'title', label: '标题'},
|
{prop: 'title', label: '标题'},
|
||||||
{
|
{
|
||||||
prop: 'readNum', label: '查询状态', align: 'center',
|
prop: 'readNum', label: '查询状态', align: 'center',
|
||||||
render: (h, {row}) => [<span class='status'
|
render: (h, {row}) => h('p', {
|
||||||
onClick={this.showDialog.bind(this, row)}>{row.readNum}人已读,</span>,
|
class: 'status', on: {
|
||||||
<span class='status' onClick={this.showDialog.bind(this, row)}>{row.unReadNum}人未读</span>]
|
click() {
|
||||||
|
this.showDialog(row)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, `${row.readNum || 0}人已读,${row.unReadNum}人未读`)
|
||||||
},
|
},
|
||||||
{slot: 'releaseUserName'},
|
{slot: 'releaseUserName'},
|
||||||
{slot: 'unitName'},
|
{slot: 'unitName'},
|
||||||
{prop: 'releaseTime', label: '发布时间', align: 'center'},
|
{prop: 'releaseTime', label: '发布时间', align: 'center'},
|
||||||
{
|
{
|
||||||
prop: 'status', label: '发布状态', align: 'center',
|
prop: 'status', label: '发布状态', align: 'center',
|
||||||
render: (h, {row}) => [<span
|
render: (h, {row}) => h('p', {color: this.dict.getColor("announcementStatus", row.status)}, this.dict.getLabel("announcementStatus", row.status))
|
||||||
style={{color: this.dict.getColor("announcementStatus", row.status)}}>{this.dict.getLabel("announcementStatus", row.status)}</span>]
|
|
||||||
},
|
},
|
||||||
{slot: 'options'},
|
{slot: 'options'},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -13,13 +13,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
<!-- <div class="header-right__item">-->
|
<!-- <div class="header-right__item">-->
|
||||||
<!-- <span>成员总数</span>-->
|
<!-- <span>成员总数</span>-->
|
||||||
<!-- <h3>{{ chartData.groupSum}}</h3>-->
|
<!-- <h3>{{ chartData.groupSum}}</h3>-->
|
||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<div class="header-right__item">
|
<div class="header-right__item">
|
||||||
<span>成员总数</span>
|
<span>成员总数</span>
|
||||||
<h3>{{chartData.today && chartData.today.total }}</h3>
|
<h3>{{ chartData.today && chartData.today.total }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right__item">
|
<div class="header-right__item">
|
||||||
<span>今日新增</span>
|
<span>今日新增</span>
|
||||||
@@ -27,13 +27,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="header-right__item">
|
<div class="header-right__item">
|
||||||
<span>今日流失</span>
|
<span>今日流失</span>
|
||||||
<h3>{{chartData.today && chartData.today.decrease}}</h3>
|
<h3>{{ chartData.today && chartData.today.decrease }}</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="detail-top__content">
|
<div class="detail-top__content">
|
||||||
<ai-wrapper
|
<ai-wrapper
|
||||||
label-width="80px">
|
label-width="80px">
|
||||||
<ai-info-item label="群主" :value="info.ownerName"></ai-info-item>
|
<ai-info-item label="群主" :value="info.ownerName"></ai-info-item>
|
||||||
<ai-info-item label="群公告" :value="info.notice" isLine></ai-info-item>
|
<ai-info-item label="群公告" :value="info.notice" isLine></ai-info-item>
|
||||||
<ai-info-item label="群聊标签" isLine>
|
<ai-info-item label="群聊标签" isLine>
|
||||||
@@ -53,14 +53,25 @@
|
|||||||
<ai-card title="成员列表">
|
<ai-card title="成员列表">
|
||||||
<template slot="content">
|
<template slot="content">
|
||||||
<ai-table
|
<ai-table
|
||||||
:tableData="tableData"
|
:tableData="tableData"
|
||||||
:col-configs="colConfigs"
|
:col-configs="colConfigs"
|
||||||
:total="total"
|
:total="total"
|
||||||
border
|
border
|
||||||
ref="aitableex"
|
ref="aitableex"
|
||||||
@getList="getDynamicInfo"
|
@getList="getDynamicInfo"
|
||||||
:current.sync="search.current"
|
:current.sync="search.current"
|
||||||
:size.sync="search.size">
|
:size.sync="search.size"
|
||||||
|
:dict="dict">
|
||||||
|
<el-table-column slot="member" label="成员">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-row type="flex" align="middle">
|
||||||
|
<img class="avatar" :src='row.avatar || "https://cdn.cunwuyun.cn/dvcp/h5/defaultAvatar.png"'/>
|
||||||
|
<div v-text="row.memberName"/>
|
||||||
|
<span :style="{color: row.customerType == 1 ? '#2EA222' : '#3C7FC8', marginLeft: '8px'}"
|
||||||
|
v-text="(row.customerType == 1 ? '@微信' : '@' + row.corpName)|| ''"/>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column slot="options" label="操作" width="100" align="center">
|
<el-table-column slot="options" label="操作" width="100" align="center">
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
<el-button type="text" v-if="row.type==2 && row.avatar" @click="toDetail(row)">居民详情</el-button>
|
<el-button type="text" v-if="row.type==2 && row.avatar" @click="toDetail(row)">居民详情</el-button>
|
||||||
@@ -74,304 +85,300 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import * as echarts from 'echarts'
|
import * as echarts from 'echarts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Detail',
|
name: 'Detail',
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
instance: Function,
|
instance: Function,
|
||||||
dict: Object,
|
dict: Object,
|
||||||
params: Object
|
params: Object
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
colConfigs() {
|
colConfigs() {
|
||||||
return [
|
return [
|
||||||
{
|
{slot: "member"},
|
||||||
prop: 'memberName', label: '成员',render:(h,{row})=>[<img class="avatar" src={row.avatar || "https://cdn.cunwuyun.cn/dvcp/h5/defaultAvatar.png"} />,
|
{prop: 'type', label: '类型', dict: "wxGroupMemberType"},
|
||||||
<span>{row.memberName}</span>,
|
{prop: 'joinTime', label: '入群时间'},
|
||||||
<span style={{color:row.customerType==1 ? '#2EA222' : '#3C7FC8',marginLeft:'8px'}}>{ row.customerType?(row.customerType==1 ? '@微信' : '@' + row.corpName):'' }</span>],
|
{prop: 'joinScene', label: '入群方式', dict: "wxGroupMemberJoinScene"},
|
||||||
|
{slot: "options"},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isShow: false,
|
||||||
|
info: {},
|
||||||
|
search: {
|
||||||
|
current: 1,
|
||||||
|
size: 10
|
||||||
},
|
},
|
||||||
{prop: 'type', label: '类型',render:(h,{row})=>[<span>{this.dict.getLabel("wxGroupMemberType",row.type)}</span>]},
|
total: 0,
|
||||||
{prop: 'joinTime', label: '入群时间'},
|
tableData: [],
|
||||||
{prop: 'joinScene', label: '入群方式',render:(h,{row})=>[<span>{this.dict.getLabel("wxGroupMemberJoinScene",row.joinScene)}</span>]},
|
chart: null,
|
||||||
{slot: "options"},
|
chartData: {},
|
||||||
]
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
created() {
|
||||||
return {
|
this.dict.load("wxGroupMemberJoinScene", "wxGroupMemberType")
|
||||||
isShow: false,
|
},
|
||||||
info: {},
|
|
||||||
search: {
|
mounted() {
|
||||||
current: 1,
|
if (this.params && this.params.id) {
|
||||||
size: 10
|
this.getInfo()
|
||||||
|
this.getDynamicInfo()
|
||||||
|
this.getChart()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getChart() {
|
||||||
|
this.instance.post(`/app/wxcp/wxgroup/groupStatistic`, null, {
|
||||||
|
params: {
|
||||||
|
id: this.params.id
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res && res.data) {
|
||||||
|
this.chartData = res.data
|
||||||
|
this.initChart()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
initChart() {
|
||||||
|
this.chart = echarts.init(document.getElementById('lineChart'))
|
||||||
|
this.setOptions()
|
||||||
|
},
|
||||||
|
setOptions() {
|
||||||
|
const x = Object.keys(this.chartData.list)
|
||||||
|
const y = Object.values(this.chartData.list)
|
||||||
|
this.chart.setOption({
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis'
|
||||||
},
|
},
|
||||||
total: 0,
|
legend: {
|
||||||
tableData: [],
|
type: "plain"
|
||||||
chart: null,
|
},
|
||||||
chartData: {},
|
grid: {
|
||||||
}
|
left: '20px',
|
||||||
},
|
right: '38px',
|
||||||
|
bottom: '14px',
|
||||||
created() {
|
top: '30px',
|
||||||
this.dict.load("wxGroupMemberJoinScene", "wxGroupMemberType")
|
containLabel: true
|
||||||
},
|
},
|
||||||
|
color: ['#2266FF', '#22AA99', '#F8B425'],
|
||||||
mounted() {
|
xAxis: {
|
||||||
if (this.params && this.params.id) {
|
type: 'category',
|
||||||
this.getInfo()
|
axisLabel: {
|
||||||
this.getDynamicInfo()
|
align: 'center',
|
||||||
this.getChart()
|
padding: [2, 0, 0, 0],
|
||||||
}
|
interval: 0,
|
||||||
},
|
fontSize: 14,
|
||||||
|
color: '#666666'
|
||||||
methods: {
|
|
||||||
getChart() {
|
|
||||||
this.instance.post(`/app/wxcp/wxgroup/groupStatistic`, null, {
|
|
||||||
params: {
|
|
||||||
id: this.params.id
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res && res.data) {
|
|
||||||
this.chartData = res.data
|
|
||||||
this.initChart()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
initChart() {
|
|
||||||
this.chart = echarts.init(document.getElementById('lineChart'))
|
|
||||||
this.setOptions()
|
|
||||||
},
|
|
||||||
setOptions() {
|
|
||||||
const x = Object.keys(this.chartData.list)
|
|
||||||
const y = Object.values(this.chartData.list)
|
|
||||||
this.chart.setOption({
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis'
|
|
||||||
},
|
},
|
||||||
legend: {
|
boundaryGap: false,
|
||||||
type: "plain"
|
axisLine: {
|
||||||
},
|
lineStyle: {
|
||||||
grid: {
|
color: '#E1E5EF'
|
||||||
left: '20px',
|
|
||||||
right: '38px',
|
|
||||||
bottom: '14px',
|
|
||||||
top: '30px',
|
|
||||||
containLabel: true
|
|
||||||
},
|
|
||||||
color: ['#2266FF', '#22AA99', '#F8B425'],
|
|
||||||
xAxis: {
|
|
||||||
type: 'category',
|
|
||||||
axisLabel: {
|
|
||||||
align: 'center',
|
|
||||||
padding: [2, 0, 0, 0],
|
|
||||||
interval: 0,
|
|
||||||
fontSize: 14,
|
|
||||||
color: '#666666'
|
|
||||||
},
|
|
||||||
boundaryGap: false,
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: '#E1E5EF'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data: x
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
axisTick: {
|
|
||||||
length: 0,
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
splitLine: {
|
|
||||||
show: true,
|
|
||||||
lineStyle: {
|
|
||||||
color: ['#E1E5EF'],
|
|
||||||
width: 1,
|
|
||||||
type: 'solid'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
nameTextStyle: {
|
|
||||||
color: '#666666',
|
|
||||||
align: 'left'
|
|
||||||
},
|
|
||||||
axisLine: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
axisLabel: {
|
|
||||||
color: '#666666'
|
|
||||||
},
|
|
||||||
type: 'value'
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: '成员总数',
|
|
||||||
type: 'line',
|
|
||||||
data: y.map(v => v.total)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新增成员数',
|
|
||||||
type: 'line',
|
|
||||||
data: y.map(v => v.increase)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '流失成员数',
|
|
||||||
type: 'line',
|
|
||||||
data: y.map(v => v.decrease)
|
|
||||||
}
|
}
|
||||||
]
|
},
|
||||||
})
|
data: x
|
||||||
},
|
},
|
||||||
|
yAxis: {
|
||||||
getInfo() {
|
axisTick: {
|
||||||
this.instance.post(`/app/wxcp/wxgroup/getDetail?id=${this.params.id}`).then(res => {
|
length: 0,
|
||||||
if (res && res.data) {
|
show: false
|
||||||
this.info = res.data
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: ['#E1E5EF'],
|
||||||
|
width: 1,
|
||||||
|
type: 'solid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#666666',
|
||||||
|
align: 'left'
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
color: '#666666'
|
||||||
|
},
|
||||||
|
type: 'value'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '成员总数',
|
||||||
|
type: 'line',
|
||||||
|
data: y.map(v => v.total)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '新增成员数',
|
||||||
|
type: 'line',
|
||||||
|
data: y.map(v => v.increase)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '流失成员数',
|
||||||
|
type: 'line',
|
||||||
|
data: y.map(v => v.decrease)
|
||||||
}
|
}
|
||||||
})
|
]
|
||||||
},
|
})
|
||||||
|
},
|
||||||
|
|
||||||
getDynamicInfo() {
|
getInfo() {
|
||||||
this.instance.post(`/app/wxcp/wxgroup/listMember?groupId=${this.params.id}`, null, {
|
this.instance.post(`/app/wxcp/wxgroup/getDetail?id=${this.params.id}`).then(res => {
|
||||||
params: {
|
if (res && res.data) {
|
||||||
...this.search
|
this.info = res.data
|
||||||
}
|
}
|
||||||
}).then(res => {
|
})
|
||||||
if (res.code === 0) {
|
},
|
||||||
this.tableData = res.data.records
|
|
||||||
this.total = res.data.total
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
toDetail(row) {
|
getDynamicInfo() {
|
||||||
this.$router.push({
|
this.instance.post(`/app/wxcp/wxgroup/listMember?groupId=${this.params.id}`, null, {
|
||||||
name: '68',
|
params: {
|
||||||
query: {
|
...this.search
|
||||||
id: row.userId,
|
}
|
||||||
type: 'Detail'
|
}).then(res => {
|
||||||
}
|
if (res.code === 0) {
|
||||||
})
|
this.tableData = res.data.records
|
||||||
},
|
this.total = res.data.total
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
cancel(isRefresh) {
|
toDetail(row) {
|
||||||
this.$emit('change', {
|
this.$router.push({
|
||||||
type: 'list',
|
name: '68',
|
||||||
isRefresh: isRefresh ? true : false
|
query: {
|
||||||
})
|
id: row.userId,
|
||||||
}
|
type: 'Detail'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel(isRefresh) {
|
||||||
|
this.$emit('change', {
|
||||||
|
type: 'list',
|
||||||
|
isRefresh: isRefresh ? true : false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.AppResidentManage {
|
.AppResidentManage {
|
||||||
::v-deep .ai-detail__content--wrapper {
|
::v-deep .ai-detail__content--wrapper {
|
||||||
max-width: 100% !important;
|
max-width: 100% !important;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2, h3 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-top {
|
||||||
|
padding: 30px 40px;
|
||||||
|
background: #FFFFFF;
|
||||||
|
box-shadow: 0px 4px 6px -2px rgba(15, 15, 21, 0.15);
|
||||||
|
border-radius: 2px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.detail-top__content {
|
||||||
|
padding-top: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2, h3 {
|
.detail-top__header {
|
||||||
margin: 0;
|
display: flex;
|
||||||
}
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding-bottom: 32px;
|
||||||
|
border-bottom: 1px solid #EEEEEE;
|
||||||
|
|
||||||
.detail-top {
|
.header-right {
|
||||||
padding: 30px 40px;
|
.header-right__item {
|
||||||
background: #FFFFFF;
|
width: 120px;
|
||||||
box-shadow: 0px 4px 6px -2px rgba(15, 15, 21, 0.15);
|
margin-right: 8px;
|
||||||
border-radius: 2px;
|
text-align: center;
|
||||||
margin-bottom: 20px;
|
}
|
||||||
|
|
||||||
.detail-top__content {
|
div {
|
||||||
padding-top: 32px;
|
text-align: center;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-button {
|
||||||
|
height: 28px;
|
||||||
|
margin-left: 8px;
|
||||||
|
border-radius: 14px;
|
||||||
|
font-size: 12px;
|
||||||
|
padding: 7px 15px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.detail-top__header {
|
.header-left, .header-right {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding-bottom: 32px;
|
}
|
||||||
border-bottom: 1px solid #EEEEEE;
|
|
||||||
|
|
||||||
.header-right {
|
.header-left {
|
||||||
.header-right__item {
|
img {
|
||||||
width: 120px;
|
width: 64px;
|
||||||
margin-right: 8px;
|
height: 64px;
|
||||||
text-align: center;
|
margin-right: 16px;
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
color: #888888;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-button {
|
|
||||||
height: 28px;
|
|
||||||
margin-left: 8px;
|
|
||||||
border-radius: 14px;
|
|
||||||
font-size: 12px;
|
|
||||||
padding: 7px 15px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-left, .header-right {
|
h2 {
|
||||||
display: flex;
|
margin-bottom: 6px;
|
||||||
align-items: center;
|
color: #222222;
|
||||||
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-left {
|
p {
|
||||||
img {
|
color: #2EA222;
|
||||||
width: 64px;
|
font-size: 14px;
|
||||||
height: 64px;
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
margin-bottom: 6px;
|
|
||||||
color: #222222;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
color: #2EA222;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#lineChart {
|
|
||||||
width: 100%;
|
|
||||||
height: 336px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-tags {
|
|
||||||
.el-tag {
|
|
||||||
margin-right: 8px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .avatar {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
vertical-align: middle;
|
|
||||||
margin-right: 8px;
|
|
||||||
object-fit: fill;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#lineChart {
|
||||||
|
width: 100%;
|
||||||
|
height: 336px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-tags {
|
||||||
|
.el-tag {
|
||||||
|
margin-right: 8px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .avatar {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 8px;
|
||||||
|
object-fit: fill;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"AppGigscreenViewer": "大屏预览组件",
|
|
||||||
"AppDesigner": "大屏设计"
|
|
||||||
}
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AppCentralTaskDV">
|
|
||||||
<!-- <ai-dv-background :src="bgImage"/>-->
|
|
||||||
<div class="coreTask">
|
|
||||||
<div class="leftBox">
|
|
||||||
<div class="boxTitle">{{ coreTaskData.titleText }}</div>
|
|
||||||
<dv-scroll-board v-if="refresh" :config="coreTaskData"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {scrollBoard} from '@jiaminghi/data-view'
|
|
||||||
import bgImage from '../assets/centralTask/bg.png'
|
|
||||||
import Vue from "vue";
|
|
||||||
|
|
||||||
Vue.use(scrollBoard)
|
|
||||||
export default {
|
|
||||||
name: "AppCentralTaskDV",
|
|
||||||
label: "数据大屏-重点工作",
|
|
||||||
props: {
|
|
||||||
nav: {default: () => ({})}
|
|
||||||
},
|
|
||||||
inject: {
|
|
||||||
dv: {default: ""}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
coreTaskData() {
|
|
||||||
return {
|
|
||||||
headerHeight: 52,
|
|
||||||
header: ['基层组织建设', "社区治理", "便民服务效能", "城市管理"],
|
|
||||||
headerBGC: 'rgba(0, 113, 255, 0.5)',
|
|
||||||
oddRowBGC: "rgba(5, 65, 139, 0.5)",
|
|
||||||
evenRowBGC: "rgba(5, 65, 139, 0.5)",
|
|
||||||
waitTime: 6000,
|
|
||||||
align: ["center", "start", "center", "center"],
|
|
||||||
rowNum: 5,
|
|
||||||
...this.nav.data,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {bgImage, refresh: true}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
nav: {
|
|
||||||
deep: true,
|
|
||||||
handler() {
|
|
||||||
this.refresh = false
|
|
||||||
this.$nextTick(() => this.refresh = true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AppCentralTaskDV {
|
|
||||||
height: 100%;
|
|
||||||
padding: 0 0 60px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
.coreTask {
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 53px;
|
|
||||||
margin-top: 56px;
|
|
||||||
|
|
||||||
.leftBox {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background-image: url("../assets/centralTask/box.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
padding: 0 40px 42px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.boxTitle {
|
|
||||||
height: 68px;
|
|
||||||
width: 534px;
|
|
||||||
background-image: url("../assets/centralTask/titleBox.png");
|
|
||||||
text-align: center;
|
|
||||||
font-size: 22px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: #71F8FF;
|
|
||||||
transform: translateY(-32px);
|
|
||||||
line-height: 68px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .dv-scroll-board {
|
|
||||||
width: 100%;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
border-radius: 6px;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.header {
|
|
||||||
color: #9FDBFB;
|
|
||||||
font-size: 20px;
|
|
||||||
|
|
||||||
.header-item {
|
|
||||||
text-align: center;
|
|
||||||
border: 1px solid #054596;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.row-item {
|
|
||||||
color: #68F0FC;
|
|
||||||
font-size: 18px;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.ceil {
|
|
||||||
border: 1px solid #054596;
|
|
||||||
border-top: none;
|
|
||||||
position: relative;
|
|
||||||
line-height: 30px;
|
|
||||||
white-space: normal;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,479 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AppGovInteractionDV">
|
|
||||||
<el-row type="flex" justify="space-between" align="bottom">
|
|
||||||
<div flex class="framePane column top">
|
|
||||||
<div class="titlePane" v-text="'事件内容'"/>
|
|
||||||
<div class="fill">
|
|
||||||
<dv-scroll-board :config="topLeftData"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="centerTopPane" id="centerTopPane">
|
|
||||||
<b class="title gradientFont">事件统计</b>
|
|
||||||
<el-row type="flex" justify="space-between" align="middle"
|
|
||||||
v-for="(row,i) in topCenterData" :key="i">
|
|
||||||
<div class="dataPane" v-for="(op,j) in row" :key="j">
|
|
||||||
<span class="gradientFont" v-text="op.label"/>
|
|
||||||
<dv-digital-flop class="gradientFont" :config="op.v1"/>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
</div>
|
|
||||||
<div flex class="framePane column top">
|
|
||||||
<div class="titlePane" v-text="'政务微信群'"/>
|
|
||||||
<div class="totalPane" flex>
|
|
||||||
<div class="dataPanel fill" flex v-for="(op,i) in rightTopData.total" :key="i">
|
|
||||||
<span v-text="op.label"/>
|
|
||||||
<b v-text="op.v1"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="fill">
|
|
||||||
<ai-echart class="chart" :data="rightTopData.list" :ops="rightTopData.ops"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
<div flex class="gap fill">
|
|
||||||
<div flex class="framePane fill column" v-for="c in charts" :key="c.id">
|
|
||||||
<div class="titlePane" v-text="c.label"/>
|
|
||||||
<div class="fill">
|
|
||||||
<ai-echart class="chart" :data="chartData[c.id]" :ops="c.ops"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {digitalFlop, scrollBoard} from '@jiaminghi/data-view'
|
|
||||||
import Vue from "vue";
|
|
||||||
|
|
||||||
Vue.use(digitalFlop)
|
|
||||||
Vue.use(scrollBoard)
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "AppGovInteractionDV",
|
|
||||||
label: "数据大屏-政民互动",
|
|
||||||
props: {
|
|
||||||
instance: Function
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
topCenterData() {
|
|
||||||
let meta = [
|
|
||||||
[{label: "待受理", name: 'pending'}, {label: "累计上报", name: 'total_case'}],
|
|
||||||
[{label: "办理中", name: 'processing'}, {label: "累计受理", name: 'total_accepted'}],
|
|
||||||
[{label: "今日上报", name: "added_today"}, {label: "累计办结", name: 'total_solved'}],
|
|
||||||
[{label: "今日办结", name: 'solved_today'}, {label: "累计办结率", name: 'total_solved_percent'}],
|
|
||||||
]
|
|
||||||
return meta.map(e => e.map(s => {
|
|
||||||
let v1 = {
|
|
||||||
number: [this.meta.residentCategoryReport?.[s.name] || 0],
|
|
||||||
style: {
|
|
||||||
fontFamily: 'dineng',
|
|
||||||
fontWeight: 'bold',
|
|
||||||
fontSize: 40,
|
|
||||||
gradientType: 'linear',
|
|
||||||
gradientColor: ['#fff', '#fff', '#6BC7FF'],
|
|
||||||
gradientParams: [0, 0, 0, 40],
|
|
||||||
gradientWith: 'fill',
|
|
||||||
gradientStops: [0, .18, 1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (s.name == 'total_solved_percent') {
|
|
||||||
v1 = {
|
|
||||||
...v1,
|
|
||||||
number: [v1.number * 100], content: '{nt}%'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {...s, v1}
|
|
||||||
}))
|
|
||||||
},
|
|
||||||
topLeftData() {
|
|
||||||
let statusColor = {
|
|
||||||
0: 'doing',
|
|
||||||
1: 'done',
|
|
||||||
2: 'pending',
|
|
||||||
},
|
|
||||||
statusLabel = {
|
|
||||||
0: '处理中',
|
|
||||||
1: '已处理'
|
|
||||||
},
|
|
||||||
list = this.meta.residentOrderList?.map(e => {
|
|
||||||
let status = e.process_list.slice(-1)?.[0]?.status
|
|
||||||
return {
|
|
||||||
...e, status, statusLabel: statusLabel[status]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return {
|
|
||||||
oddRowBGC: 'transparent',
|
|
||||||
evenRowBGC: 'transparent',
|
|
||||||
rowNum: 10,
|
|
||||||
data: list?.map(e => [`
|
|
||||||
<div flex class="eventItem">
|
|
||||||
<span class="tag ${statusColor[e.status]}">${e.statusLabel}</span>
|
|
||||||
<div class="fill">${e.desc}</div>
|
|
||||||
</div>`]) || []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
rightTopData() {
|
|
||||||
let obj = this.meta.groupMap?.list || {},
|
|
||||||
list = Object.keys(obj).map(e => {
|
|
||||||
let {total, increase, decrease} = obj?.[e],
|
|
||||||
time = this.$moment(e).format('MM-DD')
|
|
||||||
return {time, total, increase, decrease}
|
|
||||||
})
|
|
||||||
return {
|
|
||||||
total: [
|
|
||||||
{label: '群聊总数', v1: this.meta.groupMap?.groupSum || 0},
|
|
||||||
{label: '群成员数', v1: this.meta.groupMap?.today?.total || 0},
|
|
||||||
],
|
|
||||||
ops: {
|
|
||||||
color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)', 'rgba(255, 215, 109, 0.2)'],
|
|
||||||
legend: {
|
|
||||||
itemWidth: 16,
|
|
||||||
itemHeight: 16,
|
|
||||||
textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
icon: 'rect',
|
|
||||||
itemGap: 40
|
|
||||||
},
|
|
||||||
tooltip: {},
|
|
||||||
xAxis: {
|
|
||||||
type: 'category', axisTick: false,
|
|
||||||
nameGap: 20,
|
|
||||||
axisLabel: {color: '#fff'},
|
|
||||||
axisLine: {lineStyle: {color: '#263763'}}
|
|
||||||
},
|
|
||||||
// 声明一个 Y 轴,数值轴。
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 30, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: '#263763'}},
|
|
||||||
axisLabel: {color: 'rgba(255,255,255,.8)'}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
type: 'line', name: "群成员数", symbol: 'none', lineStyle: {color: '#36A5FF', borderWidth: 1},
|
|
||||||
itemStyle: {borderColor: '#36A5FF', borderWidth: 1},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'line', name: "新增人数", symbol: 'none', lineStyle: {color: '#1CD444', borderWidth: 1},
|
|
||||||
itemStyle: {borderColor: '#1CD444', borderWidth: 1},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'line', name: "退群人数", symbol: 'none', lineStyle: {color: '#FFD76D', borderWidth: 1},
|
|
||||||
itemStyle: {borderColor: '#FFD76D', borderWidth: 1},
|
|
||||||
}
|
|
||||||
],
|
|
||||||
grid: {left: 60, bottom: 58, right: 20}
|
|
||||||
},
|
|
||||||
list
|
|
||||||
}
|
|
||||||
},
|
|
||||||
chartData() {
|
|
||||||
return {
|
|
||||||
EventType: this.meta.residentCategoryReportList?.map(e => {
|
|
||||||
let {category_name: name, total_case, total_solved} = e
|
|
||||||
return {name, total_case, total_solved}
|
|
||||||
}) || [],
|
|
||||||
EventSource: this.meta.unitReportList?.map(e => {
|
|
||||||
let {grid_name: name, total_case, total_solved} = e
|
|
||||||
return {name, total_case, total_solved}
|
|
||||||
}) || []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
charts: [
|
|
||||||
{
|
|
||||||
label: "事件类型", id: "EventType", ops: {
|
|
||||||
color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)'],
|
|
||||||
legend: {
|
|
||||||
itemWidth: 16,
|
|
||||||
itemHeight: 16,
|
|
||||||
textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
icon: 'rect',
|
|
||||||
itemGap: 40
|
|
||||||
},
|
|
||||||
tooltip: {},
|
|
||||||
xAxis: {
|
|
||||||
type: 'category', nameGap: 20, axisTick: false,
|
|
||||||
axisLabel: {color: '#fff'},
|
|
||||||
axisLine: {lineStyle: {color: '#263763'}}
|
|
||||||
},
|
|
||||||
// 声明一个 Y 轴,数值轴。
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: '#263763'}},
|
|
||||||
axisLabel: {color: 'rgba(255,255,255,.8)'}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
type: 'bar',
|
|
||||||
name: "累计受理",
|
|
||||||
barWidth: 10,
|
|
||||||
barGap: '20%',
|
|
||||||
itemStyle: {borderColor: '#36A5FF', borderWidth: 1}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'bar',
|
|
||||||
name: "累计办结",
|
|
||||||
barWidth: 10,
|
|
||||||
barGap: '20%',
|
|
||||||
itemStyle: {borderColor: '#1CD444', borderWidth: 1}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
grid: {left: 40, bottom: 58, right: 20}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "上报来源", id: "EventSource", ops: {
|
|
||||||
color: ['rgba(54, 165, 255, 0.2)', 'rgba(28, 212, 68, 0.2)'],
|
|
||||||
legend: {
|
|
||||||
itemWidth: 16,
|
|
||||||
itemHeight: 16,
|
|
||||||
textStyle: {color: '#82C5FF', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
icon: 'rect',
|
|
||||||
itemGap: 40
|
|
||||||
},
|
|
||||||
tooltip: {},
|
|
||||||
xAxis: {
|
|
||||||
type: 'category', axisTick: false,
|
|
||||||
nameGap: 20,
|
|
||||||
axisLabel: {color: '#fff'},
|
|
||||||
axisLine: {lineStyle: {color: '#263763'}}
|
|
||||||
},
|
|
||||||
// 声明一个 Y 轴,数值轴。
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 30, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: '#263763'}},
|
|
||||||
axisLabel: {color: 'rgba(255,255,255,.8)'}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
type: 'line', name: "事件数", symbol: 'none', lineStyle: {color: '#36A5FF', borderWidth: 1},
|
|
||||||
itemStyle: {borderColor: '#36A5FF', borderWidth: 1, show: false},
|
|
||||||
areaStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x2: 0, y2: 1, colorStops: [
|
|
||||||
{offset: 0, color: 'rgba(37, 161, 255, 0.5)'}, {offset: 1, color: 'rgba(37, 161, 255, 0)'}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'line', name: "办理数", symbol: 'none', lineStyle: {color: '#1CD444', borderWidth: 1},
|
|
||||||
itemStyle: {borderColor: '#1CD444', borderWidth: 1, show: false},
|
|
||||||
areaStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x2: 0, y2: 1, colorStops: [
|
|
||||||
{offset: 0, color: 'rgba(37, 206, 55, 0.5)'}, {offset: 1, color: 'rgba(37, 206, 55, 0)'}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
grid: {left: 40, bottom: 58, right: 20}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
],
|
|
||||||
meta: {},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getData() {
|
|
||||||
this.instance.post("/app/statistics/governmentPeople/queryResidentReport").then(res => {
|
|
||||||
if (res?.data) this.meta = res.data
|
|
||||||
})
|
|
||||||
},
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.getData()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AppGovInteractionDV {
|
|
||||||
height: 100%;
|
|
||||||
padding: 6px 0 10px;
|
|
||||||
gap: 20px;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #82C5FF;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
|
|
||||||
::v-deep .eventItem {
|
|
||||||
width: 100%;
|
|
||||||
color: #82C5FF;
|
|
||||||
|
|
||||||
& > .fill {
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .communityEvent {
|
|
||||||
list-style-type: circle;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 40px;
|
|
||||||
padding-left: 1px;
|
|
||||||
color: #82C5FF;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .tag {
|
|
||||||
padding: 0 10px;
|
|
||||||
border-radius: 4px;
|
|
||||||
margin-right: 10px;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 28px;
|
|
||||||
color: #fff;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
&.doing {
|
|
||||||
background-image: radial-gradient(rgba(#1B1BD6, .4), #208FFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.pending {
|
|
||||||
background-image: radial-gradient(rgba(#FF9333, .4), #FFE959);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.done {
|
|
||||||
background-image: radial-gradient(rgba(#1BD622, .4), #2CFF7C);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.centerTopPane {
|
|
||||||
background-image: url("../assets/govInteraction/globe_map.png");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
height: 540px;
|
|
||||||
width: 940px;
|
|
||||||
flex-shrink: 0;
|
|
||||||
position: relative;
|
|
||||||
padding: 30px 50px 50px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 60px;
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
top: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .gradientFont {
|
|
||||||
background-image: linear-gradient(180deg, #FFFFFF 0%, #FFFFFF 18%, #6BC7FF 100%);
|
|
||||||
-webkit-background-clip: text;
|
|
||||||
-webkit-text-fill-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-row {
|
|
||||||
&:first-of-type, &:last-of-type {
|
|
||||||
margin: 0 110px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .dataPane {
|
|
||||||
width: 122px;
|
|
||||||
height: 114px;
|
|
||||||
background-image: url("../assets/govInteraction/kuaikuai.png");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: 100% 80px;
|
|
||||||
background-position: bottom center;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
font-weight: bold;
|
|
||||||
|
|
||||||
& > b {
|
|
||||||
font-size: 50px;
|
|
||||||
line-height: 50px;
|
|
||||||
|
|
||||||
span {
|
|
||||||
font-weight: normal;
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span {
|
|
||||||
font-size: 18px;
|
|
||||||
line-height: 18px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.framePane {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(7, 11, 35, 0.4);
|
|
||||||
border: 1px solid #14345F;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
&.top {
|
|
||||||
width: 440px;
|
|
||||||
height: 520px;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .fill {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
padding: 20px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.titlePane {
|
|
||||||
width: 100%;
|
|
||||||
background-image: url("../assets/govInteraction/title.png");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: 309px 100%;
|
|
||||||
height: 60px;
|
|
||||||
padding-left: 30px;
|
|
||||||
color: #fff;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 20px;
|
|
||||||
line-height: 48px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chart {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-image {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.totalPane {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.dataPanel {
|
|
||||||
height: 60px;
|
|
||||||
background: linear-gradient(270deg, rgba(119, 169, 255, 0.1) 0%, rgba(66, 112, 255, 0.25) 100%);
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 0 10px;
|
|
||||||
font-size: 16px;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin-left: 20px;
|
|
||||||
|
|
||||||
& > span {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > b {
|
|
||||||
font-size: 24px;
|
|
||||||
color: #fff;
|
|
||||||
font-family: Arial-BoldMT, Arial, serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-right: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,852 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="griddv">
|
|
||||||
<div class="left">
|
|
||||||
<div class="griddv-title">
|
|
||||||
<h2>网格列表</h2>
|
|
||||||
</div>
|
|
||||||
<div class="griddv-tree">
|
|
||||||
<el-tree
|
|
||||||
:data="treeList"
|
|
||||||
:props="defaultProps"
|
|
||||||
@node-click="handleNodeClick"
|
|
||||||
node-key="id"
|
|
||||||
ref="tree"
|
|
||||||
default-expand-all
|
|
||||||
:expand-on-click-node="false"
|
|
||||||
highlight-current>
|
|
||||||
</el-tree>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="middle" :class="[girdLevel == '2' ? 'middle-active' : '']" ref="container" v-loading="isLoading"
|
|
||||||
element-loading-background="rgba(0, 0, 0, 0.5)">
|
|
||||||
<div
|
|
||||||
ref="middleTree"
|
|
||||||
id="tree"
|
|
||||||
class="tree"
|
|
||||||
:style="{left: x, top: y, transform: `scale(${scale}) translate(-50%, -50%) `, 'transform-origin': `${0} ${0}`}">
|
|
||||||
<ai-okr-tree ref="VueOkrTree" v-if="chartData.length"
|
|
||||||
:data="chartData"
|
|
||||||
node-key="id"
|
|
||||||
show-collapsable
|
|
||||||
aniamte
|
|
||||||
animate-name="okr-fade-in-linear"
|
|
||||||
:render-content="renderContent"
|
|
||||||
default-expand-all/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="right">
|
|
||||||
<div class="right-top">
|
|
||||||
<div class="griddv-title">
|
|
||||||
<h2>网格内人员情况</h2>
|
|
||||||
</div>
|
|
||||||
<div class="right-chart">
|
|
||||||
<ai-echart
|
|
||||||
style="height: 100%; width: 100%;"
|
|
||||||
:data="userInfo"
|
|
||||||
:ops="barChart1">
|
|
||||||
</ai-echart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="right-bottom">
|
|
||||||
<div class="griddv-title">
|
|
||||||
<h2>事件上报情况</h2>
|
|
||||||
</div>
|
|
||||||
<div class="right-chart">
|
|
||||||
<ai-echart
|
|
||||||
style="height: 100%; width: 100%;"
|
|
||||||
:data="eventInfo"
|
|
||||||
:ops="pieChart">
|
|
||||||
</ai-echart>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<el-dialog :visible.sync="isShowInfo" width="640px" :close-on-click-modal="false" :modal-append-to-body="false">
|
|
||||||
<template slot="title">
|
|
||||||
<h2>家庭信息</h2>
|
|
||||||
<img src="../assets/grid/close.png" @click="isShowInfo = false">
|
|
||||||
</template>
|
|
||||||
<div class="grid-info">
|
|
||||||
<div class="grid-info__title">
|
|
||||||
<h2>家庭地址</h2>
|
|
||||||
<span>{{ residentInfo.currentAreaName }}</span>
|
|
||||||
</div>
|
|
||||||
<ai-table
|
|
||||||
style="width: 558px"
|
|
||||||
:tableData="tableData"
|
|
||||||
:col-configs="colConfigs"
|
|
||||||
:total="total"
|
|
||||||
:isShowPagination="false"
|
|
||||||
:current.sync="search.current"
|
|
||||||
:size.sync="search.size"
|
|
||||||
@getList="() => {}">
|
|
||||||
</ai-table>
|
|
||||||
</div>
|
|
||||||
</el-dialog>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import pieChart from 'dvcp-dv-ui/components/AiEchart/template/pie/pieChart2'
|
|
||||||
import barChart1 from 'dvcp-dv-ui/components/AiEchart/template/bar/barChart1'
|
|
||||||
import AiOkrTree from "dvcp-dv-ui/components/AiOkrTree/AiOkrTree"
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AppGridDV',
|
|
||||||
|
|
||||||
label: '网格数据大屏',
|
|
||||||
components: {AiOkrTree},
|
|
||||||
props: {
|
|
||||||
instance: Function,
|
|
||||||
dict: Object,
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
isLoading: false,
|
|
||||||
treeList: [],
|
|
||||||
search: {
|
|
||||||
size: 100,
|
|
||||||
current: 1
|
|
||||||
},
|
|
||||||
barChart1,
|
|
||||||
userInfo: [],
|
|
||||||
eventInfo: [],
|
|
||||||
pieChart,
|
|
||||||
total: 0,
|
|
||||||
isShowInfo: false,
|
|
||||||
defaultProps: {
|
|
||||||
children: 'girdList',
|
|
||||||
label: 'girdName',
|
|
||||||
},
|
|
||||||
colConfigs: [
|
|
||||||
{prop: 'name', label: '姓名', align: 'center', width: 120},
|
|
||||||
{
|
|
||||||
prop: 'householdRelation',
|
|
||||||
label: '与户主关系',
|
|
||||||
align: 'center',
|
|
||||||
render: (h, {row}) => {
|
|
||||||
return h('span', {
|
|
||||||
style: {
|
|
||||||
color: row.householdName === '1' ? '#1DE94D' : '#A8D7F3'
|
|
||||||
}
|
|
||||||
}, row.householdName === '1' ? '户主' : (this.dict.getLabel('householdRelation', row.householdRelation) || '-'))
|
|
||||||
},
|
|
||||||
formart: v => this.dict.getLabel('householdRelation', v)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
prop: 'idNumber',
|
|
||||||
label: '身份证号',
|
|
||||||
align: 'center',
|
|
||||||
width: 220,
|
|
||||||
formart: v => v ? v.replace(/^(\d{10})\d{4}(.{4}$)/g, `$1${Array(5).join('*')}$2`) : '-'
|
|
||||||
},
|
|
||||||
{prop: 'phone', label: '联系方式', align: 'center'}
|
|
||||||
],
|
|
||||||
girdId: '',
|
|
||||||
residentInfo: {},
|
|
||||||
tableData: [],
|
|
||||||
chartData: [],
|
|
||||||
girdLevel: '0',
|
|
||||||
scale: 1,
|
|
||||||
x: '50%',
|
|
||||||
y: '50%',
|
|
||||||
offsetX: 0,
|
|
||||||
offsetY: 0,
|
|
||||||
defaultUrl: 'https://cdn.cunwuyun.cn/dvcp/dv/avatar.png'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
this.dict.load('householdRelation')
|
|
||||||
this.getTreeList()
|
|
||||||
this.getGirdInfo()
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
this.bindEvent()
|
|
||||||
},
|
|
||||||
|
|
||||||
destroyed() {
|
|
||||||
document.querySelector('body').removeEventListener('mousewheel', this.onMousewheel)
|
|
||||||
document.querySelector('body').removeEventListener('mouseup', this.onMouseUp)
|
|
||||||
document.querySelector('body').removeEventListener('mousedown', this.onMousedown)
|
|
||||||
document.querySelector('body').removeEventListener('mousemove', this.onMouseMove)
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
bindEvent() {
|
|
||||||
document.querySelector('body').addEventListener('mousewheel', this.onMousewheel, true)
|
|
||||||
|
|
||||||
document.querySelector('body').addEventListener('mouseup', this.onMouseUp, true)
|
|
||||||
document.querySelector('body').addEventListener('mousedown', this.onMousedown, true)
|
|
||||||
document.querySelector('body').addEventListener('mousemove', this.onMouseMove, true)
|
|
||||||
},
|
|
||||||
|
|
||||||
onMousewheel(event) {
|
|
||||||
if (!event) return false
|
|
||||||
const elClass = event.target.className
|
|
||||||
if (elClass === 'tree' || elClass === 'middle' || (elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
|
||||||
var dir = event.deltaY > 0 ? 'Up' : 'Down'
|
|
||||||
if (dir === 'Up') {
|
|
||||||
this.scale = this.scale - 0.2 <= 0.1 ? 0.1 : this.scale - 0.2
|
|
||||||
} else {
|
|
||||||
this.scale = this.scale + 0.2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
},
|
|
||||||
|
|
||||||
onMousedown(e) {
|
|
||||||
const elClass = e.target.className
|
|
||||||
if ((elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
|
||||||
const left = document.querySelector('#tree').offsetLeft
|
|
||||||
const top = document.querySelector('#tree').offsetTop
|
|
||||||
this.isMove = true
|
|
||||||
this.offsetX = e.clientX - left
|
|
||||||
this.offsetY = e.clientY - top
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onMouseMove(e) {
|
|
||||||
if (!this.isMove) return
|
|
||||||
|
|
||||||
this.x = (e.clientX - this.offsetX) + 'px'
|
|
||||||
this.y = (e.clientY - this.offsetY) + 'px'
|
|
||||||
},
|
|
||||||
|
|
||||||
onMouseUp() {
|
|
||||||
this.isMove = false
|
|
||||||
},
|
|
||||||
|
|
||||||
debounce(func, wait = 1000) {
|
|
||||||
let timeout
|
|
||||||
return function (event) {
|
|
||||||
clearTimeout(timeout)
|
|
||||||
timeout = setTimeout(() => {
|
|
||||||
func.call(this, event)
|
|
||||||
}, wait)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
handleNodeClick(e) {
|
|
||||||
this.girdLevel = e.girdLevel
|
|
||||||
this.isLoading = true
|
|
||||||
this.getGirdInfo(e.id, e.girdLevel)
|
|
||||||
this.getStatisticsInfo(e.id)
|
|
||||||
},
|
|
||||||
|
|
||||||
getStatisticsInfo(id) {
|
|
||||||
this.instance.post(`/app/appgirdmemberinfo/girdMemberAndResidentStatistic?girdId=${id}`).then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.userInfo = [
|
|
||||||
{
|
|
||||||
'name': '网格长',
|
|
||||||
'人数': res.data['网格长'] || 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': '网格员',
|
|
||||||
'人数': res.data['网格员'] || 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': '责任家庭数',
|
|
||||||
'人数': res.data['责任家庭数'] || 0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
this.instance.post(`/app/appclapeventinfo/clapEventStatistic?girdId=${id}`).then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.eventInfo = Object.keys(res.data).map(v => {
|
|
||||||
return {
|
|
||||||
'事件类型': v,
|
|
||||||
v1: res.data[v]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
renderContent(h, node) {
|
|
||||||
return h('div', {
|
|
||||||
class: 'userlist-container'
|
|
||||||
}, [h('div', {
|
|
||||||
class: `userlist ${node.data.label === '子节点' ? 'last-level' : ''} ${node.data.girdLevel > 1 ? 'userlist-wrapper' : ''} userlist-${node.data.girdLevel}`
|
|
||||||
}, node.data.userList.map(v => {
|
|
||||||
return h('div', {
|
|
||||||
class: `user-item user-item-${v.girdLevel}`
|
|
||||||
}, [h('img', {
|
|
||||||
class: 'user-img',
|
|
||||||
attrs: {
|
|
||||||
src: v.photo || this.defaultUrl
|
|
||||||
},
|
|
||||||
on: {
|
|
||||||
dragstart: e => {
|
|
||||||
e.preventDefault()
|
|
||||||
e.stopPropagation()
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}), h('p', {
|
|
||||||
class: 'user-p',
|
|
||||||
attrs: {
|
|
||||||
title: v.label,
|
|
||||||
'data-id': v.id
|
|
||||||
},
|
|
||||||
on: {
|
|
||||||
click: () => {
|
|
||||||
if (node.data.label === '子节点') {
|
|
||||||
this.getResidentInfo(v.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, v.label), h('span', {
|
|
||||||
class: 'user-span',
|
|
||||||
style: {
|
|
||||||
display: v.girdLevel === '2' ? 'block' : 'none',
|
|
||||||
fontSize: v.girdLevel === '2' ? '12px' : ''
|
|
||||||
}
|
|
||||||
}, v.checkType ? (v.checkType === '1' ? '网格员' : '网格长') : '-')])
|
|
||||||
})), h('div', {
|
|
||||||
class: 'user-gridName',
|
|
||||||
style: {
|
|
||||||
display: node.data.label === '子节点' ? 'none' : 'block',
|
|
||||||
color: 'rgba(255, 255, 255, 0.8)',
|
|
||||||
fontSize: '12px',
|
|
||||||
margin: '4px 0'
|
|
||||||
}
|
|
||||||
}, node.data.label)])
|
|
||||||
},
|
|
||||||
|
|
||||||
getResidentInfo(id) {
|
|
||||||
this.isLoading = true
|
|
||||||
this.instance.post(`/app/appresident/detail?id=${id}`).then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.residentInfo.resident = res.data
|
|
||||||
this.tableData = res.data.family || []
|
|
||||||
this.isShowInfo = true
|
|
||||||
}
|
|
||||||
|
|
||||||
this.isLoading = false
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
autoScale() {
|
|
||||||
const treeWidth = this.$refs.middleTree.offsetWidth
|
|
||||||
const containerWidth = this.$refs.container.offsetWidth
|
|
||||||
this.scale = treeWidth < containerWidth ? 1 : containerWidth / treeWidth
|
|
||||||
this.x = '50%'
|
|
||||||
this.y = '50%'
|
|
||||||
},
|
|
||||||
|
|
||||||
getGirdInfo(id) {
|
|
||||||
this.instance.post(`/app/appgirdinfo/listAllGirdAndMemberByTop?id=${id || ''}`).then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
const chartData = this.formatList([res.data])
|
|
||||||
this.chartData = chartData
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
|
||||||
if (id) {
|
|
||||||
this.getUserList(id, chartData[0].id)
|
|
||||||
} else {
|
|
||||||
this.isLoading = false
|
|
||||||
this.autoScale()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getUserList(id, parentId) {
|
|
||||||
this.instance.post(`/app/appgirdmemberresident/listByGirdMember`, null, {
|
|
||||||
params: {
|
|
||||||
size: 1000,
|
|
||||||
girdId: id
|
|
||||||
}
|
|
||||||
}).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
const userList = res.data.records.map(v => {
|
|
||||||
return {
|
|
||||||
...v,
|
|
||||||
isLast: true,
|
|
||||||
label: v.name
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
this.isLoading = false
|
|
||||||
|
|
||||||
if (!userList.length) {
|
|
||||||
this.autoScale()
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
const node = this.$refs.VueOkrTree.getNode(parentId)
|
|
||||||
this.$refs.VueOkrTree.append({
|
|
||||||
id: new Date().getTime(),
|
|
||||||
label: '子节点',
|
|
||||||
userList: userList || []
|
|
||||||
}, node)
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.autoScale()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
formatList(list) {
|
|
||||||
return list.map(item => {
|
|
||||||
let userList = []
|
|
||||||
const girdMemberManageList = item.girdMemberManageList ? item.girdMemberManageList.map(v => {
|
|
||||||
return {
|
|
||||||
...v,
|
|
||||||
label: v.name,
|
|
||||||
id: v.id,
|
|
||||||
checkType: '2',
|
|
||||||
girdName: item.girdName,
|
|
||||||
girdLevel: item.girdLevel,
|
|
||||||
isUser: true
|
|
||||||
}
|
|
||||||
}) : []
|
|
||||||
const girdMemberList = item.girdMemberList ? item.girdMemberList.map(v => {
|
|
||||||
return {
|
|
||||||
...v,
|
|
||||||
label: v.name,
|
|
||||||
id: v.id,
|
|
||||||
checkType: '1',
|
|
||||||
girdName: item.girdName,
|
|
||||||
girdLevel: item.girdLevel,
|
|
||||||
isUser: true
|
|
||||||
}
|
|
||||||
}) : []
|
|
||||||
|
|
||||||
if (this.girdLevel === '2' && item.girdLevel === '2' && girdMemberList.length) {
|
|
||||||
userList = girdMemberManageList
|
|
||||||
item.girdList = [{
|
|
||||||
girdLevel: '2',
|
|
||||||
id: item.id,
|
|
||||||
isUser: false,
|
|
||||||
userList: girdMemberList,
|
|
||||||
label: item.girdName,
|
|
||||||
children: []
|
|
||||||
}]
|
|
||||||
} else {
|
|
||||||
userList = [...girdMemberManageList, ...girdMemberList]
|
|
||||||
}
|
|
||||||
if (!userList.length) {
|
|
||||||
userList = [{
|
|
||||||
label: '-',
|
|
||||||
id: item.id,
|
|
||||||
girdLevel: item.girdLevel,
|
|
||||||
girdName: item.girdName
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
|
|
||||||
const obj = {
|
|
||||||
label: item.girdName,
|
|
||||||
id: `${new Date().getTime()}-${item.id}`,
|
|
||||||
girdLevel: item.girdLevel,
|
|
||||||
isUser: false,
|
|
||||||
userList: userList,
|
|
||||||
children: item.girdList || []
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj.children && obj.children.length && this.girdLevel !== '2') {
|
|
||||||
obj.children = this.formatList(obj.children)
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
getTreeList() {
|
|
||||||
this.instance.post('/app/appgirdinfo/listAll').then((res) => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.treeList = [...res.data]
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.$refs.tree.setCurrentKey(res.data[0].id)
|
|
||||||
this.getStatisticsInfo(res.data[0].id)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.griddv {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
height: 100%;
|
|
||||||
user-select: none;
|
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
|
||||||
width: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-track {
|
|
||||||
border-radius: 5px;
|
|
||||||
background: rgba(93, 163, 255, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
border-radius: 5px;
|
|
||||||
background: rgba(173, 208, 255, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-info {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.grid-info__title {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
h2, span {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .el-dialog__body {
|
|
||||||
padding: 10px 40px 30px;
|
|
||||||
|
|
||||||
.el-table {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table__body tr td:first-child .cell, .ai-table .el-table__header tr th:first-child .cell {
|
|
||||||
padding-left: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table th, .el-table tr {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 14px;
|
|
||||||
background-color: rgba(28, 39, 65, 0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table__row--striped, .el-table--striped .el-table__body tr.el-table__row--striped td {
|
|
||||||
background-color: transparent !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table__header-wrapper {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table--enable-row-hover .el-table__body tr:hover > td, .el-table-filter {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .el-dialog {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
margin: 0 !important;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
background: rgba(2, 13, 43, 0.9);
|
|
||||||
box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.5), inset 0px 0px 10px 0px #2C7CFF;
|
|
||||||
border: 1px solid #2D65C9;
|
|
||||||
|
|
||||||
.el-dialog__header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
background: transparent;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
cursor: pointer;
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-dialog__headerbtn {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .userlist-container {
|
|
||||||
.userlist {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 10px;
|
|
||||||
background: rgba(76, 166, 255, 0.1);
|
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
||||||
|
|
||||||
.user-item {
|
|
||||||
margin-right: 10px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 0;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 58px;
|
|
||||||
height: 80px;
|
|
||||||
object-fit: cover;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
max-width: 120px;
|
|
||||||
margin: 4px 0 0 0;
|
|
||||||
font-size: 19px;
|
|
||||||
text-align: center;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
display: block;
|
|
||||||
max-width: 120px;
|
|
||||||
font-size: 17px;
|
|
||||||
color: #9DD3FF;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.user-item-0 {
|
|
||||||
img {
|
|
||||||
width: 86px;
|
|
||||||
height: 120px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.user-item-2 {
|
|
||||||
p {
|
|
||||||
line-height: 14px;
|
|
||||||
font-size: 12px;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
line-height: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 40px;
|
|
||||||
height: 56px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.userlist-2 {
|
|
||||||
justify-content: space-between;
|
|
||||||
max-width: 130px;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
padding-bottom: 0;
|
|
||||||
width: fit-content;
|
|
||||||
margin: 0 auto;
|
|
||||||
|
|
||||||
.user-item {
|
|
||||||
width: 48px;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
&:nth-of-type(2n) {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.last-level {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
max-width: 690px;
|
|
||||||
font-size: 0;
|
|
||||||
background: rgba(0, 0, 0, 0.1);
|
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
||||||
padding: 12px 12px 0 12px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
.user-item {
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
padding: 8px;
|
|
||||||
font-size: 12px;
|
|
||||||
background: #0B477D;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.griddv-title {
|
|
||||||
display: flex;
|
|
||||||
width: 320px;
|
|
||||||
height: 62px;
|
|
||||||
background-image: url(../assets/grid/title-bg.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
width: 100%;
|
|
||||||
height: 50px;
|
|
||||||
line-height: 50px;
|
|
||||||
padding-left: 24px;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 20px;
|
|
||||||
letter-spacing: 1px;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > div {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.right {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
flex-direction: column;
|
|
||||||
width: 440px;
|
|
||||||
margin-left: 20px;
|
|
||||||
|
|
||||||
& > div {
|
|
||||||
flex: 1;
|
|
||||||
width: 100%;
|
|
||||||
padding-bottom: 20px;
|
|
||||||
background: rgba(7, 11, 35, 0.4);
|
|
||||||
border: 1px solid #2D50B5;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
.right-chart {
|
|
||||||
height: calc(100% - 82px);
|
|
||||||
padding: 0 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.middle {
|
|
||||||
position: relative;
|
|
||||||
flex: 1;
|
|
||||||
margin-left: 20px;
|
|
||||||
background: rgba(7, 11, 35, 0.4);
|
|
||||||
border: 1px solid #2D50B5;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
#tree {
|
|
||||||
display: flex;
|
|
||||||
position: absolute;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
left: 50%;
|
|
||||||
top: 50%;
|
|
||||||
padding: 20px;
|
|
||||||
overflow: hidden;
|
|
||||||
width: max-content;
|
|
||||||
height: 300%;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .org-chart-container {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
.org-chart-node-children:before, .org-chart-node:after, .org-chart-node:last-child:before,
|
|
||||||
.org-chart-node.is-leaf:before {
|
|
||||||
border-radius: 0;
|
|
||||||
border-color: #9CD7FF !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vertical .org-chart-node:after, .vertical .org-chart-node:before {
|
|
||||||
border-radius: 0;
|
|
||||||
border-color: #9CD7FF !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.org-chart-node-label-inner {
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.org-chart-node-btn {
|
|
||||||
margin-left: 0;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.org-chart-node {
|
|
||||||
// max-width: 500px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .org-chart-node-children {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.left {
|
|
||||||
width: 320px;
|
|
||||||
background: rgba(7, 11, 35, 0.4);
|
|
||||||
border: 1px solid #2D50B5;
|
|
||||||
|
|
||||||
.griddv-tree {
|
|
||||||
height: calc(100% - 62px);
|
|
||||||
overflow-y: auto;
|
|
||||||
margin: 0 8px;
|
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .el-tree {
|
|
||||||
background: transparent;
|
|
||||||
|
|
||||||
.el-tree-node__expand-icon {
|
|
||||||
color: #eaeff9;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tree-node__expand-icon.is-leaf {
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tree-node__content {
|
|
||||||
height: 32px;
|
|
||||||
color: #eaeff9;
|
|
||||||
font-size: 14px;
|
|
||||||
user-select: none;
|
|
||||||
font-weight: normal !important;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.is-current > .el-tree-node__content, .el-tree-node__content:hover {
|
|
||||||
background: linear-gradient(270deg, #4895D9 0%, #2D52CA 100%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,522 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AppVideoMonitoringDV">
|
|
||||||
<el-row type="flex" justify="space-between" class="body">
|
|
||||||
<div class="left-wrap column" flex>
|
|
||||||
<div class="left-top fill">
|
|
||||||
<label class="label">设备统计</label>
|
|
||||||
<dv-scroll-board :header="config.header" :config="config" class="table"/>
|
|
||||||
</div>
|
|
||||||
<div class="left-bottom">
|
|
||||||
<label class="label">电子地图</label>
|
|
||||||
<ai-map :areaId="user.info.areaId"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="center-wrap column" flex>
|
|
||||||
<div flex style="width: 100%">
|
|
||||||
<div :span="6" class="card fill" v-for="(item,index) in cardList" :key="index">
|
|
||||||
<span>{{ item.label }}</span>
|
|
||||||
<span>{{ item.value }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="center-bottom fill">
|
|
||||||
<label class="label">视频监控</label>
|
|
||||||
<div class="video-wrap">
|
|
||||||
<div class="item" v-for="(item,index) in videoData.slice(0,2)"
|
|
||||||
:key="index">
|
|
||||||
<template v-if="flag">
|
|
||||||
<iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *"
|
|
||||||
allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div class="video"></div>
|
|
||||||
</template>
|
|
||||||
<div class="info">
|
|
||||||
<span>{{ item.name }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="video-wrap">
|
|
||||||
<div class="item" v-for="(item,index) in videoData.slice(2,4)"
|
|
||||||
:key="index">
|
|
||||||
<template v-if="flag">
|
|
||||||
<iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *"
|
|
||||||
allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div class="video"></div>
|
|
||||||
</template>
|
|
||||||
<div class="info">
|
|
||||||
<span>{{ item.name }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="right-wrap column" flex>
|
|
||||||
<div class="right-top fill">
|
|
||||||
<label class="label">人员统计</label>
|
|
||||||
<label class="total">人员总数
|
|
||||||
<span>0</span>
|
|
||||||
<span>人</span>
|
|
||||||
</label>
|
|
||||||
<dv-scroll-board :config="config1" class="total-table"/>
|
|
||||||
</div>
|
|
||||||
<div class="right-middle">
|
|
||||||
<label class="label">动作告警统计</label>
|
|
||||||
<div class="tag">
|
|
||||||
<span></span>
|
|
||||||
</div>
|
|
||||||
<ai-echart :ops="getOpt()"/>
|
|
||||||
<div class="info">
|
|
||||||
今日
|
|
||||||
<span>0</span>
|
|
||||||
<span>次</span>
|
|
||||||
本月
|
|
||||||
<span>0</span>
|
|
||||||
<span>次</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="right-bottom">
|
|
||||||
<label class="label">声音告警统计</label>
|
|
||||||
<div class="tag">
|
|
||||||
<span></span>
|
|
||||||
</div>
|
|
||||||
<ai-echart :ops="getOpt('1')"/>
|
|
||||||
<div class="info">
|
|
||||||
今日
|
|
||||||
<span style="color:#00FFDF">0</span>
|
|
||||||
<span>次</span>
|
|
||||||
本月
|
|
||||||
<span style="color:#00FFDF">0</span>
|
|
||||||
<span>次</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-row>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {mapState} from "vuex";
|
|
||||||
import Vue from "vue";
|
|
||||||
import {scrollBoard} from "@jiaminghi/data-view";
|
|
||||||
|
|
||||||
Vue.use(scrollBoard)
|
|
||||||
export default {
|
|
||||||
name: "AppVideoMonitoringDV",
|
|
||||||
label: "数据大屏-平安小区",
|
|
||||||
inject: {
|
|
||||||
dv: {default: ""}
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
instance: Function
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState(['user']),
|
|
||||||
cardList() {
|
|
||||||
return [
|
|
||||||
{label: "总设备数", value: "0"},
|
|
||||||
{label: "在线设备", value: "0"},
|
|
||||||
{label: "离线设备", value: "0"},
|
|
||||||
{label: "设备在线率", value: "0%"},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
meta: {},
|
|
||||||
config: {
|
|
||||||
data: [
|
|
||||||
],
|
|
||||||
columnWidth: [60, 140],
|
|
||||||
header: ["机构", "设备在线率"],
|
|
||||||
headerBGC: '',
|
|
||||||
headerHeight: 41,
|
|
||||||
oddRowBGC: "",
|
|
||||||
evenRowBGC: "",
|
|
||||||
align: ["center", "center", "center"],
|
|
||||||
rowNum: 10,
|
|
||||||
index: true,
|
|
||||||
indexHeader: "排名"
|
|
||||||
},
|
|
||||||
config1: {
|
|
||||||
data: [
|
|
||||||
['普通用户', '-'],
|
|
||||||
['村级管理员', '-'],
|
|
||||||
['超级管理员', '-'],
|
|
||||||
['测试', '-'],
|
|
||||||
],
|
|
||||||
headerHeight: 41,
|
|
||||||
oddRowBGC: "",
|
|
||||||
evenRowBGC: "",
|
|
||||||
align: ["left", "left", "right"],
|
|
||||||
index: true,
|
|
||||||
rowNum: 6,
|
|
||||||
columnWidth: [50]
|
|
||||||
},
|
|
||||||
start: 0,
|
|
||||||
end: 40,
|
|
||||||
start1: 0,
|
|
||||||
end1: 40,
|
|
||||||
interval: null,
|
|
||||||
videoData: [],
|
|
||||||
flag: false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
jsonObj(val) {
|
|
||||||
return JSON.parse(val || "{}")?.url
|
|
||||||
},
|
|
||||||
getOpt(type = "0") {
|
|
||||||
let opt = {
|
|
||||||
"0": {
|
|
||||||
xData: ['2020/7/1', "2020/7/2", "2020/7/3", "2020/7/4", "2020/7/5", "2020/7/6", "2020/7/7", "2020/7/8", "2020/7/9", "2020/7/10", "2020/7/11"],
|
|
||||||
yData: Array(11).fill(0),
|
|
||||||
color: "#FFEA2F",
|
|
||||||
areaStyle: 'rgba(255,234,47,0.2)',
|
|
||||||
unit: '',
|
|
||||||
},
|
|
||||||
"1": {
|
|
||||||
xData: ["1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", "8:00", "9:00", "10:00"],
|
|
||||||
yData: Array(10).fill(0),
|
|
||||||
color: "#13B5B1",
|
|
||||||
areaStyle: 'rgba(255,234,47,0.2)',
|
|
||||||
unit: '次',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
grid: {
|
|
||||||
top: "5%",
|
|
||||||
left: "16%",
|
|
||||||
right: "3%",
|
|
||||||
bottom: "12%"
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
show: true,
|
|
||||||
boundaryGap: false,
|
|
||||||
type: 'category',
|
|
||||||
axisLabel: {
|
|
||||||
show: true,
|
|
||||||
textStyle: {
|
|
||||||
color: "#5E9CEA",
|
|
||||||
fontSize: 12
|
|
||||||
}
|
|
||||||
},
|
|
||||||
axisLine: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
axisTick: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
data: opt[type]["xData"]
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
type: 'value',
|
|
||||||
show: true,
|
|
||||||
axisTick: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
axisLine: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
splitLine: {
|
|
||||||
show: true,
|
|
||||||
lineStyle: {
|
|
||||||
color: ['#103066'],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
axisLabel: {
|
|
||||||
show: true,
|
|
||||||
formatter: (val) => `${val}${opt[type]["unit"]}`,
|
|
||||||
textStyle: {
|
|
||||||
color: "#5E9CEA",
|
|
||||||
fontSize: 12
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
series: [{
|
|
||||||
symbol: "none",
|
|
||||||
data: opt[type]["yData"],
|
|
||||||
type: 'line',
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: opt[type]["color"],
|
|
||||||
areaStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x2: 0, y2: 1, colorStops: [
|
|
||||||
{offset: 0, color: opt[type]["areaStyle"]}, {offset: 1, color: '#000000'}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getWebSdkUrlForScreen() {
|
|
||||||
this.instance.post(`/app/appzyvideoequipment/getWebSdkUrlForTianQiaoScreen`).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.videoData = res.data
|
|
||||||
this.flag = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
this.interval && clearInterval(this.interval);
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
// this.getWebSdkUrlForScreen()
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AppVideoMonitoringDV {
|
|
||||||
height: 100%;
|
|
||||||
padding: 6px 0 10px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 24px;
|
|
||||||
|
|
||||||
.body {
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.left-wrap {
|
|
||||||
width: 307px;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.left-top {
|
|
||||||
width: 100%;
|
|
||||||
background-image: url("../assets/videoMonitor/box1.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.table {
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 63px 17px 17px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.left-bottom {
|
|
||||||
width: 100%;
|
|
||||||
height: 311px;
|
|
||||||
background-image: url("../assets/videoMonitor/box2.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
margin-top: 7px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.AiMap {
|
|
||||||
width: 274px;
|
|
||||||
height: 247px;
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.center-wrap {
|
|
||||||
width: 1183px;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
height: 93.3px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
background-image: url("../assets/videoMonitor/card.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
margin-right: 24px;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span:first-child {
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span:last-child {
|
|
||||||
font-size: 38px;
|
|
||||||
font-family: dineng, serif;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #00EDFF;
|
|
||||||
margin-left: 13px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.center-bottom {
|
|
||||||
width: 100%;
|
|
||||||
height: 789px;
|
|
||||||
background-image: url("../assets/videoMonitor/middlebox.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
margin-top: 40px;
|
|
||||||
position: relative;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 61px;
|
|
||||||
|
|
||||||
.video-wrap {
|
|
||||||
width: 100%;
|
|
||||||
height: 344px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
|
|
||||||
.item {
|
|
||||||
.video {
|
|
||||||
width: 522px;
|
|
||||||
height: 296px;
|
|
||||||
object-fit: fill;
|
|
||||||
vertical-align: bottom;
|
|
||||||
border: 2px solid #122C7D;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
height: 48px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 0 12px;
|
|
||||||
background-color: #071153;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-wrap {
|
|
||||||
width: 297px;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.right-top {
|
|
||||||
width: 100%;
|
|
||||||
height: 333px;
|
|
||||||
background-image: url("../assets/videoMonitor/box3.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.total {
|
|
||||||
font-size: 16px;
|
|
||||||
color: #979AB7;
|
|
||||||
display: inline-block;
|
|
||||||
margin: 65px 0 16px 23px;
|
|
||||||
|
|
||||||
& > span:nth-child(1) {
|
|
||||||
font-size: 28px;
|
|
||||||
font-family: dineng, serif;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #01CAFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span:nth-child(2) {
|
|
||||||
font-size: 16px;
|
|
||||||
color: #01CAFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.total-table {
|
|
||||||
height: 200px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 0 23px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-middle, .right-bottom {
|
|
||||||
width: 100%;
|
|
||||||
height: 276px;
|
|
||||||
background-image: url("../assets/videoMonitor/box4.png");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
margin: 19px 0;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.tag {
|
|
||||||
margin: 28px 18px 0 0;
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #5E9CEA;
|
|
||||||
|
|
||||||
& > span {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
display: inline-block;
|
|
||||||
width: 34px;
|
|
||||||
height: 17px;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 18px;
|
|
||||||
margin-left: 14px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .AiEchart {
|
|
||||||
width: 251px;
|
|
||||||
height: 175px;
|
|
||||||
margin: 11px auto 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
line-height: 24px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 15px 19px 0;
|
|
||||||
|
|
||||||
& > span:nth-child(2n+1) {
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 400;
|
|
||||||
line-height: 24px;
|
|
||||||
color: #FFE930;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span:nth-child(2n) {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
color: #FFE930;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 0 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span:nth-child(2) {
|
|
||||||
margin-right: 22px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-bottom {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
position: absolute;
|
|
||||||
left: 24px;
|
|
||||||
top: 23px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .index {
|
|
||||||
background-color: transparent !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .header {
|
|
||||||
background: url("../assets/videoMonitor/titlebox.png");
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .row-item div:nth-child(3) {
|
|
||||||
font-size: 13px;
|
|
||||||
color: #00CDFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
Before Width: | Height: | Size: 362 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 693 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 445 B |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "dvcp-dv",
|
|
||||||
"description": "大屏应用",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"main": "dist/dvcp-dv.common.js",
|
|
||||||
"publishConfig": {
|
|
||||||
"registry": "http://192.168.1.87:4873/"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"dvcp-dv-ui": "^2.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0,
|
|
||||||
itemHeight: 5,
|
|
||||||
itemWidth: 16,
|
|
||||||
textStyle: { color: '#fff' }
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23,
|
|
||||||
minInterval: 1,
|
|
||||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,.2)', type: 'dashed' } },
|
|
||||||
axisLabel: { color: '#fff' },
|
|
||||||
axisPointer: { show: false }
|
|
||||||
},
|
|
||||||
axisPointer: {
|
|
||||||
type: 'shadow',
|
|
||||||
triggerTooltip: false,
|
|
||||||
shadowStyle: { color: 'rgba(46, 153, 255, .2)' }
|
|
||||||
},
|
|
||||||
color: [
|
|
||||||
{
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
x2: 0,
|
|
||||||
y: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{ offset: 0, color: 'rgba(66, 187, 255, 1)' },
|
|
||||||
{ offset: 1, color: 'rgba(37, 143, 255, 0.2)' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
x2: 0,
|
|
||||||
y: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{ offset: 0, color: 'rgba(66, 255, 254, 1)' },
|
|
||||||
{ offset: 1, color: 'rgba(37, 255, 246, 0.2)' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
x2: 0,
|
|
||||||
y: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{ offset: 0, color: 'rgba(97, 253, 185, 1)' },
|
|
||||||
{ offset: 1, color: 'rgba(97, 253, 185, 0.2)' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
x2: 0,
|
|
||||||
y: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{ offset: 0, color: 'rgba(253, 108, 57, 1)' },
|
|
||||||
{ offset: 1, color: 'rgba(253, 108, 57, 0.2)' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
x2: 0,
|
|
||||||
y: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{ offset: 0, color: 'rgba(248, 187, 25, 1)' },
|
|
||||||
{ offset: 1, color: 'rgba(55, 39, 5, 1)' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
daemon: {
|
|
||||||
type: 'bar',
|
|
||||||
label: {
|
|
||||||
show: true,
|
|
||||||
position: 'top',
|
|
||||||
color: '#fff',
|
|
||||||
formatter: e => {
|
|
||||||
return e.data[e.seriesName] || ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
barWidth: 16,
|
|
||||||
barCategoryGap: 40,
|
|
||||||
itemStyle: {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
itemWidth: 16, itemHeight: 5
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis', backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC',
|
|
||||||
textStyle: {color: '#fff'}
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff'}, axisPointer: {show: false}
|
|
||||||
},
|
|
||||||
axisPointer: {
|
|
||||||
type: 'shadow', show: true,
|
|
||||||
shadowStyle: {color: 'rgba(46, 153, 255, .2)'}
|
|
||||||
},
|
|
||||||
daemon: {type: 'bar', barWidth: 2, barGap: 4}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {show: false},
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff'}, axisPointer: {show: false}
|
|
||||||
},
|
|
||||||
axisPointer: {
|
|
||||||
type: 'none', show: true, triggerTooltip: false,
|
|
||||||
},
|
|
||||||
daemon: {
|
|
||||||
type: 'bar', label: {show: true, position: 'insideBottom', color: '#fff'},
|
|
||||||
barWidth: 24,
|
|
||||||
showBackground: true,
|
|
||||||
backgroundStyle: {
|
|
||||||
color: 'rgba(123, 165, 255, .2)'
|
|
||||||
},
|
|
||||||
itemStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x: 0, x2: 0, y: 0, y2: 1,
|
|
||||||
colorStops: [{offset: 0, color: '#42BBFF'}, {offset: 1, color: 'rgba(37, 143, 255, 0.2)'}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
emphasis: {
|
|
||||||
itemStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x: 0, x2: 0, y: 0, y2: 1,
|
|
||||||
colorStops: [{offset: 0, color: '#42FFFE'}, {offset: 1, color: 'rgba(37, 255, 246, 0.2)'}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
itemWidth: 16, itemHeight: 5
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis', backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC',
|
|
||||||
textStyle: {color: '#fff'}
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff'}, axisPointer: {show: false}
|
|
||||||
},
|
|
||||||
axisPointer: {
|
|
||||||
type: 'none', show: true, triggerTooltip: false,
|
|
||||||
},
|
|
||||||
daemon: {type: 'bar', barWidth: 12, stack: 'stack'}
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {show: false},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis',
|
|
||||||
backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC', textStyle: {color: '#fff'},
|
|
||||||
axisPointer: {
|
|
||||||
type: 'shadow', shadowStyle: {color: 'rgba(46, 153, 255, .2)'},
|
|
||||||
label: {show: true, backgroundColor: 'transparent', fontSize: 14, margin: 1, color: '#28FBFF'}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
type: 'category',
|
|
||||||
axisLabel: {color: '#fff', fontSize: 14},
|
|
||||||
axisTick: {show: false},
|
|
||||||
axisLine: {show: false},
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff', fontSize: 14},
|
|
||||||
},
|
|
||||||
daemon: {
|
|
||||||
type: 'bar', barWidth: 10, barGap: '40%',
|
|
||||||
label: {show: true, position: 'insideRight', color: '#fff', fontSize: 14},
|
|
||||||
showBackground: true,
|
|
||||||
backgroundStyle: {
|
|
||||||
color: 'rgba(123, 165, 255, .2)'
|
|
||||||
},
|
|
||||||
itemStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x: 0, x2: 1, y: 0, y2: 0,
|
|
||||||
colorStops: [{offset: 0, color: 'rgba(37, 143, 255,.5)'}, {offset: 1, color: 'rgba(43, 199, 255, 1)'}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
emphasis: {
|
|
||||||
label: {color: '#28FBFF', position: 'right'},
|
|
||||||
itemStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x: 0, x2: 1, y: 0, y2: 0,
|
|
||||||
colorStops: [{offset: 0, color: 'rgba(37, 255, 246, 0.5)'}, {offset: 1, color: '#28FBFF'}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import tools from "../tools";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
itemWidth: 16, itemHeight: 5
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis',
|
|
||||||
backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC', textStyle: {color: '#fff'}
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
type: 'category',
|
|
||||||
axisLabel: {color: '#fff', fontSize: 14},
|
|
||||||
axisLine: {lineStyle: {color: 'rgba(255,255,255,.5)'}},
|
|
||||||
axisPointer: {show: false},
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff', fontSize: 14},
|
|
||||||
},
|
|
||||||
daemon: {
|
|
||||||
type: 'bar', barWidth: 10,
|
|
||||||
itemStyle: {
|
|
||||||
color: ({color}) => ({
|
|
||||||
type: 'linear', x: 0, x2: 1, y: 0, y2: 0,
|
|
||||||
colorStops: [{offset: 0, color: tools.$colorUtils.Hex2RGBA(color, .5)}, {offset: 1, color}]
|
|
||||||
})
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
itemWidth: 16, itemHeight: 5
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 80, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC', textStyle: {color: '#fff'},
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
type: 'category',
|
|
||||||
axisLabel: {color: '#fff', fontSize: 14, margin: 23},
|
|
||||||
axisTick: {show: false},
|
|
||||||
axisLine: {show: false},
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff', fontSize: 14},
|
|
||||||
},
|
|
||||||
daemon: {
|
|
||||||
type: 'bar', barWidth: 10, barGap: '40%', stack: 'stack',
|
|
||||||
showBackground: true,
|
|
||||||
backgroundStyle: {color: 'rgba(123, 165, 255, .2)'}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
import tools from '../tools';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
legend: { show: false },
|
|
||||||
grid: {
|
|
||||||
left: 50,
|
|
||||||
right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis',
|
|
||||||
backgroundColor: 'rgba(14, 51, 111, 0.9)',
|
|
||||||
borderColor: '#1A6ABC',
|
|
||||||
textStyle: { color: '#fff' },
|
|
||||||
axisPointer: { type: 'cross' }
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23,
|
|
||||||
minInterval: 1,
|
|
||||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,.2)', type: 'dashed' } },
|
|
||||||
axisLabel: { color: '#fff' },
|
|
||||||
axisPointer: { snap: true }
|
|
||||||
},
|
|
||||||
daemon: (color) => ({
|
|
||||||
showSymbol: false,
|
|
||||||
lineStyle: { shadowBlur: 4, shadowOffsetY: 2 },
|
|
||||||
areaStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
x2: 0,
|
|
||||||
y: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{ offset: 0, color: tools.$colorUtils.Hex2RGBA(color, 0.5) },
|
|
||||||
{ offset: 1, color: tools.$colorUtils.Hex2RGBA(color, 0.5) }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
};
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import tools from "../tools";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis', backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC',
|
|
||||||
textStyle: {color: '#fff'}
|
|
||||||
},
|
|
||||||
daemon: color => ({
|
|
||||||
showSymbol: false,
|
|
||||||
lineStyle: {shadowBlur: 4, shadowOffsetY: 2},
|
|
||||||
areaStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x: 0, x2: 0, y: 0, y2: 1, colorStops: [
|
|
||||||
{offset: 0, color: tools.$colorUtils.Hex2RGBA(color, .5)},
|
|
||||||
{offset: 1, color: tools.$colorUtils.Hex2RGBA(color, 0)},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis', backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC',
|
|
||||||
textStyle: {color: '#fff'}
|
|
||||||
},
|
|
||||||
daemon: {
|
|
||||||
lineStyle: {shadowBlur: 4, shadowOffsetY: 2},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
right: 0, itemGap: 16,
|
|
||||||
textStyle: {color: '#fff', padding: [0, 0, 0, 8], fontSize: 14},
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis', backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC',
|
|
||||||
textStyle: {color: '#fff'}
|
|
||||||
},
|
|
||||||
daemon: {
|
|
||||||
lineStyle: {shadowBlur: 4, shadowOffsetY: 2},
|
|
||||||
emphasis: {
|
|
||||||
focus: 'self'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import tools from "../tools";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
legend: {show: false},
|
|
||||||
grid: {
|
|
||||||
left: 50, right: 0
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis', backgroundColor: 'rgba(14, 51, 111, 0.9)', borderColor: '#1A6ABC',
|
|
||||||
textStyle: {color: '#fff'},
|
|
||||||
axisPointer: {type: 'cross'}
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
nameGap: 23, minInterval: 1,
|
|
||||||
splitLine: {lineStyle: {color: 'rgba(255,255,255,.2)', type: 'dashed'}},
|
|
||||||
axisLabel: {color: '#fff'},
|
|
||||||
axisPointer: {snap: true}
|
|
||||||
},
|
|
||||||
daemon: color=> ({
|
|
||||||
showSymbol: false, smooth: true,
|
|
||||||
lineStyle: {shadowBlur: 4, shadowOffsetY: 2},
|
|
||||||
areaStyle: {
|
|
||||||
color: {
|
|
||||||
type: 'linear', x: 0, x2: 0, y: 0, y2: 1, colorStops: [
|
|
||||||
{offset: 0, color: tools.$colorUtils.Hex2RGBA(color, .5)},
|
|
||||||
{offset: 1, color: tools.$colorUtils.Hex2RGBA(color, 0)},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
export default {
|
|
||||||
legend: {
|
|
||||||
bottom: 0,
|
|
||||||
itemGap: 14,
|
|
||||||
itemWidth: 16,
|
|
||||||
itemHeight: 5,
|
|
||||||
textStyle: {color: "#fff", fontSize: 14}
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
height: 260
|
|
||||||
},
|
|
||||||
xAxis: {show: false},
|
|
||||||
yAxis: {show: false},
|
|
||||||
tooltip: {
|
|
||||||
backgroundColor: "rgba(14, 51, 111, 0.9)",
|
|
||||||
borderColor: "#1A6ABC",
|
|
||||||
textStyle: {color: "#fff"}
|
|
||||||
},
|
|
||||||
series: {
|
|
||||||
type: "pie",
|
|
||||||
minShowLabelAngle: 10,
|
|
||||||
radius: [70, 81],
|
|
||||||
itemStyle: {
|
|
||||||
borderColor: "#fff",
|
|
||||||
borderWidth: 2
|
|
||||||
},
|
|
||||||
label: {
|
|
||||||
color: "#A8D7F3",
|
|
||||||
fontSize: 14,
|
|
||||||
formatter: "{name|{b}}\n{v|{d}%}",
|
|
||||||
minMargin: 5,
|
|
||||||
edgeDistance: 10,
|
|
||||||
lineHeight: 22,
|
|
||||||
rich: {
|
|
||||||
v: {
|
|
||||||
color: "#fff"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
labelLine: {},
|
|
||||||
labelLayout: function (params) {
|
|
||||||
let points = params.labelLinePoints,
|
|
||||||
isLeft = points[2][0] < points[1][0]
|
|
||||||
points[2][0] =
|
|
||||||
points[2][0] + (params.labelRect.width + 4) * (isLeft ? -1 : 1)
|
|
||||||
return {
|
|
||||||
labelLinePoints: points
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
render: (h, params) => {
|
|
||||||
const formatNum = num => {
|
|
||||||
if (num >= 10000000) {
|
|
||||||
return num / 10000000 + "千万"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num >= 10000) {
|
|
||||||
return num / 10000 + "万"
|
|
||||||
}
|
|
||||||
|
|
||||||
return parseFloat(num.toFixed(2))
|
|
||||||
}
|
|
||||||
|
|
||||||
let total = params.data.reduce((t, e) => {
|
|
||||||
return t + Number(Object.values(e)?.[1] || 0)
|
|
||||||
}, 0)
|
|
||||||
return h(
|
|
||||||
"div",
|
|
||||||
{
|
|
||||||
style: {
|
|
||||||
height: "162px",
|
|
||||||
width: "162px",
|
|
||||||
color: "#8BCCFF",
|
|
||||||
left: "50%",
|
|
||||||
top: "50%",
|
|
||||||
display: "flex",
|
|
||||||
alignItems: "center",
|
|
||||||
justifyContent: "center",
|
|
||||||
flexDirection: "column",
|
|
||||||
position: "absolute",
|
|
||||||
transform: "translate(-50%,-50%)",
|
|
||||||
backgroundImage: `url('https://cdn.cunwuyun.cn/dvcp/dv/tpl/pie2Circle.png')`,
|
|
||||||
backgroundPosition: "center"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[
|
|
||||||
h(
|
|
||||||
"span",
|
|
||||||
{style: {fontSize: "28px", color: "#fff", fontFamily: "DIN"}},
|
|
||||||
formatNum(total)
|
|
||||||
),
|
|
||||||
h("span", null, "总量")
|
|
||||||
]
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
export default {
|
|
||||||
$colorUtils: {
|
|
||||||
Hex2RGBA(color, alpha = 1) {
|
|
||||||
let hex = 0;
|
|
||||||
if (color.charAt(0) == "#") {
|
|
||||||
if (color.length == 4) {
|
|
||||||
//检测诸如#FFF简写格式
|
|
||||||
color = "#" + color.charAt(1).repeat(2) +
|
|
||||||
color.charAt(2).repeat(2) +
|
|
||||||
color.charAt(3).repeat(2);
|
|
||||||
}
|
|
||||||
hex = parseInt(color.slice(1), 16);
|
|
||||||
}
|
|
||||||
let r = hex >> 16 & 0xFF;
|
|
||||||
let g = hex >> 8 & 0xFF;
|
|
||||||
let b = hex & 0xFF;
|
|
||||||
return `rgba(${r},${g},${b},${alpha})`;
|
|
||||||
},
|
|
||||||
RGBtoHex(r, g, b) {
|
|
||||||
let hex = r << 16 | g << 8 | b;
|
|
||||||
return "#" + hex.toString(16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AiMonitor">
|
|
||||||
<template v-if="type=='cmcc'">
|
|
||||||
<iframe :src="src" allow="autoplay *; microphone *; fullscreen *" allowfullscreen allowtransparency
|
|
||||||
allowusermedia frameBorder="no"/>
|
|
||||||
</template>
|
|
||||||
<hikversion-monitor v-else-if="type=='hik'" :src="src"/>
|
|
||||||
<dhVideo v-else-if="type=='dahua'" :src="src"/>
|
|
||||||
<slwVideo v-else-if="type=='slw'" :src="src"/>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import HikversionMonitor from "./hikversionMonitor";
|
|
||||||
import dhVideo from "./dhVideo";
|
|
||||||
import slwVideo from "./slwVideo";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "AiMonitor",
|
|
||||||
components: {HikversionMonitor, dhVideo, slwVideo},
|
|
||||||
props: {
|
|
||||||
/**
|
|
||||||
* 视频源
|
|
||||||
*/
|
|
||||||
src: {default: ""},
|
|
||||||
/**
|
|
||||||
* 组件类型
|
|
||||||
* cmcc 中移物联,hik 海康威视
|
|
||||||
* @values cmcc,hik
|
|
||||||
*/
|
|
||||||
type: {default: "cmcc"},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AiMonitor {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
min-width: 100px;
|
|
||||||
min-height: 60px;
|
|
||||||
|
|
||||||
iframe {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="dh-video" style="height: 100%;">
|
|
||||||
<video :id="id" autoplay class="video-js vjs-default-skin" style="width: 100%; height: 100%;" controls>
|
|
||||||
<source :src="src">
|
|
||||||
</video>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import videojs from 'video.js'
|
|
||||||
import 'videojs-contrib-hls'
|
|
||||||
import 'video.js/dist/video-js.css'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
props: ['src'],
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
isInit: false,
|
|
||||||
id: `video-${Math.ceil(Math.random() * 1000000)}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
|
||||||
src: {
|
|
||||||
handler(val) {
|
|
||||||
if (val) {
|
|
||||||
this.$nextTick(() => {
|
|
||||||
videojs(this.id, {
|
|
||||||
autoplay: true
|
|
||||||
}, function () { console.log('videojs播放器初始化成功') })
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted () {
|
|
||||||
if (this.src) {
|
|
||||||
this.$nextTick(() => {
|
|
||||||
videojs(this.id, {
|
|
||||||
autoplay: true
|
|
||||||
}, function () {
|
|
||||||
this.isInit = true
|
|
||||||
console.log('videojs播放器初始化成功')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.dh-video {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
.video-js {
|
|
||||||
width: 100%!important;
|
|
||||||
height: 100%!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
::v-deep .video-js {
|
|
||||||
width: 100%!important;
|
|
||||||
height: 100%!important;
|
|
||||||
|
|
||||||
.vjs-big-play-button {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > div {
|
|
||||||
width: 100%!important;
|
|
||||||
height: 100%!important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="hikversionMonitor">
|
|
||||||
<div id="monitorIns">
|
|
||||||
<el-link v-if="needSetupPlugin" href="https://cdn.cunwuyun.cn/wsr/lib/VideoWebPlugin.exe" type="primary">
|
|
||||||
请检查是否安装视频插件,如果没有请点击下载视频插件并安装
|
|
||||||
</el-link>
|
|
||||||
<div v-else>视频插件未启动,正在尝试启动,请稍候...</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "hikversionMonitor",
|
|
||||||
props: {
|
|
||||||
src: {default: ""},
|
|
||||||
list: {default: () => []}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
monitorIns: null,
|
|
||||||
initCount: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
needSetupPlugin() {
|
|
||||||
return this.initCount >= 3
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getMonitorWidth() {
|
|
||||||
let {width} = document.querySelector("#monitorIns")?.getBoundingClientRect()
|
|
||||||
return width
|
|
||||||
},
|
|
||||||
getMonitorHeight() {
|
|
||||||
let {height} = document.querySelector("#monitorIns")?.getBoundingClientRect()
|
|
||||||
return height
|
|
||||||
},
|
|
||||||
initSDK() {
|
|
||||||
this.$nextTick(() => {
|
|
||||||
let width = this.getMonitorWidth(), height = this.getMonitorHeight()
|
|
||||||
if (width) {
|
|
||||||
this.monitorIns = new WebControl({
|
|
||||||
szPluginContainer: "monitorIns", // 指定容器id
|
|
||||||
iServicePortStart: 15900, // 指定起止端口号,建议使用该值
|
|
||||||
iServicePortEnd: 15909,
|
|
||||||
szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
|
|
||||||
cbConnectSuccess: () => { // 创建WebControl实例成功
|
|
||||||
this.monitorIns.JS_StartService("window", { // WebControl实例创建成功后需要启动服务
|
|
||||||
dllPath: "./VideoPluginConnect.dll" // 值"./VideoPluginConnect.dll"写死
|
|
||||||
}).then(() => { // 启动插件服务成功
|
|
||||||
this.monitorIns.JS_CreateWnd("monitorIns", width, height).then(() => { //JS_CreateWnd创建视频播放窗口,宽高可设定
|
|
||||||
this.monitorIns.JS_RequestInterface({
|
|
||||||
funcName: "getRSAPubKey",
|
|
||||||
argument: JSON.stringify({
|
|
||||||
keyLength: 1024
|
|
||||||
})
|
|
||||||
}).then((oData) => {
|
|
||||||
if (oData.responseMsg.data) {
|
|
||||||
let encrypt = new JSEncrypt();
|
|
||||||
encrypt.setPublicKey(oData.responseMsg.data);
|
|
||||||
let secret = encrypt.encrypt("JSqHo9JUgPLQxfCIjsmQ");
|
|
||||||
this.monitorIns.JS_RequestInterface({
|
|
||||||
funcName: "init",
|
|
||||||
argument: JSON.stringify({
|
|
||||||
appkey: "23335895", //API网关提供的appkey
|
|
||||||
secret, //API网关提供的secret
|
|
||||||
ip: "124.128.246.74", //API网关IP地址
|
|
||||||
playMode: 0, //初始播放模式:0-预览,1-回放
|
|
||||||
port: 1443, //端口
|
|
||||||
snapDir: ".", //抓图存储路径
|
|
||||||
videoDir: ".", //紧急录像或录像剪辑存储路径
|
|
||||||
layout: "1x1", //布局
|
|
||||||
enableHTTPS: 1, //是否启用HTTPS协议
|
|
||||||
encryptedFields: "secret", //加密字段
|
|
||||||
showToolbar: 1, //是否显示工具栏
|
|
||||||
showSmart: 1, //是否显示智能信息
|
|
||||||
buttonIDs: "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769" //自定义工具条按钮
|
|
||||||
})
|
|
||||||
}).then(() => {
|
|
||||||
this.monitorIns.JS_Resize(width, height); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
|
|
||||||
this.startPreview()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}, (...args) => {
|
|
||||||
// 启动插件服务失败
|
|
||||||
console.log(args)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
cbConnectError: () => {
|
|
||||||
this.monitorIns = null
|
|
||||||
WebControl.JS_WakeUp("VideoWebPlugin://");
|
|
||||||
this.initCount++
|
|
||||||
if (!this.needSetupPlugin) {
|
|
||||||
setTimeout(() => {
|
|
||||||
this.initSDK()
|
|
||||||
}, 3000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
startPreview() {
|
|
||||||
const layout = len =>
|
|
||||||
len <= 1 ? '1x1' :
|
|
||||||
len == 2 ? '1x2' :
|
|
||||||
len == 3 ? '1+2' :
|
|
||||||
len == 4 ? '2x2' :
|
|
||||||
len < 6 ? '1+5' :
|
|
||||||
len == 7 ? '3+4' :
|
|
||||||
len == 8 ? '1+7' :
|
|
||||||
len == 9 ? '3x3' :
|
|
||||||
len == 10 ? '1+9' :
|
|
||||||
len <= 16 ? '4x4' : '4x6'
|
|
||||||
let list = this.src?.split(",")
|
|
||||||
this.monitorIns?.JS_RequestInterface({
|
|
||||||
funcName: "setLayout",
|
|
||||||
argument: JSON.stringify({layout: layout(list.length)})
|
|
||||||
}).then(() => {
|
|
||||||
this.monitorIns?.JS_RequestInterface({
|
|
||||||
funcName: "startMultiPreviewByCameraIndexCode",
|
|
||||||
argument: JSON.stringify({
|
|
||||||
list: list.map((cameraIndexCode, i) => ({
|
|
||||||
cameraIndexCode, //监控点编号
|
|
||||||
streamMode: 0, //主子码流标识
|
|
||||||
transMode: 1, //传输协议
|
|
||||||
gpuMode: 0, //是否开启GPU硬解
|
|
||||||
wndId: i + 1 //可指定播放窗口
|
|
||||||
}))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
src(v) {
|
|
||||||
v && this.monitorIns?.JS_RequestInterface({funcName: "stopAllPreview"}).then(() => this.startPreview())
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.$injectLib("https://cdn.cunwuyun.cn/wsr/lib/jsencrypt.min.js")
|
|
||||||
this.$injectLib("https://cdn.cunwuyun.cn/wsr/lib/jsWebControl-1.0.0.min.js", () => {
|
|
||||||
this.initSDK()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
this.monitorIns?.JS_DestroyWnd()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.hikversionMonitor {
|
|
||||||
color: #fff;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
#monitorIns {
|
|
||||||
height: 100%;
|
|
||||||
background: #000;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="slw">
|
|
||||||
<iframe
|
|
||||||
v-if="isShow"
|
|
||||||
:id="id"
|
|
||||||
allow="autoplay *; microphone *; fullscreen *" allowfullscreen allowtransparency key="" allowusermedia frameBorder="no"
|
|
||||||
style="width: 100%; height: 100%;"
|
|
||||||
:src="`https://cdn.cunwuyun.cn/jssdk/slw/index.html?url=${src}`"></iframe>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
props: ['src'],
|
|
||||||
|
|
||||||
name: 'slwVideo',
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
isShow: true,
|
|
||||||
id: `video-${new Date().getTime()}`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
|
||||||
src: {
|
|
||||||
handler (val) {
|
|
||||||
if (val) {
|
|
||||||
this.isShow = false
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.isShow = true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted () {
|
|
||||||
window.addEventListener('message', e => {
|
|
||||||
if (e.data.type && e.data.name === 'fullscreen') {
|
|
||||||
this.requestFullScreen(document.getElementById(this.id))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!e.data.type && e.data.name === 'fullscreen') {
|
|
||||||
this.exitFullscreen()
|
|
||||||
}
|
|
||||||
}, false)
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
exitFullscreen () {
|
|
||||||
if (document.exitFullscreen) {
|
|
||||||
document.exitFullscreen()
|
|
||||||
} else if (document.msExitFullscreen) {
|
|
||||||
document.msExitFullscreen()
|
|
||||||
} else if (document.mozCancelFullScreen) {
|
|
||||||
document.mozCancelFullScreen()
|
|
||||||
} else if (document.webkitExitFullscreen) {
|
|
||||||
document.webkitExitFullscreen()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
requestFullScreen (element) {
|
|
||||||
var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullScreen;
|
|
||||||
if (requestMethod) {
|
|
||||||
requestMethod.call(element);
|
|
||||||
} else if (typeof window.ActiveXObject !== 'undefined') {
|
|
||||||
var wscript = new ActiveXObject('WScript.Shell')
|
|
||||||
if (wscript !== null) {
|
|
||||||
wscript.SendKeys('{F11}')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.slw {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
iframe {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="swiper">
|
|
||||||
<el-carousel height="100%" indicator-position="none">
|
|
||||||
<el-carousel-item v-for="(item, index) in data" :key="index">
|
|
||||||
<img :src="item.img">
|
|
||||||
<div class="swiper-content" v-if="item.title">
|
|
||||||
<h2>{{ item.title }}</h2>
|
|
||||||
<p>{{ item.content }}</p>
|
|
||||||
</div>
|
|
||||||
</el-carousel-item>
|
|
||||||
</el-carousel>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'AiSwiper',
|
|
||||||
|
|
||||||
props: {
|
|
||||||
data: {
|
|
||||||
type: Array,
|
|
||||||
default: () => []
|
|
||||||
},
|
|
||||||
|
|
||||||
width: {
|
|
||||||
type: String,
|
|
||||||
default: '100%'
|
|
||||||
},
|
|
||||||
heigth: {
|
|
||||||
type: String,
|
|
||||||
default: '100%'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted () {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.swiper {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
padding: 20px 0 0;
|
|
||||||
|
|
||||||
::v-deep .el-carousel {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.swiper-content {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
width: 100%;
|
|
||||||
padding: 10px;
|
|
||||||
text-align: center;
|
|
||||||
background: linear-gradient(180deg, rgba(0, 0, 0, 0.1) 0%, #000000 100%);
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
margin-bottom: 4px;
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
line-height: 22px;
|
|
||||||
white-space: pre-line;
|
|
||||||
color: #B6DFFF;
|
|
||||||
font-size: 14px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
const apps = []
|
|
||||||
const install = function (Vue) {
|
|
||||||
if (install.installed) return Promise.resolve()
|
|
||||||
else {
|
|
||||||
let contexts = require.context('.', true, /(\/.+)\/Ai[^\/]+\.vue$/)
|
|
||||||
if (contexts) {
|
|
||||||
contexts.keys().map(e => {
|
|
||||||
if (contexts(e).default) {
|
|
||||||
let mod = apps.find(a => a.name == contexts(e).default.name)
|
|
||||||
if (mod) {
|
|
||||||
mod.component = contexts(e).default
|
|
||||||
} else {
|
|
||||||
apps.push({name: contexts(e).default.name, component: contexts(e).default})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
apps.map(e => {
|
|
||||||
Vue.component(e.name, e.component)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 判断是否是直接引入文件
|
|
||||||
if (typeof window !== 'undefined' && window.Vue) {
|
|
||||||
install(window.Vue)
|
|
||||||
}
|
|
||||||
export default {
|
|
||||||
// 导出的对象必须具有 install,才能被 Vue.use() 方法安装
|
|
||||||
install
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AiDvBackground" :style="{opacity:alpha}">
|
|
||||||
<img class="bgImage" :src="src"/>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "AiDvBackground",
|
|
||||||
props: {
|
|
||||||
src: String,
|
|
||||||
alpha: {default: 1}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AiDvBackground {
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
position: absolute;
|
|
||||||
pointer-events: none;
|
|
||||||
//z-index: -1;
|
|
||||||
|
|
||||||
.bgImage {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AiDvDisplay">
|
|
||||||
<div class="display-top">
|
|
||||||
<img class="left" src="https://cdn.cunwuyun.cn/dvcp/dv/img/display-icon.svg">
|
|
||||||
<h2>{{ title }}</h2>
|
|
||||||
<img class="right" src="https://cdn.cunwuyun.cn/dvcp/dv/img/display-icon.svg">
|
|
||||||
</div>
|
|
||||||
<component class="background" :is="type"/>
|
|
||||||
<div class="displayPanel">
|
|
||||||
<div class="animation">
|
|
||||||
<component class="item" v-for="(op,i) in list" :key="i" :is="item" v-bind="op" :style="{transform:getPos(i)}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Display0 from './components/Display0'
|
|
||||||
import DisplayItem from "./components/displayItem";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AiDvDisplay',
|
|
||||||
components: {DisplayItem, Display0},
|
|
||||||
props: {
|
|
||||||
type: {default: 'display0'},
|
|
||||||
item: {default: 'DisplayItem'},
|
|
||||||
title: {
|
|
||||||
default: '数据统计'
|
|
||||||
},
|
|
||||||
list: {default: () => []},
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getPos(i) {
|
|
||||||
let unit = this.list.length > 0 ? 2 * Math.PI / this.list.length : 0,
|
|
||||||
corner = this.list.length > 0 ? 360 / this.list.length : 0
|
|
||||||
return `translateZ(${250 * Math.cos(unit * i)}px) translateX(${250 * Math.sin(unit * i)}px) rotateY(${corner * i}deg)`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AiDvDisplay {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.display-top {
|
|
||||||
position: relative;
|
|
||||||
width: 840px;
|
|
||||||
background-image: url(asset/display-top.svg);
|
|
||||||
background-size: 1420px 142px;
|
|
||||||
background-position: center;
|
|
||||||
text-align: center;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.left {
|
|
||||||
position: absolute;
|
|
||||||
left: 280px;
|
|
||||||
top: 50%;
|
|
||||||
z-index: 1;
|
|
||||||
width: 35px;
|
|
||||||
height: 22px;
|
|
||||||
background-image: url(asset/display-icon.svg);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
transform: translate(0, -50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.right {
|
|
||||||
position: absolute;
|
|
||||||
right: 280px;
|
|
||||||
top: 50%;
|
|
||||||
z-index: 1;
|
|
||||||
width: 35px;
|
|
||||||
height: 22px;
|
|
||||||
background-image: url(asset/display-icon.svg);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
transform: translate(0, -50%) rotate(180deg);
|
|
||||||
transform-origin: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
line-height: 75px;
|
|
||||||
margin: 0;
|
|
||||||
font-size: 36px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
text-shadow: 0px 4px 20px #345FFF;
|
|
||||||
background: linear-gradient(180deg, #FFFFFF 0%, #A1E4FF 100%);
|
|
||||||
-webkit-background-clip: text;
|
|
||||||
-webkit-text-fill-color: transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.displayPanel {
|
|
||||||
position: absolute;
|
|
||||||
width: 160px;
|
|
||||||
height: 160px;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
z-index: 9;
|
|
||||||
|
|
||||||
.animation {
|
|
||||||
animation: rotate3D 30s infinite linear;
|
|
||||||
transform-style: preserve-3d;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
animation-play-state: paused;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.item {
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes rotate3D {
|
|
||||||
from {
|
|
||||||
transform: rotateY(0deg);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: rotateY(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="35px" height="22px" viewBox="0 0 35 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>形状结合</title>
|
|
||||||
<defs>
|
|
||||||
<path d="M1072,220 L1072,228 L1068,224 L1072,220 Z M1064,220 L1064,228 L1060,224 L1064,220 Z M1056,220 L1056,228 L1052,224 L1056,220 Z" id="path-1"></path>
|
|
||||||
<filter x="-60.0%" y="-150.0%" width="220.0%" height="400.0%" filterUnits="objectBoundingBox" id="filter-2">
|
|
||||||
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.760001846 0 0 0 0 0.291006098 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<filter x="-50.0%" y="-125.0%" width="200.0%" height="350.0%" filterUnits="objectBoundingBox" id="filter-3">
|
|
||||||
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.97961238 0 0 0 0 0.9078125 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g id="钟祥大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="形状结合" transform="translate(-1045.000000, -213.000000)">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
|
||||||
<use fill="#FFC143" fill-rule="evenodd" xlink:href="#path-1"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-3)" xlink:href="#path-1"></use>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -1,36 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="1478px" height="142px" viewBox="0 0 1478 142" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>编组 2</title>
|
|
||||||
<defs>
|
|
||||||
<linearGradient x1="100%" y1="50%" x2="0%" y2="50%" id="linearGradient-1">
|
|
||||||
<stop stop-color="#5A86FF" stop-opacity="0" offset="0%"></stop>
|
|
||||||
<stop stop-color="#5AACFF" offset="36.7624563%"></stop>
|
|
||||||
<stop stop-color="#7EEFFF" offset="50.0376124%"></stop>
|
|
||||||
<stop stop-color="#5AACFF" offset="62.9709649%"></stop>
|
|
||||||
<stop stop-color="#5A86FF" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<path d="M547,0.25 C556.749607,0.25 565.858022,4.76380868 571.818048,12.456132 L572.118303,12.85 C577.460114,19.9724141 585.628339,24.4148226 594.493503,25.038944 L594.977736,25.069194 L800,39.9977736 L594.814342,27.814741 C585.045723,27.2819072 576.001062,22.5266807 570.024678,14.8021845 L569.718303,14.4 C564.430381,7.34943641 556.184331,3.14910303 547.389942,3.00389299 L547,3 C483.876874,3 434.876874,3 400,3 C365.099096,3 316.099096,3 253,3 C244.186796,3 235.797203,7.07663928 230.404401,14.0250247 L230.118303,14.4 C224.248419,22.2265123 215.269839,27.1053605 205.52688,27.7834215 L205.022264,27.814741 L0,39.9977736 L204.858871,25.069194 C213.748674,24.5842957 221.980256,20.260414 227.424142,13.235831 L227.718303,12.85 C233.568068,5.05031402 242.693181,0.406510872 252.423056,0.253884 L253,0.25 C316.068383,0.0833333333 365.068383,3.55271368e-15 400,3.55271368e-15 C434.846161,3.55271368e-15 483.846161,0.0833333333 547,0.25 Z" id="path-2"></path>
|
|
||||||
<filter x="-45.4%" y="-147.5%" width="190.9%" height="479.4%" filterUnits="objectBoundingBox" id="filter-3">
|
|
||||||
<feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
|
|
||||||
<feOffset dx="0" dy="8" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="20" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0.254665854 0 0 0 0 0.715268342 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<linearGradient x1="0%" y1="49.1111111%" x2="100%" y2="50%" id="linearGradient-4">
|
|
||||||
<stop stop-color="#0085FF" stop-opacity="0.502840909" offset="0%"></stop>
|
|
||||||
<stop stop-color="#0085FF" stop-opacity="0" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g id="钟祥大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="公共招聘" transform="translate(-221.000000, -146.000000)">
|
|
||||||
<g id="编组-2" transform="translate(560.000000, 180.000000)">
|
|
||||||
<g id="路径-3备份" fill-rule="nonzero">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-3)" xlink:href="#path-2"></use>
|
|
||||||
<use fill="url(#linearGradient-1)" xlink:href="#path-2"></use>
|
|
||||||
</g>
|
|
||||||
<path d="M190.442478,46.7350415 L194.690265,47.0710935 L200,54 L195.752212,53.663948 L190.442478,46.7350415 Z M181.946903,46.0629376 L186.19469,46.3989895 L191.504425,53.3278961 L187.256637,52.9918441 L181.946903,46.0629376 Z M173.451327,45.3919885 L177.699115,45.7280404 L183.00885,52.656947 L178.761062,52.320895 L173.451327,45.3919885 Z M164.955752,44.7198845 L169.20354,45.0559365 L174.513274,51.984843 L170.265487,51.6487911 L164.955752,44.7198845 Z M156.460177,44.0489354 L160.707965,44.3849874 L166.017699,51.3138939 L161.769912,50.9778419 L156.460177,44.0489354 Z M147.964602,43.3768315 L152.212389,43.7128834 L157.522124,50.64179 L153.274336,50.305738 L147.964602,43.3768315 Z M139.469027,42.7047275 L143.716814,43.0407795 L149.026549,49.969686 L144.778761,49.6336341 L139.469027,42.7047275 Z M130.973451,42.0326236 L135.221239,42.3686756 L140.530973,49.2975821 L136.283186,48.9615301 L130.973451,42.0326236 Z M122.477876,41.3605197 L126.725664,41.6965716 L132.035398,48.6254782 L127.787611,48.2894262 L122.477876,41.3605197 Z M113.982301,40.6884157 L118.230088,41.0244677 L123.539823,47.9533742 L119.292035,47.6173223 L113.982301,40.6884157 Z M105.486726,40.0163118 L109.734513,40.3523638 L115.044248,47.2812703 L110.79646,46.9452183 L105.486726,40.0163118 Z M96.9911504,39.3442079 L101.238938,39.6802598 L106.548673,46.6091664 L102.300885,46.2731144 L96.9911504,39.3442079 Z M88.4955752,38.6721039 L92.7433628,39.0081559 L98.0530973,45.9370624 L93.8053097,45.6010105 L88.4955752,38.6721039 Z M80,38 L84.2477876,38.336052 L89.5575221,45.2649585 L85.3097345,44.9289065 L80,38 Z" id="形状" fill="url(#linearGradient-4)" transform="translate(140.000000, 46.000000) scale(-1, 1) translate(-140.000000, -46.000000) "></path>
|
|
||||||
<path d="M710.442478,46.7350415 L714.690265,47.0710935 L720,54 L715.752212,53.663948 L710.442478,46.7350415 Z M701.946903,46.0629376 L706.19469,46.3989895 L711.504425,53.3278961 L707.256637,52.9918441 L701.946903,46.0629376 Z M693.451327,45.3919885 L697.699115,45.7280404 L703.00885,52.656947 L698.761062,52.320895 L693.451327,45.3919885 Z M684.955752,44.7198845 L689.20354,45.0559365 L694.513274,51.984843 L690.265487,51.6487911 L684.955752,44.7198845 Z M676.460177,44.0489354 L680.707965,44.3849874 L686.017699,51.3138939 L681.769912,50.9778419 L676.460177,44.0489354 Z M667.964602,43.3768315 L672.212389,43.7128834 L677.522124,50.64179 L673.274336,50.305738 L667.964602,43.3768315 Z M659.469027,42.7047275 L663.716814,43.0407795 L669.026549,49.969686 L664.778761,49.6336341 L659.469027,42.7047275 Z M650.973451,42.0326236 L655.221239,42.3686756 L660.530973,49.2975821 L656.283186,48.9615301 L650.973451,42.0326236 Z M642.477876,41.3605197 L646.725664,41.6965716 L652.035398,48.6254782 L647.787611,48.2894262 L642.477876,41.3605197 Z M633.982301,40.6884157 L638.230088,41.0244677 L643.539823,47.9533742 L639.292035,47.6173223 L633.982301,40.6884157 Z M625.486726,40.0163118 L629.734513,40.3523638 L635.044248,47.2812703 L630.79646,46.9452183 L625.486726,40.0163118 Z M616.99115,39.3442079 L621.238938,39.6802598 L626.548673,46.6091664 L622.300885,46.2731144 L616.99115,39.3442079 Z M608.495575,38.6721039 L612.743363,39.0081559 L618.053097,45.9370624 L613.80531,45.6010105 L608.495575,38.6721039 Z M600,38 L604.247788,38.336052 L609.557522,45.2649585 L605.309735,44.9289065 L600,38 Z" id="形状" fill="url(#linearGradient-4)"></path>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 500 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="128px" height="128px" viewBox="0 0 128 128" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>编组 3</title>
|
|
||||||
<defs>
|
|
||||||
<linearGradient x1="100%" y1="0%" x2="0%" y2="100%" id="linearGradient-1">
|
|
||||||
<stop stop-color="#00DDF2" stop-opacity="0" offset="0%"></stop>
|
|
||||||
<stop stop-color="#00E0C9" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient x1="0%" y1="0%" x2="100%" y2="100%" id="linearGradient-2">
|
|
||||||
<stop stop-color="#FFE457" stop-opacity="0" offset="0%"></stop>
|
|
||||||
<stop stop-color="#FFDC2C" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient x1="0%" y1="0%" x2="100%" y2="100%" id="linearGradient-3">
|
|
||||||
<stop stop-color="#FFDC2C" offset="0%"></stop>
|
|
||||||
<stop stop-color="#FFE457" stop-opacity="0" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient x1="100%" y1="0%" x2="0%" y2="100%" id="linearGradient-4">
|
|
||||||
<stop stop-color="#00E0C9" offset="0%"></stop>
|
|
||||||
<stop stop-color="#00DDF2" stop-opacity="0" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g id="大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="农产品推荐" transform="translate(-896.000000, -416.000000)" fill-rule="nonzero">
|
|
||||||
<g id="编组-13" transform="translate(880.000000, 400.000000)">
|
|
||||||
<g id="编组-3" transform="translate(22.000000, 22.000000)">
|
|
||||||
<path d="M122,58 C122,92.9927617 93.9164341,121.426255 59.058357,121.991426 L58,122 L58,110 C86.4316189,110 109.533832,87.1821027 109.993033,58.8599151 L110,58 L122,58 Z" id="路径" fill="url(#linearGradient-1)"></path>
|
|
||||||
<path d="M58,-6 C92.9927617,-6 121.426255,22.0835659 121.991426,56.941643 L122,58 L110,58 C110,29.5683811 87.1821027,6.46616762 58.8599151,6.00696651 L58,6 L58,-6 Z" id="路径" fill="url(#linearGradient-2)"></path>
|
|
||||||
<path d="M6,58 C6,86.4316189 28.8178973,109.533832 57.1400849,109.993033 L58,110 L58,122 C23.0072383,122 -5.42625523,93.9164341 -5.99142583,59.058357 L-6,58 L6,58 Z" id="路径" fill="url(#linearGradient-3)"></path>
|
|
||||||
<path d="M58,-6 L58,6 C29.5683811,6 6.46616762,28.8178973 6.00696651,57.1400849 L6,58 L-6,58 C-6,23.0072383 22.0835659,-5.42625523 56.941643,-5.99142583 L58,-6 Z" id="路径" fill="url(#linearGradient-4)"></path>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,49 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="display0">
|
|
||||||
<div class="display0-container">
|
|
||||||
<div class="display0-content">
|
|
||||||
<img src="https://cdn.cunwuyun.cn/dvcp/dv/img/display0-left.png">
|
|
||||||
<img src="https://cdn.cunwuyun.cn/dvcp/dv/img/display0-left.png">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'display0',
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.display0 {
|
|
||||||
position: relative;
|
|
||||||
width: 840px;
|
|
||||||
height: 465px;
|
|
||||||
background: url(./../asset/display0-bg.png) no-repeat center;
|
|
||||||
background-size: cover;
|
|
||||||
|
|
||||||
.display0-content {
|
|
||||||
display: flex;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
width: 100%;
|
|
||||||
height: 465px;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
background: url(./../asset/display0-bg.png) no-repeat center;
|
|
||||||
background-size: cover;
|
|
||||||
|
|
||||||
img:last-child {
|
|
||||||
position: relative;
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="displayItem">
|
|
||||||
<span class="num" v-text="value"/>
|
|
||||||
<span v-text="label"/>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "displayItem",
|
|
||||||
props: {
|
|
||||||
label: {default: "标题"},
|
|
||||||
value: {default: 0},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.displayItem {
|
|
||||||
width: 160px;
|
|
||||||
height: 160px;
|
|
||||||
color: #fff;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 26px;
|
|
||||||
position: relative;
|
|
||||||
background-image: url("./../asset/displayItem-bg.svg");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
content: " ";
|
|
||||||
background-image: url("./../asset/displayItem-bg1.svg");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
animation: rotate 4s infinite linear;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.num {
|
|
||||||
font-family: DIN;
|
|
||||||
font-size: 32px;
|
|
||||||
line-height: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes rotate {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="AiDvPanel">
|
|
||||||
<component :is="border" :title="title" v-if="border">
|
|
||||||
<template v-if="$slots.title" #title>
|
|
||||||
<slot name="title"/>
|
|
||||||
</template>
|
|
||||||
<slot/>
|
|
||||||
</component>
|
|
||||||
<slot style="width: 100%; height: 100%;" v-else></slot>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Border1 from "./borders/border1";
|
|
||||||
import Border0 from "./borders/border0";
|
|
||||||
import Border2 from "./borders/border2";
|
|
||||||
import Border3 from "./borders/border3";
|
|
||||||
import Border4 from "./borders/border4";
|
|
||||||
import Border5 from "./borders/border5";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "AiDvPanel",
|
|
||||||
components: { Border0, Border1, Border2, Border3, Border4, Border5 },
|
|
||||||
props: {
|
|
||||||
title: {default: "请传入标题"},
|
|
||||||
border: {default: "border0"}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.AiDvPanel {
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="560px" height="280px" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>矩形备份 58</title>
|
|
||||||
<defs>
|
|
||||||
<polygon id="path-1" points="680 760 690 750 1230 750 1240 760 1240 1020 1230 1030 690 1030 680 1020"></polygon>
|
|
||||||
<filter x="-2.7%" y="-5.4%" width="105.4%" height="110.7%" filterUnits="objectBoundingBox" id="filter-2">
|
|
||||||
<feMorphology radius="10" operator="erode" in="SourceAlpha" result="shadowSpreadInner1"></feMorphology>
|
|
||||||
<feGaussianBlur stdDeviation="10" in="shadowSpreadInner1" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1"
|
|
||||||
result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.239634146 0 0 0 0 0.473717493 0 0 0 0 1 0 0 0 1 0" type="matrix"
|
|
||||||
in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g id="钟祥大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.5">
|
|
||||||
<g id="矩形备份-58" transform="translate(-680.000000, -750.000000)">
|
|
||||||
<use fill="#0B2949" fill-rule="evenodd" xlink:href="#path-1"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,82 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="166px" height="48px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>编组 8</title>
|
|
||||||
<defs>
|
|
||||||
<polygon id="path-1" points="1 0 165 0 165 31 155 40 11 40 1 31"></polygon>
|
|
||||||
<filter x="-4.6%" y="-18.8%" width="109.1%" height="137.5%" filterUnits="objectBoundingBox" id="filter-2">
|
|
||||||
<feMorphology radius="5" operator="erode" in="SourceAlpha" result="shadowSpreadInner1"></feMorphology>
|
|
||||||
<feGaussianBlur stdDeviation="5" in="shadowSpreadInner1" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.0340090302 0 0 0 0 0.105477684 0 0 0 0 0.340155118 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<polygon id="path-3" points="72 4 94 4 98 0 68 0"></polygon>
|
|
||||||
<filter x="-20.0%" y="-150.0%" width="140.0%" height="400.0%" filterUnits="objectBoundingBox" id="filter-4">
|
|
||||||
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.607194757 0 0 0 0 0.291006098 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<filter x="-20.0%" y="-150.0%" width="140.0%" height="400.0%" filterUnits="objectBoundingBox" id="filter-5">
|
|
||||||
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.97961238 0 0 0 0 0.9078125 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<polygon id="path-6" points="76 38 90 38 92 40 74 40"></polygon>
|
|
||||||
<filter x="-33.3%" y="-300.0%" width="166.7%" height="700.0%" filterUnits="objectBoundingBox" id="filter-7">
|
|
||||||
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.607194757 0 0 0 0 0.291006098 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<filter x="-33.3%" y="-300.0%" width="166.7%" height="700.0%" filterUnits="objectBoundingBox" id="filter-8">
|
|
||||||
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.97961238 0 0 0 0 0.9078125 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g id="钟祥大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="画板" transform="translate(-878.000000, -726.000000)">
|
|
||||||
<g id="编组-8" transform="translate(878.000000, 730.000000)">
|
|
||||||
<g id="矩形">
|
|
||||||
<use fill-opacity="0.8" fill="#0B2949" fill-rule="evenodd" xlink:href="#path-1"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
|
||||||
</g>
|
|
||||||
<path d="M3,23 L1,20 L1,12.333 L0,11 L0,0 L30,0 L27,3 L17,3 L17,2 L11,2 L10,3 L3,3 L3,10 L5,10 L5,12 L3,12 L3,14 L5,14 L5,16 L3,16 L3,18 L5,18 L5,20 L3,20 L3,23 Z" id="形状结合" fill="#2B6EFF" fill-rule="nonzero"></path>
|
|
||||||
<path d="M139,23 L137,20 L137,12.333 L136,11 L136,0 L166,0 L163,3 L153,3 L153,2 L147,2 L146,3 L139,3 L139,10 L141,10 L141,12 L139,12 L139,14 L141,14 L141,16 L139,16 L139,18 L141,18 L141,20 L139,20 L139,23 Z" id="形状结合备份" fill="#2B6EFF" fill-rule="nonzero" transform="translate(151.000000, 11.500000) scale(-1, 1) translate(-151.000000, -11.500000) "></path>
|
|
||||||
<polygon id="矩形" fill="#51AAFF" points="38 0 42 0 40 2 36 2"></polygon>
|
|
||||||
<polygon id="矩形备份-74" fill="#51AAFF" transform="translate(127.000000, 1.000000) scale(-1, 1) translate(-127.000000, -1.000000) " points="126 0 130 0 128 2 124 2"></polygon>
|
|
||||||
<polygon id="矩形备份-64" fill="#51AAFF" points="32 0 36 0 34 2 30 2"></polygon>
|
|
||||||
<polygon id="矩形备份-75" fill="#51AAFF" transform="translate(121.000000, 1.000000) scale(-1, 1) translate(-121.000000, -1.000000) " points="120 0 124 0 122 2 118 2"></polygon>
|
|
||||||
<polygon id="矩形备份-61" fill="#51AAFF" points="44 0 48 0 46 2 42 2"></polygon>
|
|
||||||
<polygon id="矩形备份-76" fill="#51AAFF" transform="translate(133.000000, 1.000000) scale(-1, 1) translate(-133.000000, -1.000000) " points="132 0 136 0 134 2 130 2"></polygon>
|
|
||||||
<polygon id="矩形备份-62" fill="#2B6EFF" fill-rule="nonzero" points="50 0 66 0 69 3 47 3"></polygon>
|
|
||||||
<polygon id="矩形备份-73" fill="#2B6EFF" fill-rule="nonzero" points="100 0 116 0 119 3 97 3"></polygon>
|
|
||||||
<g id="矩形备份-63">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
|
|
||||||
<use fill="#FFC143" fill-rule="evenodd" xlink:href="#path-3"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-3"></use>
|
|
||||||
</g>
|
|
||||||
<polygon id="矩形备份-68" fill="#2B6EFF" points="28 37 39 37 39 40 25 40"></polygon>
|
|
||||||
<polygon id="矩形备份-79" fill="#2B6EFF" transform="translate(134.000000, 38.500000) scale(-1, 1) translate(-134.000000, -38.500000) " points="130 37 141 37 141 40 127 40"></polygon>
|
|
||||||
<polygon id="矩形备份-70" fill="#2B6EFF" transform="translate(56.500000, 38.500000) scale(-1, -1) translate(-56.500000, -38.500000) " points="56 37 60 37 57 40 53 40"></polygon>
|
|
||||||
<polygon id="矩形备份-81" fill="#2B6EFF" transform="translate(95.500000, 38.500000) scale(1, -1) translate(-95.500000, -38.500000) " points="95 37 99 37 96 40 92 40"></polygon>
|
|
||||||
<polygon id="矩形备份-71" fill="#2B6EFF" transform="translate(63.500000, 38.500000) scale(-1, -1) translate(-63.500000, -38.500000) " points="63 37 67 37 64 40 60 40"></polygon>
|
|
||||||
<polygon id="矩形备份-82" fill="#2B6EFF" transform="translate(102.500000, 38.500000) scale(1, -1) translate(-102.500000, -38.500000) " points="102 37 106 37 103 40 99 40"></polygon>
|
|
||||||
<polygon id="矩形备份-72" fill="#2B6EFF" transform="translate(70.500000, 38.500000) scale(-1, -1) translate(-70.500000, -38.500000) " points="70 37 74 37 71 40 67 40"></polygon>
|
|
||||||
<polygon id="矩形备份-83" fill="#2B6EFF" transform="translate(109.500000, 38.500000) scale(1, -1) translate(-109.500000, -38.500000) " points="109 37 113 37 110 40 106 40"></polygon>
|
|
||||||
<polygon id="矩形备份-65" fill="#2B6EFF" fill-rule="nonzero" points="4 32 10 37 16 37 18 40 10 40 1 32 1 28 0 26.6037002 0 23 4 28"></polygon>
|
|
||||||
<polygon id="矩形备份-77" fill="#2B6EFF" fill-rule="nonzero" transform="translate(157.000000, 31.500000) scale(-1, 1) translate(-157.000000, -31.500000) " points="152 32 158 37 164 37 166 40 158 40 149 32 149 28 148 26.6037002 148 23 152 28"></polygon>
|
|
||||||
<rect id="矩形" fill="#2B6EFF" x="16" y="39" width="20" height="1"></rect>
|
|
||||||
<rect id="矩形备份-78" fill="#2B6EFF" transform="translate(140.000000, 39.500000) scale(-1, 1) translate(-140.000000, -39.500000) " x="130" y="39" width="20" height="1"></rect>
|
|
||||||
<polygon id="矩形备份-69" fill="#2B6EFF" points="38 39 51 39 50 40 38 40"></polygon>
|
|
||||||
<polygon id="矩形备份-80" fill="#2B6EFF" transform="translate(121.500000, 39.500000) scale(-1, 1) translate(-121.500000, -39.500000) " points="115 39 128 39 127 40 115 40"></polygon>
|
|
||||||
<g id="矩形">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-7)" xlink:href="#path-6"></use>
|
|
||||||
<use fill="#FFC143" fill-rule="evenodd" xlink:href="#path-6"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-6"></use>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
@@ -1,34 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="580px" height="40px" viewBox="0 0 580 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>矩形</title>
|
|
||||||
<defs>
|
|
||||||
<rect id="path-1" x="40" y="740" width="580" height="40"></rect>
|
|
||||||
<pattern id="pattern-2" width="12.0397351" height="12.0397351" x="27.9602649" y="727.960265" patternUnits="userSpaceOnUse">
|
|
||||||
<use xlink:href="#image-3" transform="scale(0.250827815,0.250827815)"></use>
|
|
||||||
</pattern>
|
|
||||||
<image id="image-3" width="48" height="48" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAMKADAAQAAAABAAAAMAAAAADbN2wMAAABX0lEQVRoBe3Y7Q2CMBAGYGu3gOgOJrAQcRAHUXcwrsEcrFH7agpB+ex5cJfQH9ISvfO5xkjP5Hnudn445+5lWZ4xxZo4TJZlV2NMEeJwxbdpml6QxCc7JUlyqKrqGZJSroiDeIjLGd/6JEfuJJzx7VKV4kJYbK9mxBugGVEDtCJaAI2IH4A2RCdAE6IXoAUxCNCAGAVIR0wCSEZMBkhFzAJIRMwGSENEASQhogFSECSABAQZsDYCAIMvQR1rHYqs7x7ckJwKwOfXQKAr8dDYjQhn7D0q5xcF+jiYYk0cDv0l9IFCHM74W18oVLnrusRvYusLdVX++x7nTtR/ZJxJAOKKXwM4k4Qd4UC0ABoRPwBtiE6AJkQvQAtiEKABMQqQjpgEkIyYDJCKmAWQiJgNkIaIAkhCRAOkIEgACQgyYG0EAP84yLM976NAGH2P4ltf6FOf5rWvUrjfvCt+9h3/BX5SBuUP9sYWAAAAAElFTkSuQmCC"></image>
|
|
||||||
<filter x="-0.3%" y="-5.0%" width="100.7%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
|
|
||||||
<feOffset dx="0" dy="4" in="SourceAlpha" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.121683836 0 0 0 0 0.302967066 0 0 0 0 0.653362772 0 0 0 0.504234047 0" type="matrix" in="shadowInnerInner1" result="shadowMatrixInner1"></feColorMatrix>
|
|
||||||
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetInner2"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner2" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner2"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.333333333 0 0 0 0 0.476619275 0 0 0 0 0.862745098 0 0 0 1 0" type="matrix" in="shadowInnerInner2" result="shadowMatrixInner2"></feColorMatrix>
|
|
||||||
<feOffset dx="0" dy="-2" in="SourceAlpha" result="shadowOffsetInner3"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner3" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner3"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.22745098 0 0 0 0 0.344729535 0 0 0 0 0.588235294 0 0 0 0.250355114 0" type="matrix" in="shadowInnerInner3" result="shadowMatrixInner3"></feColorMatrix>
|
|
||||||
<feMerge>
|
|
||||||
<feMergeNode in="shadowMatrixInner1"></feMergeNode>
|
|
||||||
<feMergeNode in="shadowMatrixInner2"></feMergeNode>
|
|
||||||
<feMergeNode in="shadowMatrixInner3"></feMergeNode>
|
|
||||||
</feMerge>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g id="钟祥大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="矩形" transform="translate(-40.000000, -740.000000)">
|
|
||||||
<use fill-opacity="0.2" fill="#004CA0" fill-rule="evenodd" xlink:href="#path-1"></use>
|
|
||||||
<use fill-opacity="0.5" fill="url(#pattern-2)" fill-rule="evenodd" style="mix-blend-mode: multiply;" xlink:href="#path-1"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-1"></use>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -1,21 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>路径备份</title>
|
|
||||||
<defs>
|
|
||||||
<polygon id="path-1" points="1826 14 1826 15 1821 15 1821 20 1820 20 1820 14"></polygon>
|
|
||||||
<filter x="-150.0%" y="-150.0%" width="400.0%" height="400.0%" filterUnits="objectBoundingBox" id="filter-2">
|
|
||||||
<feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.088934077 0 0 0 0 0.269903162 0 0 0 0 0.86962183 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="头部导航备份" transform="translate(-1814.000000, -8.000000)" fill-rule="nonzero">
|
|
||||||
<g id="路径备份" transform="translate(1823.000000, 17.000000) scale(-1, 1) translate(-1823.000000, -17.000000) ">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
|
||||||
<use fill="#E8F9FF" xlink:href="#path-1"></use>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,21 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="26px" height="36px" viewBox="0 0 26 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>矩形</title>
|
|
||||||
<defs>
|
|
||||||
<polygon id="path-1" points="606 756 610 760 606 764"></polygon>
|
|
||||||
<filter x="-412.5%" y="-259.3%" width="956.1%" height="618.6%" filterUnits="objectBoundingBox" id="filter-2">
|
|
||||||
<feMorphology radius="1.5" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 0.088934077 0 0 0 0 0.269903162 0 0 0 0 0.86962183 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g id="钟祥大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="画板" transform="translate(-595.000000, -742.000000)" fill-rule="nonzero">
|
|
||||||
<g id="矩形" transform="translate(608.000000, 760.000000) scale(-1, 1) translate(-608.000000, -760.000000) ">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
|
||||||
<use fill="#E8F9FF" xlink:href="#path-1"></use>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="528px" height="41px" viewBox="0 0 528 41" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<title>编组 2备份</title>
|
|
||||||
<defs>
|
|
||||||
<linearGradient x1="-1.11022302e-14%" y1="50%" x2="100%" y2="50%" id="linearGradient-1">
|
|
||||||
<stop stop-color="#0085FF" stop-opacity="0" offset="0%"></stop>
|
|
||||||
<stop stop-color="#0085FF" stop-opacity="0.502840909" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
<polygon id="path-2" points="8 7 0 14 0 0"></polygon>
|
|
||||||
<filter x="-150.0%" y="-85.7%" width="400.0%" height="271.4%" filterUnits="objectBoundingBox" id="filter-3">
|
|
||||||
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.760001846 0 0 0 0 0.291006098 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<filter x="-125.0%" y="-71.4%" width="350.0%" height="242.9%" filterUnits="objectBoundingBox" id="filter-4">
|
|
||||||
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.97961238 0 0 0 0 0.9078125 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<polygon id="path-5" points="16 7 8 14 8 0"></polygon>
|
|
||||||
<filter x="-150.0%" y="-85.7%" width="400.0%" height="271.4%" filterUnits="objectBoundingBox" id="filter-6">
|
|
||||||
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
|
||||||
<feGaussianBlur stdDeviation="4" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.760001846 0 0 0 0 0.291006098 0 0 0 1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<filter x="-125.0%" y="-71.4%" width="350.0%" height="242.9%" filterUnits="objectBoundingBox" id="filter-7">
|
|
||||||
<feGaussianBlur stdDeviation="2" in="SourceAlpha" result="shadowBlurInner1"></feGaussianBlur>
|
|
||||||
<feOffset dx="0" dy="0" in="shadowBlurInner1" result="shadowOffsetInner1"></feOffset>
|
|
||||||
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
|
|
||||||
<feColorMatrix values="0 0 0 0 1 0 0 0 0 0.97961238 0 0 0 0 0.9078125 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
|
|
||||||
</filter>
|
|
||||||
<linearGradient x1="-1.11022302e-14%" y1="50%" x2="100%" y2="50%" id="linearGradient-8">
|
|
||||||
<stop stop-color="#0085FF" stop-opacity="0" offset="0%"></stop>
|
|
||||||
<stop stop-color="#0085FF" stop-opacity="0.502840909" offset="100%"></stop>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
||||||
<g id="饼图" transform="translate(-32.000000, -121.000000)">
|
|
||||||
<g id="编组-2备份" transform="translate(40.000000, 129.000000)">
|
|
||||||
<polygon id="矩形" fill="url(#linearGradient-1)" points="1 9 273 9 255 27 1 27"></polygon>
|
|
||||||
<g id="三角形" opacity="0.300000012">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-3)" xlink:href="#path-2"></use>
|
|
||||||
<use fill="#FFC143" fill-rule="evenodd" xlink:href="#path-2"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
|
|
||||||
</g>
|
|
||||||
<g id="三角形备份">
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
|
|
||||||
<use fill="#FFC143" fill-rule="evenodd" xlink:href="#path-5"></use>
|
|
||||||
<use fill="black" fill-opacity="1" filter="url(#filter-7)" xlink:href="#path-5"></use>
|
|
||||||
</g>
|
|
||||||
<polygon id="矩形" fill="#0085FF" opacity="0.25" points="278 13 520 13 520 21 270 21"></polygon>
|
|
||||||
<polygon id="矩形" fill="#0085FF" opacity="0.100000001" points="270 21 520 21 520 29 262 29"></polygon>
|
|
||||||
<polygon id="矩形" fill="url(#linearGradient-8)" points="278 13 398 13 390 21 270 21"></polygon>
|
|
||||||
<polygon id="路径-3" fill="#0085FF" fill-rule="nonzero" opacity="0.5" points="520 11 520 13 278 13 258 33 1 33 1 31 257.17 31 277.18 11"></polygon>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.7 KiB |
@@ -1,42 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="border0">
|
|
||||||
<div class="title">
|
|
||||||
<slot v-if="$slots.title" name="title"/>
|
|
||||||
<b v-else v-text="title"/>
|
|
||||||
</div>
|
|
||||||
<div class="slot">
|
|
||||||
<slot />
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "border0",
|
|
||||||
props: {title: String}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.border0 {
|
|
||||||
height: 100%;
|
|
||||||
.title {
|
|
||||||
padding-left: 30px;
|
|
||||||
background-image: url("./../asset/titleBg.svg");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
height: 41px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
& > b {
|
|
||||||
font-size: 24px;
|
|
||||||
color: #fff;
|
|
||||||
line-height: 32px;
|
|
||||||
letter-spacing: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.slot {
|
|
||||||
height: calc(100% - 51px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="border1">
|
|
||||||
<dv-border-box1 :color="['#2B6EFF']">
|
|
||||||
<div class="bg">
|
|
||||||
<div class="header" v-text="title"/>
|
|
||||||
<div class="slot">
|
|
||||||
<slot/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</dv-border-box1>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {borderBox1} from '@jiaminghi/data-view'
|
|
||||||
import Vue from "vue";
|
|
||||||
|
|
||||||
Vue.use(borderBox1)
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: "border1",
|
|
||||||
props: {title: String}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.border1 {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.bg {
|
|
||||||
position: relative;
|
|
||||||
margin: 15px 20px;
|
|
||||||
background-image: url("./../asset/border1Bg.svg");
|
|
||||||
background-size: 100% calc(100%);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
padding: 30px 20px 0 20px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
height: calc(100% - 40px);
|
|
||||||
|
|
||||||
.header {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
height: 48px;
|
|
||||||
min-width: 166px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 16px;
|
|
||||||
background-image: url("./../asset/border1Title.svg");
|
|
||||||
background-size: 100%;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.slot {
|
|
||||||
height: calc(100% - 20px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="border2">
|
|
||||||
<div class="corner left-bottom"></div>
|
|
||||||
<div class="corner right-bottom"></div>
|
|
||||||
<div class="bg">
|
|
||||||
<div class="header">
|
|
||||||
<img src="https://cdn.cunwuyun.cn/dvcp/dv/img/sanjiaoxing.svg" />
|
|
||||||
<h2>{{ title }}</h2>
|
|
||||||
<img class="header-right" src="https://cdn.cunwuyun.cn/dvcp/dv/img/sanjiaoxing.svg" />
|
|
||||||
</div>
|
|
||||||
<div class="slot">
|
|
||||||
<slot/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'border2',
|
|
||||||
props: {title: String},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.border2 {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: linear-gradient(180deg, rgba(7, 29, 62, 0.2) 0%, rgba(15, 69, 124, 0.2) 100%);
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.corner {
|
|
||||||
height: 18px;
|
|
||||||
width: 18px;
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
background-image: url(./../asset/corner.svg);
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
.corner.left-top {
|
|
||||||
left: -6px;
|
|
||||||
top: -6px;
|
|
||||||
transform: rotateY(180deg);
|
|
||||||
}
|
|
||||||
.corner.right-top {
|
|
||||||
right: -6px;
|
|
||||||
top: -6px;
|
|
||||||
}
|
|
||||||
.corner.left-bottom {
|
|
||||||
left: -6px;
|
|
||||||
bottom: -6px;
|
|
||||||
transform: rotateX(180deg) rotateY(180deg);
|
|
||||||
}
|
|
||||||
.corner.right-bottom {
|
|
||||||
right: -6px;
|
|
||||||
bottom: -6px;
|
|
||||||
transform: rotateX(180deg);
|
|
||||||
}
|
|
||||||
.bg {
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
width: 100%;
|
|
||||||
height: 28px;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
content: ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
display: flex;
|
|
||||||
position: relative;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 40px;
|
|
||||||
text-align: center;
|
|
||||||
background: url(./../asset/border2Title.svg) no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
|
|
||||||
.header-right {
|
|
||||||
position: relative;
|
|
||||||
transform-origin: center;
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 18px;
|
|
||||||
color: #fff;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.slot {
|
|
||||||
height: calc(100% - 40px);
|
|
||||||
padding: 0 20px 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="border3">
|
|
||||||
<div class="bg">
|
|
||||||
<div class="bg-wrapper"></div>
|
|
||||||
<div class="header">
|
|
||||||
<div class="header-border">
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
</div>
|
|
||||||
<h2>{{ title }}</h2>
|
|
||||||
<div class="header-border">
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="bottom">
|
|
||||||
<div class="bottom-left">
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
</div>
|
|
||||||
<div class="bottom-right">
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
<div class="point"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="slot">
|
|
||||||
<slot/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'border3',
|
|
||||||
props: {title: String}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.border3 {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bg {
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.bg-wrapper {
|
|
||||||
position: absolute;
|
|
||||||
top: 12px;
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 12px);
|
|
||||||
background: rgba(11, 24, 73, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom-left, .bottom-right, .header-border {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
position: relative;
|
|
||||||
justify-content: space-between;
|
|
||||||
width: 24%;
|
|
||||||
height: 1px;
|
|
||||||
|
|
||||||
.point {
|
|
||||||
width: 4px;
|
|
||||||
height: 1px;
|
|
||||||
background: #FFCD68;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
width: 100%;
|
|
||||||
height: 1px;
|
|
||||||
background: rgba(0, 133, 255, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
display: flex;
|
|
||||||
position: relative;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
height: 24px;
|
|
||||||
line-height: 24px;
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
.header-border {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
width: 30%;
|
|
||||||
height: 1px;
|
|
||||||
background: rgba(0, 133, 255, 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
position: relative;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #fff;
|
|
||||||
letter-spacing: 2px;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
width: 120px;
|
|
||||||
height: 12px;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
content: ' ';
|
|
||||||
background: url(./../asset/border3Title.png) no-repeat;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.slot {
|
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
height: calc(100% - 34px);
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<template>
|
|
||||||
<section class="border4">
|
|
||||||
<div class="slot">
|
|
||||||
<slot/>
|
|
||||||
</div>
|
|
||||||
<div class="title">{{ title }}</div>
|
|
||||||
</section>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'border4',
|
|
||||||
props: {title: String}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.border4 {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(33, 73, 157, 0.15);
|
|
||||||
border-radius: 6px;
|
|
||||||
border: 1px solid #274A7E;
|
|
||||||
box-sizing: border-box;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.slot {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 48px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
height: 48px;
|
|
||||||
line-height: 48px;
|
|
||||||
padding: 0 10px;
|
|
||||||
color: #82C5FF;
|
|
||||||
font-size: 16px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||