Commit e02d81d6 by jml0128

feat:项目BI

0 parents
Showing with 10240 additions and 0 deletions
{
"presets": [["env", { "modules": false }], "stage-3"],
"plugins": [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
\ No newline at end of file
/dist
\ No newline at end of file
/*
* @Description:
* @LastEditors: Please set LastEditors
* @Date: 2021-02-02 21:32:37
*/
module.exports = {
root: true,
env: {
node: true,
browser: true
},
extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'],
plugins: ['prettier'],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'prettier/prettier': [
'error',
{
jsxBracketSameLine: false,
semi: true,
trailingComma: 'all',
singleQuote: true,
printWidth: 80,
tabWidth: 2,
endOfLine: 'auto',
trailingComma: 'none',
arrowParens: 'avoid',
htmlWhitespaceSensitivity: 'ignore'
}
],
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
quotes: [1, 'single'],
semi: [0],
'space-before-function-paren': [0, 'always']
}
};
.DS_Store
node_modules/
npm-debug.log
yarn-error.log
yarn.lock
.vscode/
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
/*
* @Description:
* @Date: 2021-02-02 21:48:47
*/
module.exports = {
jsxBracketSameLine: false,
semi: true,
trailingComma: "all",
singleQuote: true,
printWidth: 80,
tabWidth: 2,
endOfLine: "auto",
trailingComma: "none",
arrowParens: "avoid",
htmlWhitespaceSensitivity: "ignore"
};
No preview for this file type
No preview for this file type
[0301/100708.779:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
<!--
* @Description:
* @Date: 2021-03-02 20:19:43
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta
name="viewport"
content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"
/>
<meta name="format-detection" content="telephone=no, email=no" />
<title>xrk</title>
</head>
<body>
<div id="app"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/es6-shim/0.35.6/es6-sham.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/es7-shim/6.0.0/es7-shim.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/json3/3.3.3/json3.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/babel-polyfill/7.12.1/polyfill.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/es5-shim/4.5.15/es5-sham.min.js"></script>
<script src="./dist/bundler.js"></script>
</body>
</html>
This diff could not be displayed because it is too large.
{
"name": "jml-bi",
"version": "0.1.2",
"description": "jml-bi",
"author": "xrk",
"main": "dist/bundler.js",
"keywords": [
"vue",
"xrk"
],
"repository": {
"type": "git",
"url": "http://wangjiaxing@git.jimijiayuan.cn/wangjiaxing/xrk-components.git"
},
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules",
"lint": "eslint src/ --ext .js,.vue ",
"fix": "eslint --fix ./src --ext .js,.vue "
},
"dependencies": {
"echarts": "^5.1.2",
"element-ui": "^2.15.2",
"swiper": "^6.7.0",
"uuid": "^8.3.2",
"vue": "^2.5.11",
"vue-awesome-swiper": "^4.1.1",
"vue-echarts": "^6.0.0-rc.5",
"vue-photo-preview": "^1.1.3",
"vuedraggable": "^2.24.3"
},
"devDependencies": {
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/composition-api": "^1.0.0-rc.11",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-core": "^6.26.0",
"babel-eslint": "^10.1.0",
"babel-loader": "^7.1.2",
"babel-plugin-component": "^1.1.1",
"babel-preset-env": "^1.6.0",
"babel-preset-stage-3": "^6.24.1",
"cross-env": "^5.2.1",
"css-loader": "^0.28.7",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^6.2.2",
"file-loader": "^1.1.4",
"lint-staged": "^9.5.0",
"mockjs": "^1.1.0",
"node-sass": "^4.0.0",
"prettier": "^1.19.1",
"sass-loader": "^7.3.1",
"url-loader": "^1.0.1",
"vue-loader": "^13.0.5",
"vue-template-compiler": "^2.4.4",
"webpack": "^3.6.0",
"webpack-dev-server": "^2.11.5"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
],
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"gitHooks": {
"pre-commit": "lint-staged"
},
"lint-staged": {
"src/*.{js,jsx,vue}": [
"npm run fix",
"git add"
]
}
}
<!--
* @Description:
* @LastEditors: Please set LastEditors
* @Date: 2021-01-28 23:29:19
-->
<template>
<div>
<XrkBi
:mobile="isMobile"
:print="isPrint"
:projectType="projectType"
></XrkBi>
</div>
<!-- <ul class="pervie">
<li name="任务记录">
<h1>任务记录</h1>
<TaskDetail :config="taskDetailOptions"></TaskDetail>
</li>
<li name="滑动组件">
<h1>滑动组件</h1>
<div style="padding:300px 0 30px 100px;width:350px;" class="block">
<input type="text" v-model="form.phone" />
<button @click="showVerify">submit</button>
<XrkSlideVerify
ref="verify"
title="12"
:options="options"
></XrkSlideVerify>
</div>
</li>
</ul> -->
</template>
<script>
import { getQueryVariable } from './packages/bi/src/chart-type/common';
export default {
name: 'App',
data() {
return {
isMobile: getQueryVariable('mobile') == 1,
isPrint: getQueryVariable('print') == 1,
projectType: getQueryVariable('projectType') || 6
};
},
components: {},
watch: {},
computed: {},
methods: {},
created() {},
beforeDestroy() {}
};
</script>
<style>
.block {
box-sizing: border-box;
border-radius: 8px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
}
</style>
/*
* @Description:
* @LastEditors: Please set LastEditors
* @Date: 2021-01-28 23:29:19
*/
import Bi from '../packages/bi/index.js';
const components = [Bi];
const install = function(Vue) {
components.forEach(component => {
Vue.component(component.name, component);
});
};
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
export default {
install,
Bi
};
/*
* @Description:
* @LastEditors: jml
* @Date: 2021-01-28 23:29:19
*/
import Vue from 'vue';
import App from './App';
import Xrk from './lib/index.js';
Vue.config.productionTip = false;
Vue.use(Xrk);
/* eslint-disable no-new */
new Vue({
el: '#app',
render: h => h(App)
});
/*
* @Description:
* @Author: jml
* @Date: 2021-02-26 15:38:03
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-10 23:06:00
*/
import Bi from './src/main';
Bi.install = function(Vue) {
Vue.component(Bi.name, Bi);
};
export default Bi;
/*
* @Description:
* @Date: 2021-06-10 13:51:26
*/
import { dealString, dealFormatter, getInterval } from '../common';
const grid = {
containLabel: true,
left: 10,
right: 10,
bottom: 10,
top: 10
};
export const createBar = (Vue, chartData, axisData, yAxisUnit, colors = []) => {
const _axisData = dealString(axisData);
return {
animation: false,
grid: grid,
xAxis: {
type: 'category',
data: _axisData,
axisLabel: {
interval: getInterval(axisData),
color: '#A8B0BF',
fontSize: 12,
formatter: function(params) {
return dealFormatter(_axisData, params);
}
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisTick: { show: false }
},
yAxis: {
splitNumber: 3,
axisLabel: {
formatter: '{value}' + (yAxisUnit || ''),
color: '#A8B0BF',
fontSize: 12
},
splitLine: {
lineStyle: {
color: '#F4F4F4'
}
}
},
series: chartData.map((item, index) => {
return {
type: 'bar',
barGap: 0,
data: item,
barMaxWidth: 30,
itemStyle: {
color: function(params) {
return chartData.length == 1
? colors[params.dataIndex % colors.length]
: colors[index];
}
},
label: {
show: true,
position: 'top',
color: '#2A3558',
fontSize: 12
}
};
})
};
};
export const createBarTransverse = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = []
) => {
const _axisData = dealString(axisData);
return {
animation: false,
grid: grid,
xAxis: {
splitNumber: 3,
axisLabel: {
formatter: '{value}' + (yAxisUnit || ''),
margin: 8,
color: '#A8B0BF',
fontSize: 12
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
}
},
yAxis: {
interval: getInterval(_axisData),
type: 'category',
data: _axisData,
axisLabel: {
color: '#A8B0BF',
fontSize: 12,
formatter: function(params) {
return _axisData.length > 20
? params
: dealFormatter(_axisData, params);
}
},
splitLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisTick: { show: false }
},
series: chartData.map((item, index) => {
return {
type: 'bar',
barGap: 0,
data: item,
barMaxWidth: 30,
itemStyle: {
color: function(params) {
return chartData.length == 1
? colors[params.dataIndex % colors.length]
: colors[index];
}
},
label: {
show: true,
position: 'right',
color: '#2A3558',
fontSize: 12
}
};
})
};
};
export const createBarMultiple = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = []
) => {
const _axisData = dealString(axisData);
return {
animation: false,
grid: grid,
calculable: true,
xAxis: {
type: 'category',
data: _axisData,
axisLabel: {
interval: getInterval(_axisData),
color: '#A8B0BF',
fontSize: 12,
formatter: function(params) {
return dealFormatter(_axisData, params);
}
},
splitLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisTick: { show: false }
},
yAxis: {
splitNumber: 3,
axisLabel: {
formatter: '{value}' + (yAxisUnit || ''),
margin: 8,
color: '#A8B0BF',
fontSize: 12
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
}
},
series: chartData.map((item, index) => {
return {
type: 'bar',
stack: '总量',
barMaxWidth: 60,
barGap: '10%',
itemStyle: {
color: colors[index]
},
label: {
show: true,
color: '#fff',
fontSize: 12
},
data: item
};
})
};
};
export const createBarMultipleTransverse = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = []
) => {
const _axisData = dealString(axisData);
return {
animation: false,
grid: grid,
calculable: true,
xAxis: {
splitNumber: 3,
axisLabel: {
formatter: '{value}' + (yAxisUnit || ''),
margin: 8,
color: '#A8B0BF',
fontSize: 12
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
}
},
yAxis: {
interval: getInterval(_axisData),
type: 'category',
data: _axisData,
axisLabel: {
color: '#A8B0BF',
fontSize: 12,
formatter: function(params) {
return dealFormatter(_axisData, params);
}
},
splitLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisTick: { show: false }
},
series: chartData.map((item, index) => {
return {
type: 'bar',
stack: '总量',
barMaxWidth: 60,
barGap: '10%',
itemStyle: {
color: colors[index]
},
label: {
show: true,
color: '#fff',
fontSize: 12
},
data: item
};
})
};
};
/*
* @Description:
* @Date: 2021-06-10 15:30:08
*/
export const dealString = (axisData, maxLength = 15) => {
// return axisData;
return axisData.map(item => {
if (`${item}`.length > maxLength) {
return `${item}`.slice(0, maxLength) + '...';
} else {
return item;
}
});
};
const d = {
1: 50,
2: 28,
3: 19,
4: 20,
5: 18,
6: 14,
7: 12,
8: 10,
9: 9,
10: 8,
11: 7,
12: 6,
13: 6,
14: 5,
15: 5
};
export const axisFormatter = (params, count) => {
var newParamsName = ''; // 最终拼接成的字符串
var paramsNameNumber = params.length; // 实际标签的个数
var provideNumber = d[count] || 3; // 每行能显示的字的个数
var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话,需要显示几行,向上取整
/**
* 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
*/
// 条件等同于rowNumber>1
if (paramsNameNumber > provideNumber) {
/** 循环每一行,p表示行 */
for (var p = 0; p < rowNumber; p++) {
var tempStr = ''; // 表示每一次截取的字符串
var start = p * provideNumber; // 开始截取的位置
var end = start + provideNumber; // 结束截取的位置
// 此处特殊处理最后一行的索引值
if (p == rowNumber - 1) {
// 最后一次不换行
tempStr = params.substring(start, paramsNameNumber);
} else {
// 每一次拼接字符串并换行
tempStr = `${params.substring(start, end)}\n`;
}
newParamsName += tempStr; // 最终拼成的字符串
}
} else {
// 将旧标签的值赋给新标签
newParamsName = params;
}
//将最终的字符串返回
return newParamsName;
};
export const getQueryVariable = variable => {
var query = window.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (pair[0] == variable) {
return pair[1];
}
}
return false;
};
export const heightToPage = height => {
return Math.ceil(height / (Math.sqrt(2) * 1200));
};
export const computedPageSize = domArr => {
if (!Array.isArray(domArr)) {
return 0;
}
const prePageHeight = 1697;
let initHeight = 0;
let pageSize = 1;
for (let i = 0; i < domArr.length; ) {
if (initHeight + domArr[i] < prePageHeight) {
initHeight += domArr[i];
i++;
} else {
pageSize++;
initHeight = 0;
}
}
return pageSize;
};
export const hexColorToRgba = (hex, opacity = 1) => {
let rgbaColor = '';
const reg = /^#[\da-f]{6}$/i;
if (reg.test(hex)) {
rgbaColor = `rgba(${parseInt('0x' + hex.slice(1, 3))},${parseInt(
'0x' + hex.slice(3, 5)
)},${parseInt('0x' + hex.slice(5, 7))},${opacity})`;
}
return rgbaColor;
};
export const dealFormatter = (axisData, params) => {
return params;
// if (axisData.length > 30) {
// return params;
// }
// return axisFormatter(params, axisData.length);
};
export const getInterval = axisData => {
if (!Array.isArray(axisData)) {
return 0;
}
const { length } = axisData;
if (length < 20) {
return 0;
}
if (length < 40) {
return 1;
}
return 'auto';
};
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "xin_jiang",
"properties": { "name": "新疆", "cp": [84.9023, 41.748], "childNum": 18 },
"geometry": {
"type": "Polygon",
"coordinates": [
[
[96.416, 42.7588],
[96.416, 42.7148],
[95.9766, 42.4951],
[96.0645, 42.3193],
[96.2402, 42.2314],
[95.9766, 41.9238],
[95.2734, 41.6162],
[95.1855, 41.792],
[94.5703, 41.4844],
[94.043, 41.0889],
[93.8672, 40.6934],
[93.0762, 40.6494],
[92.6367, 39.6387],
[92.373, 39.3311],
[92.373, 39.1113],
[92.373, 39.0234],
[90.1758, 38.4961],
[90.3516, 38.2324],
[90.6152, 38.3203],
[90.5273, 37.8369],
[91.0547, 37.4414],
[91.3184, 37.0898],
[90.7031, 36.7822],
[90.791, 36.6064],
[91.0547, 36.5186],
[91.0547, 36.0791],
[90.8789, 36.0352],
[90, 36.2549],
[89.9121, 36.0791],
[89.7363, 36.0791],
[89.209, 36.2988],
[88.7695, 36.3428],
[88.5938, 36.4746],
[87.3633, 36.4307],
[86.2207, 36.167],
[86.1328, 35.8594],
[85.6055, 35.6836],
[85.0781, 35.7275],
[84.1992, 35.376],
[83.1445, 35.4199],
[82.8809, 35.6836],
[82.4414, 35.7275],
[82.002, 35.332],
[81.6504, 35.2441],
[80.4199, 35.4199],
[80.2441, 35.2881],
[80.332, 35.1563],
[80.2441, 35.2002],
[79.8926, 34.8047],
[79.8047, 34.4971],
[79.1016, 34.4531],
[79.0137, 34.3213],
[78.2227, 34.7168],
[78.0469, 35.2441],
[78.0469, 35.5078],
[77.4316, 35.4639],
[76.8164, 35.6396],
[76.5527, 35.8594],
[76.2012, 35.8154],
[75.9375, 36.0352],
[76.0254, 36.4746],
[75.8496, 36.6943],
[75.498, 36.7383],
[75.4102, 36.958],
[75.0586, 37.002],
[74.8828, 36.9141],
[74.7949, 37.0459],
[74.5313, 37.0898],
[74.5313, 37.2217],
[74.8828, 37.2217],
[75.1465, 37.4414],
[74.8828, 37.5732],
[74.9707, 37.749],
[74.8828, 38.4521],
[74.3555, 38.6719],
[74.1797, 38.6719],
[74.0918, 38.54],
[73.8281, 38.584],
[73.7402, 38.8477],
[73.8281, 38.9795],
[73.4766, 39.375],
[73.916, 39.5068],
[73.916, 39.6826],
[73.8281, 39.7705],
[74.0039, 40.0342],
[74.8828, 40.3418],
[74.7949, 40.5176],
[75.2344, 40.4297],
[75.5859, 40.6494],
[75.7617, 40.2979],
[76.377, 40.3857],
[76.9043, 41.001],
[77.6074, 41.001],
[78.1348, 41.2207],
[78.1348, 41.3965],
[80.1563, 42.0557],
[80.2441, 42.2754],
[80.1563, 42.627],
[80.2441, 42.8467],
[80.5078, 42.8906],
[80.4199, 43.0664],
[80.7715, 43.1982],
[80.4199, 44.165],
[80.4199, 44.6045],
[79.9805, 44.8242],
[79.9805, 44.9561],
[81.7383, 45.3955],
[82.0898, 45.2197],
[82.5293, 45.2197],
[82.2656, 45.6592],
[83.0566, 47.2412],
[83.6719, 47.0215],
[84.7266, 47.0215],
[84.9023, 46.8896],
[85.5176, 47.0654],
[85.6934, 47.2852],
[85.5176, 48.1201],
[85.7813, 48.4277],
[86.5723, 48.5596],
[86.8359, 48.8232],
[86.748, 48.9551],
[86.8359, 49.1309],
[87.8027, 49.1748],
[87.8906, 48.999],
[87.7148, 48.9111],
[88.0664, 48.7354],
[87.9785, 48.6035],
[88.5059, 48.3838],
[88.6816, 48.1641],
[89.1211, 47.9883],
[89.5605, 48.0322],
[89.7363, 47.8564],
[90.0879, 47.8564],
[90.3516, 47.6807],
[90.5273, 47.2412],
[90.8789, 46.9775],
[91.0547, 46.582],
[90.8789, 46.3184],
[91.0547, 46.0107],
[90.7031, 45.7471],
[90.7031, 45.5273],
[90.8789, 45.2197],
[91.582, 45.0879],
[93.5156, 44.9561],
[94.7461, 44.3408],
[95.3613, 44.2969],
[95.3613, 44.0332],
[95.5371, 43.9014],
[95.8887, 43.2422],
[96.3281, 42.9346],
[96.416, 42.7588]
]
]
}
},
{
"type": "Feature",
"id": "xi_zang",
"properties": { "name": "西藏", "cp": [88.7695, 31.6846], "childNum": 7 },
"geometry": {
"type": "Polygon",
"coordinates": [
[
[79.0137, 34.3213],
[79.1016, 34.4531],
[79.8047, 34.4971],
[79.8926, 34.8047],
[80.2441, 35.2002],
[80.332, 35.1563],
[80.2441, 35.2881],
[80.4199, 35.4199],
[81.6504, 35.2441],
[82.002, 35.332],
[82.4414, 35.7275],
[82.8809, 35.6836],
[83.1445, 35.4199],
[84.1992, 35.376],
[85.0781, 35.7275],
[85.6055, 35.6836],
[86.1328, 35.8594],
[86.2207, 36.167],
[87.3633, 36.4307],
[88.5938, 36.4746],
[88.7695, 36.3428],
[89.209, 36.2988],
[89.7363, 36.0791],
[89.3848, 36.0352],
[89.4727, 35.9033],
[89.7363, 35.7715],
[89.7363, 35.4199],
[89.4727, 35.376],
[89.4727, 35.2441],
[89.5605, 34.8926],
[89.8242, 34.8486],
[89.7363, 34.6729],
[89.8242, 34.3652],
[89.6484, 34.0137],
[90.0879, 33.4863],
[90.7031, 33.1348],
[91.4063, 33.1348],
[91.9336, 32.8271],
[92.1973, 32.8271],
[92.2852, 32.7393],
[92.9883, 32.7393],
[93.5156, 32.4756],
[93.7793, 32.5635],
[94.1309, 32.4316],
[94.6582, 32.6074],
[95.1855, 32.4316],
[95.0098, 32.2998],
[95.1855, 32.3438],
[95.2734, 32.2119],
[95.3613, 32.168],
[95.3613, 31.9922],
[95.4492, 31.8164],
[95.8008, 31.6846],
[95.9766, 31.8164],
[96.1523, 31.5967],
[96.2402, 31.9482],
[96.5039, 31.7285],
[96.8555, 31.6846],
[96.7676, 31.9922],
[97.2949, 32.0801],
[97.3828, 32.5635],
[97.7344, 32.5195],
[98.1738, 32.3438],
[98.4375, 31.8604],
[98.877, 31.4209],
[98.6133, 31.2012],
[98.9648, 30.7617],
[99.1406, 29.2676],
[98.9648, 29.1357],
[98.9648, 28.8281],
[98.7891, 28.8721],
[98.7891, 29.0039],
[98.7012, 28.916],
[98.6133, 28.5205],
[98.7891, 28.3447],
[98.7012, 28.2129],
[98.3496, 28.125],
[98.2617, 28.3887],
[98.1738, 28.125],
[97.5586, 28.5205],
[97.2949, 28.0811],
[97.3828, 27.9053],
[97.0313, 27.7295],
[96.5039, 28.125],
[95.7129, 28.2568],
[95.3613, 28.125],
[95.2734, 27.9492],
[94.2188, 27.5537],
[93.8672, 27.0264],
[93.6035, 26.9385],
[92.1094, 26.8506],
[92.0215, 27.4658],
[91.582, 27.5537],
[91.582, 27.9053],
[91.4063, 28.0371],
[91.0547, 27.8613],
[90.7031, 28.0811],
[89.8242, 28.2129],
[89.6484, 28.1689],
[89.1211, 27.5977],
[89.1211, 27.334],
[89.0332, 27.2021],
[88.7695, 27.4219],
[88.8574, 27.9932],
[88.6816, 28.125],
[88.1543, 27.9053],
[87.8906, 27.9492],
[87.7148, 27.8174],
[87.0996, 27.8174],
[86.748, 28.125],
[86.5723, 28.125],
[86.4844, 27.9053],
[86.1328, 28.125],
[86.0449, 27.9053],
[85.6934, 28.3447],
[85.6055, 28.2568],
[85.166, 28.3447],
[85.166, 28.6523],
[84.9023, 28.5645],
[84.4629, 28.7402],
[84.2871, 28.8721],
[84.1992, 29.2236],
[84.1113, 29.2676],
[83.584, 29.1797],
[83.2324, 29.5752],
[82.1777, 30.0586],
[82.0898, 30.3223],
[81.3867, 30.3662],
[81.2109, 30.0146],
[81.0352, 30.2344],
[80.0684, 30.5859],
[79.7168, 30.9375],
[79.0137, 31.0693],
[78.75, 31.333],
[78.8379, 31.5967],
[78.6621, 31.8164],
[78.75, 31.9043],
[78.4863, 32.124],
[78.3984, 32.5195],
[78.75, 32.6953],
[78.9258, 32.3438],
[79.2773, 32.5635],
[79.1016, 33.1787],
[78.6621, 33.6621],
[78.6621, 34.1016],
[78.9258, 34.1455],
[79.0137, 34.3213]
]
]
}
},
{
"type": "Feature",
"id": "nei_meng_gu",
"properties": {
"name": "内蒙古",
"cp": [117.5977, 44.3408],
"childNum": 12
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[97.207, 42.8027],
[99.4922, 42.583],
[100.8105, 42.6709],
[101.7773, 42.4951],
[102.041, 42.2314],
[102.7441, 42.1436],
[103.3594, 41.8799],
[103.8867, 41.792],
[104.502, 41.8799],
[104.502, 41.6602],
[105.0293, 41.5723],
[105.7324, 41.9238],
[107.4023, 42.4512],
[109.4238, 42.4512],
[110.3906, 42.7588],
[111.0059, 43.3301],
[111.9727, 43.6816],
[111.9727, 43.8135],
[111.4453, 44.3848],
[111.7969, 45],
[111.9727, 45.0879],
[113.6426, 44.7363],
[114.1699, 44.9561],
[114.5215, 45.3955],
[115.6641, 45.4395],
[116.1914, 45.7031],
[116.2793, 45.9668],
[116.543, 46.2744],
[117.334, 46.3623],
[117.4219, 46.582],
[117.7734, 46.5381],
[118.3008, 46.7578],
[118.7402, 46.7139],
[118.916, 46.7578],
[119.0918, 46.6699],
[119.707, 46.626],
[119.9707, 46.7139],
[119.707, 47.1973],
[118.4766, 47.9883],
[117.8613, 48.0322],
[117.334, 47.6807],
[116.8066, 47.9004],
[116.1914, 47.8564],
[115.9277, 47.6807],
[115.5762, 47.9004],
[115.4883, 48.1641],
[115.8398, 48.252],
[115.8398, 48.5596],
[116.7188, 49.834],
[117.7734, 49.5264],
[118.5645, 49.9219],
[119.2676, 50.0977],
[119.3555, 50.3174],
[119.1797, 50.3613],
[119.5313, 50.7568],
[119.5313, 50.8887],
[119.707, 51.0645],
[120.1465, 51.6797],
[120.6738, 51.9434],
[120.7617, 52.1191],
[120.7617, 52.251],
[120.5859, 52.3389],
[120.6738, 52.5146],
[120.4102, 52.6465],
[120.0586, 52.6025],
[120.0586, 52.7344],
[120.8496, 53.2617],
[121.4648, 53.3496],
[121.8164, 53.042],
[121.2012, 52.5586],
[121.6406, 52.4268],
[121.7285, 52.2949],
[121.9922, 52.2949],
[122.168, 52.5146],
[122.6953, 52.251],
[122.6074, 52.0752],
[122.959, 51.3281],
[123.3105, 51.2402],
[123.6621, 51.3721],
[124.3652, 51.2842],
[124.541, 51.3721],
[124.8926, 51.3721],
[125.0684, 51.6357],
[125.332, 51.6357],
[126.0352, 51.0205],
[125.7715, 50.7568],
[125.7715, 50.5371],
[125.332, 50.1416],
[125.1563, 49.834],
[125.2441, 49.1748],
[124.8047, 49.1309],
[124.4531, 48.1201],
[124.2773, 48.5156],
[122.4316, 47.373],
[123.0469, 46.7139],
[123.3984, 46.8896],
[123.3984, 46.9775],
[123.4863, 46.9775],
[123.5742, 46.8457],
[123.5742, 46.8896],
[123.5742, 46.6699],
[123.0469, 46.582],
[123.2227, 46.2305],
[122.7832, 46.0107],
[122.6953, 45.7031],
[122.4316, 45.8789],
[122.2559, 45.791],
[121.8164, 46.0107],
[121.7285, 45.7471],
[121.9043, 45.7031],
[122.2559, 45.2637],
[122.0801, 44.8682],
[122.3438, 44.2529],
[123.1348, 44.4727],
[123.4863, 43.7256],
[123.3105, 43.5059],
[123.6621, 43.374],
[123.5742, 43.0225],
[123.3105, 42.9785],
[123.1348, 42.8027],
[122.7832, 42.7148],
[122.3438, 42.8467],
[122.3438, 42.6709],
[121.9922, 42.7148],
[121.7285, 42.4512],
[121.4648, 42.4951],
[120.498, 42.0996],
[120.1465, 41.7041],
[119.8828, 42.1875],
[119.5313, 42.3633],
[119.3555, 42.2754],
[119.2676, 41.7041],
[119.4434, 41.6162],
[119.2676, 41.3086],
[118.3887, 41.3086],
[118.125, 41.748],
[118.3008, 41.792],
[118.3008, 42.0996],
[118.125, 42.0557],
[117.9492, 42.2314],
[118.0371, 42.4072],
[117.7734, 42.627],
[117.5098, 42.583],
[117.334, 42.4512],
[116.8945, 42.4072],
[116.8066, 42.0117],
[116.2793, 42.0117],
[116.0156, 41.792],
[115.9277, 41.9238],
[115.2246, 41.5723],
[114.9609, 41.6162],
[114.873, 42.0996],
[114.5215, 42.1436],
[114.1699, 41.792],
[114.2578, 41.5723],
[113.9063, 41.4404],
[113.9941, 41.2207],
[113.9063, 41.1328],
[114.082, 40.7373],
[114.082, 40.5176],
[113.8184, 40.5176],
[113.5547, 40.3418],
[113.2031, 40.3857],
[112.7637, 40.166],
[112.3242, 40.2539],
[111.9727, 39.5947],
[111.4453, 39.6387],
[111.3574, 39.4189],
[111.0938, 39.375],
[111.0938, 39.5947],
[110.6543, 39.2871],
[110.127, 39.4629],
[110.2148, 39.2871],
[109.8633, 39.2432],
[109.9512, 39.1553],
[108.9844, 38.3203],
[109.0723, 38.0127],
[108.8965, 37.9688],
[108.8086, 38.0127],
[108.7207, 37.7051],
[108.1934, 37.6172],
[107.666, 37.8809],
[107.3145, 38.1006],
[106.7871, 38.1885],
[106.5234, 38.3203],
[106.9629, 38.9795],
[106.7871, 39.375],
[106.3477, 39.2871],
[105.9082, 38.7158],
[105.8203, 37.793],
[104.3262, 37.4414],
[103.4473, 37.8369],
[103.3594, 38.0127],
[103.5352, 38.1445],
[103.4473, 38.3643],
[104.2383, 38.9795],
[104.0625, 39.4189],
[103.3594, 39.3311],
[103.0078, 39.1113],
[102.4805, 39.2432],
[101.8652, 39.1113],
[102.041, 38.8916],
[101.7773, 38.6719],
[101.3379, 38.7598],
[101.25, 39.0234],
[100.9863, 38.9355],
[100.8105, 39.4189],
[100.5469, 39.4189],
[100.0195, 39.7705],
[99.4922, 39.8584],
[100.1074, 40.2539],
[100.1953, 40.6494],
[99.9316, 41.001],
[99.2285, 40.8691],
[99.0527, 40.6934],
[98.9648, 40.7813],
[98.7891, 40.6055],
[98.5254, 40.7373],
[98.6133, 40.6494],
[98.3496, 40.5615],
[98.3496, 40.9131],
[97.4707, 41.4844],
[97.8223, 41.6162],
[97.8223, 41.748],
[97.207, 42.8027]
]
]
}
},
{
"type": "Feature",
"id": "qing_hai",
"properties": { "name": "青海", "cp": [96.2402, 35.4199], "childNum": 8 },
"geometry": {
"type": "Polygon",
"coordinates": [
[
[89.7363, 36.0791],
[89.9121, 36.0791],
[90, 36.2549],
[90.8789, 36.0352],
[91.0547, 36.0791],
[91.0547, 36.5186],
[90.791, 36.6064],
[90.7031, 36.7822],
[91.3184, 37.0898],
[91.0547, 37.4414],
[90.5273, 37.8369],
[90.6152, 38.3203],
[90.3516, 38.2324],
[90.1758, 38.4961],
[92.373, 39.0234],
[92.373, 39.1113],
[93.1641, 39.1992],
[93.1641, 38.9795],
[93.6914, 38.9355],
[93.8672, 38.7158],
[94.3066, 38.7598],
[94.5703, 38.3643],
[95.0098, 38.4082],
[95.4492, 38.2764],
[95.7129, 38.3643],
[96.2402, 38.1006],
[96.416, 38.2324],
[96.6797, 38.1885],
[96.6797, 38.4521],
[97.1191, 38.584],
[97.0313, 39.1992],
[98.1738, 38.8037],
[98.3496, 39.0234],
[98.6133, 38.9355],
[98.7891, 39.0674],
[99.1406, 38.9355],
[99.8438, 38.3643],
[100.1953, 38.2764],
[100.0195, 38.4521],
[100.1074, 38.4961],
[100.459, 38.2764],
[100.7227, 38.2324],
[101.1621, 37.8369],
[101.5137, 37.8809],
[101.7773, 37.6172],
[101.9531, 37.7051],
[102.1289, 37.4414],
[102.5684, 37.1777],
[102.4805, 36.958],
[102.6563, 36.8262],
[102.5684, 36.7383],
[102.832, 36.3428],
[103.0078, 36.2549],
[102.9199, 36.0791],
[102.9199, 35.9033],
[102.6563, 35.7715],
[102.832, 35.5957],
[102.4805, 35.5957],
[102.3047, 35.4199],
[102.3926, 35.2002],
[101.9531, 34.8486],
[101.9531, 34.6289],
[102.2168, 34.4092],
[102.1289, 34.2773],
[101.6895, 34.1016],
[100.9863, 34.3652],
[100.8105, 34.2773],
[101.25, 33.6621],
[101.5137, 33.7061],
[101.6016, 33.5303],
[101.7773, 33.5303],
[101.6895, 33.3105],
[101.7773, 33.2227],
[101.6016, 33.1348],
[101.1621, 33.2227],
[101.25, 32.6953],
[100.7227, 32.6514],
[100.7227, 32.5195],
[100.3711, 32.7393],
[100.1074, 32.6514],
[100.1074, 32.8711],
[99.8438, 33.0029],
[99.7559, 32.7393],
[99.2285, 32.915],
[99.2285, 33.0469],
[98.877, 33.1787],
[98.4375, 34.0576],
[97.8223, 34.1895],
[97.6465, 34.1016],
[97.7344, 33.9258],
[97.3828, 33.8818],
[97.4707, 33.5742],
[97.7344, 33.3984],
[97.3828, 32.8711],
[97.4707, 32.6953],
[97.7344, 32.5195],
[97.3828, 32.5635],
[97.2949, 32.0801],
[96.7676, 31.9922],
[96.8555, 31.6846],
[96.5039, 31.7285],
[96.2402, 31.9482],
[96.1523, 31.5967],
[95.9766, 31.8164],
[95.8008, 31.6846],
[95.4492, 31.8164],
[95.3613, 31.9922],
[95.3613, 32.168],
[95.2734, 32.2119],
[95.1855, 32.3438],
[95.0098, 32.2998],
[95.1855, 32.4316],
[94.6582, 32.6074],
[94.1309, 32.4316],
[93.7793, 32.5635],
[93.5156, 32.4756],
[92.9883, 32.7393],
[92.2852, 32.7393],
[92.1973, 32.8271],
[91.9336, 32.8271],
[91.4063, 33.1348],
[90.7031, 33.1348],
[90.0879, 33.4863],
[89.6484, 34.0137],
[89.8242, 34.3652],
[89.7363, 34.6729],
[89.8242, 34.8486],
[89.5605, 34.8926],
[89.4727, 35.2441],
[89.4727, 35.376],
[89.7363, 35.4199],
[89.7363, 35.7715],
[89.4727, 35.9033],
[89.3848, 36.0352],
[89.7363, 36.0791]
]
]
}
},
{
"type": "Feature",
"id": "si_chuan",
"properties": {
"name": "四川",
"cp": [102.9199, 30.1904],
"childNum": 21
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[101.7773, 33.5303],
[101.8652, 33.5742],
[101.9531, 33.4424],
[101.8652, 33.0908],
[102.4805, 33.4424],
[102.2168, 33.9258],
[102.9199, 34.3213],
[103.0957, 34.1895],
[103.1836, 33.7939],
[104.1504, 33.6182],
[104.2383, 33.3984],
[104.4141, 33.3105],
[104.3262, 33.2227],
[104.4141, 33.0469],
[104.3262, 32.8711],
[104.4141, 32.7393],
[105.2051, 32.6074],
[105.3809, 32.7393],
[105.3809, 32.8711],
[105.4688, 32.915],
[105.5566, 32.7393],
[106.084, 32.8711],
[106.084, 32.7393],
[106.3477, 32.6514],
[107.0508, 32.6953],
[107.1387, 32.4756],
[107.2266, 32.4316],
[107.4023, 32.5195],
[108.0176, 32.168],
[108.2813, 32.2559],
[108.5449, 32.2119],
[108.3691, 32.168],
[108.2813, 31.9043],
[108.5449, 31.6846],
[108.1934, 31.5088],
[107.9297, 30.8496],
[107.4902, 30.8496],
[107.4023, 30.7617],
[107.4902, 30.6299],
[107.0508, 30.0146],
[106.7871, 30.0146],
[106.6113, 30.3223],
[106.2598, 30.1904],
[105.8203, 30.4541],
[105.6445, 30.2783],
[105.5566, 30.1025],
[105.7324, 29.8828],
[105.293, 29.5313],
[105.4688, 29.3115],
[105.7324, 29.2676],
[105.8203, 28.96],
[106.2598, 28.8721],
[106.3477, 28.5205],
[105.9961, 28.7402],
[105.6445, 28.4326],
[105.9082, 28.125],
[106.1719, 28.125],
[106.3477, 27.8174],
[105.6445, 27.6416],
[105.5566, 27.7734],
[105.293, 27.7295],
[105.2051, 27.9932],
[105.0293, 28.0811],
[104.8535, 27.9053],
[104.4141, 27.9492],
[104.3262, 28.0371],
[104.4141, 28.125],
[104.4141, 28.2568],
[104.2383, 28.4326],
[104.4141, 28.6084],
[103.8867, 28.6523],
[103.7988, 28.3008],
[103.4473, 28.125],
[103.4473, 27.7734],
[102.9199, 27.29],
[103.0078, 26.3672],
[102.6563, 26.1914],
[102.5684, 26.3672],
[102.1289, 26.1035],
[101.8652, 26.0596],
[101.6016, 26.2354],
[101.6895, 26.3672],
[101.4258, 26.5869],
[101.4258, 26.8066],
[101.4258, 26.7188],
[101.1621, 27.0264],
[101.1621, 27.1582],
[100.7227, 27.8613],
[100.3711, 27.8174],
[100.2832, 27.7295],
[100.0195, 28.125],
[100.1953, 28.3447],
[99.668, 28.8281],
[99.4043, 28.5205],
[99.4043, 28.1689],
[99.2285, 28.3008],
[99.1406, 29.2676],
[98.9648, 30.7617],
[98.6133, 31.2012],
[98.877, 31.4209],
[98.4375, 31.8604],
[98.1738, 32.3438],
[97.7344, 32.5195],
[97.4707, 32.6953],
[97.3828, 32.8711],
[97.7344, 33.3984],
[97.4707, 33.5742],
[97.3828, 33.8818],
[97.7344, 33.9258],
[97.6465, 34.1016],
[97.8223, 34.1895],
[98.4375, 34.0576],
[98.877, 33.1787],
[99.2285, 33.0469],
[99.2285, 32.915],
[99.7559, 32.7393],
[99.8438, 33.0029],
[100.1074, 32.8711],
[100.1074, 32.6514],
[100.3711, 32.7393],
[100.7227, 32.5195],
[100.7227, 32.6514],
[101.25, 32.6953],
[101.1621, 33.2227],
[101.6016, 33.1348],
[101.7773, 33.2227],
[101.6895, 33.3105],
[101.7773, 33.5303]
]
]
}
},
{
"type": "Feature",
"id": "hei_long_jiang",
"properties": {
"name": "黑龙江",
"cp": [128.1445, 48.5156],
"childNum": 13
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[121.4648, 53.3496],
[123.6621, 53.5693],
[124.8926, 53.0859],
[125.0684, 53.2178],
[125.5957, 53.0859],
[125.6836, 52.9102],
[126.123, 52.7783],
[126.0352, 52.6025],
[126.2109, 52.5146],
[126.3867, 52.2949],
[126.3867, 52.207],
[126.5625, 52.1631],
[126.4746, 51.9434],
[126.9141, 51.3721],
[126.8262, 51.2842],
[127.002, 51.3281],
[126.9141, 51.1084],
[127.2656, 50.7568],
[127.3535, 50.2734],
[127.6172, 50.2295],
[127.5293, 49.8779],
[127.793, 49.6143],
[128.7598, 49.5703],
[129.1113, 49.3506],
[129.4629, 49.4385],
[130.2539, 48.8672],
[130.6934, 48.8672],
[130.5176, 48.6475],
[130.8691, 48.2959],
[130.6934, 48.1201],
[131.0449, 47.6807],
[132.5391, 47.7246],
[132.627, 47.9443],
[133.0664, 48.1201],
[133.5059, 48.1201],
[134.209, 48.3838],
[135.0879, 48.4277],
[134.7363, 48.252],
[134.5605, 47.9883],
[134.7363, 47.6807],
[134.5605, 47.4609],
[134.3848, 47.4609],
[134.209, 47.2852],
[134.209, 47.1533],
[133.8574, 46.5381],
[133.9453, 46.2744],
[133.5059, 45.835],
[133.418, 45.5713],
[133.2422, 45.5273],
[133.0664, 45.1318],
[132.8906, 45.0439],
[131.9238, 45.3516],
[131.5723, 45.0439],
[131.0449, 44.8682],
[131.3086, 44.0771],
[131.2207, 43.7256],
[131.3086, 43.4619],
[130.8691, 43.418],
[130.5176, 43.6377],
[130.3418, 43.9893],
[129.9902, 43.8574],
[129.9023, 44.0332],
[129.8145, 43.9014],
[129.2871, 43.8135],
[129.1992, 43.5938],
[128.8477, 43.5498],
[128.4961, 44.165],
[128.4082, 44.4727],
[128.0566, 44.3408],
[128.0566, 44.1211],
[127.7051, 44.1211],
[127.5293, 44.6045],
[127.0898, 44.6045],
[127.002, 44.7803],
[127.0898, 45],
[126.9141, 45.1318],
[126.5625, 45.2637],
[126.0352, 45.1758],
[125.7715, 45.3076],
[125.6836, 45.5273],
[125.0684, 45.3955],
[124.8926, 45.5273],
[124.3652, 45.4395],
[124.0137, 45.7471],
[123.9258, 46.2305],
[123.2227, 46.2305],
[123.0469, 46.582],
[123.5742, 46.6699],
[123.5742, 46.8896],
[123.5742, 46.8457],
[123.4863, 46.9775],
[123.3984, 46.9775],
[123.3984, 46.8896],
[123.0469, 46.7139],
[122.4316, 47.373],
[124.2773, 48.5156],
[124.4531, 48.1201],
[124.8047, 49.1309],
[125.2441, 49.1748],
[125.1563, 49.834],
[125.332, 50.1416],
[125.7715, 50.5371],
[125.7715, 50.7568],
[126.0352, 51.0205],
[125.332, 51.6357],
[125.0684, 51.6357],
[124.8926, 51.3721],
[124.541, 51.3721],
[124.3652, 51.2842],
[123.6621, 51.3721],
[123.3105, 51.2402],
[122.959, 51.3281],
[122.6074, 52.0752],
[122.6953, 52.251],
[122.168, 52.5146],
[121.9922, 52.2949],
[121.7285, 52.2949],
[121.6406, 52.4268],
[121.2012, 52.5586],
[121.8164, 53.042],
[121.4648, 53.3496]
]
]
}
},
{
"type": "Feature",
"id": "gan_su",
"properties": { "name": "甘肃", "cp": [95.7129, 40.166], "childNum": 14 },
"geometry": {
"type": "Polygon",
"coordinates": [
[
[96.416, 42.7148],
[97.207, 42.8027],
[97.8223, 41.748],
[97.8223, 41.6162],
[97.4707, 41.4844],
[98.3496, 40.9131],
[98.3496, 40.5615],
[98.6133, 40.6494],
[98.5254, 40.7373],
[98.7891, 40.6055],
[98.9648, 40.7813],
[99.0527, 40.6934],
[99.2285, 40.8691],
[99.9316, 41.001],
[100.1953, 40.6494],
[100.1074, 40.2539],
[99.4922, 39.8584],
[100.0195, 39.7705],
[100.5469, 39.4189],
[100.8105, 39.4189],
[100.9863, 38.9355],
[101.25, 39.0234],
[101.3379, 38.7598],
[101.7773, 38.6719],
[102.041, 38.8916],
[101.8652, 39.1113],
[102.4805, 39.2432],
[103.0078, 39.1113],
[103.3594, 39.3311],
[104.0625, 39.4189],
[104.2383, 38.9795],
[103.4473, 38.3643],
[103.5352, 38.1445],
[103.3594, 38.0127],
[103.4473, 37.8369],
[104.3262, 37.4414],
[104.5898, 37.4414],
[104.5898, 37.2217],
[104.8535, 37.2217],
[105.293, 36.8262],
[105.2051, 36.6943],
[105.4688, 36.123],
[105.293, 35.9912],
[105.3809, 35.7715],
[105.7324, 35.7275],
[105.8203, 35.5518],
[105.9961, 35.4639],
[105.9082, 35.4199],
[105.9961, 35.4199],
[106.084, 35.376],
[106.2598, 35.4199],
[106.3477, 35.2441],
[106.5234, 35.332],
[106.4355, 35.6836],
[106.6992, 35.6836],
[106.9629, 35.8154],
[106.875, 36.123],
[106.5234, 36.2549],
[106.5234, 36.4746],
[106.4355, 36.5625],
[106.6113, 36.7822],
[106.6113, 37.0898],
[107.3145, 37.0898],
[107.3145, 36.9141],
[108.7207, 36.3428],
[108.6328, 35.9912],
[108.5449, 35.8594],
[108.6328, 35.5518],
[108.5449, 35.2881],
[107.7539, 35.2881],
[107.7539, 35.1123],
[107.8418, 35.0244],
[107.666, 34.9365],
[107.2266, 34.8926],
[106.9629, 35.0684],
[106.6113, 35.0684],
[106.5234, 34.7607],
[106.3477, 34.585],
[106.6992, 34.3213],
[106.5234, 34.2773],
[106.6113, 34.1455],
[106.4355, 33.9258],
[106.5234, 33.5303],
[105.9961, 33.6182],
[105.7324, 33.3984],
[105.9961, 33.1787],
[105.9082, 33.0029],
[105.4688, 32.915],
[105.3809, 32.8711],
[105.3809, 32.7393],
[105.2051, 32.6074],
[104.4141, 32.7393],
[104.3262, 32.8711],
[104.4141, 33.0469],
[104.3262, 33.2227],
[104.4141, 33.3105],
[104.2383, 33.3984],
[104.1504, 33.6182],
[103.1836, 33.7939],
[103.0957, 34.1895],
[102.9199, 34.3213],
[102.2168, 33.9258],
[102.4805, 33.4424],
[101.8652, 33.0908],
[101.9531, 33.4424],
[101.8652, 33.5742],
[101.7773, 33.5303],
[101.6016, 33.5303],
[101.5137, 33.7061],
[101.25, 33.6621],
[100.8105, 34.2773],
[100.9863, 34.3652],
[101.6895, 34.1016],
[102.1289, 34.2773],
[102.2168, 34.4092],
[101.9531, 34.6289],
[101.9531, 34.8486],
[102.3926, 35.2002],
[102.3047, 35.4199],
[102.4805, 35.5957],
[102.832, 35.5957],
[102.6563, 35.7715],
[102.9199, 35.9033],
[102.9199, 36.0791],
[103.0078, 36.2549],
[102.832, 36.3428],
[102.5684, 36.7383],
[102.6563, 36.8262],
[102.4805, 36.958],
[102.5684, 37.1777],
[102.1289, 37.4414],
[101.9531, 37.7051],
[101.7773, 37.6172],
[101.5137, 37.8809],
[101.1621, 37.8369],
[100.7227, 38.2324],
[100.459, 38.2764],
[100.1074, 38.4961],
[100.0195, 38.4521],
[100.1953, 38.2764],
[99.8438, 38.3643],
[99.1406, 38.9355],
[98.7891, 39.0674],
[98.6133, 38.9355],
[98.3496, 39.0234],
[98.1738, 38.8037],
[97.0313, 39.1992],
[97.1191, 38.584],
[96.6797, 38.4521],
[96.6797, 38.1885],
[96.416, 38.2324],
[96.2402, 38.1006],
[95.7129, 38.3643],
[95.4492, 38.2764],
[95.0098, 38.4082],
[94.5703, 38.3643],
[94.3066, 38.7598],
[93.8672, 38.7158],
[93.6914, 38.9355],
[93.1641, 38.9795],
[93.1641, 39.1992],
[92.373, 39.1113],
[92.373, 39.3311],
[92.6367, 39.6387],
[93.0762, 40.6494],
[93.8672, 40.6934],
[94.043, 41.0889],
[94.5703, 41.4844],
[95.1855, 41.792],
[95.2734, 41.6162],
[95.9766, 41.9238],
[96.2402, 42.2314],
[96.0645, 42.3193],
[95.9766, 42.4951],
[96.416, 42.7148]
]
]
}
},
{
"type": "Feature",
"id": "yun_nan",
"properties": {
"name": "云南",
"cp": [101.8652, 25.1807],
"childNum": 16
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[98.1738, 28.125],
[98.2617, 28.3887],
[98.3496, 28.125],
[98.7012, 28.2129],
[98.7891, 28.3447],
[98.6133, 28.5205],
[98.7012, 28.916],
[98.7891, 29.0039],
[98.7891, 28.8721],
[98.9648, 28.8281],
[98.9648, 29.1357],
[99.1406, 29.2676],
[99.2285, 28.3008],
[99.4043, 28.1689],
[99.4043, 28.5205],
[99.668, 28.8281],
[100.1953, 28.3447],
[100.0195, 28.125],
[100.2832, 27.7295],
[100.3711, 27.8174],
[100.7227, 27.8613],
[101.1621, 27.1582],
[101.1621, 27.0264],
[101.4258, 26.7188],
[101.4258, 26.8066],
[101.4258, 26.5869],
[101.6895, 26.3672],
[101.6016, 26.2354],
[101.8652, 26.0596],
[102.1289, 26.1035],
[102.5684, 26.3672],
[102.6563, 26.1914],
[103.0078, 26.3672],
[102.9199, 27.29],
[103.4473, 27.7734],
[103.4473, 28.125],
[103.7988, 28.3008],
[103.8867, 28.6523],
[104.4141, 28.6084],
[104.2383, 28.4326],
[104.4141, 28.2568],
[104.4141, 28.125],
[104.3262, 28.0371],
[104.4141, 27.9492],
[104.8535, 27.9053],
[105.0293, 28.0811],
[105.2051, 27.9932],
[105.293, 27.7295],
[105.2051, 27.3779],
[104.5898, 27.334],
[104.4141, 27.4658],
[104.1504, 27.2461],
[103.8867, 27.4219],
[103.623, 27.0264],
[103.7109, 26.9824],
[103.7109, 26.7627],
[103.8867, 26.543],
[104.4141, 26.6748],
[104.6777, 26.4111],
[104.3262, 25.708],
[104.8535, 25.2246],
[104.5898, 25.0488],
[104.6777, 24.9609],
[104.502, 24.7412],
[104.6777, 24.3457],
[104.7656, 24.4775],
[105.0293, 24.4336],
[105.2051, 24.082],
[105.4688, 24.0381],
[105.5566, 24.126],
[105.9961, 24.126],
[106.1719, 23.8184],
[106.1719, 23.5547],
[105.6445, 23.4229],
[105.5566, 23.2031],
[105.293, 23.3789],
[104.8535, 23.1592],
[104.7656, 22.8516],
[104.3262, 22.6758],
[104.1504, 22.8076],
[103.9746, 22.5439],
[103.623, 22.7637],
[103.5352, 22.5879],
[103.3594, 22.8076],
[103.0957, 22.4561],
[102.4805, 22.7637],
[102.3047, 22.4121],
[101.8652, 22.3682],
[101.7773, 22.5],
[101.6016, 22.1924],
[101.8652, 21.6211],
[101.7773, 21.1377],
[101.6016, 21.2256],
[101.25, 21.1816],
[101.1621, 21.7529],
[100.6348, 21.4453],
[100.1074, 21.4893],
[99.9316, 22.0605],
[99.2285, 22.1484],
[99.4043, 22.5879],
[99.3164, 22.7197],
[99.4922, 23.0713],
[98.877, 23.2031],
[98.7012, 23.9502],
[98.877, 24.126],
[98.1738, 24.082],
[97.7344, 23.8623],
[97.5586, 23.9063],
[97.7344, 24.126],
[97.6465, 24.4336],
[97.5586, 24.4336],
[97.5586, 24.7412],
[97.7344, 24.8291],
[97.8223, 25.2686],
[98.1738, 25.4004],
[98.1738, 25.6201],
[98.3496, 25.5762],
[98.5254, 25.8398],
[98.7012, 25.8838],
[98.6133, 26.0596],
[98.7012, 26.1475],
[98.7891, 26.5869],
[98.7012, 27.5098],
[98.5254, 27.6416],
[98.3496, 27.5098],
[98.1738, 28.125]
]
]
}
},
{
"type": "Feature",
"id": "guang_xi",
"properties": {
"name": "广西",
"cp": [108.2813, 23.6426],
"childNum": 14
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[104.502, 24.7412],
[104.6777, 24.6094],
[105.2051, 24.9609],
[105.9961, 24.6533],
[106.1719, 24.7852],
[106.1719, 24.9609],
[106.875, 25.1807],
[107.0508, 25.2686],
[106.9629, 25.4883],
[107.2266, 25.6201],
[107.4902, 25.2246],
[107.7539, 25.2246],
[107.8418, 25.1367],
[108.1055, 25.2246],
[108.1934, 25.4443],
[108.3691, 25.5322],
[108.6328, 25.3125],
[108.6328, 25.5762],
[109.0723, 25.5322],
[108.9844, 25.752],
[109.3359, 25.708],
[109.5117, 26.0156],
[109.7754, 25.8838],
[109.9512, 26.1914],
[110.2148, 25.9717],
[110.5664, 26.3232],
[111.1816, 26.3232],
[111.2695, 26.2354],
[111.2695, 25.8838],
[111.4453, 25.8398],
[111.0059, 25.0049],
[111.0938, 24.9609],
[111.3574, 25.1367],
[111.5332, 24.6533],
[111.709, 24.7852],
[112.0605, 24.7412],
[111.8848, 24.6533],
[112.0605, 24.3457],
[111.8848, 24.2139],
[111.8848, 23.9941],
[111.7969, 23.8184],
[111.6211, 23.8184],
[111.6211, 23.6865],
[111.3574, 23.4668],
[111.4453, 23.0273],
[111.2695, 22.8076],
[110.7422, 22.5439],
[110.7422, 22.2803],
[110.6543, 22.1484],
[110.3027, 22.1484],
[110.3027, 21.8848],
[109.9512, 21.8408],
[109.8633, 21.665],
[109.7754, 21.6211],
[109.7754, 21.4014],
[109.5996, 21.4453],
[109.1602, 21.3574],
[109.248, 20.874],
[109.0723, 20.9619],
[109.0723, 21.5332],
[108.7207, 21.5332],
[108.6328, 21.665],
[108.2813, 21.4893],
[107.8418, 21.6211],
[107.4023, 21.6211],
[107.0508, 21.7969],
[107.0508, 21.9287],
[106.6992, 22.0166],
[106.6113, 22.4121],
[106.7871, 22.7637],
[106.6992, 22.8955],
[105.9082, 22.9395],
[105.5566, 23.0713],
[105.5566, 23.2031],
[105.6445, 23.4229],
[106.1719, 23.5547],
[106.1719, 23.8184],
[105.9961, 24.126],
[105.5566, 24.126],
[105.4688, 24.0381],
[105.2051, 24.082],
[105.0293, 24.4336],
[104.7656, 24.4775],
[104.6777, 24.3457],
[104.502, 24.7412]
]
]
}
},
{
"type": "Feature",
"id": "hu_nan",
"properties": {
"name": "湖南",
"cp": [111.5332, 27.3779],
"childNum": 14
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[109.248, 28.4766],
[109.248, 29.1357],
[109.5117, 29.6191],
[109.6875, 29.6191],
[109.7754, 29.751],
[110.4785, 29.6631],
[110.6543, 29.751],
[110.4785, 30.0146],
[110.8301, 30.1465],
[111.7969, 29.9268],
[112.2363, 29.5313],
[112.5, 29.6191],
[112.6758, 29.5752],
[112.9395, 29.7949],
[113.0273, 29.751],
[112.9395, 29.4873],
[113.0273, 29.4434],
[113.5547, 29.8389],
[113.5547, 29.707],
[113.7305, 29.5752],
[113.6426, 29.3115],
[113.7305, 29.0918],
[113.9063, 29.0479],
[114.1699, 28.8281],
[114.082, 28.5645],
[114.2578, 28.3447],
[113.7305, 27.9492],
[113.6426, 27.5977],
[113.6426, 27.3779],
[113.8184, 27.29],
[113.7305, 27.1143],
[113.9063, 26.9385],
[113.9063, 26.6309],
[114.082, 26.5869],
[113.9941, 26.1914],
[114.2578, 26.1475],
[113.9941, 26.0596],
[113.9063, 25.4443],
[113.6426, 25.3125],
[113.2031, 25.5322],
[112.8516, 25.3564],
[113.0273, 25.2246],
[113.0273, 24.9609],
[112.8516, 24.917],
[112.5879, 25.1367],
[112.2363, 25.1807],
[112.1484, 24.873],
[112.0605, 24.7412],
[111.709, 24.7852],
[111.5332, 24.6533],
[111.3574, 25.1367],
[111.0938, 24.9609],
[111.0059, 25.0049],
[111.4453, 25.8398],
[111.2695, 25.8838],
[111.2695, 26.2354],
[111.1816, 26.3232],
[110.5664, 26.3232],
[110.2148, 25.9717],
[109.9512, 26.1914],
[109.7754, 25.8838],
[109.5117, 26.0156],
[109.4238, 26.2793],
[109.248, 26.3232],
[109.4238, 26.5869],
[109.3359, 26.7188],
[109.5117, 26.8066],
[109.5117, 27.0264],
[109.3359, 27.1582],
[108.8965, 27.0264],
[108.8086, 27.1143],
[109.4238, 27.5977],
[109.3359, 27.9053],
[109.3359, 28.2568],
[109.248, 28.4766]
]
]
}
},
{
"type": "Feature",
"id": "shan_xi_1",
"properties": {
"name": "陕西",
"cp": [109.5996, 35.6396],
"childNum": 10
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[105.4688, 32.915],
[105.9082, 33.0029],
[105.9961, 33.1787],
[105.7324, 33.3984],
[105.9961, 33.6182],
[106.5234, 33.5303],
[106.4355, 33.9258],
[106.6113, 34.1455],
[106.5234, 34.2773],
[106.6992, 34.3213],
[106.3477, 34.585],
[106.5234, 34.7607],
[106.6113, 35.0684],
[106.9629, 35.0684],
[107.2266, 34.8926],
[107.666, 34.9365],
[107.8418, 35.0244],
[107.7539, 35.1123],
[107.7539, 35.2881],
[108.5449, 35.2881],
[108.6328, 35.5518],
[108.5449, 35.8594],
[108.6328, 35.9912],
[108.7207, 36.3428],
[107.3145, 36.9141],
[107.3145, 37.0898],
[107.3145, 37.6172],
[107.666, 37.8809],
[108.1934, 37.6172],
[108.7207, 37.7051],
[108.8086, 38.0127],
[108.8965, 37.9688],
[109.0723, 38.0127],
[108.9844, 38.3203],
[109.9512, 39.1553],
[109.8633, 39.2432],
[110.2148, 39.2871],
[110.127, 39.4629],
[110.6543, 39.2871],
[111.0938, 39.5947],
[111.0938, 39.375],
[111.1816, 39.2432],
[110.918, 38.7158],
[110.8301, 38.4961],
[110.4785, 38.1885],
[110.4785, 37.9688],
[110.8301, 37.6611],
[110.3906, 37.002],
[110.4785, 36.123],
[110.5664, 35.6396],
[110.2148, 34.8926],
[110.2148, 34.6729],
[110.3906, 34.585],
[110.4785, 34.2334],
[110.6543, 34.1455],
[110.6543, 33.8379],
[111.0059, 33.5303],
[111.0059, 33.2666],
[110.7422, 33.1348],
[110.5664, 33.2666],
[110.3027, 33.1787],
[109.5996, 33.2666],
[109.4238, 33.1348],
[109.7754, 33.0469],
[109.7754, 32.915],
[110.127, 32.7393],
[110.127, 32.6074],
[109.6875, 32.6074],
[109.5117, 32.4316],
[109.5996, 31.7285],
[109.248, 31.7285],
[109.0723, 31.9482],
[108.5449, 32.2119],
[108.2813, 32.2559],
[108.0176, 32.168],
[107.4023, 32.5195],
[107.2266, 32.4316],
[107.1387, 32.4756],
[107.0508, 32.6953],
[106.3477, 32.6514],
[106.084, 32.7393],
[106.084, 32.8711],
[105.5566, 32.7393],
[105.4688, 32.915]
]
]
}
},
{
"type": "Feature",
"id": "guang_dong",
"properties": {
"name": "广东",
"cp": [113.4668, 22.8076],
"childNum": 21
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[109.7754, 21.4014],
[109.7754, 21.6211],
[109.8633, 21.665],
[109.9512, 21.8408],
[110.3027, 21.8848],
[110.3027, 22.1484],
[110.6543, 22.1484],
[110.7422, 22.2803],
[110.7422, 22.5439],
[111.2695, 22.8076],
[111.4453, 23.0273],
[111.3574, 23.4668],
[111.6211, 23.6865],
[111.6211, 23.8184],
[111.7969, 23.8184],
[111.8848, 23.9941],
[111.8848, 24.2139],
[112.0605, 24.3457],
[111.8848, 24.6533],
[112.0605, 24.7412],
[112.1484, 24.873],
[112.2363, 25.1807],
[112.5879, 25.1367],
[112.8516, 24.917],
[113.0273, 24.9609],
[113.0273, 25.2246],
[112.8516, 25.3564],
[113.2031, 25.5322],
[113.6426, 25.3125],
[113.9063, 25.4443],
[113.9941, 25.2686],
[114.6094, 25.4004],
[114.7852, 25.2686],
[114.6973, 25.1367],
[114.4336, 24.9609],
[114.1699, 24.6973],
[114.4336, 24.5215],
[115.4004, 24.7852],
[115.8398, 24.5654],
[115.752, 24.7852],
[115.9277, 24.917],
[116.2793, 24.7852],
[116.3672, 24.873],
[116.543, 24.6094],
[116.7188, 24.6533],
[116.9824, 24.1699],
[116.9824, 23.9063],
[117.1582, 23.5547],
[117.334, 23.2471],
[116.8945, 23.3789],
[116.6309, 23.1152],
[116.543, 22.8516],
[115.9277, 22.7197],
[115.6641, 22.7637],
[115.5762, 22.6318],
[115.0488, 22.6758],
[114.6094, 22.3682],
[114.3457, 22.5439],
[113.9941, 22.5],
[113.8184, 22.1924],
[114.3457, 22.1484],
[114.4336, 22.0166],
[114.082, 21.9287],
[113.9941, 21.7969],
[113.5547, 22.0166],
[113.1152, 21.8408],
[112.9395, 21.5771],
[112.4121, 21.4453],
[112.2363, 21.5332],
[111.5332, 21.4893],
[111.2695, 21.3574],
[110.7422, 21.3574],
[110.6543, 21.2256],
[110.7422, 20.918],
[110.4785, 20.874],
[110.6543, 20.2588],
[110.5664, 20.2588],
[110.3906, 20.127],
[110.0391, 20.127],
[109.8633, 20.127],
[109.8633, 20.3027],
[109.5996, 20.918],
[109.7754, 21.4014],
[109.7754, 21.4014]
],
[
[113.5986, 22.1649],
[113.6096, 22.1265],
[113.5547, 22.11],
[113.5437, 22.2034],
[113.5767, 22.2034],
[113.5986, 22.1649]
]
]
}
},
{
"type": "Feature",
"id": "ji_lin",
"properties": {
"name": "吉林",
"cp": [126.4746, 43.5938],
"childNum": 9
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[123.2227, 46.2305],
[123.9258, 46.2305],
[124.0137, 45.7471],
[124.3652, 45.4395],
[124.8926, 45.5273],
[125.0684, 45.3955],
[125.6836, 45.5273],
[125.7715, 45.3076],
[126.0352, 45.1758],
[126.5625, 45.2637],
[126.9141, 45.1318],
[127.0898, 45],
[127.002, 44.7803],
[127.0898, 44.6045],
[127.5293, 44.6045],
[127.7051, 44.1211],
[128.0566, 44.1211],
[128.0566, 44.3408],
[128.4082, 44.4727],
[128.4961, 44.165],
[128.8477, 43.5498],
[129.1992, 43.5938],
[129.2871, 43.8135],
[129.8145, 43.9014],
[129.9023, 44.0332],
[129.9902, 43.8574],
[130.3418, 43.9893],
[130.5176, 43.6377],
[130.8691, 43.418],
[131.3086, 43.4619],
[131.3086, 43.3301],
[131.1328, 42.9346],
[130.4297, 42.7148],
[130.6055, 42.6709],
[130.6055, 42.4512],
[130.2539, 42.7588],
[130.2539, 42.8906],
[130.166, 42.9785],
[129.9023, 43.0225],
[129.7266, 42.4951],
[129.375, 42.4512],
[128.9355, 42.0117],
[128.0566, 42.0117],
[128.3203, 41.5723],
[128.1445, 41.3525],
[127.0898, 41.5283],
[127.1777, 41.5723],
[126.9141, 41.792],
[126.6504, 41.6602],
[126.4746, 41.3965],
[126.123, 40.957],
[125.6836, 40.8691],
[125.5957, 40.9131],
[125.7715, 41.2207],
[125.332, 41.6602],
[125.332, 41.9678],
[125.4199, 42.0996],
[125.332, 42.1436],
[124.8926, 42.8027],
[124.8926, 43.0664],
[124.7168, 43.0664],
[124.4531, 42.8467],
[124.2773, 43.2422],
[123.8379, 43.4619],
[123.6621, 43.374],
[123.3105, 43.5059],
[123.4863, 43.7256],
[123.1348, 44.4727],
[122.3438, 44.2529],
[122.0801, 44.8682],
[122.2559, 45.2637],
[121.9043, 45.7031],
[121.7285, 45.7471],
[121.8164, 46.0107],
[122.2559, 45.791],
[122.4316, 45.8789],
[122.6953, 45.7031],
[122.7832, 46.0107],
[123.2227, 46.2305]
]
]
}
},
{
"type": "Feature",
"id": "he_bei",
"properties": {
"name": "河北",
"cp": [115.4004, 37.9688],
"childNum": 11
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[114.5215, 39.5068],
[114.3457, 39.8584],
[113.9941, 39.9902],
[114.5215, 40.3418],
[114.3457, 40.3857],
[114.2578, 40.6055],
[114.082, 40.7373],
[113.9063, 41.1328],
[113.9941, 41.2207],
[113.9063, 41.4404],
[114.2578, 41.5723],
[114.1699, 41.792],
[114.5215, 42.1436],
[114.873, 42.0996],
[114.9609, 41.6162],
[115.2246, 41.5723],
[115.9277, 41.9238],
[116.0156, 41.792],
[116.2793, 42.0117],
[116.8066, 42.0117],
[116.8945, 42.4072],
[117.334, 42.4512],
[117.5098, 42.583],
[117.7734, 42.627],
[118.0371, 42.4072],
[117.9492, 42.2314],
[118.125, 42.0557],
[118.3008, 42.0996],
[118.3008, 41.792],
[118.125, 41.748],
[118.3887, 41.3086],
[119.2676, 41.3086],
[118.8281, 40.8252],
[119.2676, 40.5176],
[119.5313, 40.5615],
[119.707, 40.1221],
[119.8828, 39.9463],
[119.5313, 39.6826],
[119.4434, 39.4189],
[118.916, 39.0674],
[118.4766, 38.9355],
[118.125, 39.0234],
[118.0371, 39.1992],
[118.0371, 39.2432],
[117.8613, 39.4189],
[117.9492, 39.5947],
[117.6855, 39.5947],
[117.5098, 39.7705],
[117.5098, 39.9902],
[117.6855, 39.9902],
[117.6855, 40.0781],
[117.4219, 40.21],
[117.2461, 40.5176],
[117.4219, 40.6494],
[116.9824, 40.6934],
[116.6309, 41.0449],
[116.3672, 40.9131],
[116.4551, 40.7813],
[116.1914, 40.7813],
[116.1035, 40.6055],
[115.752, 40.5615],
[115.9277, 40.2539],
[115.4004, 39.9463],
[115.4883, 39.6387],
[115.752, 39.5068],
[116.1914, 39.5947],
[116.3672, 39.4629],
[116.543, 39.5947],
[116.8066, 39.5947],
[116.8945, 39.1113],
[116.7188, 38.9355],
[116.7188, 38.8037],
[117.2461, 38.54],
[117.5977, 38.6279],
[117.9492, 38.3203],
[117.4219, 37.8369],
[116.8066, 37.8369],
[116.4551, 37.4854],
[116.2793, 37.5732],
[116.2793, 37.3535],
[116.0156, 37.3535],
[115.752, 36.9141],
[115.3125, 36.5186],
[115.4883, 36.167],
[115.3125, 36.0791],
[115.1367, 36.2109],
[114.9609, 36.0791],
[114.873, 36.123],
[113.7305, 36.3428],
[113.4668, 36.6504],
[113.7305, 36.8701],
[113.7305, 37.1338],
[114.1699, 37.6611],
[113.9941, 37.7051],
[113.8184, 38.1445],
[113.5547, 38.2764],
[113.5547, 38.54],
[113.8184, 38.8037],
[113.8184, 38.9355],
[113.9063, 39.0234],
[114.3457, 39.0674],
[114.5215, 39.5068]
]
],
[
[
[117.2461, 40.0781],
[117.1582, 39.8145],
[117.1582, 39.6387],
[116.8945, 39.6826],
[116.8945, 39.8145],
[116.8066, 39.9902],
[117.2461, 40.0781]
]
]
]
}
},
{
"type": "Feature",
"id": "hu_bei",
"properties": {
"name": "湖北",
"cp": [112.2363, 31.1572],
"childNum": 17
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[110.2148, 31.1572],
[110.127, 31.377],
[109.6875, 31.5527],
[109.7754, 31.6846],
[109.5996, 31.7285],
[109.5117, 32.4316],
[109.6875, 32.6074],
[110.127, 32.6074],
[110.127, 32.7393],
[109.7754, 32.915],
[109.7754, 33.0469],
[109.4238, 33.1348],
[109.5996, 33.2666],
[110.3027, 33.1787],
[110.5664, 33.2666],
[110.7422, 33.1348],
[111.0059, 33.2666],
[111.5332, 32.6074],
[112.3242, 32.3438],
[113.2031, 32.4316],
[113.4668, 32.2998],
[113.7305, 32.4316],
[113.8184, 31.8604],
[113.9941, 31.7725],
[114.1699, 31.8604],
[114.5215, 31.7725],
[114.6094, 31.5527],
[114.7852, 31.4648],
[115.1367, 31.5967],
[115.2246, 31.4209],
[115.4004, 31.4209],
[115.5762, 31.2012],
[116.0156, 31.0254],
[115.752, 30.6738],
[116.1035, 30.1904],
[116.1035, 29.8389],
[115.9277, 29.707],
[115.4883, 29.7949],
[114.873, 29.3994],
[114.2578, 29.3555],
[113.9063, 29.0479],
[113.7305, 29.0918],
[113.6426, 29.3115],
[113.7305, 29.5752],
[113.5547, 29.707],
[113.5547, 29.8389],
[113.0273, 29.4434],
[112.9395, 29.4873],
[113.0273, 29.751],
[112.9395, 29.7949],
[112.6758, 29.5752],
[112.5, 29.6191],
[112.2363, 29.5313],
[111.7969, 29.9268],
[110.8301, 30.1465],
[110.4785, 30.0146],
[110.6543, 29.751],
[110.4785, 29.6631],
[109.7754, 29.751],
[109.6875, 29.6191],
[109.5117, 29.6191],
[109.248, 29.1357],
[109.0723, 29.3555],
[108.9844, 29.3115],
[108.6328, 29.8389],
[108.457, 29.7949],
[108.5449, 30.2344],
[108.457, 30.4102],
[108.6328, 30.5859],
[108.8086, 30.498],
[109.0723, 30.6299],
[109.1602, 30.542],
[109.248, 30.6299],
[109.4238, 30.542],
[109.8633, 30.8936],
[110.0391, 30.8057],
[110.2148, 31.1572]
]
]
}
},
{
"type": "Feature",
"id": "gui_zhou",
"properties": {
"name": "贵州",
"cp": [106.6113, 26.9385],
"childNum": 9
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[104.1504, 27.2461],
[104.4141, 27.4658],
[104.5898, 27.334],
[105.2051, 27.3779],
[105.293, 27.7295],
[105.5566, 27.7734],
[105.6445, 27.6416],
[106.3477, 27.8174],
[106.1719, 28.125],
[105.9082, 28.125],
[105.6445, 28.4326],
[105.9961, 28.7402],
[106.3477, 28.5205],
[106.5234, 28.5645],
[106.4355, 28.7842],
[106.5234, 28.7842],
[106.6113, 28.6523],
[106.6113, 28.5205],
[106.6992, 28.4766],
[106.875, 28.7842],
[107.4023, 28.8721],
[107.4023, 29.1797],
[107.5781, 29.2236],
[107.8418, 29.1357],
[107.8418, 29.0039],
[108.2813, 29.0918],
[108.3691, 28.6523],
[108.5449, 28.6523],
[108.5449, 28.3887],
[108.7207, 28.4766],
[108.7207, 28.2129],
[109.0723, 28.2129],
[109.248, 28.4766],
[109.3359, 28.2568],
[109.3359, 27.9053],
[109.4238, 27.5977],
[108.8086, 27.1143],
[108.8965, 27.0264],
[109.3359, 27.1582],
[109.5117, 27.0264],
[109.5117, 26.8066],
[109.3359, 26.7188],
[109.4238, 26.5869],
[109.248, 26.3232],
[109.4238, 26.2793],
[109.5117, 26.0156],
[109.3359, 25.708],
[108.9844, 25.752],
[109.0723, 25.5322],
[108.6328, 25.5762],
[108.6328, 25.3125],
[108.3691, 25.5322],
[108.1934, 25.4443],
[108.1055, 25.2246],
[107.8418, 25.1367],
[107.7539, 25.2246],
[107.4902, 25.2246],
[107.2266, 25.6201],
[106.9629, 25.4883],
[107.0508, 25.2686],
[106.875, 25.1807],
[106.1719, 24.9609],
[106.1719, 24.7852],
[105.9961, 24.6533],
[105.2051, 24.9609],
[104.6777, 24.6094],
[104.502, 24.7412],
[104.6777, 24.9609],
[104.5898, 25.0488],
[104.8535, 25.2246],
[104.3262, 25.708],
[104.6777, 26.4111],
[104.4141, 26.6748],
[103.8867, 26.543],
[103.7109, 26.7627],
[103.7109, 26.9824],
[103.623, 27.0264],
[103.8867, 27.4219],
[104.1504, 27.2461]
]
]
}
},
{
"type": "Feature",
"id": "shan_dong",
"properties": {
"name": "山东",
"cp": [118.7402, 36.4307],
"childNum": 17
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[115.4883, 36.167],
[115.3125, 36.5186],
[115.752, 36.9141],
[116.0156, 37.3535],
[116.2793, 37.3535],
[116.2793, 37.5732],
[116.4551, 37.4854],
[116.8066, 37.8369],
[117.4219, 37.8369],
[117.9492, 38.3203],
[118.125, 38.1445],
[118.916, 38.1445],
[119.3555, 37.6611],
[119.0039, 37.5293],
[119.0039, 37.3535],
[119.3555, 37.1338],
[119.707, 37.1338],
[119.8828, 37.3975],
[120.498, 37.8369],
[120.5859, 38.1445],
[120.9375, 38.4521],
[121.0254, 37.8369],
[121.2012, 37.6611],
[121.9043, 37.4854],
[122.168, 37.6172],
[122.2559, 37.4854],
[122.6074, 37.4854],
[122.6953, 37.3535],
[122.6074, 36.9141],
[122.4316, 36.7822],
[121.8164, 36.8701],
[121.7285, 36.6943],
[121.1133, 36.6064],
[121.1133, 36.4307],
[121.377, 36.2549],
[120.7617, 36.167],
[120.9375, 35.8594],
[120.6738, 36.0352],
[119.707, 35.4639],
[119.9707, 34.9805],
[119.3555, 35.0244],
[119.2676, 35.1123],
[118.916, 35.0244],
[118.7402, 34.7168],
[118.4766, 34.6729],
[118.3887, 34.4092],
[118.2129, 34.4092],
[118.125, 34.6289],
[117.9492, 34.6729],
[117.5977, 34.4531],
[117.334, 34.585],
[117.2461, 34.4531],
[116.8066, 34.9365],
[116.4551, 34.8926],
[116.3672, 34.6289],
[116.1914, 34.585],
[115.5762, 34.585],
[115.4004, 34.8486],
[114.7852, 35.0684],
[115.0488, 35.376],
[115.2246, 35.4199],
[115.4883, 35.7275],
[116.1035, 36.0791],
[115.3125, 35.8154],
[115.4883, 36.167]
]
]
}
},
{
"type": "Feature",
"id": "jiang_xi",
"properties": { "name": "江西", "cp": [116.0156, 27.29], "childNum": 11 },
"geometry": {
"type": "Polygon",
"coordinates": [
[
[114.2578, 28.3447],
[114.082, 28.5645],
[114.1699, 28.8281],
[113.9063, 29.0479],
[114.2578, 29.3555],
[114.873, 29.3994],
[115.4883, 29.7949],
[115.9277, 29.707],
[116.1035, 29.8389],
[116.2793, 29.7949],
[116.7188, 30.0586],
[116.8945, 29.9268],
[116.7188, 29.751],
[116.7188, 29.6191],
[117.1582, 29.707],
[117.0703, 29.8389],
[117.1582, 29.9268],
[117.5098, 29.6191],
[118.0371, 29.5752],
[118.2129, 29.3994],
[118.0371, 29.1797],
[118.0371, 29.0479],
[118.3887, 28.7842],
[118.4766, 28.3447],
[118.4766, 28.3008],
[118.3008, 28.0811],
[117.7734, 27.8174],
[117.5098, 27.9932],
[116.9824, 27.6416],
[117.1582, 27.29],
[117.0703, 27.1143],
[116.543, 26.8066],
[116.6309, 26.4551],
[116.3672, 26.2354],
[116.4551, 26.1035],
[116.1914, 25.8838],
[116.0156, 25.2686],
[115.8398, 25.2246],
[115.9277, 24.917],
[115.752, 24.7852],
[115.8398, 24.5654],
[115.4004, 24.7852],
[114.4336, 24.5215],
[114.1699, 24.6973],
[114.4336, 24.9609],
[114.6973, 25.1367],
[114.7852, 25.2686],
[114.6094, 25.4004],
[113.9941, 25.2686],
[113.9063, 25.4443],
[113.9941, 26.0596],
[114.2578, 26.1475],
[113.9941, 26.1914],
[114.082, 26.5869],
[113.9063, 26.6309],
[113.9063, 26.9385],
[113.7305, 27.1143],
[113.8184, 27.29],
[113.6426, 27.3779],
[113.6426, 27.5977],
[113.7305, 27.9492],
[114.2578, 28.3447]
]
]
}
},
{
"type": "Feature",
"id": "he_nan",
"properties": {
"name": "河南",
"cp": [113.4668, 33.8818],
"childNum": 17
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[110.3906, 34.585],
[110.8301, 34.6289],
[111.1816, 34.8047],
[111.5332, 34.8486],
[111.7969, 35.0684],
[112.0605, 35.0684],
[112.0605, 35.2881],
[112.7637, 35.2002],
[113.1152, 35.332],
[113.6426, 35.6836],
[113.7305, 36.3428],
[114.873, 36.123],
[114.9609, 36.0791],
[115.1367, 36.2109],
[115.3125, 36.0791],
[115.4883, 36.167],
[115.3125, 35.8154],
[116.1035, 36.0791],
[115.4883, 35.7275],
[115.2246, 35.4199],
[115.0488, 35.376],
[114.7852, 35.0684],
[115.4004, 34.8486],
[115.5762, 34.585],
[116.1914, 34.585],
[116.1914, 34.4092],
[116.543, 34.2773],
[116.6309, 33.9258],
[116.1914, 33.7061],
[116.0156, 33.9697],
[115.6641, 34.0576],
[115.5762, 33.9258],
[115.5762, 33.6621],
[115.4004, 33.5303],
[115.3125, 33.1787],
[114.873, 33.1348],
[114.873, 33.0029],
[115.1367, 32.8711],
[115.2246, 32.6074],
[115.5762, 32.4316],
[115.8398, 32.5195],
[115.9277, 31.7725],
[115.4883, 31.6846],
[115.4004, 31.4209],
[115.2246, 31.4209],
[115.1367, 31.5967],
[114.7852, 31.4648],
[114.6094, 31.5527],
[114.5215, 31.7725],
[114.1699, 31.8604],
[113.9941, 31.7725],
[113.8184, 31.8604],
[113.7305, 32.4316],
[113.4668, 32.2998],
[113.2031, 32.4316],
[112.3242, 32.3438],
[111.5332, 32.6074],
[111.0059, 33.2666],
[111.0059, 33.5303],
[110.6543, 33.8379],
[110.6543, 34.1455],
[110.4785, 34.2334],
[110.3906, 34.585]
]
]
}
},
{
"type": "Feature",
"id": "liao_ning",
"properties": {
"name": "辽宁",
"cp": [122.3438, 41.0889],
"childNum": 14
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[119.2676, 41.3086],
[119.4434, 41.6162],
[119.2676, 41.7041],
[119.3555, 42.2754],
[119.5313, 42.3633],
[119.8828, 42.1875],
[120.1465, 41.7041],
[120.498, 42.0996],
[121.4648, 42.4951],
[121.7285, 42.4512],
[121.9922, 42.7148],
[122.3438, 42.6709],
[122.3438, 42.8467],
[122.7832, 42.7148],
[123.1348, 42.8027],
[123.3105, 42.9785],
[123.5742, 43.0225],
[123.6621, 43.374],
[123.8379, 43.4619],
[124.2773, 43.2422],
[124.4531, 42.8467],
[124.7168, 43.0664],
[124.8926, 43.0664],
[124.8926, 42.8027],
[125.332, 42.1436],
[125.4199, 42.0996],
[125.332, 41.9678],
[125.332, 41.6602],
[125.7715, 41.2207],
[125.5957, 40.9131],
[125.6836, 40.8691],
[124.541, 40.21],
[124.1016, 39.6826],
[123.3984, 39.6826],
[123.1348, 39.4189],
[123.1348, 39.0234],
[122.0801, 39.0234],
[121.5527, 38.7158],
[121.1133, 38.6719],
[120.9375, 38.9795],
[121.377, 39.1992],
[121.2012, 39.5508],
[122.0801, 40.3857],
[121.9922, 40.6934],
[121.7285, 40.8252],
[121.2012, 40.8252],
[120.5859, 40.21],
[119.8828, 39.9463],
[119.707, 40.1221],
[119.5313, 40.5615],
[119.2676, 40.5176],
[118.8281, 40.8252],
[119.2676, 41.3086]
]
]
}
},
{
"type": "Feature",
"id": "shan_xi_2",
"properties": {
"name": "山西",
"cp": [112.4121, 37.6611],
"childNum": 11
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[110.918, 38.7158],
[111.1816, 39.2432],
[111.0938, 39.375],
[111.3574, 39.4189],
[111.4453, 39.6387],
[111.9727, 39.5947],
[112.3242, 40.2539],
[112.7637, 40.166],
[113.2031, 40.3857],
[113.5547, 40.3418],
[113.8184, 40.5176],
[114.082, 40.5176],
[114.082, 40.7373],
[114.2578, 40.6055],
[114.3457, 40.3857],
[114.5215, 40.3418],
[113.9941, 39.9902],
[114.3457, 39.8584],
[114.5215, 39.5068],
[114.3457, 39.0674],
[113.9063, 39.0234],
[113.8184, 38.9355],
[113.8184, 38.8037],
[113.5547, 38.54],
[113.5547, 38.2764],
[113.8184, 38.1445],
[113.9941, 37.7051],
[114.1699, 37.6611],
[113.7305, 37.1338],
[113.7305, 36.8701],
[113.4668, 36.6504],
[113.7305, 36.3428],
[113.6426, 35.6836],
[113.1152, 35.332],
[112.7637, 35.2002],
[112.0605, 35.2881],
[112.0605, 35.0684],
[111.7969, 35.0684],
[111.5332, 34.8486],
[111.1816, 34.8047],
[110.8301, 34.6289],
[110.3906, 34.585],
[110.2148, 34.6729],
[110.2148, 34.8926],
[110.5664, 35.6396],
[110.4785, 36.123],
[110.3906, 37.002],
[110.8301, 37.6611],
[110.4785, 37.9688],
[110.4785, 38.1885],
[110.8301, 38.4961],
[110.918, 38.7158]
]
]
}
},
{
"type": "Feature",
"id": "an_hui",
"properties": {
"name": "安徽",
"cp": [117.2461, 32.0361],
"childNum": 17
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[116.6309, 33.9258],
[116.543, 34.2773],
[116.1914, 34.4092],
[116.1914, 34.585],
[116.3672, 34.6289],
[116.8945, 34.4092],
[117.1582, 34.0576],
[117.5977, 34.0137],
[117.7734, 33.7061],
[118.125, 33.75],
[117.9492, 33.2227],
[118.0371, 33.1348],
[118.2129, 33.2227],
[118.3008, 32.7832],
[118.7402, 32.7393],
[118.916, 32.959],
[119.1797, 32.8271],
[119.1797, 32.4756],
[118.5645, 32.5635],
[118.6523, 32.2119],
[118.4766, 32.168],
[118.3887, 31.9482],
[118.916, 31.5527],
[118.7402, 31.377],
[118.8281, 31.2451],
[119.3555, 31.2891],
[119.4434, 31.1572],
[119.6191, 31.1133],
[119.6191, 31.0693],
[119.4434, 30.6738],
[119.2676, 30.6299],
[119.3555, 30.4102],
[118.916, 30.3223],
[118.916, 29.9707],
[118.7402, 29.707],
[118.2129, 29.3994],
[118.0371, 29.5752],
[117.5098, 29.6191],
[117.1582, 29.9268],
[117.0703, 29.8389],
[117.1582, 29.707],
[116.7188, 29.6191],
[116.7188, 29.751],
[116.8945, 29.9268],
[116.7188, 30.0586],
[116.2793, 29.7949],
[116.1035, 29.8389],
[116.1035, 30.1904],
[115.752, 30.6738],
[116.0156, 31.0254],
[115.5762, 31.2012],
[115.4004, 31.4209],
[115.4883, 31.6846],
[115.9277, 31.7725],
[115.8398, 32.5195],
[115.5762, 32.4316],
[115.2246, 32.6074],
[115.1367, 32.8711],
[114.873, 33.0029],
[114.873, 33.1348],
[115.3125, 33.1787],
[115.4004, 33.5303],
[115.5762, 33.6621],
[115.5762, 33.9258],
[115.6641, 34.0576],
[116.0156, 33.9697],
[116.1914, 33.7061],
[116.6309, 33.9258]
]
]
}
},
{
"type": "Feature",
"id": "fu_jian",
"properties": {
"name": "福建",
"cp": [118.3008, 25.9277],
"childNum": 9
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[118.4766, 28.3008],
[118.8281, 28.2568],
[118.7402, 28.0371],
[118.916, 27.4658],
[119.2676, 27.4219],
[119.6191, 27.6855],
[119.7949, 27.29],
[120.2344, 27.4219],
[120.4102, 27.1582],
[120.7617, 27.0264],
[120.6738, 26.8945],
[120.2344, 26.8506],
[120.2344, 26.7188],
[120.4102, 26.6748],
[120.498, 26.3672],
[120.2344, 26.2793],
[120.4102, 26.1475],
[120.0586, 26.1914],
[119.9707, 25.9277],
[119.7949, 25.9277],
[119.9707, 25.4004],
[119.7949, 25.2686],
[119.5313, 25.1367],
[119.4434, 25.0049],
[119.2676, 25.0928],
[118.916, 24.8291],
[118.6523, 24.5215],
[118.4766, 24.5215],
[118.4766, 24.4336],
[118.2129, 24.3457],
[118.2129, 24.1699],
[117.8613, 23.9941],
[117.7734, 23.7744],
[117.5098, 23.5986],
[117.1582, 23.5547],
[116.9824, 23.9063],
[116.9824, 24.1699],
[116.7188, 24.6533],
[116.543, 24.6094],
[116.3672, 24.873],
[116.2793, 24.7852],
[115.9277, 24.917],
[115.8398, 25.2246],
[116.0156, 25.2686],
[116.1914, 25.8838],
[116.4551, 26.1035],
[116.3672, 26.2354],
[116.6309, 26.4551],
[116.543, 26.8066],
[117.0703, 27.1143],
[117.1582, 27.29],
[116.9824, 27.6416],
[117.5098, 27.9932],
[117.7734, 27.8174],
[118.3008, 28.0811],
[118.4766, 28.3008]
]
]
}
},
{
"type": "Feature",
"id": "zhe_jiang",
"properties": {
"name": "浙江",
"cp": [120.498, 29.0918],
"childNum": 11
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[118.2129, 29.3994],
[118.7402, 29.707],
[118.916, 29.9707],
[118.916, 30.3223],
[119.3555, 30.4102],
[119.2676, 30.6299],
[119.4434, 30.6738],
[119.6191, 31.0693],
[119.6191, 31.1133],
[119.9707, 31.1572],
[120.498, 30.8057],
[120.9375, 31.0254],
[121.2891, 30.6738],
[121.9922, 30.8057],
[122.6953, 30.8936],
[122.8711, 30.7178],
[122.959, 30.1465],
[122.6074, 30.1025],
[122.6074, 29.9268],
[122.168, 29.5313],
[122.3438, 28.8721],
[121.9922, 28.8721],
[121.9922, 28.4326],
[121.7285, 28.3447],
[121.7285, 28.2129],
[121.4648, 28.2129],
[121.5527, 28.0371],
[121.2891, 27.9492],
[121.1133, 27.4219],
[120.6738, 27.334],
[120.6738, 27.1582],
[120.9375, 27.0264],
[120.7617, 27.0264],
[120.4102, 27.1582],
[120.2344, 27.4219],
[119.7949, 27.29],
[119.6191, 27.6855],
[119.2676, 27.4219],
[118.916, 27.4658],
[118.7402, 28.0371],
[118.8281, 28.2568],
[118.4766, 28.3008],
[118.4766, 28.3447],
[118.3887, 28.7842],
[118.0371, 29.0479],
[118.0371, 29.1797],
[118.2129, 29.3994]
]
]
}
},
{
"type": "Feature",
"id": "jiang_su",
"properties": {
"name": "江苏",
"cp": [120.0586, 32.915],
"childNum": 13
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[116.3672, 34.6289],
[116.4551, 34.8926],
[116.8066, 34.9365],
[117.2461, 34.4531],
[117.334, 34.585],
[117.5977, 34.4531],
[117.9492, 34.6729],
[118.125, 34.6289],
[118.2129, 34.4092],
[118.3887, 34.4092],
[118.4766, 34.6729],
[118.7402, 34.7168],
[118.916, 35.0244],
[119.2676, 35.1123],
[119.3555, 35.0244],
[119.3555, 34.8486],
[119.707, 34.585],
[120.3223, 34.3652],
[120.9375, 33.0469],
[121.0254, 32.6514],
[121.377, 32.4756],
[121.4648, 32.168],
[121.9043, 31.9922],
[121.9922, 31.6846],
[121.9922, 31.5967],
[121.2012, 31.8604],
[121.1133, 31.7285],
[121.377, 31.5088],
[121.2012, 31.4648],
[120.9375, 31.0254],
[120.498, 30.8057],
[119.9707, 31.1572],
[119.6191, 31.1133],
[119.4434, 31.1572],
[119.3555, 31.2891],
[118.8281, 31.2451],
[118.7402, 31.377],
[118.916, 31.5527],
[118.3887, 31.9482],
[118.4766, 32.168],
[118.6523, 32.2119],
[118.5645, 32.5635],
[119.1797, 32.4756],
[119.1797, 32.8271],
[118.916, 32.959],
[118.7402, 32.7393],
[118.3008, 32.7832],
[118.2129, 33.2227],
[118.0371, 33.1348],
[117.9492, 33.2227],
[118.125, 33.75],
[117.7734, 33.7061],
[117.5977, 34.0137],
[117.1582, 34.0576],
[116.8945, 34.4092],
[116.3672, 34.6289]
]
]
}
},
{
"type": "Feature",
"id": "chong_qing",
"properties": {
"name": "重庆",
"cp": [107.7539, 30.1904],
"childNum": 40
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[108.5449, 31.6846],
[108.2813, 31.9043],
[108.3691, 32.168],
[108.5449, 32.2119],
[109.0723, 31.9482],
[109.248, 31.7285],
[109.5996, 31.7285],
[109.7754, 31.6846],
[109.6875, 31.5527],
[110.127, 31.377],
[110.2148, 31.1572],
[110.0391, 30.8057],
[109.8633, 30.8936],
[109.4238, 30.542],
[109.248, 30.6299],
[109.1602, 30.542],
[109.0723, 30.6299],
[108.8086, 30.498],
[108.6328, 30.5859],
[108.457, 30.4102],
[108.5449, 30.2344],
[108.457, 29.7949],
[108.6328, 29.8389],
[108.9844, 29.3115],
[109.0723, 29.3555],
[109.248, 29.1357],
[109.248, 28.4766],
[109.0723, 28.2129],
[108.7207, 28.2129],
[108.7207, 28.4766],
[108.5449, 28.3887],
[108.5449, 28.6523],
[108.3691, 28.6523],
[108.2813, 29.0918],
[107.8418, 29.0039],
[107.8418, 29.1357],
[107.5781, 29.2236],
[107.4023, 29.1797],
[107.4023, 28.8721],
[106.875, 28.7842],
[106.6992, 28.4766],
[106.6113, 28.5205],
[106.6113, 28.6523],
[106.5234, 28.7842],
[106.4355, 28.7842],
[106.5234, 28.5645],
[106.3477, 28.5205],
[106.2598, 28.8721],
[105.8203, 28.96],
[105.7324, 29.2676],
[105.4688, 29.3115],
[105.293, 29.5313],
[105.7324, 29.8828],
[105.5566, 30.1025],
[105.6445, 30.2783],
[105.8203, 30.4541],
[106.2598, 30.1904],
[106.6113, 30.3223],
[106.7871, 30.0146],
[107.0508, 30.0146],
[107.4902, 30.6299],
[107.4023, 30.7617],
[107.4902, 30.8496],
[107.9297, 30.8496],
[108.1934, 31.5088],
[108.5449, 31.6846]
]
]
}
},
{
"type": "Feature",
"id": "ning_xia",
"properties": {
"name": "宁夏",
"cp": [105.9961, 37.3096],
"childNum": 5
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[104.3262, 37.4414],
[105.8203, 37.793],
[105.9082, 38.7158],
[106.3477, 39.2871],
[106.7871, 39.375],
[106.9629, 38.9795],
[106.5234, 38.3203],
[106.7871, 38.1885],
[107.3145, 38.1006],
[107.666, 37.8809],
[107.3145, 37.6172],
[107.3145, 37.0898],
[106.6113, 37.0898],
[106.6113, 36.7822],
[106.4355, 36.5625],
[106.5234, 36.4746],
[106.5234, 36.2549],
[106.875, 36.123],
[106.9629, 35.8154],
[106.6992, 35.6836],
[106.4355, 35.6836],
[106.5234, 35.332],
[106.3477, 35.2441],
[106.2598, 35.4199],
[106.084, 35.376],
[105.9961, 35.4199],
[106.084, 35.4639],
[105.9961, 35.4639],
[105.8203, 35.5518],
[105.7324, 35.7275],
[105.3809, 35.7715],
[105.293, 35.9912],
[105.4688, 36.123],
[105.2051, 36.6943],
[105.293, 36.8262],
[104.8535, 37.2217],
[104.5898, 37.2217],
[104.5898, 37.4414],
[104.3262, 37.4414]
]
]
}
},
{
"type": "Feature",
"id": "hai_nan",
"properties": {
"name": "海南",
"cp": [109.9512, 19.2041],
"childNum": 18
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[108.6328, 19.3799],
[109.0723, 19.6436],
[109.248, 19.9512],
[109.5996, 20.0391],
[110.0391, 20.127],
[110.3906, 20.127],
[110.5664, 20.2588],
[110.6543, 20.2588],
[111.0938, 19.9512],
[111.2695, 19.9951],
[110.6543, 19.1602],
[110.5664, 18.6768],
[110.2148, 18.5889],
[110.0391, 18.3691],
[109.8633, 18.3691],
[109.6875, 18.1055],
[108.9844, 18.2813],
[108.6328, 18.457],
[108.6328, 19.3799]
]
]
}
},
{
"type": "Feature",
"id": "tai_wan",
"properties": {
"name": "台湾",
"cp": [121.0254, 23.5986],
"childNum": 1
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[121.9043, 25.0488],
[121.9922, 25.0049],
[121.8164, 24.7412],
[121.9043, 24.5654],
[121.6406, 24.0381],
[121.377, 23.1152],
[121.0254, 22.6758],
[120.8496, 22.0605],
[120.7617, 21.9287],
[120.6738, 22.3242],
[120.2344, 22.5879],
[120.0586, 23.0713],
[120.1465, 23.6865],
[121.0254, 25.0488],
[121.5527, 25.3125],
[121.9043, 25.0488]
]
]
}
},
{
"type": "Feature",
"id": "bei_jing",
"properties": {
"name": "北京",
"cp": [116.4551, 40.2539],
"childNum": 19
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[117.4219, 40.21],
[117.334, 40.1221],
[117.2461, 40.0781],
[116.8066, 39.9902],
[116.8945, 39.8145],
[116.8945, 39.6826],
[116.8066, 39.5947],
[116.543, 39.5947],
[116.3672, 39.4629],
[116.1914, 39.5947],
[115.752, 39.5068],
[115.4883, 39.6387],
[115.4004, 39.9463],
[115.9277, 40.2539],
[115.752, 40.5615],
[116.1035, 40.6055],
[116.1914, 40.7813],
[116.4551, 40.7813],
[116.3672, 40.9131],
[116.6309, 41.0449],
[116.9824, 40.6934],
[117.4219, 40.6494],
[117.2461, 40.5176],
[117.4219, 40.21]
]
]
}
},
{
"type": "Feature",
"id": "tian_jin",
"properties": {
"name": "天津",
"cp": [117.4219, 39.4189],
"childNum": 18
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[116.8066, 39.5947],
[116.8945, 39.6826],
[117.1582, 39.6387],
[117.1582, 39.8145],
[117.2461, 40.0781],
[117.334, 40.1221],
[117.4219, 40.21],
[117.6855, 40.0781],
[117.6855, 39.9902],
[117.5098, 39.9902],
[117.5098, 39.7705],
[117.6855, 39.5947],
[117.9492, 39.5947],
[117.8613, 39.4189],
[118.0371, 39.2432],
[118.0371, 39.1992],
[117.8613, 39.1113],
[117.5977, 38.6279],
[117.2461, 38.54],
[116.7188, 38.8037],
[116.7188, 38.9355],
[116.8945, 39.1113],
[116.8066, 39.5947]
]
]
}
},
{
"type": "Feature",
"id": "shang_hai",
"properties": {
"name": "上海",
"cp": [121.4648, 31.2891],
"childNum": 19
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[120.9375, 31.0254],
[121.2012, 31.4648],
[121.377, 31.5088],
[121.1133, 31.7285],
[121.2012, 31.8604],
[121.9922, 31.5967],
[121.9043, 31.1572],
[121.9922, 30.8057],
[121.2891, 30.6738],
[120.9375, 31.0254]
]
]
}
},
{
"type": "Feature",
"id": "xiang_gang",
"properties": {
"name": "香港",
"cp": [114.2578, 22.3242],
"childNum": 1
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[114.6094, 22.4121],
[114.5215, 22.1484],
[114.3457, 22.1484],
[113.9063, 22.1484],
[113.8184, 22.1924],
[113.9063, 22.4121],
[114.1699, 22.5439],
[114.3457, 22.5439],
[114.4336, 22.5439],
[114.4336, 22.4121],
[114.6094, 22.4121]
]
]
}
},
{
"type": "Feature",
"id": "ao_men",
"properties": {
"name": "澳门",
"cp": [113.5547, 22.1484],
"childNum": 1
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[113.5986, 22.1649],
[113.6096, 22.1265],
[113.5547, 22.11],
[113.5437, 22.2034],
[113.5767, 22.2034],
[113.5986, 22.1649]
]
]
}
}
]
}
{
"type": "FeatureCollection",
"features": [{
"id": "100000",
"type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [["@@š¦ŜiÀºƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅ó­@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ AɞÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĒĞȠzÐŘΰH¨ȔBĠ "], ["@@ƛĴÕƊÉɼģºðʀI̠ÔĚäœθؾNJŨxĚĮǂƺòƌ‚ĪŐĮXŦţƸZûЋƕƑ’ʳÛDžƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"], ["@@Óɖ± dƊ½ǒÂň×äı–§ĤƩ™¶hlçxĬŸĄŞkâ’ÌwøàIJaĞ‚fƠ¥Ž„Ŕdž˜®UɎÖ¢aƆúŪtŠųƠjd•ƺŠƺÅìnŽŢ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼìĴPðŀbþ¹ļD¢¹œ\\ĜÑ̔ùўÊ‰ȮŒǪűŽÀêZǚŐ¤qȂ\\`ºłĤ\\ºs|zºÿŐãѦvĪĺĺ†ĈłÈ͚FÞºĠUƢ¾ªì°`öøu®Ì¼ãÐUÞ˶¬æɒlʐߨvWʚ”ÖÕÁÜÅŵ­_«”E”ÍɪëÏ÷ÅyXo͂ĝĂÛÎf`Þ…¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘETėº¯ɀáMĺŝOéȇ¿ÖğǤǷŔ²å]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±‚řü›]µȺrĦáŖuҞª«IJ‡πdƺÏɌ]͚œĐ™ǂZɔ¹ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥Ǖǚk˦ӷxūД̵nơԆ|DŽŽࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãɜRצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´ԜÃƲÀɠmǐnȺĸƠ´ǠNˠŜ‚¶ƌĆĘźʆȬμƒĞGȖƴƀj`ĢçĶȅŚē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDƞŧǘÛۨĝȘIJžªǬ”¾äʀƪ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊ˰ȎŜHĦðDĝŒ|ø˂˜ƮÐ¬ҌqjĔ²Äw°dždĞéĸdîàŎjɒĚŌ‡ŜWÈ|Ŗ‡¶îÎFC•ĊZĀēƄNĤ¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Šų¬K°ȧǵÂcḷ̌ĚǣȄɧ\\ĵœŇ‹ȣFέ̿ʏƶɷØ̫»ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔDzlжøZh¤Ɛ E ĈDJ˜ì¸̚¸ƎGú´Pž¬WÄì–HsIJ¾wLVnƽCw`h`¥V”„¦U¤¸}€¾Ô[~âxh¢ªHÆÂr–iĐɘǜhÀoRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚ÈÄ[|òDȎŸÖdH„Ʈ–Àì~Ǝ†â•¦^¢ķ¶e”ÐÚEꖄɡČÅyġLû™ŇV®ŠÄ‰Ðź~ϰƂŤǒȦÒŬÂezÂvǴZ„{ĘFǜĴAΜĐȄEÔ¤ØQĄ–Ą»ΈZǺ¨ìSŊÄƸwŠn¼–c]—ܬì¯DŽ]ȘŏńzƺŷɄeeOĨS’Œfm Ɋ’̎ēz©þ†ÐÙÊmgŸÇsJ¥ƔˆŊśÎÔsÁtÃßGo—À­ xňË_½ä@êíuáĠ[ġ¥g“ɊדûÏWXáǠDZÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Dz¡SíċġHµ ¡EŃļƒrĉŘóƢFƺ«øxÊk†”ƈdƬÌr|©ÛńRŀƒøďŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^gēĊĕƯǏx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ɏ‘~”ȰCĐ´Ƕ£’fNÎèâ_ÐŮeʆNJǘuȔ\\¤ÒĨA¢Ê͠æÔ ŬGƠ”ƦYê‹ŊàƆXvkmŸͥœ@čŅĻA“¶çÎqC½Ĉ»NŸăëK™ďÍQ“Ʌ›řęgßÔÇOÝáWáħ£˯ā¡ÑķĎÛ寰WKɱ_d_}}vyŸõu¬ïÏҽ@gÏ¿rýб…Cd‰µ—°MFYxw¿CG£ǧ«»ó¡Ɵš¿BÇƻğëšܭNJĭôµ}‰čÓpg±˜ƒǫŋRwŕnéÑƕfSŸŋ‹®ÍšD Ûǖ֍Ÿ]gr¡µŷzįm³~S«“„›þeo³l™•{iē¥yZ÷īŖõġMRÇģZ“mÃ|¡™ģTɟij“Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜTNJŋB…h–¬ƩDoˆ±enq©G`™wGçǑ‚“K‰‹F‚“›uNĝw‡őXtW·Ýďæßa}xV•—XR‰ãQ`­©GŒM»­”ďϝd‡©ÑW_ÏǷr¡…é\\ƒɹ~ɍuØ©Bš¤ÝĤ½¢Å_Á¿•LŅñuT\\rÅIs®y}’ywdS™DZtCmûvašʋJr€Ư‚⦳P‡rbbÍzš€wBG’ĭ€T†Ák‘»ƒlY­ċ²z“Ç£—^§»d¯íŻŽ£ćGŵDžƍÓ]í“M^o•£Ã]ªUóo½~ŕ‘|ŋݘ¥ċh“¹·CÉ­Dřlg‡ȵë[‘’}ģS}xƃği©ĝ‡ɝǡF꼵áƣ©‚Hžĕoƫ€Ňqƒr³Ãg[„šÃS–ő_†±ÅFC¥Pq{‚ñg—¿įX…•ƝıĉNj•ûěʼn³F‘¦oĵ—hŸÕP{¯~TÍl¸ÓßYÏàs{ÃVU™™eĎwk±ʼnVÓ½ŽJūĉ»Jm°fϑdF~ˆ€ĀeĖ€O˜² Ĉ‰żĀiÂd^~ăÔHˆ¦\\§|ĄVez¤NP ǹӗR™ÆƇP[¦´Âghwm}ÐШźhI|žVVŽ—Ž|p[¦À¶èNä¶ÒCÀ¢^h—PfvƾĪ×òúNZÞÒKxpw|ÊEZŽI¨®œİFÜçmĩ‚WĪñt‘ÞʼnËÝ^³uL‚±|Əlĉ¥čn§ßÅc‘˜B× CNƒǟ‹_ñŧı¯Y]ăٟ™Ľѷť‹³ÃAR‹‡ZRlʑýSëÍDěïÿȧ¢ÙġƒěŗŷęŸUªhJˆƁ™ƅn³gF‹³HàŋÅÃƉÀKšť`ċŮÁõYėé÷`ٚ_Ïǵ—R§òoEÅąLœŐœƜVµąłíļĐ·ũ̈«ªdÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿäćú y±¨Mf~C¿`€à_ŒÿƌfQnð³ƬˆŲŎ¥ĠʦĘĒØ‰¼Â†±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«Múīô‰Ö°ʊkŲÆM|²@¤u•ƒ¤Û´Œä«̰\\„}ēƒ‹ÅM•¼Ã­]NągoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøC̍ƃhÛ­–Ň\\bÅxì²ƝýN‰īCȽĿǃšŖÕy\\‡¹kx‡Ã£Č×G¿Ï¤ÁçFQ¡„KtŵΥëÚź—Љ«ėn½ĉŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕñžx———Z¯u™Œ…Ï•˜ï{éƵP—™_K«™pÍÁwƏčaE›U”£uݘāɌŁFŴu»¹İ×ȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±hǥ®jű¢KOķÅ}`åÂK­_Юƫ²ʯÊ^H{ǸÃĆēĤȍzȥݵċF͓ŸI©Õ͈ǫȌȥ¦ŋEӏ“†ıŪěřÀåżȟLƏ—ŽąđGǛģLjƧĎOłčȶʋÀBŖÕªˆŠÁŐTőŕåqûõi¨hÜ·ƒñt»¹ýv_[«²Kƒ{L¯‰SªƒGѵ¸•gÑpY´«•ęœƘʑcoċ\\œ­gěŧ«Āý¶ŧ·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZ~﵉fzʼnfåÂȝǷÕĕÊĉ{ğč±uƁí]Í»ęX\\­•Ip™¡éĥZE‹ãoP…þy—¸k³—†¡ƽŸ¿å³BRضˆœWlâþäą`“]aģc— ĹGµ¶H™åՌ‰¾xĨ‡ôȉðX«½đCIŇOK³Á‰Äţ¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNrį~IМ‘êĘÎG§Ė¥Ý™F{ WK}ùaH‘āÖ{OoužHEÅǍqĬuë±KEò£‰UplÀ÷tMāe£bYÂý¡a±Öcp©®^ö±q…ÇGjųªKy¬ŏ–®¤ÉEŸ–ĀåA¬ˆV{Xģ‰Đƒpě…¼³Ăp·¤ƒīyÚ¡ŅLĻŗž§qlŸÀh¬µ»åÇGnùčÙmÆß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěYÓ±]ÓđīkWó«íěCŸŇͱ™‘čvĭõĉ‚ę÷N¹³ĉoTĵËçŁYلǝŕ¹tȏģ·Ĕĭ|đėÊK™½R‘ē ó]™ĀęAx–ŸNk©|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™áÎÁąÏŸHcòßÎſ¿Çdğ·ùT×Çūʄ¡XgWÀLJƟψOj YÇ÷Sğ³kzőȝğ§õ¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰Ƈ׫BhlmtÃPµy‹ÓɉUīí}†€GBȅ‰ŹãĻFŷŽǩoo¿ē‹±ß}ŽwƋtƺ—CőØEîǻīƓʑã͘ƍ“DĈ±ÌŒÜӔĨ£LóɢVȞĆĖMĸĤfˆÜǗjđĆ»ýͥãğ¶ĞØO¤Ǜn³Žő}‹¦…·z€YŠwa™–šőűMę§ZĨ훘Û]é’ÛUćİȹ¯…dƒy¹TcÂĕ½A´µê÷wĻþÙ`K€¦˜…¢ÍeœĥR¡ˆã…‚Ĉu¼dl‰t‚†U¶¶ď\\zœ}ưŬ–{ÚfKš¶Ð_„ÂÒ¿C©Ö•TmuŸ¼ãl‰›ŇÕVåĤĵfÝYYįk‘ÒīØſNQĠ³r³øÓrŸÖͳgÍſGįÅ_—±he¡ÅM²Ɠ綾ßīZgmk„ǭƁć¦UĔťƒ×ëǟ…e˭ʔħǛāĘPªij¶‘Ņăw§n‰ď£S»şŒÍļɉŀ‰}ÛÞ»å£_ˆŸıęÏZ—÷`…[„ùx½}ÑRH‘YėĺďsÍn‘™é½Ya¤Ïm¬ĝg•ĂsA•ØÅwď‚õ¤q}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónȯ×âpÒŌ“Ø Tˆêa²ËX€€c̋lLìģËŁkŻƑŷÉăP¹æƧÝ¡¦}•veèÆ´UvÅ~§‡½˜“Ġ²Ŵwæč\\Dƒ}O÷š£[ŽăŒá[™‚į‰ŷvŸœRsdĒƄwžŎĒo~t¾ÍŶÒtD¦Ú„iôö‰€z«Ųƭ¸Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†AĦw\\ưĆ ¦g–ʉË£¢ι‰ǫßK‘ÙIįóVesb‘aĕ ǠƺpªqŒ‚ďŒE˜®tŸôřk˜ȌwêżĔÂe‚nËÂQƞ´’¼ŲƝÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“¬oêDŽŲÚr^¯°’^º{ªBHŒ²Ö¤ɦ§Țv€qĸ„ ­viļ€ndĜ­ĆfŒ“xÝgyށqóžSᝑ³X_ĞçêtrmÚ§z„¦c¦¥jnŞi˜¯´ÓH@ÂċĂჷÌ_þ·–¹_wzË£Z­¹|ŕWM‰“|O¥ÃWTÕ­ùÔQ†¥‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnkòəėªƒ²œm˽ŏġǝʅįĭạ̃ūȹ]ΓͧŹəăЕ·ƭˆęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖƝ^ęuůÞiĊÄÀ\\Æs¦ÓRäšřÌkÄŷ¶½÷ùCMÝۛĥ°G¬ĩ`£Øą‚ğ¯ß”§aëbéüÑOčœk£ÍI ïCċÀÕÕĻSŧʼnïŽŗãWÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔŠƦ›Ú@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxĉWù׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRÑÈěVVе‚õ‡«Œ¯ůĉ¥áºaeõ|uĐh`Ü³ç@šƋĿa©|z²Ý¼ŸĴ貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaňæêSĈ½Ž½KÙóĿeƃÆBŽ·¬ƃV×ĴƳ˜lŒµ`bԑ¨ˆÐÓ@s¬ƿ‚ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSÄį¤Ç[ǾµMW¢ĭiÕØ¿@ŠÂ…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨^“ƒ±ze…ė·¥Ó@~¯‹éīB™Š\\”āƚǗÀƷŘóQīÈáP•œǥ@ŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­Z±đ[‰Âÿiñ¬‰Òj°ŁŤ_uµ^‘°ŒìÇÊĶĒ¡Æ‡MğźİĨƥôRŽāð©[wâ䥩Ô\\°ÝĄ̄Ƣ’ăk™néǀůŠ˜ĆK„ĒĬœ¶è‰âz¨u¦¥L~ƄýÎIƖߔµĔƱĐċņbÎՂĄæ_ƞZRÖíŽJ²öLĸҜcºƖÎ\\ñºÛqY–Ѩ`x¥’ù^•}ƒÌđYªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´Aňńňĕuĩt[{ù°ŁÏ•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGǣ@Dü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKÕK‡ÄNô‡ŠfœƫVó¼dz—H‘‹QµâFšù­Âœ³¦{Y‹Â¢ĚÜO „€{Ö¦ÞͨJÜÄƨ€lŽU˧ªÍE˨¡ĐĬĬùÎRƠŸHÕŔ_ƪàÒKäȇĬə²ȕnáûl—÷eǛò•Ğ\\ªÑò˜Üìc\\üqˆÕ[ēdžċªbØ­Œø|€¶ȴZdÆÂšońéŒGšŠǚnìÈƲ‚ہȖưòTxÊǪMīИÖŲÃɎO̚ǰއRěò—¿ġ~åŊœú‰¬ô¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ŀ¤ĄYÒ©ÊfºmԈȈ¡DŽ~¤„s²‚”ʘچžȂVƼîèW²æIJXŔþɔÖĚêϜêĮŢɨJ€˜¯ÎrDDšĤ€`€Q¾§~wâJÂ˜ñÈOú¤p¨ŪŊMǎÀW|ų ¿¾ɄĦƖAiƒ÷fØĶK¢ȝ˔"]],
"encodeOffsets": [[[112750, 20508]], [[123335, 22980]], [[82455, 44869]]]
},
"properties": {
"cp": [116.3683244, 39.915085],
"name": "中华人民共和国",
"childNum": 3
}
}],
"UTF8Encoding": true
}
\ No newline at end of file
/*
* @Description:
* @Date: 2021-06-10 13:51:26
*/
import { dealString, dealFormatter, getInterval } from '../common';
// const getInfo = Vue => {
// const { isMobile, isPrint, axisData } = Vue;
// return {
// isMobile: isMobile && !isPrint,
// isPrint,
// fontSize: isMobile && !isPrint ? 10 : 14,
// lineWidth: isMobile && !isPrint ? 2 : axisData.length > 30 ? 3 : 5,
// symbolSize: isMobile && !isPrint ? 7 : axisData.length > 30 ? 7 : 10
// };
// };
const grid = {
containLabel: true,
left: 0,
right: 10,
top: 10,
bottom: 0
};
export const createLine = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = []
) => {
const isSingle = chartData.length == 1;
const _axisData = dealString(axisData);
return {
animation: false,
grid: grid,
xAxis: {
interval: getInterval(axisData),
type: 'category',
data: _axisData,
axisLabel: {
color: '#A8B0BF',
fontSize: 12,
formatter: function(params) {
return dealFormatter(_axisData, params);
}
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisTick: { show: false }
},
yAxis: {
splitNumber: 3,
axisLabel: {
formatter: '{value}' + (yAxisUnit || ''),
color: '#A8B0BF',
fontSize: 12
},
splitLine: {
lineStyle: {
color: '#F4F4F4'
}
}
},
series: chartData.map((item, index) => {
return {
type: 'line',
data: item,
barWidth: '28px',
symbolSize: 7,
lineStyle: {
color: isSingle
? colors.length == 1
? colors[0]
: '#D8E5F2'
: colors[index],
width: 3
// shadowColor: hexColorToRgba(colors[index], 0.6),
// shadowBlur: isSingle ? 0 : 10
},
itemStyle: {
color: function(params) {
return isSingle
? colors[params.dataIndex % colors.length]
: colors[index];
}
},
label: {
show: true,
position: 'top',
color: isSingle ? '#2A3558' : colors[index],
fontSize: 12
},
emphasis: {
lineStyle: {
color: isSingle
? colors.length == 1
? colors[0]
: '#D8E5F2'
: colors[index],
width: 3
}
}
};
})
};
};
export const createLineSmooth = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = []
) => {
const isSingle = chartData.length == 1;
const _axisData = dealString(axisData);
return {
animation: false,
grid: grid,
xAxis: {
interval: getInterval(_axisData),
type: 'category',
data: _axisData,
axisLabel: {
color: '#A8B0BF',
fontSize: 12,
formatter: function(params) {
return dealFormatter(_axisData, params);
}
},
axisLine: {
lineStyle: {
color: '#F4F4F4'
}
},
axisTick: { show: false }
},
yAxis: {
splitNumber: 3,
axisLabel: {
formatter: '{value}' + (yAxisUnit || ''),
color: '#A8B0BF',
fontSize: 12
},
splitLine: {
lineStyle: {
color: '#F4F4F4'
}
}
},
series: chartData.map((item, index) => {
return {
type: 'line',
data: item,
smooth: true,
symbolSize: 7,
lineStyle: {
color: isSingle
? colors.length == 1
? colors[0]
: '#D8E5F2'
: colors[index],
width: 3
// shadowColor: hexColorToRgba(colors[index], 0.6),
// shadowBlur: isSingle ? 0 : 10
},
itemStyle: {
color: function(params) {
return isSingle
? colors[params.dataIndex % colors.length]
: colors[index];
}
},
label: {
show: true,
position: 'top',
color: isSingle ? '#2A3558' : colors[index],
fontSize: 12
},
emphasis: {
lineStyle: {
color: isSingle
? colors.length == 1
? colors[0]
: '#D8E5F2'
: colors[index],
width: 3
}
}
};
})
};
};
/*
* @Description:
* @Date: 2021-06-20 01:16:17
*/
export const createMap = () => {
return {
visualMap: {
borderColor: '#fff',
min: 0,
max: 1000,
left: 26,
bottom: 40,
pieces: [
{
gt: 100,
label: '100以上',
color: '#6C71FF'
},
{
gte: 50,
lte: 100,
label: '51-100',
color: '#34CE9C'
},
{
gte: 11,
lt: 50,
label: '11-50',
color: '#3985FF'
},
{
gt: 0,
lt: 10,
label: '0-10',
color: '#00BAFF'
}
]
},
series: [
{
type: 'map',
mapType: 'china',
map: 'china',
label: {
show: true,
color: '#323235',
fontSize: 12
},
silent: true,
itemStyle: {
areaColor: 'rgba(0,0,0,0)',
borderColor: '#4C6286',
borderWidth: 1
},
top: 36,
left: 0,
data: [
{
name: '北京',
value: 54
},
{
name: '天津',
value: 13
},
{
name: '上海',
value: 40
},
{
name: '重庆',
value: 75
},
{
name: '河北',
value: 13
},
{
name: '河南',
value: 83
},
{
name: '云南',
value: 11
},
{
name: '辽宁',
value: 19
},
{
name: '黑龙江',
value: 15
},
{
name: '湖南',
value: 69
},
{
name: '安徽',
value: 60
},
{
name: '山东',
value: 39
},
{
name: '新疆',
value: 4
},
{
name: '江苏',
value: 31
},
{
name: '浙江',
value: 104
},
{
name: '江西',
value: 36
},
{
name: '湖北',
value: 1052
},
{
name: '广西',
value: 33
},
{
name: '甘肃',
value: 7
}
]
}
]
};
};
/*
* @Description:
* @Date: 2021-06-10 13:51:26
*/
const getInfo = Vue => {
const { isMobile, isPrint } = Vue;
return {
isMobile: isMobile && !isPrint,
isPrint,
fontSize: isMobile && !isPrint ? 10 : 12,
formatter: isMobile && !isPrint ? '{b}\n{d}%' : '{b}\n数量{c},占比{d}%'
};
};
export const createRing = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = [],
legend = []
) => {
const { fontSize, formatter, isMobile, isPrint } = getInfo(Vue);
const isSingle = chartData.length == 1;
return {
animation: false,
grid: {
containLabel: true,
left: 20,
right: 0,
bottom: '5%'
},
title: isMobile
? {
borderColor: '#fff',
text: 10000 + '人',
textStyle: {
color: '#2A3558',
fontSize: isPrint ? 45 : 15
},
subtext: '答题人数',
subtextStyle: {
color: '#6F7A91',
fontSize: isPrint ? 30 : 10
},
itemGap: isPrint ? 12 : 4,
left: 'center',
top: isPrint ? '45%' : '42%'
}
: {
borderColor: '#fff'
},
series: chartData.map((item, index) => {
const maxWidth = 80;
const getRadius = index => {
if (isSingle) {
return isMobile ? ['35%', '55%'] : ['70%', '55%'];
}
const width = 15;
const gap = width * 1.5;
return [
`${maxWidth - gap * index}%`,
`${maxWidth - gap * index - width}%`
];
};
const _item = item.map((cItem, cIndex) => {
return {
name: isSingle
? `${axisData[cIndex]}`
: `${axisData[cIndex]}-${legend[index]}`,
value: cItem
};
});
return {
type: 'pie',
z: index,
zlevel: index,
center: ['50%', '50%'],
radius: getRadius(index),
clockwise: true,
avoidLabelOverlap: true,
hoverOffset: 15,
itemStyle: {
color: function(params) {
return colors[params.dataIndex % colors.length];
}
},
label: {
show: true,
position: 'outside',
fontSize: fontSize,
color: '#2A3558',
formatter: formatter
},
labelLine: {
length: isSingle ? (isMobile ? 10 : 40) : maxWidth + 30 * index,
length2: isSingle ? (isMobile ? 10 : 40) : 50 + 10 * index,
lineStyle: {
color: '#6E6E6E',
width: 1
}
},
data: _item
};
})
};
};
export const createPie = (
Vue,
chartData,
axisData,
yAxisUnit,
colors = [],
legend = []
) => {
const { fontSize, formatter, isMobile } = getInfo(Vue);
const isSingle = chartData.length == 1;
return {
animation: false,
grid: {
containLabel: true,
left: 20,
right: 0,
bottom: '5%'
},
series: [
{
type: 'pie',
center: ['50%', '50%'],
radius: isMobile ? '60%' : '70%',
hoverOffset: 15,
itemStyle: {
color: function(params) {
return colors[params.dataIndex % colors.length];
}
},
label: {
show: true,
position: 'outside',
fontSize: fontSize,
color: '#2A3558',
formatter: formatter
},
labelLine: {
length: isMobile ? 10 : 30,
length2: isMobile ? 10 : 30,
lineStyle: {
color: '#6E6E6E',
width: 1
}
},
data: chartData.reduce((pre, cur, index) => {
const _item = cur.map((cItem, cIndex) => {
return {
name: isSingle
? `${axisData[cIndex]}`
: `${axisData[cIndex]}-${legend[index]}`,
value: cItem
};
});
pre.push(..._item);
return pre;
}, [])
}
]
};
};
/*
* @Description:
* @Date: 2021-06-10 13:56:53
*/
import {
createBar,
createBarTransverse,
createBarMultiple,
createBarMultipleTransverse
} from './bar/createBar';
import { createLine, createLineSmooth } from './line/createLine';
import { createPie, createRing } from './pie/createPie';
import { createMap } from './map/createMap';
export default {
// 柱状
1: {
name: 'bar',
cnName: '柱状图',
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhuzhuang2.svg',
sort: 2,
create: createBar
},
// 柱状-横向
2: {
name: 'bar-transverse',
cnName: '柱状图',
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhuzhuang3.svg',
sort: 3,
create: createBarTransverse
},
// 柱状-多重
3: {
name: 'bar-multiple',
cnName: '柱状图',
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhuzhuang1.svg',
sort: 1,
create: createBarMultiple
},
// 柱状-多重-横向
4: {
name: 'bar-multiple-transverse',
cnName: '柱状图',
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhuzhuang4.svg',
sort: 4,
create: createBarMultipleTransverse
},
// 折线
5: {
name: 'line',
cnName: '折线图',
sort: 1,
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhexian2.svg',
create: createLineSmooth
},
// 折线-光滑
6: {
name: 'line-smooth',
cnName: '折线图',
sort: 2,
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhexian1.svg',
create: createLine
},
// 折线-光滑
// 7: {
// name: 'line-smooth',
// cnName: '折线图',
// sort: 3,
// icon: require('http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhexian1.svg')
// },
// // 折线-光滑-多重
// 8: {
// name: 'line-smooth-multiple',
// cnName: '折线图',
// sort: 4,
// icon: require('http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/zhexian2.svg')
// },
// 圆环
9: {
name: 'ring',
cnName: '饼图',
sort: 1,
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/bingtu2.svg',
create: createRing
},
// 饼图
10: {
name: 'circle',
cnName: '饼图',
sort: 2,
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/bingtu1.svg',
create: createPie
},
// 表格
11: {
name: 'table',
cnName: '表格',
sort: 1,
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/biaoge.svg'
},
// 男女ICON
12: {
name: 'icon',
cnName: '初始化',
sort: 1,
icon: 'http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/boyicon.svg?v=1'
},
// 地图
13: {
name: 'map',
cnName: '地图',
sort: 1,
icon: '',
create: createMap
}
};
<!--
* @Description:
* @Date: 2021-06-19 17:10:30
-->
<template>
<div class="bi-blank" :style="customStle"></div>
</template>
<script>
import mixin from '../mixin/index';
export default {
name: 'bi-blank',
mixins: [mixin],
props: {
height: {
type: [String, Number],
default: 0
},
usePrint: Boolean
},
computed: {
customStle() {
if (this.isPrint && !this.usePrint) {
return { height: '0px' };
}
if (this.isMobile) {
return { height: `${this.height / 2}px` };
}
return { height: `${this.height}px` };
}
}
};
</script>
<!--
* @Description:
* @Date: 2021-06-15 19:55:05
-->
<!--
* @Description:
* @Date: 2020-07-16 18:27:04
-->
<template>
<div class="ebox" :id="uuid"></div>
</template>
<script>
// import { v4 } from 'uuid';
/**
* echart 配置
*/
import { use, init, registerMap } from 'echarts/core';
import { SVGRenderer } from 'echarts/renderers';
import { PieChart, BarChart, LineChart, MapChart } from 'echarts/charts';
import china from '../chart-type/json/china.json';
// import chinaMapOutline from '../chart-type/json/chinaMapOutline.json';
import {
TitleComponent,
TooltipComponent,
LegendComponent,
GridComponent,
DatasetComponent,
PolarComponent,
VisualMapComponent
} from 'echarts/components';
use([
SVGRenderer,
BarChart,
PieChart,
LineChart,
MapChart,
TitleComponent,
TooltipComponent,
LegendComponent,
GridComponent,
DatasetComponent,
PolarComponent,
VisualMapComponent
]);
export default {
props: {
option: {
type: Object,
default: () => ({})
},
type: [Number, String],
autoresize: Boolean
},
data() {
return {
uuid: `${parseInt(Math.random())}-${new Date().getTime()}`,
myChart: null,
height: 0
};
},
watch: {
option: {
deep: true,
immediate: true,
handler(v) {
if (v) {
this.$nextTick(() => {
this.init();
});
}
}
}
},
methods: {
init() {
if (!this.myChart) {
if (this.type === 13) {
console.log(china);
registerMap('china', china);
// registerMap('chinaMapOutline', chinaMapOutline);
}
this.myChart = init(document.getElementById(this.uuid));
}
this.myChart.setOption(this.option);
}
},
mounted() {},
created() {}
};
</script>
<style scoped lang="scss">
.ebox {
display: flex;
max-width: '920px';
max-height: '450px';
width: '100%';
& + .ebox {
margin-top: 80px;
}
}
</style>
<!--
* @Description: file content
* @Author: jml
* @Date: 2021-03-24 10:22:27
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-20 00:46:51
-->
<template>
<div style="position:relative;" class="bi-chart-block">
<slot></slot>
<slot name="top"></slot>
<BiChartTitle
v-if="title.show"
v-bind="{
...title,
colors: chart.colors,
chartType: chart.type,
disableTypes: chart.disableTypes
}"
@change-colors="changeChartColors"
@change-chartkey="changeChartType"
@change-delete="deleteChart"
:showGuide="showGuide"
></BiChartTitle>
<BiChartChoiceMinxinToggleAxis
v-if="(chart.axis || []).every(item => item.names.length > 0)"
:axis="chart.axis"
@toggle-axis="toggleAxis"
></BiChartChoiceMinxinToggleAxis>
<template v-if="chart.show">
<BiTable
v-if="chart.type == 11"
v-bind="{
...chart,
title: title.name
}"
></BiTable>
<BiSexIcon v-else-if="chart.type == 12" v-bind="chart"></BiSexIcon>
<BiChart :showGuide="showGuide" v-else v-bind="chart"></BiChart>
</template>
<BiChartLegend
v-if="legend.show"
v-bind="{ ...legend, colors: chart.colors }"
></BiChartLegend>
<BiChartDesc
v-if="desc.show"
v-bind="desc"
@change-status="changeStatus('desc', '描述')"
@change-text="changeText"
></BiChartDesc>
<BiChartChoiceMinxinAnalysis
v-if="analysis.show"
v-bind="analysis"
@change-status="changeStatus('analysis', '卡方分析结果')"
></BiChartChoiceMinxinAnalysis>
<BiChartDesc
v-if="analysisDesc.show"
v-bind="analysisDesc"
@change-status="changeStatus('analysisDesc', '智能分析')"
></BiChartDesc>
<slot name="bottom"></slot>
</div>
</template>
<script>
import BiChartTitle from './chart-title.vue';
import BiChart from './chart.vue';
import BiTable from './table.vue';
import BiSexIcon from './sex-icon.vue';
import BiChartLegend from './chart-legend.vue';
import BiChartDesc from './chart-desc.vue';
import BiChartChoiceMinxinToggleAxis from './chart-choice-mixin-toggle-axis.vue';
import BiChartChoiceMinxinAnalysis from './chart-choice-mixin-analysis.vue';
export default {
name: 'bi-chart-block',
components: {
BiChartTitle,
BiChart,
BiTable,
BiSexIcon,
BiChartDesc,
BiChartLegend,
BiChartChoiceMinxinToggleAxis,
BiChartChoiceMinxinAnalysis
},
props: {
showGuide: Boolean,
chartConfig: {
type: Object,
default: () => ({})
}
},
computed: {
analysis() {
return this.chartConfig.analysis || {};
},
analysisDesc() {
return this.chartConfig.analysisDesc || {};
},
chart() {
return this.chartConfig.chart || {};
},
desc() {
return this.chartConfig.desc || {};
},
legend() {
return this.chartConfig.legend || {};
},
title() {
return this.chartConfig.title || {};
}
},
methods: {
changeChartColors(colors) {
this.chartConfig.chart['colors'] = colors;
console.log(`${this.title.name}-图表-颜色`, colors);
},
deleteChart() {
this.chartConfig['isDelete'] = 1;
console.log(`${this.title.name}-图表-删除`);
},
changeChartType(chartKey) {
this.chartConfig.chart['type'] = chartKey;
console.log(`${this.title.name}-图表-格式`, chartKey);
},
changeStatus(keyName, typeName) {
// 设置附加文字是否显示
this.chartConfig[keyName]['setShow'] = !this.chartConfig[keyName][
'setShow'
];
console.log(`${this.title.name}-${typeName}-是否显示`);
},
changeText(text) {
// 修改附加文字的内容
console.log(`${this.title.name}-用户自定义描述`, text);
},
toggleAxis() {
// 交换X轴与Y轴
const { data, axis } = this.chart;
this.chartConfig.chart['axis'] = axis.reverse();
this.chartConfig.chart['data'] = data[0].reduce((pre, cur, index) => {
pre.push(
data.reduce((cPre, cCur) => {
cPre.push(cCur[index]);
return cPre;
}, [])
);
return pre;
}, []);
console.log(`${this.title.name}-交换X轴与Y轴`);
}
}
};
</script>
<style lang="scss" scoped>
.bi-chart-block {
& > div {
page-break-inside: avoid;
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-10 10:34:38
-->
<template>
<div>
<BiBlank height="17" :usePrint="true"></BiBlank>
<div class="bi-choice-mixin-analysis" :class="{ hide: !setShow }">
<template v-if="setShow">
<div class="bi-choice-mixin-analysis_title" v-if="title">
{{ title }}
</div>
<table
cellspacing="0"
cellpadding="0"
border="0"
class="bi-choice-mixin-analysis_table"
>
<tr class="" v-for="(item, index) in tableConfig" :key="index">
<td
v-for="(cItem, cIndex) in item"
:key="cIndex"
:colspan="index == 0 && cIndex == 2 ? xLength : 1"
>
{{ cItem }}
</td>
</tr>
</table>
</template>
<el-button
class="bi-choice-mixin-analysis_btn"
v-if="!hideBtn && !isPrint"
@click="toggleShow"
>
{{ setShow ? '隐藏' : '显示' }}
</el-button>
</div>
</div>
</template>
<script>
import mixin from '../mixin/index';
import { Button } from 'element-ui';
import BiBlank from './blank.vue';
export default {
name: 'bi-choice-mixin-analysis',
mixins: [mixin],
components: {
[Button.name]: Button,
BiBlank
},
data() {
return {
test: {
title: [
{
name: '患者年龄',
axis: ['小于18岁', '18-40岁', '18-40岁']
},
{
name: '患者发病状态',
axis: ['新发疾病', '旧病复发', '旧病复发2', '旧病复发3']
}
],
arr: [
['50%', '100%', '100%', '60%'],
['50%', '0%', '100%', '20%'],
['50%', '10%', '100%', '10%'],
['50%', '20%', '100%', '10%'],
[4, 1, 2, 5]
],
res: {
x: '0.923',
p: '0.342'
}
}
};
},
props: {
hideBtn: Boolean,
setShow: Boolean,
title: String
},
computed: {
xLength() {
return this.test.title[0].axis.length;
},
tableConfig() {
const {
title,
arr,
res: { x, p }
} = this.test;
const _arr = arr.slice(0, -1);
const c = [
['', '', title[0].name, '', '', '', ''],
['题目', '名称', ...title[0].axis, '总计', 'X²', 'p'],
..._arr.map((item, index) => {
if (index === 0) {
return [
title[1].name,
title[1].axis[index],
..._arr[index],
'',
''
];
} else if (index === _arr.length - 1) {
return ['', title[1].axis[index], ...arr[1], x, p];
} else {
return ['', title[1].axis[index], ...arr[1], '', ''];
}
}),
['总计', '', ...arr.slice(-1)[0], '', ''],
['*p>0.05**p>0.01', '', ...title[0].axis.map(() => ''), '', '', '', '']
];
return c;
}
},
methods: {
toggleShow() {
this.$emit('change-status');
}
},
mounted() {}
};
</script>
<style lang="scss" scoped>
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.bi-choice-mixin-analysis {
position: relative;
border: 1px solid #ededed;
border-radius: 4px;
padding: 0 40px;
padding-bottom: 25px;
padding-top: 15px;
transition: all 0.3s;
&.hide {
border-color: transparent;
min-height: 35px;
}
&_title {
font-size: 16px;
font-weight: 500;
line-height: 1;
color: #2a3558;
text-align: center;
}
&_table {
width: 1058px;
margin-top: 27px;
tr {
height: 44px;
font-size: 14px;
color: #6f7a91;
text-align: center;
td {
max-width: 50px;
}
&:nth-child(2n + 1) {
background-color: #f9fafc;
}
&:first-child {
background-color: transparent;
td {
border-bottom: 1px solid #a5a5a5;
&[colspan='1'] {
border-color: transparent;
}
}
}
&:nth-child(2) {
background-color: transparent;
td {
border-bottom: 1px solid #a5a5a5;
}
}
&:last-child {
background-color: transparent;
td {
border-top: 1px solid #a5a5a5;
}
}
}
}
&_btn {
padding: 0;
position: absolute;
width: 73px;
height: 29px;
border: 1px solid #d9dfea;
border-radius: 4px;
top: 7px;
right: 8px;
font-size: 14px;
font-weight: 500;
line-height: 29px;
color: #6f7a91;
text-align: center;
cursor: pointer;
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-11 01:21:29
-->
<template>
<div class="bi-chart-choice-mixin-toggle-axis">
<BiBlank height="25" :usePrint="true"></BiBlank>
<div class="bi-chart-choice-mixin-toggle-axis_sub_title">
{{ dealAxis.join('与') }}
</div>
<div class="bi-chart-choice-mixin-toggle-axis_text">
<span>X轴:</span>
<span>{{ dealAxis[0] }}</span>
<span style="margin-left:38px;">Y轴:</span>
<span>{{ dealAxis[1] }}</span>
</div>
<el-button icon="el-icon-sort" v-if="!isPrint" @click="toggle">
切换
</el-button>
</div>
</template>
<script>
import mixin from '../mixin/index';
import { Button } from 'element-ui';
import BiBlank from './blank.vue';
export default {
name: 'bi-chart-choice-mixin-toggle-axis',
mixins: [mixin],
components: {
[Button.name]: Button,
BiBlank
},
props: {
axis: {
type: Array,
default: () => []
}
},
computed: {
dealAxis() {
return this.axis.map(item => item.name);
}
},
methods: {
toggle() {
this.$emit('toggle-axis');
}
}
};
</script>
<style lang="scss" scoped>
.bi-chart-choice-mixin-toggle-axis {
&_sub_title {
width: 1138px;
min-height: 80px;
border: 1px solid #ededed;
border-radius: 4px;
padding: 30px;
font-size: 14px;
line-height: 1.2;
color: #6f7a91;
margin-bottom: 25px;
}
&_text {
height: 40px;
line-height: 40px;
border: 1px solid #efefef;
border-radius: 4px;
display: inline-block;
vertical-align: top;
padding: 0 25px;
margin-right: 16px;
span {
font-size: 14px;
color: #6f7a91;
&:nth-child(2n + 1) {
font-weight: 500;
color: #2a3558;
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-10 10:34:38
-->
<template>
<div>
<BiBlank height="17" :usePrint="true"></BiBlank>
<div class="bi-chart-desc" :class="{ hide: !setShow, print: isPrint }">
<template v-if="setShow">
<div class="bi-chart-desc_title" v-if="title">{{ title }}</div>
<div
type="text"
class="bi-chart-desc_textarea"
@click="blur"
:style="{ paddingTop: title ? '20px' : '35px' }"
>
<span>
{{ text }}
</span>
<span
ref="input"
class="bi-chart-desc_textarea"
:contenteditable="!isPrint"
@input="input"
>
{{ localText }}
</span>
</div>
<div class="bi-chart-desc_text" v-if="resText">
{{ resText }}
</div>
</template>
<el-button
class="bi-chart-desc_btn"
v-if="!hideBtn && !isPrint"
@click="toggleShow"
>
{{ setShow ? '隐藏' : '显示' }}
</el-button>
</div>
</div>
</template>
<script>
import mixin from '../mixin/index';
import { Button } from 'element-ui';
import BiBlank from './blank.vue';
export default {
name: 'bi-chart-desc',
mixins: [mixin],
components: {
[Button.name]: Button,
BiBlank
},
data() {
return {
localText: ''
};
},
props: {
hideBtn: Boolean,
setShow: Boolean,
title: String,
text: String,
resText: String,
maxLength: {
type: Number,
default: 20
}
},
methods: {
keepLastIndex(obj) {
if (window.getSelection) {
obj.focus(); //解决ff不获取焦点无法定位问题
var range = window.getSelection(); //创建range
range.selectAllChildren(obj); //range 选择obj下所有子内容
range.collapseToEnd(); //光标移至最后
} else if (document.selection) {
var rangeForIE = document.selection.createRange(); //创建选择对象
rangeForIE.moveToElementText(obj); //range定位到obj
rangeForIE.collapse(false); //光标移至最后
rangeForIE.select();
}
},
toggleShow() {
this.$emit('change-status');
},
blur() {
this.$refs['input'].focus();
},
input(event) {
try {
const { innerText } = event.target;
if (
`${event.target.innerText}`.length > this.maxLength &&
this.localText.length === this.maxLength
) {
event.target.innerText = this.localText;
this.keepLastIndex(event.target);
return;
}
const text = `${innerText}`.slice(0, this.maxLength);
this.localText = text;
this.$emit('change-text', this.localText);
} catch (error) {
console.log(error);
}
}
},
mounted() {
this.$refs['input'] &&
this.$refs['input'].addEventListener('paste', function(e) {
e.stopPropagation();
e.preventDefault();
var text = '',
event = e.originalEvent || e;
if (event.clipboardData && event.clipboardData.getData) {
text = event.clipboardData.getData('text/plain');
} else if (window.clipboardData && window.clipboardData.getData) {
text = window.clipboardData.getData('Text');
}
if (document.queryCommandSupported('insertText')) {
document.execCommand('insertText', false, text);
} else {
document.execCommand('paste', false, text);
}
});
}
};
</script>
<style lang="scss" scoped>
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.bi-chart-desc {
position: relative;
border: 1px solid #ededed;
border-radius: 4px;
padding-left: 40px;
transition: all 0.3s;
&.hide {
border-color: transparent;
min-height: 35px;
&.print {
min-height: 0;
}
}
&_title {
font-size: 16px;
font-weight: 500;
line-height: 1;
color: #2a3558;
padding-top: 15px;
text-align: center;
}
&_textarea {
animation: fadeIn 1s;
width: 1050px;
font-size: 14px;
line-height: 1.5;
color: #6f7a91;
outline: none;
border-color: rgba(82, 168, 236, 0.8);
padding: 35px 0;
word-break: break-all;
&.mobile {
font-size: 0.16rem;
}
}
&_text {
animation: fadeIn 1s;
font-size: 14px;
color: #1989fa;
margin-bottom: 35px;
}
&_btn {
padding: 0;
position: absolute;
width: 73px;
height: 29px;
border: 1px solid #d9dfea;
border-radius: 4px;
top: 7px;
right: 8px;
font-size: 14px;
font-weight: 500;
line-height: 29px;
color: #6f7a91;
text-align: center;
cursor: pointer;
}
}
</style>
<!--
* @Description: file content
* @Author: jml
* @Date: 2021-03-24 10:22:27
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-20 01:59:10
-->
<template>
<div class="bi-chart-legend">
<BiBlank height="20" :usePrint="true"></BiBlank>
<div class="bi-chart-legend_title" v-if="title">{{ title }}</div>
<div
class="bi-chart-legend_group"
:style="{ textAlign: title ? '' : 'center' }"
>
<div
class="bi-chart-legend_item"
v-for="(item, index) in data"
:key="index"
>
<div
class="bi-chart-legend_item_color"
:style="{ background: colors[index % colors.length] }"
></div>
<div class="bi-chart-legend_item_text">{{ item }}</div>
</div>
</div>
</div>
</template>
<script>
import mixin from '../mixin/index';
import BiBlank from './blank.vue';
export default {
mixins: [mixin],
name: 'bi-chart-legend',
components: { BiBlank },
props: {
title: String,
data: {
type: Array,
default: () => []
},
colors: {
type: Array,
default: () => []
}
},
data() {
return {};
}
};
</script>
<style lang="scss" scoped>
.bi-chart-legend {
line-height: 1.2;
font-size: 0;
&_title {
font-size: 14px;
font-weight: 500;
color: #2a3558;
margin-bottom: 12px;
}
&_item {
vertical-align: top;
display: inline-block;
font-size: 14px;
line-height: 14px;
color: #6f7a91;
margin: 12px 0;
padding-right: 60px;
&.mobile {
font-size: 0.2rem;
line-height: 1.2;
}
& > div {
display: inline-block;
&:nth-child(2) {
display: inline;
}
}
&_color {
width: 12px;
height: 12px;
border-radius: 2px;
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-10 10:04:59
-->
<template>
<div class="bi-chart-title">
<div class="bi-chart-title_hr" v-if="!hideHr"></div>
<div class="bi-chart-title_name">
{{ name }}
</div>
<div class="bi-chart-title_btn_group" v-if="!isPrint">
<el-popover
class="bi-chart-title_btn_group_item"
placement="bottom"
trigger="click"
v-model="visibleColors"
v-if="!hideColor"
>
<BiTypesColor
@change="changeColors"
:initColors="colors"
></BiTypesColor>
<el-button
slot="reference"
class="bi-chart-title_color bi-chart-title_btn"
style="line-height:50px;"
>
<img
src="http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/colorSelector.svg"
alt=""
/>
</el-button>
</el-popover>
<el-button
class="bi-chart-title_delete bi-chart-title_btn bi-chart-title_btn_group_item"
v-if="!hideDelete"
@click="dialogVisible = true"
:disabled="guideStepShow(2) || guide.use"
:style="{
zIndex: guideStepShow(2) ? 11 : ''
}"
>
<img
src="http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/delete.svg"
alt=""
/>
删除
</el-button>
<el-popover
class="bi-chart-title_btn_group_item"
placement="bottom"
trigger="click"
v-model="visibleCharts"
v-if="!hideChangeChart"
>
<BiTypesChart
@change="changeChart"
:initType="chartType"
:disableTypes="disableTypes"
:extendTypes="extendTypes"
></BiTypesChart>
<el-button
:disabled="guideStepShow(1) || guide.use"
slot="reference"
class="bi-chart-title_change_chart bi-chart-title_btn"
:style="{
zIndex: guideStepShow(1) ? 11 : ''
}"
>
{{ typesName || '柱状图' }}
<i class="el-icon-caret-bottom el-icon--right"></i>
</el-button>
</el-popover>
</div>
<el-dialog
class="custom-dialog"
title="提示"
:visible.sync="dialogVisible"
:close-on-press-escape="false"
:close-on-click-modal="false"
width="400px"
>
<span>是否确认删除 ?删除后可在撤销删除里面恢复该分析</span>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"></el-button>
<el-button type="primary" @click="deleteChart">
</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { Popover, Dialog, Button } from 'element-ui';
import BiTypesColor from './types-color.vue';
import BiTypesChart from './types-chart.vue';
import mixin from '../mixin/index';
import types from '../chart-type/types';
import eventBus from '../eventBus';
export default {
name: 'bi-chart-title',
mixins: [mixin],
components: {
[Popover.name]: Popover,
[Dialog.name]: Dialog,
[Button.name]: Button,
BiTypesColor,
BiTypesChart
},
props: {
showGuide: Boolean,
hideHr: Boolean,
name: String,
hideDelete: Boolean,
hideColor: Boolean,
hideChangeChart: Boolean,
colors: Array,
chartType: [Number, String],
disableTypes: {
type: Array,
default: () => []
},
extendTypes: {
type: Array,
default: () => []
}
},
data() {
return {
visibleColors: false,
visibleCharts: false,
dialogVisible: false
};
},
computed: {
guideStepShow() {
return step =>
this.showGuide && this.guide.use && this.guide.step == step;
},
typesName() {
return (types[+this.chartType] || {}).cnName;
}
},
methods: {
changeColors(colors) {
this.visibleColors = false;
this.$emit('change-colors', colors);
},
changeChart(chartKey) {
this.visibleCharts = false;
this.$emit('change-chartkey', chartKey);
},
deleteChart() {
this.dialogVisible = false;
this.$emit('change-delete');
}
},
mounted() {
if (this.showGuide) {
eventBus.$on('addStep', () => {
this.guide.step += 1;
});
eventBus.$on('hideGuide', () => {
this.guide.use = false;
});
}
}
};
</script>
<style lang="scss" scoped>
.bi-chart-title {
height: 82px;
background: #f9fafc;
border-radius: 4px;
position: relative;
padding-left: 16px;
font-size: 0;
&_hr {
width: 5px;
height: 26px;
background: #1989fa;
position: absolute;
left: 0;
top: 28px;
}
&_name {
font-size: 22px;
color: #2a3558;
line-height: 82px;
&.mobile {
font-size: 0.26rem;
}
}
&_btn {
display: inline-block;
min-width: 42px;
height: 42px;
border: 1px solid #bac1ce;
border-radius: 4px;
vertical-align: top;
text-align: center;
line-height: 42px;
padding: 0 15px;
font-size: 16px;
font-weight: 500;
color: #6f7a91;
cursor: pointer;
position: relative;
&_group {
position: absolute;
right: 16px;
top: 20px;
&_item {
& + .bi-chart-title_btn_group_item {
margin-left: 8px;
}
}
}
}
}
</style>
<!--
* @Description: file content
* @Author: jml
* @Date: 2021-03-24 10:22:27
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-20 11:13:55
-->
<template>
<div>
<BiBlank height="40" :usePrint="true"></BiBlank>
<v-chart
class="chart"
:option="option"
style="margin:0 auto;"
:style="customStyle"
:autoresize="true"
:key="`${type}-${JSON.stringify(data)}`"
:type="type"
/>
<BiBlank height="40" :usePrint="true"></BiBlank>
</div>
</template>
<script>
import VChart from './chart-base.vue';
import chartTypes from '../chart-type/types';
import mixin from '../mixin/index';
import BiBlank from './blank.vue';
const isNumber = val => {
return !isNaN(val / 2);
};
export default {
name: 'bi-chart',
components: { 'v-chart': VChart, BiBlank },
mixins: [mixin],
provide: {
ecTheme: 'light'
},
props: {
width: {
type: [Number, String],
default: '100%'
},
height: {
type: [Number, String],
default: '400px'
},
yAxisUnit: {
type: String,
default: ''
},
axis: {
type: Array,
default: () => []
},
data: {
type: Array,
default: () => []
},
colors: {
type: Array,
default: () => []
},
type: {
type: [Number, String],
default: 1
}
},
data() {
return {
option: {}
};
},
computed: {
chartsConfig() {
return chartTypes[this.type] || { name: '', create: () => {} };
},
length() {
return this.data.reduce((pre, cur) => {
pre += cur.length;
return pre;
}, 0);
},
cHeight() {
const { type, data, length } = this;
let _height = this.height;
let maxHeight = data.length > 1 ? 1300 : 1400;
if (this.isMobile && !this.isPrint) {
maxHeight = maxHeight / 2;
}
if (+type === 2) {
const baseHeight = data.length * (data.length == 1 ? 40 : 15);
// 横向图表,根据数据量计算高度
_height = Math.min(Math.max(_height, length * baseHeight), maxHeight);
}
if (+type === 4) {
const baseHeight = data.length * (data.length == 1 ? 30 : 15);
// 横向图表,根据数据量计算高度
_height = Math.min(
Math.max(_height, data.length * baseHeight),
maxHeight
);
}
return _height;
},
cWidth() {
const { width, length } = this;
return Math.min(width, Math.max(length * 50, 800));
},
customStyle() {
const { cWidth, cHeight } = this;
const customStyle = {
width: isNumber(cWidth) ? `${cWidth}px` : cWidth,
height: isNumber(cHeight) ? `${cHeight}px` : cHeight
};
return customStyle;
}
},
methods: {
createChart() {
this.option = this.chartsConfig.create(
this,
this.data,
this.axis[0].names,
this.yAxisUnit,
this.colors,
this.axis[1].names,
this.cWidth,
this.cHeight
);
}
},
created() {
this.createChart();
},
watch: {
colors: {
handler() {
this.createChart();
}
},
type: {
handler() {
this.createChart();
}
},
data: {
handler() {
this.createChart();
}
}
}
};
</script>
<!--
* @Description:
* @Date: 2021-06-15 17:47:19
-->
<!--
* @Description: file content
* @Author: jml
* @Date: 2021-03-24 10:22:27
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-19 23:56:39
-->
<template>
<div class="bi-sex-icon">
<div class="bi-sex-icon_item">
<img src="http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/boy.svg" alt="" />
<p>{{ axis[0].name }} {{ data[0][0] }}</p>
</div>
<div class="bi-sex-icon_item">
<img src="http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/girl.svg" alt="" />
<p>{{ axis[1].name }} {{ data[0][1] }}</p>
</div>
</div>
</template>
<script>
export default {
name: 'bi-sex-icon',
props: {
data: {
type: Array,
default: () => []
},
axis: {
type: Array,
default: () => []
}
},
data() {
return {
option: {}
};
}
};
</script>
<style lang="scss" scoped>
.bi-sex-icon {
text-align: center;
padding-top: 110px;
height: 350px;
&_item {
display: inline-block;
margin: 0 45px;
p {
margin-top: 15px;
}
}
}
</style>
<!--
* @Description: file content
* @Author: jml
* @Date: 2021-03-24 10:22:27
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-19 22:39:37
-->
<template>
<div class="bi-table">
<BiBlank height="60" :usePrint="true"></BiBlank>
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse;">
<tbody>
<tr
v-for="(item, index) in dealData"
:key="index"
:style="{
backgroundColor: index == 0 ? colors[0] : '',
color: index == 0 ? '#fff' : ''
}"
>
<template v-for="(cItem, cIndex) in item">
<td v-if="Array.isArray(cItem)" id="lineTd" :key="cIndex">
<span style="float:left;margin-top:20px;padding-left:5px;">
{{ cItem[0] }}
</span>
<span style="float:right;margin-top:-15px;padding-right:5px;">
{{ cItem[1] }}
</span>
</td>
<td
v-else
:key="cIndex"
:style="{
backgroundColor:
cIndex == 0 ? colors[isSingle && index === 0 ? 0 : 1] : '',
color: cIndex == 0 && colors.length > 1 ? '#fff' : ''
}"
>
{{ cItem }}
</td>
</template>
</tr>
</tbody>
</table>
<BiBlank height="40" :usePrint="true"></BiBlank>
</div>
</template>
<script>
import BiBlank from './blank.vue';
export default {
name: 'bi-table',
components: { BiBlank },
props: {
yAxisUnit: {
type: String,
default: ''
},
title: {
type: String,
default: ''
},
axis: {
type: Array,
default: () => []
},
data: {
type: Array,
default: () => []
},
colors: {
type: Array,
default: () => []
}
},
data() {
return {
option: {}
};
},
computed: {
isSingle() {
return this.data.length == 1;
},
dealData() {
const { data, isSingle, title, axis } = this;
return [
[isSingle ? '题干' : [axis[0].name, axis[1].name], ...axis[0].names],
...data.map((item, index) => {
return [isSingle ? title : axis[1].names[index], ...item];
})
];
}
}
};
</script>
<style lang="scss" scoped>
table {
width: 100%;
max-width: 980px;
margin: 0 auto;
}
tbody {
border: 1px solid #bfd8f2;
}
td {
padding: 27px 10px;
width: 50px;
text-align: center;
font-size: 14px;
border-right: 1px solid #bfd8f2;
&:last-child {
border-right: none;
}
}
#lineTd {
background: #fff url('http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/hr.svg')
no-repeat 100% center;
color: #2a3558;
max-width: 100px;
padding-bottom: 15px;
}
</style>
<!--
* @Description:
* @Date: 2021-06-15 15:52:53
-->
<template>
<div class="bi-tips">
<div class="bi-tips_item" style="top:-200px;" v-if="guide.step == 1">
<div class="bi-tips_btn" @click="next">继续引导</div>
<div class="bi-tips_content">
<p>不满意样式?</p>
<p>在此处切换该分析模块的其他图表展现形式</p>
</div>
</div>
<div
class="bi-tips_item"
style="top:-149px;right:143px;"
v-if="guide.step == 2"
>
<div class="bi-tips_btn" @click="next">继续引导</div>
<div class="bi-tips_content">
<p>不需要该题目的分析展示,可直接删除</p>
</div>
</div>
<div class="bi-tips_item" style="top:-224px;" v-if="guide.step == 3">
<div class="bi-tips_btn" @click="finish">
已了解,关闭引导
</div>
<div class="bi-tips_content">
<p>想更好展示分析报告见的关联性?可以拖动每个题目分析的先后顺序</p>
</div>
</div>
<div class="shadow"></div>
</div>
</template>
<script>
import eventBus from '../eventBus/index';
import mixin from '../mixin/index';
export default {
name: 'bi-tips',
mixins: [mixin],
methods: {
next() {
this.guide.step += 1;
eventBus.$emit('addStep');
},
finish() {
this.guide.use = false;
document.body.style.overflow = '';
document.getElementsByClassName(
'xrk-components-bi'
)[0].parentElement.parentElement.parentElement.style.overflow = '';
eventBus.$emit('hideGuide');
}
},
watch: {
'guide.use': {
handler(v) {
if (v) {
try {
this.$nextTick(() => {
setTimeout(() => {
document
.getElementsByClassName('xrk-components-bi')[0]
.parentElement.parentElement.parentElement.scrollTo(
0,
document.getElementsByClassName(
'bi-single-choice_item_block'
)[0].offsetTop - 300
);
document.body.style.overflow = 'hidden';
document.getElementsByClassName(
'xrk-components-bi'
)[0].parentElement.parentElement.parentElement.style.overflow =
'hidden';
}, 500);
});
} catch (error) {
eventBus.$emit('hideGuide');
console.log(error);
}
} else {
document.body.style.overflow = '';
document.getElementsByClassName(
'xrk-components-bi'
)[0].parentElement.parentElement.parentElement.style.overflow = '';
}
},
immediate: true
}
}
};
</script>
<style lang="scss" scoped>
.bi-tips {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
&_content {
background: linear-gradient(270deg, #41a0ff 0%, #1989fa 100%);
padding: 18px 30px;
border-radius: 5px;
max-width: 400px;
position: relative;
&::after {
content: '';
width: 0;
height: 0;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: none;
border-top: 10px solid #50a7ff;
bottom: -10px;
right: 40px;
}
&::before {
content: '';
width: 4px;
height: 78px;
position: absolute;
right: 47px;
bottom: -78px;
background-color: #50a7ff;
}
}
&_item {
position: absolute;
z-index: 15;
top: 0;
color: #fff;
font-size: 18px;
font-weight: 500;
line-height: 25px;
&:nth-child(1) {
right: 50px;
}
}
&_btn {
display: inline-block;
height: 40px;
background: rgba($color: #ffffff, $alpha: 0.15);
border-radius: 4px;
border: 1px solid #ffffff;
padding: 0 16px;
line-height: 40px;
color: #fff;
cursor: pointer;
left: 100%;
transform: translateX(-100%);
position: relative;
margin-bottom: 20px;
}
}
.shadow {
position: fixed;
width: 100vw;
height: 100vh;
background-color: rgba($color: #000000, $alpha: 0.7);
top: 0;
left: 0;
z-index: 9;
}
</style>
<!--
* @Description:
* @Date: 2021-06-15 15:52:53
-->
<template>
<div class="bi-tips">
<div class="bi-tips_item">
<div class="bi-tips_content">
<slot></slot>
</div>
<div class="bi-tips_btn">继续引导</div>
</div>
</div>
</template>
<script>
export default {
name: 'bi-tips'
};
</script>
<style lang="scss" scoped>
.bi-tips {
width: 100%;
height: 100%;
left: 0;
top: 0;
&_item {
color: #fff;
font-size: 18px;
font-weight: 500;
line-height: 25px;
&:nth-child(1) {
right: 50px;
}
}
&_btn {
display: inline-block;
height: 40px;
background: rgba($color: #ffffff, $alpha: 0.15);
border-radius: 4px;
border: 1px solid #ffffff;
padding: 0 16px;
line-height: 40px;
color: #fff;
cursor: pointer;
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-09 20:37:58
-->
<template>
<div class="bi_title">
<div class="bi_title_text">
<div class="bi_title_text_index">{{ `${index}`.padStart(2, 0) }}</div>
{{ name }}
<img
src="http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/title.svg"
alt=""
class="bi_title_text_icon"
/>
</div>
</div>
</template>
<script>
export default {
name: 'bi-title',
props: {
index: String,
name: String
}
};
</script>
<style lang="scss" scoped>
$bluecolor: #1989fa;
.bi {
&_title {
line-height: 0;
height: 88px;
border-bottom: 2px solid #f4f4f4;
padding-left: 29px;
&_text {
margin-top: 32px;
height: 33px;
background: $bluecolor;
font-size: 22px;
line-height: 33px;
color: #fff;
padding-left: 60px;
padding-right: 20px;
min-width: 237px;
box-sizing: border-box;
display: inline-block;
position: relative;
&_index {
position: absolute;
width: 35px;
height: 35px;
background: #ffffff;
border: 2px solid $bluecolor;
border-radius: 4px;
font-size: 22px;
line-height: 33px;
color: $bluecolor;
text-align: center;
left: 16px;
top: -7px;
}
&_icon {
position: absolute;
right: -61px;
top: 0;
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-10 12:44:14
-->
<template>
<div class="bi-types-chart">
<div
class="bi-types-chart_group"
v-for="(value, key) in chartTypes"
:key="key"
>
<div class="bi-types-chart_group_title">{{ value.name }}</div>
<div class="bi-types-chart_group_icons">
<div
class="bi-types-chart_group_icons_item"
:class="{ active: initType == item.key, disabled: item.disabled }"
@click="changeChart(item.key, item.disabled)"
v-for="item in value.list"
:key="item.name"
>
<img :src="item.icon" alt="" />
</div>
</div>
</div>
</div>
</template>
<script>
import chartTypes from '../chart-type/types';
const chartSort = {
柱状图: 0,
饼图: 1,
折线图: 2,
表格: 3,
初始化: 4
};
export default {
name: 'bi-types-chart',
props: {
initType: [Number, String],
extendTypes: {
type: Array,
default: () => []
},
disableTypes: {
type: Array,
default: () => []
}
},
data() {
return {
chartTypes: Object.entries(chartTypes)
.filter(item => {
if (this.extendTypes.includes(+item[0])) {
return true;
} else {
return item[0] != 12;
}
})
.reduce((pre, [key, value]) => {
const { cnName } = value;
if (pre[chartSort[cnName]]) {
pre[chartSort[cnName]].list.push({
...value,
disabled:
this.disableTypes.indexOf(+key) > -1 ||
this.disableTypes.indexOf(`${key}`) > -1,
key: key
});
} else {
pre[chartSort[cnName]] = {
name: cnName,
list: [
{
...value,
disabled:
this.disableTypes.indexOf(+key) > -1 ||
this.disableTypes.indexOf(`${key}`) > -1,
key: key
}
]
};
}
return pre;
}, [])
.map(item => {
item.list = item.list.sort((a, b) => {
if (a.sort - b.sort < 0) {
return -1;
} else {
return 1;
}
});
return item;
})
};
},
methods: {
changeChart(chartKey, disabled) {
if (disabled) {
return;
}
this.$emit('change', chartKey);
}
},
created() {}
};
</script>
<style lang="scss" scoped>
.bi-types-chart {
&_title {
text-align: center;
font-size: 16px;
font-weight: 500;
color: #2a3558;
margin-bottom: 15px;
}
&_group {
font-size: 16px;
padding: 0 5px;
border: 2px solid transparent;
cursor: pointer;
transition: all 0.3s;
&.active {
padding: 5px;
border-color: #1989fa;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
}
& + .bi-colors_group {
margin-top: 5px;
}
&_title {
font-size: 16px;
font-weight: 500;
color: #2a3558;
text-align: center;
margin-bottom: 10px;
margin-top: 10px;
}
&_icons {
&_item {
display: inline-flex;
width: 50px;
height: 50px;
align-items: center;
justify-content: center;
border: 2px solid transparent;
margin: 0 5px;
&.active {
border-color: #1989fa;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
}
&.disabled {
filter: grayscale(1);
cursor: not-allowed;
}
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-10 12:44:14
-->
<template>
<div class="bi-colors">
<div class="bi-colors_title">修改图表颜色</div>
<div
:class="{ active: localColorIndex === index }"
class="bi-colors_group"
v-for="(item, index) in colors"
:key="`${item[0]}-${index}`"
@click="changeColors(index)"
>
<div
class="bi-colors_item"
v-for="(color, cIndex) in item"
:key="`${color}-${cIndex}`"
:style="{ background: color }"
></div>
</div>
</div>
</template>
<script>
import colors from '../config/colors';
export default {
name: 'bi-types-colors',
props: {
initColors: {
type: Array,
default: () => []
}
},
data() {
return {
localColorIndex: 0,
colors: colors
};
},
methods: {
changeColors(index) {
this.localColorIndex = index;
this.$emit('change', this.colors[index]);
}
},
created() {
const index = this.colors.findIndex(
item => item.join(',') === this.initColors.join(',')
);
if (index === -1 && this.initColors.length === 10) {
this.colors.unshift(this.initColors);
}
this.localColorIndex = index === -1 ? 0 : index;
}
};
</script>
<style lang="scss" scoped>
.bi-colors {
&_title {
text-align: center;
font-size: 16px;
font-weight: 500;
color: #2a3558;
margin-bottom: 15px;
}
&_group {
font-size: 0;
padding: 0 5px;
border: 2px solid transparent;
cursor: pointer;
transition: all 0.3s;
&.active {
padding: 5px;
border-color: #1989fa;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
}
& + .bi-colors_group {
margin-top: 5px;
}
}
&_item {
display: inline-block;
width: 44px;
height: 44px;
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-09 19:05:20
-->
<template>
<div class="bi-catalogue" ref="bi-catalogue">
<div class="bi-catalogue-title">
<div class="bi-catalogue-title_cn_name">目录</div>
<div class="bi-catalogue-title_en_name">Contents</div>
<div class="bi-catalogue-title_hr"></div>
</div>
<div class="bi-catalogue_list">
<div
class="bi-catalogue_list_item"
v-for="({ name, child }, index) in catalogueArr"
:key="index"
>
<div class="bi-catalogue_list_item_name">
<span style="margin-right:20px;">
{{ `${index + 1}`.padStart(2, 0) }}
</span>
{{ name }}
</div>
<div class="bi-catalogue_list_item_hr"></div>
<div class="bi-catalogue_list_item_child">
<div
class="bi-catalogue_list_item_child_item"
v-for="({ name, page }, cIndex) in child"
:key="cIndex"
>
<div>
<p
class="bi-catalogue_list_item_child_item_name"
style="float:left;"
>
<span style="margin-right:5px;">
{{ `${index + 1}.${cIndex + 1}` }}
</span>
{{ name }}
</p>
<div class="bi-catalogue_list_item_child_item_hr"></div>
<span class="bi-catalogue_list_item_child_item_page">
{{ `${+page + cataloguePageSize}`.padStart(2, 0) }}
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { heightToPage } from '../chart-type/common';
import mixin from '../mixin/index';
export default {
name: 'bi-catalogue',
mixins: [mixin],
props: {
catalogueArr: {
type: Array,
default: () => []
}
},
data() {
return {
cataloguePageSize: 0
};
},
computed: {
// cataloguePageSize() {
// const catalogueCount =
// 5 +
// this.catalogueArr.slice(2).reduce((pre, cur) => {
// pre.push(...cur.child);
// return pre;
// }, []).length -
// 10;
// const cataloguePageSize = 1 + Math.ceil(catalogueCount / 17);
// return cataloguePageSize;
// }
},
created() {},
watch: {
catalogueArr: {
handler() {
this.$nextTick(() => {
this.cataloguePageSize = heightToPage(
this.$refs['bi-catalogue'].offsetHeight
);
});
},
immediate: true,
deep: true
}
}
};
</script>
<style lang="scss" scoped>
.bi-catalogue {
$color: #2a3558;
$colorNormal: #6f7a91;
padding: 0 50px;
box-sizing: border-box;
color: $color;
&-title {
padding-top: 44px;
&_cn_name {
font-size: 55px;
line-height: 1.5;
}
&_en_name {
font-size: 28px;
line-height: 45px;
padding-left: 10px;
}
&_hr {
width: 1090px;
height: 3px;
background: $color;
margin-top: 17px;
}
}
&_list {
margin-top: 133px;
&_item {
& + .bi-catalogue_list_item {
padding-top: 65px;
}
&_name {
font-size: 25px;
}
&_hr {
width: 1090px;
height: 2px;
background: $color;
margin-top: 17px;
}
&_child {
padding-top: 30px;
&_item {
padding: 30px 0;
font-size: 21px;
position: relative;
page-break-inside: avoid;
&_hr {
width: 1096px;
height: 30px;
position: relative;
&::after {
content: '';
position: absolute;
left: 0;
top: 15px;
width: 1096px;
height: 0;
border-top: 1px dashed #707070;
}
}
&_name {
height: 30px;
line-height: 30px;
background: #fff;
position: absolute;
left: 0;
top: 30px;
z-index: 1;
padding-right: 20px;
max-width: 950px;
}
&_page {
height: 30px;
line-height: 30px;
padding-left: 10px;
background: #fff;
position: absolute;
right: 0;
top: 30px;
}
}
}
&:last-child {
.bi-catalogue_list_item_child {
&_item:last-child {
padding-bottom: 77px;
}
}
}
}
}
}
.mobile {
padding: 0.59rem 0.43rem;
.bi-catalogue-title {
&_cn_name {
font-size: 0.44rem;
}
&_en_name {
font-size: 0.27rem;
line-height: 0.36rem;
padding-left: 0;
}
&_hr {
width: 9.09rem;
height: 0.03rem;
margin-top: 0.15rem;
}
}
.bi-catalogue_list {
margin-top: 0.95rem;
&_item {
padding-top: 0.3rem;
&_name {
font-size: 0.35rem;
span {
margin-right: 0.1rem !important;
}
}
&_hr {
width: 9.09rem;
height: 0.03rem;
margin-top: 0.11rem;
}
&_child {
padding-top: 0.35rem;
&_item {
padding: 0.3rem 0;
overflow: hidden;
&_name {
top: 0.3rem;
font-size: 0.32rem;
padding-right: 0.2rem;
max-width: 8rem;
}
&_hr {
width: 9.09rem;
}
&_page {
top: 0.3rem;
font-size: 0.32rem;
padding-left: 0.2rem;
}
}
}
& + .bi-catalogue_list_item {
margin-top: 0.59rem;
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-09 19:05:20
-->
<template>
<div class="bi-cover-2">
<BiBlank :height="42" :usePrint="true"></BiBlank>
<slot></slot>
<div class="bi-cover-2-content">
<p>服务公司声明</p>
<div>
<p>
本公司以勤勉的职=职业态度,独立、客观地出具本报告。本报告所采用的数据和信息均来自项目采集,本公司不保证该等信息的准确性或完整性。分析逻辑基于团队的职业理解,清晰
准确地反映了本公司的观点,结论不受任何第三方的授意或影响,特此声明。
</p>
</div>
<p class="t">法律声明</p>
<div>
<p>
本报告仅供本公司的客户使用。本公司不会因接收人收到本报告而视其为本公司的当然客户。
</p>
<p>
本报告所载的资料仅反映本公司截止发布本报告当日的判断。在不同时期,本公司可发出与本报告所载资料不一致的报告。
</p>
<p>
本报告的版权归本公司所有,未经书面许可,任何机构和个人不得以任何形式翻版、复制、发表或引用,或再次分发给任何其他人,或以任何侵犯本公司版权的其他方式使用。
</p>
<p>
向日葵将尽商业上合理水平的技能和注意义务为平台用户提供稳定的技术服务,但不对服务内容本身承担责任。
</p>
</div>
</div>
</div>
</template>
<script>
import BiBlank from '../commonComponents/blank.vue';
export default {
name: 'bi-cover-end',
components: { BiBlank },
props: {
title: String
}
};
</script>
<style lang="scss" scoped>
.bi-cover {
width: 1200px;
height: 1697px;
background: #1989fa;
page-break-before: always;
font-size: 50px;
color: #ffffff;
text-align: center;
padding: 0 50px;
padding-top: 562px;
letter-spacing: 3px;
text-indent: 3px;
}
.bi-cover-2 {
page-break-before: always;
&-content {
width: 100%;
border: 4px solid #f4f4f4;
border-radius: 4px;
padding: 40px 26px;
background: #fff;
p {
font-size: 18px;
color: #2a3558;
}
.t {
margin-top: 60px;
}
div {
margin-top: 24px;
p {
font-size: 14px;
line-height: 1.5;
color: #989898;
}
}
}
&.mobile {
.bi-cover-2-content {
border-width: 2px;
padding-top: 20px;
p {
font-size: 0.32rem;
}
.t {
margin-top: 30px;
}
div {
margin-top: 15px;
p {
font-size: 0.32rem;
}
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-09 19:05:20
-->
<template>
<div class="bi-cover">
<div
class="bi-cover_bg"
:style="{ backgroundColor: coverList[coverIndex].background }"
>
<el-popover
:popper-class="isMobile ? 'mobile-popover' : ''"
placement="bottom"
trigger="click"
v-model="visibleCoverList"
v-if="!isPrint"
>
<div class="bi-cover_popover">请选择封面</div>
<swiper class="bi-cover_swiper" :options="swiperOptions">
<swiper-slide
class="bi-cover_item"
v-for="(item, index) in coverList"
:key="item.background"
>
<div class="bi-cover_ok" v-if="localIndex === index">
<i class="el-icon-circle-check"></i>
</div>
<div
@click="localIndex = index"
class="bi-cover_item_img"
:style="{ background: item.background }"
></div>
<div class="bi-cover_name">{{ item.name }}</div>
</swiper-slide>
</swiper>
<el-button
class="bi-cover_confirm_btn"
type="primary"
@click="changeCover"
>
确定
</el-button>
<el-button slot="reference" class="bi-cover_btn">
<i class="el-icon-sort" v-if="isMobile"></i>
<span v-else>切换封面</span>
</el-button>
</el-popover>
<div
v-for="(item, index) in content"
:key="index"
class="bi-cover_input"
:class="{ [item.className]: true, drag: drag }"
:style="{
left: `${item.pos.left}px`,
top: `${item.pos.top}px`,
borderColor: isPrint ? 'rgba(255,255,255,0)' : ''
}"
@mousedown="
e => {
handleMouseDown(e, item.pos);
}
"
@touchstart="
e => {
handleTouchDown(e, item.pos);
}
"
>
<div
ref="input"
style="outline: none;display:inline-block;"
:contenteditable="!drag && !isPrint"
@input="
e => {
input(e, index, item.maxLength);
}
"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script>
import { Popover, Button } from 'element-ui';
import { Swiper, SwiperSlide } from 'vue-awesome-swiper';
import 'swiper/swiper-bundle.css';
import mixin, { printWidth } from '../mixin/index';
export default {
name: 'bi-cover',
mixins: [mixin],
components: {
[Popover.name]: Popover,
[Button.name]: Button,
Swiper,
SwiperSlide
},
data() {
return {
swiperOptions: {
slidesPerView: 3
},
visibleCoverList: false,
content: [],
coverIndex: 0,
localIndex: 0,
coverList: [
{
background: '#6C71FF',
name: '模板一'
},
{
background: '#1989FA',
name: '模板二'
},
{
background: '#3BCF9F',
name: '模板三'
},
{
background: '#FF846E',
name: '模板四'
}
],
drag: false
};
},
methods: {
dealPos(dis) {
return dis * (this.isPrint ? printWidth : this.baseFontSize);
},
changeCover() {
this.coverIndex = this.localIndex;
this.visibleCoverList = false;
},
handleMouseDown(e, pos) {
if (this.isPrint) {
return;
}
const { rafThrottle } = require('element-ui/src/utils/util');
const { on, off } = require('element-ui/src/utils/dom');
if (this.loading || e.button !== 0 || this.isPrint) return;
const { left, top } = pos;
const startX = e.pageX;
const startY = e.pageY;
this._dragHandler = rafThrottle(ev => {
if (
!this.drag &&
(Math.abs(pos.top - top) > 15 || Math.abs(pos.left - left) > 15)
) {
this.drag = true;
}
pos.left = left + ev.pageX - startX;
pos.top = top + ev.pageY - startY;
});
on(document, 'mousemove', this._dragHandler);
on(document, 'mouseup', () => {
this.drag = false;
off(document, 'mousemove', this._dragHandler);
});
},
handleTouchDown(e, pos) {
if (!e.target.className) {
return;
}
e.preventDefault();
if (this.isPrint) {
return;
}
const { rafThrottle } = require('element-ui/src/utils/util');
const { on, off } = require('element-ui/src/utils/dom');
if (this.loading || this.isPrint) return;
const { left, top } = pos;
const startX = e.targetTouches[0].pageX;
const startY = e.targetTouches[0].pageY;
this._dragHandler = rafThrottle(ev => {
if (
!this.drag &&
(Math.abs(pos.top - top) > 15 || Math.abs(pos.left - left) > 15)
) {
this.drag = true;
}
pos.left = left + ev.targetTouches[0].pageX - startX;
pos.top = top + ev.targetTouches[0].pageY - startY;
});
on(document, 'touchmove', this._dragHandler);
on(document, 'touchend', () => {
this.drag = false;
off(document, 'touchmove', this._dragHandler);
});
},
keepLastIndex(obj) {
if (window.getSelection) {
obj.focus(); //解决ff不获取焦点无法定位问题
var range = window.getSelection(); //创建range
range.selectAllChildren(obj); //range 选择obj下所有子内容
range.collapseToEnd(); //光标移至最后
} else if (document.selection) {
var rangeForIE = document.selection.createRange(); //创建选择对象
rangeForIE.moveToElementText(obj); //range定位到obj
rangeForIE.collapse(false); //光标移至最后
rangeForIE.select();
}
},
input(event, index, maxLength) {
try {
const { innerText } = event.target;
if (
`${event.target.innerText}`.length > maxLength &&
this.content[index]['name'].length === maxLength
) {
event.target.innerText = this.content[index]['name'];
this.keepLastIndex(event.target);
return;
}
const text = `${innerText}`.slice(0, maxLength);
this.content[index]['name'] = text;
} catch (error) {
console.log(error);
}
}
},
mounted() {
this.$refs['input'].forEach(item => {
item.addEventListener('paste', function(e) {
e.stopPropagation();
e.preventDefault();
var text = '',
event = e.originalEvent || e;
if (event.clipboardData && event.clipboardData.getData) {
text = event.clipboardData.getData('text/plain');
} else if (window.clipboardData && window.clipboardData.getData) {
text = window.clipboardData.getData('Text');
}
if (document.queryCommandSupported('insertText')) {
document.execCommand('insertText', false, text);
} else {
document.execCommand('paste', false, text);
}
});
});
},
created() {
this.content = [
{
name: '奇正藏药医学沙龙推广项目数据报告',
className: 'bi-cover_title',
pos: {
top: this.isMobile ? this.dealPos(3.67) : 550,
left: this.isMobile ? this.dealPos(1.93) : 237
},
maxLength: 20
},
{
name: '2021/04/28期',
className: 'bi-cover_date',
pos: {
top: this.isMobile ? this.dealPos(7.15) : 820,
left: this.isMobile ? this.dealPos(1.92) : 237
},
maxLength: 16
},
{
name: '西藏奇正藏药营销有限公司',
className: 'bi-cover_company',
pos: {
top: this.isMobile ? this.dealPos(10.79) : 1540,
left: this.isMobile ? this.dealPos(1.92) : 237
},
maxLength: 26
}
];
}
};
</script>
<style lang="scss" scoped>
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.bi-cover {
width: 1200px;
height: 1697px;
overflow: hidden;
&_bg {
width: 100%;
height: 100%;
position: relative;
}
&_input {
border: 1px dashed rgba($color: #ffffff, $alpha: 0.5);
line-height: 1.5;
color: #fff;
outline: none;
word-break: break-all;
width: 726px;
position: absolute;
&.drag {
user-select: none;
}
}
&_title {
padding: 30px 17px;
min-height: 232px;
font-size: 66px;
line-height: 80px;
}
&_date {
padding: 9px 15px;
min-height: 79px;
font-size: 43px;
}
&_company {
padding: 32px 17px;
min-height: 100px;
font-size: 26px;
}
&_btn {
position: absolute;
right: 20px;
top: 20px;
}
&_swiper {
width: 520px;
}
&_name {
font-size: 14px;
font-weight: 500;
color: #6f7a91;
text-align: center;
}
&_popover {
font-size: 16px;
font-weight: 500;
color: #2a3558;
text-align: center;
padding-bottom: 25px;
padding-top: 10px;
}
&_item {
position: relative;
overflow: hidden;
&_img {
margin: 0 auto;
width: 160px;
height: 217px;
}
}
&_confirm_btn {
width: 82px;
margin: 30px auto 20px auto;
display: block;
}
&_ok {
animation: fadeIn 0.5s;
width: 50px;
height: 50px;
border-bottom-left-radius: 30%;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 110px;
top: 0;
color: #fff;
background-color: rgba($color: #000000, $alpha: 0.4);
font-size: 30px;
}
&.mobile {
width: 10rem;
height: 14.142135623730951rem;
.bi-cover_title {
padding: 0.52rem;
width: 6.15rem;
min-height: inherit;
font-size: 0.6rem;
line-height: 0.93rem;
}
.bi-cover_date {
width: 6.13rem;
min-height: 0.93rem;
font-size: 0.48rem;
text-align: center;
padding: 0.13rem;
}
.bi-cover_company {
width: 6.13rem;
min-height: 0.93rem;
font-size: 0.4rem;
text-align: center;
padding: 0.19rem;
}
.bi-cover_btn {
padding: 0.12rem 0.21rem;
top: 12.97rem;
right: 0.8rem;
.el-icon-sort {
transform: rotate(90deg);
}
}
}
}
.mobile-popover {
.bi-cover_popover {
padding-top: 0.1rem;
padding-bottom: 0.4rem;
font-size: 0.45rem;
}
.bi-cover_swiper {
width: 9rem;
}
.bi-cover_item_img {
width: 2.5rem;
height: 3.5355rem;
}
.bi-cover_name {
font-size: 0.32rem;
}
.bi-cover_ok {
width: 1rem;
height: 1rem;
font-size: 0.6rem;
left: inherit;
right: 0.28rem;
}
.bi-cover_confirm_btn {
width: inherit;
font-size: 0.32rem;
margin: 0.5rem auto 0.2rem auto;
padding: 0.3rem 0.6rem;
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-09 19:05:20
-->
<template>
<div class="bi-mission" ref="bi-mission">
<BiTitle index="2" :name="name"></BiTitle>
<div class="bi-mission_group">
<div class="bi-mission_item">
<BiChartBlock :chartConfig="data[0]"></BiChartBlock>
</div>
<div class="bi-mission_item">
<BiChartBlock :chartConfig="data[1]"></BiChartBlock>
</div>
<BiChartBlock
style="margin-top:30px;"
:chartConfig="data[2]"
></BiChartBlock>
<template name="项目参与人完成任务区间分布">
<BiChartBlock
style="margin-top:44px;"
:chartConfig="data[3]"
></BiChartBlock>
</template>
</div>
</div>
</template>
<script>
import BiTitle from '../commonComponents/title.vue';
import BiChartBlock from '../commonComponents/chart-block.vue';
import { heightToPage } from '../chart-type/common';
export default {
name: 'bi-mission',
components: { BiTitle, BiChartBlock },
props: {
name: String,
data: {
default: () => [],
type: Array
}
},
data() {
return {};
},
methods: {},
mounted() {
this.$emit('page', heightToPage(this.$refs['bi-mission'].offsetHeight));
}
};
</script>
<style lang="scss" scoped>
.bi-mission {
page-break-before: always;
padding-bottom: 50px;
&_group {
padding: 0 30px;
padding-top: 35px;
position: relative;
&::before {
content: '';
position: absolute;
width: 1px;
height: 417px;
background-color: #e5e5e5;
left: 596px;
top: 163px;
}
}
&_item {
vertical-align: top;
display: inline-block;
width: 544px;
min-height: 550px;
& + .bi-mission_item {
margin-left: 42px;
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-16 16:52:35
-->
<template>
<div class="bi-mobile-base-info">
<BiMobileTitle index="1" title="基础信息"></BiMobileTitle>
<div class="bi-mobile-base-info_content">
<div
class="bi-mobile-base-info_content_item"
v-for="(item, index) in info"
:key="index"
>
<div class="bi-mobile-base-info_content_item_label">
{{ item.label }}
</div>
<div class="bi-mobile-base-info_content_item_value">
{{ item.value }}
</div>
</div>
</div>
</div>
</template>
<script>
import BiMobileTitle from './title.vue';
export default {
name: 'bi-mobile-base-info',
components: { BiMobileTitle },
data() {
return {
info: [
{
label: '项目参与人:',
value: '张三'
},
{
label: '发起方:',
value: '葵花医疗集团'
},
{
label: '服务商:',
value: '杭州大江工作室'
},
{
label: '提交日期:',
value: '2021-05-30'
},
{
label: '可供采购量:',
value: '100'
},
{
label: '本期采购量:',
value: '20'
},
{
label: '数据收集:',
value: '20'
},
{
label: '报表成时间:',
value: '2021-05-21 22:21:12'
}
]
};
}
};
</script>
<style lang="scss" scoped>
.bi-mobile-base-info {
page-break-before: always;
&_content {
width: 9.15rem;
border: 0.03rem solid #e8e8e8;
border-radius: 0.2rem;
margin: 0.34rem auto 0.6rem auto;
padding: 0.57rem 0.32rem;
&_item {
font-size: 0.35rem;
color: #9d9d9d;
& > div {
display: inline-block;
}
&_value {
float: right;
color: #2d2d2d;
}
& + .bi-mobile-base-info_content_item {
margin-top: 0.5rem;
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-16 18:21:11
-->
<template>
<div class="bi-mobile-chart-block">
<div class="bi-mobile-chart-block_title">{{ chartConfig.title.name }}</div>
<BiChart
v-bind="{
...chartConfig.chart,
colors: colors,
width: width,
height: height
}"
></BiChart>
<div
class="bi-mobile-chart-block_legend"
style="padding-top:0.5rem;"
v-if="chartConfig.legend.show"
>
<div class="bi-mobile-chart-block_legend_item">
<div class="bi-mobile-chart-block_legend_left">选项</div>
<div class="bi-mobile-chart-block_legend_right">回复情况</div>
</div>
<div
class="bi-mobile-chart-block_legend_item"
v-for="(item, index) in chartConfig.legend.data"
:key="index"
>
<div class="bi-mobile-chart-block_legend_left">
<span :style="{ background: colors[index % colors.length] }"></span>
<span>{{ item }}</span>
</div>
<div class="bi-mobile-chart-block_legend_right">
{{ chartConfig.chart.data[0][index] }}
</div>
</div>
</div>
<div style="padding-top:0.5rem;" v-if="chartConfig.desc.show">
<div class="bi-mobile-chart-block_desc">{{ chartConfig.desc.text }}</div>
</div>
</div>
</template>
<script>
import BiChart from '../../commonComponents/chart.vue';
import mixin, { printWidth } from '../../mixin/index';
import { getQueryVariable } from '../../chart-type/common';
const chartTypes = [1, 2, 5, 6, 9];
const isPrint = getQueryVariable('print') == 1;
const baseFontSize = Math.min(window.innerWidth / 10, 75);
export default {
name: 'bi-mobile-chart-block',
components: { BiChart },
mixins: [mixin],
data() {
return {
width: this.dealPos(9),
chartType:
chartTypes[
Math.min(
parseInt(Math.random() * chartTypes.length),
chartTypes.length - 1
)
],
colors: [
'#FFEA00',
'#FE7A03',
'#FFC200',
'#FF9400',
'#FF9DAD',
'#FF6761',
'#FFD8B2',
'#7A7BF5',
'#04B2BB'
]
};
},
props: {
chartConfig: {
type: Object,
default: () => ({})
}
},
computed: {
height() {
if (this.chartConfig.chart.type == 2) {
const { length } = this.chartConfig.chart.data;
return this.dealPos(Math.max(6, length));
}
return this.dealPos(7);
}
},
methods: {
dealPos(dis) {
return dis * (isPrint ? printWidth : baseFontSize);
}
}
};
</script>
<style lang="scss" scoped>
.bi-mobile-chart-block {
border-top: 0.13rem solid #f4f4f6;
padding: 0.4rem;
page-break-before: always;
& > div {
page-break-inside: avoid;
}
&_title {
font-size: 0.4rem;
color: #2d2d2d;
line-height: 1.3;
}
&_desc {
padding: 0.4rem;
background: #f7f7f7;
font-size: 0.32rem;
line-height: 0.75rem;
color: #2a3558;
border-radius: 0.2rem;
&:empty {
display: none;
}
}
&_legend {
width: 8.6rem;
margin-left: 0.5rem;
font-size: 0.35rem;
color: #1a1818;
&_item {
& > div {
display: inline-block;
}
& + .bi-mobile-chart-block_legend_item {
margin-top: 0.3rem;
}
}
&_left {
max-width: 5.5rem;
span {
&:first-child {
display: inline-block;
width: 0.21rem;
height: 0.21rem;
border-radius: 50%;
margin-right: 0.1rem;
}
}
}
&_right {
width: 3rem;
float: right;
text-align: center;
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-16 17:57:41
-->
<template>
<div style="background:#fff;padding-bottom: 0.54rem; border-radius: 4px;">
<BiMobileTitle :index="index" :title="title"></BiMobileTitle>
<div class="bi-mobile-single-choice_content" v-if="info.length > 0">
<div
class="bi-mobile-single-choice_content_item"
:class="{ more: info.length > 2 }"
v-for="(item, index) in info"
:key="index"
>
<div class="bi-mobile-single-choice_content_item_name">
{{ item.name }}
<span v-if="item.desc">{{ item.desc }}</span>
</div>
<div class="bi-mobile-single-choice_content_item_number">
<span>{{ item.value }}</span>
<span>{{ item.unit }}</span>
</div>
</div>
</div>
</div>
</template>
<script>
import BiMobileTitle from './title.vue';
export default {
name: 'bi-mobile-single-choice',
components: {
BiMobileTitle
},
props: {
index: [String, Number],
title: String,
info: {
type: Array,
default: () => []
}
},
methods: {}
};
</script>
<style lang="scss" scoped>
.bi-mobile-single-choice {
&_content {
width: 9.15rem;
border: 0.03rem solid #e8e8e8;
border-radius: 0.2rem;
margin: 0.34rem auto 0 auto;
padding: 0.57rem 0.32rem;
padding-top: 0.52rem;
padding-bottom: 0.54rem;
page-break-after: always;
&_item {
width: 4rem;
display: inline-block;
&.more {
width: 100%;
display: block;
height: 1rem;
line-height: 1rem;
& > div {
font-size: 0.35rem;
color: #9d9d9d;
display: inline-block;
vertical-align: top;
}
.bi-mobile-single-choice_content_item_number {
float: right;
margin-top: 0;
span {
font-size: 0.35rem !important;
color: #2d2d2d !important;
}
}
}
&_name {
text-align: center;
font-size: 0.4rem;
color: #1a1818;
span {
font-size: 0.24rem;
color: #a3a3a6;
}
}
&_number {
color: #2d2d2d;
font-size: 0.4rem;
text-align: center;
margin-top: 0.25rem;
span:first-child {
font-size: 0.61rem;
color: #ff8200;
}
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-16 17:57:41
-->
<template>
<div class="bi-mobile-single-choice">
<slot></slot>
<BiMobileChartBlock
:class="{ wrap: pageWrap }"
ref="bi-single-choice_item"
class="bi-single-choice_item"
v-for="(item, index) in singleChoice"
:key="index"
:chartConfig="item"
></BiMobileChartBlock>
</div>
</template>
<script>
import { getQueryVariable } from '../../chart-type/common';
import BiMobileChartBlock from './chart-block.vue';
import BiChartBlock from '../../commonComponents/chart-block.vue';
export default {
name: 'bi-mobile-single-choice',
components: {
BiMobileChartBlock:
getQueryVariable('print') == 1 ? BiChartBlock : BiMobileChartBlock
},
props: {
singleChoice: {
type: Array,
default: () => []
},
pageWrap: Boolean
},
methods: {
getPageSize() {
const topDom = (this.$slots.default || [{}])[0].elm || {
offsetHeight: 0
};
const domArr = [
{
$el: topDom
},
...(this.$refs['bi-single-choice_item'] || []).map(item => {
let height = 0;
item.pervPage = item.$children.reduce(
(pre, { $el: { offsetHeight } }) => {
height += offsetHeight;
if (height >= 1697) {
pre += 1;
height = offsetHeight;
}
return pre;
},
0
);
return item;
})
];
const pageSizeInfo = {
pervHeight: 0,
pervPage: 0,
height: 0,
page: this.pageWrap ? 0 : 1
};
const catalogueInfoArr = [];
domArr.forEach(
({ $el: { offsetHeight }, chartConfig, pervPage = 0 }, index) => {
pageSizeInfo.height += offsetHeight;
if (this.pageWrap) {
if (index == 1) {
// 遍历到第二个时,如果存在顶部标题,则将两个高度相加(汇总标题和表格不做强制分页)
pageSizeInfo.pervHeight = offsetHeight + topDom.offsetHeight;
if (offsetHeight + topDom.offsetHeight > 1697) {
// pageSizeInfo.pervPage = 1;
pageSizeInfo.page += 1;
}
} else {
pageSizeInfo.page += pageSizeInfo.pervPage + 1;
pageSizeInfo.pervPage = pervPage;
}
} else if (pageSizeInfo.height >= 1697) {
pageSizeInfo.page += 1;
pageSizeInfo.height = offsetHeight;
}
catalogueInfoArr.push({
name: ((chartConfig || {}).title || {}).name,
page: pageSizeInfo.page
});
}
);
this.$emit('page', {
pageSize: pageSizeInfo.page,
info: catalogueInfoArr
});
}
},
watch: {
singleChoice: {
handler() {
this.$nextTick(this.getPageSize);
},
deep: true,
immediate: true
}
}
};
</script>
<style lang="scss" scoped>
.bi-mobile-single-choice {
background: transparent;
border: none;
page-break-before: always;
.bi-single-choice_item {
padding: 20px;
border-radius: 4px;
border: 1px solid #f4f4f4;
box-shadow: 0px 3px 6px rgba(27, 39, 64, 0.04);
background-color: #fff;
page-break-inside: avoid;
margin-top: 8px;
& + .bi-single-choice_item {
&.wrap {
page-break-before: always;
}
}
}
&_content {
width: 9.15rem;
border: 0.03rem solid #e8e8e8;
border-radius: 0.2rem;
margin: 0.34rem auto 0.6rem auto;
padding: 0.57rem 0.32rem;
padding-top: 0.52rem;
padding-bottom: 0.54rem;
&_item {
width: 4rem;
display: inline-block;
&.more {
width: 100%;
display: block;
height: 1rem;
line-height: 1rem;
& > div {
font-size: 0.35rem;
color: #9d9d9d;
display: inline-block;
vertical-align: top;
}
.bi-mobile-single-choice_content_item_number {
float: right;
margin-top: 0;
span {
font-size: 0.35rem !important;
color: #2d2d2d !important;
}
}
}
&_name {
text-align: center;
font-size: 0.4rem;
color: #1a1818;
span {
font-size: 0.24rem;
color: #a3a3a6;
}
}
&_number {
color: #2d2d2d;
font-size: 0.4rem;
text-align: center;
margin-top: 0.25rem;
span:first-child {
font-size: 0.61rem;
color: #ff8200;
}
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-16 17:02:53
-->
<template>
<div class="bi-mobile-title">
<div class="bi-mobile-title_content">
<div class="bi-mobile-title_index">{{ `${index}`.padStart(2, 0) }}</div>
<div class="bi-mobile-title_name">{{ title }}</div>
</div>
</div>
</template>
<script>
export default {
name: 'bi-mobile-title',
props: {
index: [String, Number],
title: String
}
};
</script>
<style lang="scss" scoped>
.bi-mobile-title {
background-color: #fff;
font-size: 0.43rem;
color: #2d2d2d;
&_index {
font-size: 0.4rem;
color: #fff;
width: 0.64rem;
height: 0.64rem;
background: #ff8200;
line-height: 0.64rem;
text-align: center;
margin-right: 0.1rem;
}
&_content {
display: inline-block;
min-width: 5.7rem;
height: 0.84rem;
line-height: 0.84rem;
background-color: #f4f4f6;
padding-left: 0.4rem;
padding-right: 0.4rem;
position: relative;
& > div {
display: inline-block;
}
&::after {
content: '';
width: 0;
height: 0;
position: absolute;
right: -0.44rem;
top: 0;
border-top: 0.85rem solid #f4f4f6;
border-left: 0.43rem solid transparent;
border-right: 0.43rem solid transparent;
border-bottom: none;
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-17 20:27:55
-->
<template>
<div>
<div class="fixed-btn" v-if="!isPrint">
<div
class=""
@click="dialogVisible = true"
v-if="questionData.findIndex(item => item.isDelete == 1) > -1"
>
<img src="../lib/svg/chexiao.svg" />
撤销删除
</div>
<div class="">
<img src="../lib/svg/baocun.svg" />
保存
</div>
<div class="">
<img src="../lib/svg/daochu-tianchong.svg" />
导出
</div>
</div>
<el-dialog
class="custom-dialog"
title="选择撤销删除的题目"
:visible.sync="dialogVisible"
:close-on-press-escape="false"
:close-on-click-modal="false"
width="420px"
>
<el-checkbox-group v-model="resetDeleteArr">
<el-checkbox
class="reset-delete-item"
v-for="(item, index) in questionData.filter(
item => item.isDelete == 1
)"
:label="item"
:key="index"
>
<div class="reset-delete-item_text">{{ item.title.name }}</div>
</el-checkbox>
</el-checkbox-group>
<span slot="footer" class="dialog-footer">
<el-button
type="primary"
@click="resetDelete"
:disabled="resetDeleteArr.length == 0"
>
撤销删除
</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import mixin from '../mixin/index';
import { Dialog, Button, Checkbox, CheckboxGroup } from 'element-ui';
export default {
name: 'bi-operate',
mixins: [mixin],
components: {
[Dialog.name]: Dialog,
[Button.name]: Button,
[CheckboxGroup.name]: CheckboxGroup,
[Checkbox.name]: Checkbox
},
props: {
questionData: {
type: Array,
default: () => []
}
},
data() {
return {
dialogVisible: false,
resetDeleteArr: []
};
},
methods: {
resetDelete() {
this.dialogVisible = false;
this.resetDeleteArr.forEach(item => {
item.isDelete = 0;
});
this.resetDeleteArr = [];
}
}
};
</script>
<style lang="scss" scoped>
.fixed-btn {
position: fixed;
top: 50%;
right: 30px;
transform: translateY(-50%);
z-index: 10;
& > div {
width: 100px;
height: 95px;
background: #ffffff;
border: 1px solid #e6e6e6;
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
color: #6f7a91;
font-size: 16px;
img {
margin-bottom: 5px;
}
& + div {
margin-top: 8px;
}
}
}
.reset-delete-item {
width: 360px;
overflow: hidden;
display: flex;
align-items: center;
& + .reset-delete-item {
margin-top: 15px;
}
&_text {
width: 340px;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-09 19:05:20
-->
<template>
<div class="bi-overview" ref="bi-overview">
<BiTitle index="1" :name="name"></BiTitle>
<div class="bi-overview_content">
<div class="bi-overview_content_title">
{{ title }}
</div>
<div
class="bi-overview_content_text"
v-for="(item, index) in data"
:key="index"
>
<div
v-for="(cItem, cIndex) in item"
:key="cIndex"
:class="{ wrap: !textWrap }"
>
<div>{{ cItem.name }}{{ textWrap ? '' : ':' }}</div>
<div>{{ cItem.value }}</div>
</div>
</div>
</div>
</div>
</template>
<script>
import BiTitle from '../commonComponents/title.vue';
import eventBus from '../eventBus/index';
export default {
name: 'bi-overview',
props: {
textWrap: Boolean,
name: String,
title: String,
data: {
type: Array,
default: () => []
}
},
components: { BiTitle },
mounted() {
eventBus.$emit(
'overview-page-height',
this.$refs['bi-overview'].offsetHeight
);
}
};
</script>
<style lang="scss" scoped>
$bluecolor: #1989fa;
.bi-overview {
page-break-before: always;
border: 1px solid #f4f4f4;
&_content {
padding: 16px 29px;
& > div {
&:nth-child(2n + 1) {
width: 1146px;
height: 90px;
background: #f9fafc;
}
}
&_title {
font-size: 22px;
line-height: 1.2;
color: #2a3558;
padding-left: 9px;
padding-top: 23px;
}
&_text {
height: 90px;
padding-left: 16px;
padding-top: 24px;
& > div {
display: inline-block;
width: 450px;
&:nth-child(3) {
width: 200px;
}
& > div {
font-size: 14px;
&:nth-child(1) {
color: #6f7a91;
}
&:nth-child(2) {
color: #2a3558;
margin-top: 13px;
}
}
}
.wrap {
& > div {
display: inline-block;
}
}
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-10 18:57:34
-->
<template>
<div class="bi-single-choice" ref="bi-single-choice">
<slot></slot>
<vue-draggable
class="bi-single-choice_group"
:class="{ wrap: pageWrap }"
handle=".bi-chart-title_name"
v-model="copySingleChoice"
:disabled="disabled"
chosen-class="chosen"
force-fallback="true"
:group="groupName"
animation="500"
touchStartThreshold="0"
@start="onStart"
@end="onEnd"
>
<transition-group v-for="(item, index) in copySingleChoice" :key="index">
<div
:key="index"
style="position:relative;"
class="bi-single-choice_item_block"
>
<BiChartBlock
ref="bi-single-choice_item"
class="bi-single-choice_item"
:style="{
zIndex: guideStepShow(index, 3) ? 11 : ''
}"
:class="{ dragging: drag }"
:showGuide="index === 0"
:chartConfig="item"
>
<BiBlank height="28" slot="top"></BiBlank>
<BiBlank height="28" slot="bottom"></BiBlank>
</BiChartBlock>
<BiTips v-if="guide.use && index === 0"></BiTips>
</div>
</transition-group>
</vue-draggable>
</div>
</template>
<script>
import BiBlank from '../commonComponents/blank.vue';
import BiChartBlock from '../commonComponents/chart-block.vue';
import BiTips from '../commonComponents/tips.vue';
import eventBus from '../eventBus/index';
import mixin from '../mixin/index';
import { getQueryVariable } from '../chart-type/common';
export default {
name: 'bi-single-choice',
mixins: [mixin],
components: {
BiBlank,
BiTips,
BiChartBlock,
'vue-draggable':
this.isPrint || getQueryVariable('print') == 1
? {
template: '<div><slot></slot></div>'
}
: require('vuedraggable')
},
props: {
singleChoice: {
type: Array,
default: () => []
},
pageWrap: Boolean,
disabled: Boolean
},
data() {
return {
drag: false,
groupName: `single-choice-chart-${parseInt(
Math.random() * new Date().getTime()
)}`,
copySingleChoice: []
};
},
computed: {
guideStepShow() {
return (index, step) =>
index === 0 && this.guide.use && this.guide.step == step;
}
},
methods: {
onStart() {
this.drag = true;
document
.getElementsByClassName('xrk-components-bi')[0]
.parentElement.parentElement.parentElement.scrollTo(
0,
this.$refs['bi-single-choice'].offsetTop
);
},
onEnd() {
this.drag = false;
this.$emit('sort', this.copySingleChoice);
},
getPageSize() {
const topDom = (this.$slots.default || [{}])[0].elm || {
offsetHeight: 0
};
const domArr = [
{
$el: topDom
},
...(this.$refs['bi-single-choice_item'] || []).map(item => {
let height = 0;
item.pervPage = item.$children.reduce(
(pre, { $el: { offsetHeight } }) => {
height += offsetHeight;
if (height >= 1697) {
pre += 1;
height = offsetHeight;
}
return pre;
},
0
);
return item;
})
];
const pageSizeInfo = {
pervHeight: 0,
pervPage: 0,
height: 0,
page: this.pageWrap ? 0 : 1
};
const catalogueInfoArr = [];
domArr.forEach(
({ $el: { offsetHeight }, title, pervPage = 0 }, index) => {
pageSizeInfo.height += offsetHeight;
if (this.pageWrap) {
if (index == 1) {
// 遍历到第二个时,如果存在顶部标题,则将两个高度相加(汇总标题和表格不做强制分页)
pageSizeInfo.pervHeight = offsetHeight + topDom.offsetHeight;
if (offsetHeight + topDom.offsetHeight > 1697) {
pageSizeInfo.page += 1;
}
} else {
pageSizeInfo.page += pageSizeInfo.pervPage + 1;
pageSizeInfo.pervPage = pervPage;
}
} else if (pageSizeInfo.height >= 1697) {
pageSizeInfo.page += 1;
pageSizeInfo.height = offsetHeight;
}
catalogueInfoArr.push({
name: (title || {}).name,
page: pageSizeInfo.page
});
}
);
this.$emit('page', {
pageSize: pageSizeInfo.page,
info: catalogueInfoArr
});
}
},
mounted() {
eventBus.$on('addStep', () => {
this.guide.step += 1;
});
eventBus.$on('hideGuide', () => {
this.guide.use = false;
});
},
watch: {
singleChoice: {
handler(v) {
this.copySingleChoice = v;
this.$nextTick(this.getPageSize);
},
deep: true,
immediate: true
}
}
};
</script>
<style lang="scss" scoped>
.bi-single-choice {
page-break-before: always;
&_group {
& > span {
display: block;
margin-top: 8px;
page-break-inside: avoid;
// & + span {
// }
&.chosen {
border: 2px solid #016cd6;
z-index: 9;
position: relative;
}
&.sortable-fallback {
height: 150px !important;
overflow: hidden;
}
}
&.wrap {
& > span {
& + span {
page-break-before: always;
}
}
}
}
&_item {
padding: 0 28px;
border-radius: 4px;
border: 1px solid #f4f4f4;
box-shadow: 0px 3px 6px rgba(27, 39, 64, 0.04);
background-color: #fff;
&_block {
page-break-inside: avoid;
// margin-top: 8px;
}
&.dragging {
height: 140px;
overflow: hidden;
}
}
}
</style>
<!--
* @Description:
* @Date: 2021-06-19 15:57:14
-->
<template>
<div class="bi-single-choice-info">
<BiTitle :index="index" :name="name" v-if="name"></BiTitle>
<div class="bi-single-choice-info_total" v-if="info.length > 0">
<div class="bi-single-choice-info_total_content">
<img
src="http://cdn.yxvzb.com/WEB/SaaS/images/bi/svg/hengtiao.png"
alt=""
/>
<div
class="bi-single-choice-info_total_content_item"
:class="{ one: info.length === 1 }"
v-for="(item, index) in info"
:key="index"
>
<div v-for="(cItem, cIndex) in item" :key="cIndex">
{{ cItem.name }}
<span>{{ cItem.value }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import BiTitle from '../commonComponents/title.vue';
export default {
name: 'bi-single-choice-info',
components: { BiTitle },
props: {
index: [String, Number],
name: String,
info: {
type: Array,
default: () => []
}
}
};
</script>
<style lang="scss" scoped>
.bi-single-choice-info {
border-radius: 4px;
background-color: #fff;
border: 1px solid #f4f4f4;
&_total {
padding: 28px;
border-bottom: 8px solid #f9fafc;
&_content {
border-radius: 10px;
height: 155px;
background-size: 100% 100%;
padding-top: 50px;
padding-left: 130px;
position: relative;
img {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
}
&_item {
position: relative;
z-index: 2;
color: #ddeeff;
font-size: 14px;
text-align: center;
&.one {
padding-left: 60px;
padding-top: 23px;
& > div {
width: inherit;
& + div {
margin-left: 100px;
}
}
}
& > div {
display: inline-block;
text-align: left;
width: 300px;
span {
font-size: 16px;
color: #fff;
}
}
& + .bi-single-choice-info_total_content_item {
margin-top: 25px;
}
}
}
}
}
</style>
/*
* @Description:
* @Date: 2021-06-10 14:36:29
*/
export default [
[
'#724EA7',
'#FF595E',
'#FFCA39',
'#8BC827',
'#1989FA',
'#00BAFF',
'#34CE9C',
'#6C71FF',
'#946CFF',
'#D398FF'
],
[
'#A1C9FD',
'#0C3A66',
'#34CE9C',
'#F5D25E',
'#3D348B',
'#7678ED',
'#F7B802',
'#F18702',
'#FE5F53',
'#F05044'
],
[
'#724EA7',
'#6C71FF',
'#F7B537',
'#D9572A',
'#FFD25A',
'#FF795A',
'#FFAA5A',
'#FFD539',
'#FBAF01',
'#FF8204'
],
[
'#FE7F2D',
'#609C8A',
'#A1C081',
'#FCCA46',
'#0381A7',
'#04AFB9',
'#D1CD3A',
'#FDD9B7',
'#F07167',
'#F7B802'
],
[
'#F79356',
'#FBD2A2',
'#7CCFB6',
'#05B1CA',
'#2363AA',
'#3DA5D9',
'#74BFB8',
'#FEC600',
'#EA7317',
'#FA9242'
]
];
/*
* @Description:
* @Date: 2021-06-11 06:56:08
*/
import Vue from 'vue';
export default new Vue();
<svg xmlns="http://www.w3.org/2000/svg" width="27.06" height="27.06" viewBox="0 0 27.06 27.06">
<path id="baocun" d="M120.171,102.4a3.383,3.383,0,0,1,2.4,1l5.907,5.97a3.383,3.383,0,0,1,.978,2.379v15.593a2.114,2.114,0,0,1-2.114,2.114H104.514a2.114,2.114,0,0,1-2.114-2.114V104.514a2.114,2.114,0,0,1,2.114-2.114h15.657Zm1.82,14.657H109.87a.7.7,0,0,0-.7.7v11.7h2.255V119.312h9.02V129.46h2.255V118.185h0v-.422a.7.7,0,0,0-.622-.7Zm-10.429-8.527h-3.946a.141.141,0,0,0-.141.141V110.5a.141.141,0,0,0,.141.141h3.946a.141.141,0,0,0,.141-.141v-1.832A.141.141,0,0,0,111.561,108.531Z" transform="translate(-102.4 -102.4)" fill="#6f7a91"/>
</svg>
<svg id="组_602" data-name="组 602" xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<path id="路径_480" data-name="路径 480" d="M0,0H28V8H0Z" fill="#4185f4"/>
<path id="路径_481" data-name="路径 481" d="M0,365.714H8v8H0Z" transform="translate(0 -355.714)" fill="#a0c2f9"/>
<path id="路径_482" data-name="路径 482" d="M0,731.429H8v8H0Z" transform="translate(0 -711.429)" fill="#a0c2f9"/>
<path id="路径_483" data-name="路径 483" d="M365.714,365.714h8v8h-8Zm0,10h8v8h-8Z" transform="translate(-355.714 -355.714)" fill="#a0c2f9"/>
<path id="路径_484" data-name="路径 484" d="M731.429,365.714h8v8h-8Z" transform="translate(-711.429 -355.714)" fill="#a0c2f9"/>
<path id="路径_485" data-name="路径 485" d="M731.429,731.429h8v8h-8Z" transform="translate(-711.429 -711.429)" fill="#4185f4"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="32.001" height="31.999" viewBox="0 0 32.001 31.999">
<g id="组_798" data-name="组 798" transform="translate(-1076.469 -5005.815)">
<path id="交叉_49" data-name="交叉 49" d="M824.032,10513c-.022-.33-.033-.665-.033-1a15,15,0,0,1,15-15q.5,0,1,.032V10513Z" transform="translate(252.469 -5491.186)" fill="#4185f4"/>
<path id="减去_103" data-name="减去 103" d="M15.5,31A15.488,15.488,0,0,1,0,15.5H15.5V0a15.5,15.5,0,0,1,6.033,29.782A15.412,15.412,0,0,1,15.5,31Z" transform="translate(1077.469 5006.814)" fill="#a0c2f9"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="34.219" height="33.12" viewBox="0 0 35.219 35.12">
<g id="组_799" data-name="组 799" transform="translate(-1005.392 -5004.339)">
<path id="减去_107" data-name="减去 107" d="M11.908,35.12a17.684,17.684,0,0,1-3.539-.357A17.463,17.463,0,0,1,2.09,32.121,17.71,17.71,0,0,1,0,30.466L3.3,28.33c.291.233.595.457.9.665A13.795,13.795,0,1,0,11.908,3.77V0a17.691,17.691,0,0,1,3.539.357A17.465,17.465,0,0,1,21.726,3a17.612,17.612,0,0,1,6.362,7.726,17.474,17.474,0,0,1,1.023,3.3,17.734,17.734,0,0,1,0,7.078,17.467,17.467,0,0,1-2.642,6.279,17.613,17.613,0,0,1-7.726,6.362,17.474,17.474,0,0,1-3.3,1.023A17.684,17.684,0,0,1,11.908,35.12Z" transform="translate(1011.143 5004.339)" fill="#a0c2f9"/>
<path id="交叉_50" data-name="交叉 50" d="M5.143,29.977A17.588,17.588,0,0,1,1.38,24.4,17.473,17.473,0,0,1,.357,21.1a17.73,17.73,0,0,1,0-7.078A17.463,17.463,0,0,1,3,7.742,17.61,17.61,0,0,1,10.725,1.38a17.471,17.471,0,0,1,3.3-1.023A17.691,17.691,0,0,1,17.56,0V3.77a13.892,13.892,0,0,0-2.779.28A13.718,13.718,0,0,0,9.85,6.125a13.831,13.831,0,0,0-5,6.067,13.719,13.719,0,0,0-.8,2.589,13.924,13.924,0,0,0,0,5.558A13.714,13.714,0,0,0,6.125,25.27a13.861,13.861,0,0,0,2.822,3.06l-3.3,2.135Q5.393,30.226,5.143,29.977Z" transform="translate(1005.392 5004.339)" fill="#4185f4"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="126.833" height="129.325" viewBox="0 0 126.833 129.325">
<g id="组_20" data-name="组 20" transform="translate(1.504)">
<path id="路径_13" data-name="路径 13" d="M2204.131,719.812s5.411-3.772,8.035,1.476-4.592,14.1-10.167,10.495C2202,731.783,2203.476,723.42,2204.131,719.812Z" transform="translate(-2120.41 -678.665)" fill="#fff" stroke="#1989fa" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_14" data-name="路径 14" d="M2054.59,719.812s-5.411-3.772-8.035,1.476,4.592,14.1,10.167,10.495C2056.722,731.783,2055.246,723.42,2054.59,719.812Z" transform="translate(-2015.572 -678.665)" fill="#fff" stroke="#1989fa" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_15" data-name="路径 15" d="M2074.758,606.208s6.887-15.087,22.63-6.559c0,0,16.726,5.247,15.087,22.3l-2.933,14.957q-.347,1.769-.565,3.559l-.8,6.57a38.315,38.315,0,0,1-3.8,12.7,18.589,18.589,0,0,1-1.737,2.885s-3.608,15.742-18.366,14.1c0,0-8.527-1.312-12.791-13.447a33.681,33.681,0,0,1-5.575-12.135l-2.624-14.1-3.28-19.35S2061.312,602.6,2074.758,606.208Z" transform="translate(-2024.981 -597.038)" fill="#1989fa"/>
<path id="路径_17" data-name="路径 17" d="M2000.215,798.006V819.98l-27.221,13.775s-21.318,6.887-19.678,27.549" transform="translate(-1953.225 -732.097)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_18" data-name="路径 18" d="M2188.249,790.2l-.749,29.789,27.221,13.775s21.318,6.887,19.678,27.549" transform="translate(-2110.665 -732.108)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_19" data-name="路径 19" d="M2122.888,870.5s-17.054,24.27-37.388,0" transform="translate(-2042.118 -780.813)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_20" data-name="路径 20" d="M2115.875,879s-19.842,32.633-48.375.164" transform="translate(-2030.022 -786.525)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_16" data-name="路径 16" d="M2081.782,650s7.161,8.406,18.679,7.783,15.255,6.226,15.255,6.226l-.51,7.65c-.06.9-.1,1.794-.127,2.692-.135,4.513-1.456,22.888-13.995,26.7-14.321,4.359-19.006-4.565-21.481-7.783-1.682-2.186-3-6.733-3.955-11.385A82.368,82.368,0,0,1,2074,665.33v-2.565S2082.405,653.736,2081.782,650Z" transform="translate(-2033.274 -631.233)" fill="#fff"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30.833" height="30.325" viewBox="0 0 126.833 129.325">
<g id="组_20" data-name="组 20" transform="translate(1.504)">
<path id="路径_13" data-name="路径 13" d="M2204.131,719.812s5.411-3.772,8.035,1.476-4.592,14.1-10.167,10.495C2202,731.783,2203.476,723.42,2204.131,719.812Z" transform="translate(-2120.41 -678.665)" fill="#fff" stroke="#1989fa" stroke-miterlimit="10" stroke-width="8"/>
<path id="路径_14" data-name="路径 14" d="M2054.59,719.812s-5.411-3.772-8.035,1.476,4.592,14.1,10.167,10.495C2056.722,731.783,2055.246,723.42,2054.59,719.812Z" transform="translate(-2015.572 -678.665)" fill="#fff" stroke="#1989fa" stroke-miterlimit="10" stroke-width="8"/>
<path id="路径_15" data-name="路径 15" d="M2074.758,606.208s6.887-15.087,22.63-6.559c0,0,16.726,5.247,15.087,22.3l-2.933,14.957q-.347,1.769-.565,3.559l-.8,6.57a38.315,38.315,0,0,1-3.8,12.7,18.589,18.589,0,0,1-1.737,2.885s-3.608,15.742-18.366,14.1c0,0-8.527-1.312-12.791-13.447a33.681,33.681,0,0,1-5.575-12.135l-2.624-14.1-3.28-19.35S2061.312,602.6,2074.758,606.208Z" transform="translate(-2024.981 -597.038)" fill="#1989fa"/>
<path id="路径_17" data-name="路径 17" d="M2000.215,798.006V819.98l-27.221,13.775s-21.318,6.887-19.678,27.549" transform="translate(-1953.225 -732.097)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="8"/>
<path id="路径_18" data-name="路径 18" d="M2188.249,790.2l-.749,29.789,27.221,13.775s21.318,6.887,19.678,27.549" transform="translate(-2110.665 -732.108)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="8"/>
<path id="路径_19" data-name="路径 19" d="M2122.888,870.5s-17.054,24.27-37.388,0" transform="translate(-2042.118 -780.813)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="8"/>
<path id="路径_20" data-name="路径 20" d="M2115.875,879s-19.842,32.633-48.375.164" transform="translate(-2030.022 -786.525)" fill="none" stroke="#1989fa" stroke-miterlimit="10" stroke-width="8"/>
<path id="路径_16" data-name="路径 16" d="M2081.782,650s7.161,8.406,18.679,7.783,15.255,6.226,15.255,6.226l-.51,7.65c-.06.9-.1,1.794-.127,2.692-.135,4.513-1.456,22.888-13.995,26.7-14.321,4.359-19.006-4.565-21.481-7.783-1.682-2.186-3-6.733-3.955-11.385A82.368,82.368,0,0,1,2074,665.33v-2.565S2082.405,653.736,2081.782,650Z" transform="translate(-2033.274 -631.233)" fill="#fff"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="28.999" height="26.969" viewBox="0 0 28.999 26.969">
<path id="chexiao" d="M71.936,126.013l-11.32,11.319a1.569,1.569,0,0,0,0,2.219l11.32,11.32a1.233,1.233,0,0,0,.872.361l.134-.007a1.233,1.233,0,0,0,1.1-1.226v-6.619l.373.015a16.336,16.336,0,0,1,12.6,6.865l1.658,2.362.37-2.864a15.02,15.02,0,0,0,.12-1.9l0-.343a15.353,15.353,0,0,0-14.871-14.783l-.241-.008v-5.844a1.233,1.233,0,0,0-2.1-.871Z" transform="translate(-60.157 -125.651)" fill="#6f7a91"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="68" height="68" viewBox="0 0 68 68">
<defs>
<filter id="矩形_1003" x="0" y="0" width="68" height="68" filterUnits="userSpaceOnUse">
<feOffset dy="3" input="SourceAlpha"/>
<feGaussianBlur stdDeviation="3" result="blur"/>
<feFlood flood-opacity="0.161"/>
<feComposite operator="in" in2="blur"/>
<feComposite in="SourceGraphic"/>
</filter>
</defs>
<g transform="matrix(1, 0, 0, 1, 0, 0)" filter="url(#矩形_1003)">
<g id="矩形_1003-2" data-name="矩形 1003" transform="translate(9 6)" fill="#fff" stroke="#1989fa" stroke-width="2">
<rect width="50" height="50" stroke="none"/>
<rect x="1" y="1" width="48" height="48" fill="none"/>
</g>
</g>
</svg>
<svg id="colorSelector" xmlns="http://www.w3.org/2000/svg" width="20.418" height="22.049" viewBox="0 0 20.418 22.049">
<path id="路径_102" data-name="路径 102" d="M109.312,216.845l9.372-9.372-9.372-9.372-9.372,9.372Zm-6.873-9.372,6.873-6.873,6.873,6.873-6.873,6.873Z" transform="translate(-98.267 -194.796)" fill="#6f7a91"/>
<path id="路径_103" data-name="路径 103" d="M174.687,75.216H162.5l-2.327,1.262,8.205,7.574,7.574-7.574Zm-3.4-11.351-4.769,4.769,1.25,1.25,4.769-4.769Z" transform="translate(-157.014 -63.865)" fill="#6f7a91"/>
<path id="路径_104" data-name="路径 104" d="M787.547,742.127m1.767,0a1.767,1.767,0,1,1-1.767-1.767A1.767,1.767,0,0,1,789.315,742.127Z" transform="translate(-785.78 -723.707)" fill="#6f7a91"/>
<path id="路径_105" data-name="路径 105" d="M798.978,682.635l-1.5-2.355-1.5,2.256" transform="translate(-795.694 -665.106)" fill="#6f7a91"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30.368" height="25.306" viewBox="0 0 30.368 25.306">
<path id="daochu-tianchong" d="M28.47,110.64H1.9a1.864,1.864,0,0,1-1.9-1.9V87.231a1.864,1.864,0,0,1,1.9-1.9h9.363a1.723,1.723,0,0,1,1.329.569l2.025,2.025a1.821,1.821,0,0,0,1.329.569H28.47a1.864,1.864,0,0,1,1.9,1.9v18.347A1.864,1.864,0,0,1,28.47,110.64ZM16.006,93.3a1.288,1.288,0,0,0-.949-.38,1.4,1.4,0,0,0-.949.38L8.794,99a1.235,1.235,0,0,0,.949,2.088h2.91v3.8a1.269,1.269,0,0,0,1.265,1.265h2.531a1.269,1.269,0,0,0,1.265-1.265v-3.8h2.657A1.271,1.271,0,0,0,21.321,99Z" transform="translate(0 -85.333)" fill="#6f7a91"/>
</svg>
<svg id="组_29" data-name="组 29" xmlns="http://www.w3.org/2000/svg" width="11.024" height="11.625" viewBox="0 0 11.024 11.625">
<g id="矩形_68" data-name="矩形 68" transform="translate(3.508)" fill="#fff" stroke="#6f7a91" stroke-width="1">
<path d="M1.6,0h.8a1.6,1.6,0,0,1,1.6,1.6v0a0,0,0,0,1,0,0H0a0,0,0,0,1,0,0v0A1.6,1.6,0,0,1,1.6,0Z" stroke="none"/>
<path d="M1.1.5H2.909a.6.6,0,0,1,.6.6v0a0,0,0,0,1,0,0H.5a0,0,0,0,1,0,0v0A.6.6,0,0,1,1.1.5Z" fill="none"/>
</g>
<rect id="矩形_69" data-name="矩形 69" width="11.024" height="1.002" rx="0.501" transform="translate(0 1.604)" fill="#6f7a91"/>
<g id="矩形_70" data-name="矩形 70" transform="translate(1.002 3.608)" fill="#6f7a91" stroke="#6f7a91" stroke-width="1">
<path d="M0,0H9.02a0,0,0,0,1,0,0V6.018a2,2,0,0,1-2,2H2a2,2,0,0,1-2-2V0A0,0,0,0,1,0,0Z" stroke="none"/>
<path d="M1,.5H8.02a.5.5,0,0,1,.5.5V6.018a1.5,1.5,0,0,1-1.5,1.5H2a1.5,1.5,0,0,1-1.5-1.5V1A.5.5,0,0,1,1,.5Z" fill="none"/>
</g>
<rect id="矩形_72" data-name="矩形 72" width="4.009" height="1.002" rx="0.501" transform="translate(6.013 5.613) rotate(90)" fill="#fff"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="110.172" height="129.151" viewBox="0 0 110.172 129.151">
<g id="组_19" data-name="组 19" transform="translate(1.182)">
<path id="路径_7" data-name="路径 7" d="M-495.453,769.709s2.544-3.18,2.862-5.406c0,0-7.314,8.9-13.993,8.586,0,0-28.622,7-39.116-8.586a11.4,11.4,0,0,0,2.544,5.088s-13.039.318-18.127-15.9c0,0-2.544-6.042,2.862-19.4,0,0,7.315-11.767,9.223-18.445,0,0,11.449-31.8,46.113-16.537,0,0,7,3.5,11.449,13.039,0,0,4.77,9.54,8.268,16.855C-483.368,729-462.061,760.169-495.453,769.709Z" transform="translate(575.116 -694.964)" fill="#ff846e"/>
<path id="路径_8" data-name="路径 8" d="M-501.41,791h40.07s.318,9.859,2.544,11.767c0,0-.954,29.258-21.307,29.258S-503,810.081-503,803.085C-503,803.085-500.774,794.5-501.41,791Z" transform="translate(534.961 -760.459)" fill="#fff"/>
<path id="路径_9" data-name="路径 9" d="M-603.5,977.743c.318-19.4,19.4-27.668,19.4-27.668l21.943-12.4V920.5c13.357,10.972,24.805,0,24.805,0v17.173l21.943,12.4s19.081,8.268,19.4,27.668Z" transform="translate(603.5 -848.775)" fill="#fff"/>
<path id="路径_10" data-name="路径 10" d="M-561.158,921v17.173l-21.943,12.4s-19.081,8.268-19.4,27.667" transform="translate(602.818 -849.116)" fill="none" stroke="#ff846e" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_11" data-name="路径 11" d="M-354.158,977.243c-.318-19.4-19.4-27.667-19.4-27.667l-21.943-12.4V920" transform="translate(461.648 -848.434)" fill="none" stroke="#ff846e" stroke-miterlimit="10" stroke-width="3"/>
<path id="路径_12" data-name="路径 12" d="M-465.313,1002.74s-27.032,22.655-56.265,0" transform="translate(547.631 -904.862)" fill="none" stroke="#ff846e" stroke-miterlimit="10" stroke-width="3"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"><line x1="0" y1="0" x2="100%" y2="100%" stroke="#bfd8f2" stroke-width="1"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="61.93" height="33.073" viewBox="0 0 61.93 33.073">
<g id="组_797" data-name="组 797" transform="translate(-2244.644 6547.659)">
<path id="路径_700" data-name="路径 700" d="M225,0h.545l20.044,33.073H225Z" transform="translate(2019.643 -6547.659)" fill="#1989fa"/>
<path id="路径_701" data-name="路径 701" d="M2076.461,39l21.521,32.274h7.127L2082.976,39Z" transform="translate(182.422 -6586.659)" fill="#8bc4fc"/>
<path id="路径_702" data-name="路径 702" d="M2076.461,39l21.521,32.274h7.127L2082.976,39Z" transform="translate(201.465 -6586.659)" fill="#b9dbfe"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30.84" height="25.431" viewBox="0 0 30.84 25.431">
<g id="组_801" data-name="组 801" transform="translate(-1073.052 -5101.991)">
<line id="直线_363" data-name="直线 363" x2="28" transform="translate(1074.892 5126.422)" fill="none" stroke="#4185f4" stroke-linecap="round" stroke-width="2"/>
<path id="路径_486" data-name="路径 486" d="M167.07-4907.484l6.028-7.033L187.456-4909l5.926-5.517" transform="translate(908.392 10023.922)" fill="none" stroke="#a0c2f9" stroke-linecap="round" stroke-width="2"/>
<path id="路径_487" data-name="路径 487" d="M167.07-4907.484l6.028-7.033L187.456-4909l5.926-5.517" transform="translate(907.392 10017.922)" fill="none" stroke="#4185f4" stroke-linecap="round" stroke-width="2"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="30.245" height="26.92" viewBox="0 0 30.245 26.92">
<g id="组_802" data-name="组 802" transform="translate(-1013.392 -5100.254)">
<path id="路径_469" data-name="路径 469" d="M106-4910.668v24.92h28.245" transform="translate(908.392 10011.922)" fill="none" stroke="#4185f4" stroke-linecap="round" stroke-width="2"/>
<path id="路径_470" data-name="路径 470" d="M106-4897.015l6.887-6.5" transform="translate(908.392 10011.922)" fill="none" stroke="#4185f4" stroke-width="2"/>
<path id="路径_471" data-name="路径 471" d="M106-4897.015l6.887-6.5" transform="matrix(-0.017, -1, 1, -0.017, 5929.912, 5135.313)" fill="none" stroke="#4185f4" stroke-width="2"/>
<path id="路径_472" data-name="路径 472" d="M110.318-4896.3l8.241-7.214" transform="matrix(-0.998, 0.07, -0.07, -0.998, 809.064, 214.046)" fill="none" stroke="#4185f4" stroke-linecap="round" stroke-width="2"/>
<g id="椭圆_209" data-name="椭圆 209" transform="translate(1020.392 5115.922)" fill="#fff" stroke="#e1f1f9" stroke-width="2">
<circle cx="3" cy="3" r="3" stroke="none"/>
<circle cx="3" cy="3" r="2" fill="none"/>
</g>
<g id="椭圆_210" data-name="椭圆 210" transform="translate(1020.392 5103.922)" fill="#fff" stroke="#4185f4" stroke-width="2">
<circle cx="3" cy="3" r="3" stroke="none"/>
<circle cx="3" cy="3" r="2" fill="none"/>
</g>
<g id="椭圆_211" data-name="椭圆 211" transform="translate(1029.392 5111.922)" fill="#fff" stroke="#4185f4" stroke-width="2">
<circle cx="3" cy="3" r="3" stroke="none"/>
<circle cx="3" cy="3" r="2" fill="none"/>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="33.418" height="28.408" viewBox="0 0 33.418 28.408">
<g id="组_803" data-name="组 803" transform="translate(-1011.515 -4906.218)">
<rect id="矩形_1005" data-name="矩形 1005" width="33.418" height="2.673" transform="translate(1011.515 4931.953)" fill="#a0c2f9"/>
<rect id="矩形_1008" data-name="矩形 1008" width="10.026" height="13.031" transform="translate(1018.489 4916.248)" fill="#a0c2f9"/>
<rect id="矩形_1010" data-name="矩形 1010" width="10.026" height="23.061" transform="translate(1029.392 4906.218)" fill="#a0c2f9"/>
<rect id="矩形_1007" data-name="矩形 1007" width="10.026" height="7.684" transform="translate(1018.489 4921.595)" fill="#4185f4"/>
<rect id="矩形_1009" data-name="矩形 1009" width="10.026" height="14.368" transform="translate(1029.392 4914.911)" fill="#4185f4"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="33.418" height="29.704" viewBox="0 0 33.418 29.704">
<g id="组_804" data-name="组 804" transform="translate(-1073.608 -4904.922)">
<rect id="矩形_996" data-name="矩形 996" width="33.418" height="2.673" transform="translate(1073.608 4931.953)" fill="#a0c2f9"/>
<rect id="矩形_997" data-name="矩形 997" width="10.026" height="13.367" transform="translate(1080.292 4915.922)" fill="#a0c2f9"/>
<rect id="矩形_998" data-name="矩形 998" width="10.026" height="24.367" transform="translate(1088.312 4904.922)" fill="#4185f4"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="29.399" height="33.408" viewBox="0 0 29.399 33.408">
<g id="组_805" data-name="组 805" transform="translate(-1136.137 -4903.218)">
<rect id="矩形_1001" data-name="矩形 1001" width="33.408" height="2.673" transform="translate(1138.81 4903.218) rotate(90)" fill="#a0c2f9"/>
<rect id="矩形_999" data-name="矩形 999" width="10.022" height="13.363" transform="translate(1154.846 4909.899) rotate(90)" fill="#a0c2f9"/>
<rect id="矩形_1000" data-name="矩形 1000" width="10.022" height="24.054" transform="translate(1165.537 4917.917) rotate(90)" fill="#4185f4"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="28.408" height="33.418" viewBox="0 0 28.408 33.418">
<g id="组_806" data-name="组 806" transform="translate(-1192.646 -4903.713)">
<rect id="矩形_1015" data-name="矩形 1015" width="33.418" height="2.673" transform="translate(1195.319 4903.713) rotate(90)" fill="#a0c2f9"/>
<rect id="矩形_1012" data-name="矩形 1012" width="10.026" height="13.031" transform="translate(1211.024 4910.687) rotate(90)" fill="#a0c2f9"/>
<rect id="矩形_1014" data-name="矩形 1014" width="10.026" height="23.061" transform="translate(1221.054 4921.59) rotate(90)" fill="#a0c2f9"/>
<rect id="矩形_1011" data-name="矩形 1011" width="10.026" height="7.684" transform="translate(1205.677 4910.687) rotate(90)" fill="#4185f4"/>
<rect id="矩形_1013" data-name="矩形 1013" width="10.026" height="14.368" transform="translate(1212.361 4921.59) rotate(90)" fill="#4185f4"/>
</g>
</svg>
<!--
* @Description:
* @Author: jml
* @Date: 2021-02-26 15:38:10
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-06-23 14:06:00
-->
<template>
<div class="xrk-components-bi bi" :class="{ 'bi-print': print }">
<template v-if="projectType == 20">
<BiConfigurableMobile v-if="mobile"></BiConfigurableMobile>
<BiConfigurable v-else></BiConfigurable>
</template>
<template v-if="projectType == 6">
<BiZoneMobile v-if="mobile"></BiZoneMobile>
<BiZone v-else></BiZone>
</template>
</div>
</template>
<script>
import mixin from './mixin/index';
import BiConfigurable from './project/20-configurable.vue';
import BiConfigurableMobile from './project/20-configurable-mobile.vue';
import BiZone from './project/6-zone.vue';
import BiZoneMobile from './project/6-zone-mobile.vue';
export default {
name: 'XrkBi',
mixins: [mixin],
provide() {
return {
Bi: this
};
},
props: {
mobile: [Number, String, Boolean],
print: [Number, String, Boolean],
projectType: [Number, String]
},
components: {
BiConfigurable,
BiConfigurableMobile,
BiZone,
BiZoneMobile
},
methods: {
setFontSize() {
if (this.isMobile) {
document.getElementsByTagName('html')[0].style.fontSize =
this.baseFontSize + 'px';
}
}
},
created() {
this.setFontSize();
}
};
</script>
<style lang="scss">
body,
p,
div {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.custom-dialog {
.el-dialog {
border-radius: 12px;
&__header {
text-align: center;
font-size: 24px;
color: #333333;
}
&__body {
text-align: center;
}
&__footer {
text-align: center;
.el-button {
width: 82px;
height: 33px;
line-height: 33px;
padding: 0;
}
}
}
}
.bi {
&-block {
width: 1200px;
border-radius: 4px;
overflow: hidden;
border: 1px solid #f4f4f4;
background: #fff;
&.no-border {
border-color: transparent;
background: transparent;
}
}
}
.bi-web-hr {
width: 100%;
height: 23px;
height: 0.4rem;
max-height: 23px;
background-color: #f9fafc;
}
.mobile {
.bi-web-hr {
width: 10rem;
height: 0.4rem;
}
&.bi-block {
width: 10rem;
}
}
</style>
<style lang="scss" scoped>
.xrk-components-bi {
width: 1200px;
// background-color: red;
background: #f9fafc;
line-height: 1;
position: relative;
&.bi-print {
&::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 11;
background-image: url('http://cdn.yxvzb.com/WEB/SaaS/images/bi/watermark.png');
background-repeat: repeat;
}
}
}
</style>
/*
* @Description:
* @Date: 2021-06-11 00:14:40
*/
export const printWidth = 120;
export default {
inject: {
Bi: {
default: {}
}
},
data() {
return {
guide: {
use: false,
step: 1
}
};
},
computed: {
isPrint() {
return this.Bi.print == 1 || this.print == 1;
},
isMobile() {
return this.Bi.mobile == 1 || this.mobile == 1;
},
baseFontSize() {
const { isPrint } = this;
return isPrint ? printWidth : Math.min(window.innerWidth / 10, 75);
}
}
};
/*
* @Description:
* @Date: 2021-06-11 00:14:40
*/
export default {
data() {
return {};
},
methods: {
dealSingleChoice(data, getIsDelete = false) {
if (!Array.isArray(data)) {
console.warn('传入的数据不是数组');
}
return data.filter(item => {
if (getIsDelete) {
return item.isDelete == 1;
} else {
return item.isDelete != 1;
}
});
},
sort(args, key, hideSingleChoice) {
// 传入的newSingleChoice列表 => isDelete == 0
// 给singleChoice重新赋值,所以需要把 isDelete == 1 的数据插入到最后
this[key] = [...args[0], ...hideSingleChoice];
},
setPage(args, pageKey, pageInfoKey) {
const pageInfo = args[0];
if (typeof pageInfo === 'object') {
const { pageSize, info } = pageInfo;
console.log(pageSize, info);
pageKey && (this[pageKey] = pageSize);
pageInfoKey && (this[pageInfoKey] = info);
} else {
this[pageKey] = pageInfo;
}
}
}
};
/*
* @Description:
* @Date: 2021-06-19 17:49:06
*/
import colors from '../config/colors';
export const chartConfig = () => {
let index = 0;
const createData = (xLength = 0, yLength = 0) => {
const createArr = length => {
const data = [];
for (let dataIndex = 0; dataIndex < length; dataIndex++) {
data.push(parseInt(Math.random() * 100));
}
return data;
};
const info = {
x: [],
y: [],
data: yLength == 0 ? [createArr(xLength)] : []
};
for (let x = 0; x < xLength; x++) {
info.x.push(`${+x + 1}-x-选项`);
}
for (let y = 0; y < yLength; y++) {
info.y.push(`${+y + 1}-y-选项`);
info.data.push(createArr(xLength));
}
return info;
};
return {
create: (xLength, yLength, type = 1, options = {}) => {
index += 1;
const {
blockTitle,
hideTitle,
hideChart,
hideDesc,
hideLegend,
hideDelete,
width = 1140,
height = 450
} = options;
const title = blockTitle || `${index}题目题目`;
const { x, y, data } = createData(xLength, yLength);
return {
isDelete: 0,
sort: 0,
chart: {
show: !hideChart,
type: type,
colors: colors[0],
data: data,
axis: [
{ name: `原始x轴-${index}`, names: x },
{ name: `原始y轴-${index}`, names: y }
],
width: width,
height: height
// disableTypes: [3, 4]
},
title: {
show: !hideTitle,
name: title,
hideColor: false,
hideDelete: hideDelete,
hideTypes: false
},
legend: {
show: !hideLegend,
name: '',
data: yLength > 0 ? y : x
},
desc: {
show: !hideDesc,
setShow: true,
text: '本报告通过定性(用户调研)和定量(调',
customText: ''
},
analysis: {
show: yLength > 0,
setShow: true,
title: '卡方分析结果'
},
analysisDesc: {
show: yLength > 0,
setShow: true,
title: '智能分析',
text:
'本期样本n=200 ,通过卡方检验 进行不同患者年龄与患者发病状态的相关分析,计算得出X²= 0.833 p=0.316。因此,不同患者年龄与患者发病状态无统计学意义( p>0.5)',
customText: '',
resText: '总结可知:不同年龄患者的发病状态无显著性差异。'
}
};
}
};
};
<!--
* @Description:
* @Date: 2021-06-17 20:27:04
-->
<template>
<div class="bi-configurable">
<BiCover class="mobile"></BiCover>
<BiCatalogue
class="bi-block"
:catalogueArr="catalogueArrMobile"
:class="{ mobile: !isPrint }"
></BiCatalogue>
<BiMobileBaseInfo
class="bi-block"
:class="{ mobile: isMobile }"
></BiMobileBaseInfo>
<BiMobileSingleChoice
:pageWrap="true"
:singleChoice="singleChoice"
class="bi-block"
:class="{ mobile: isMobile }"
>
<BiMobileSingleChoiceInfo
index="2"
title="项目相关调研模块"
:info="questionInfo"
></BiMobileSingleChoiceInfo>
</BiMobileSingleChoice>
<BiCoverEnd class="bi-block" :class="{ mobile: isMobile }">
<BiMobileTitle index="4" title="信息披露"></BiMobileTitle>
</BiCoverEnd>
</div>
</template>
<script>
import BiMobileTitle from '../components/mobile/title.vue';
import BiCover from '../components/cover.vue';
import BiCatalogue from '../components/catalogue.vue';
import BiMobileBaseInfo from '../components/mobile/base-info.vue';
import BiMobileSingleChoice from '../components/mobile/single-choice.vue';
import BiMobileSingleChoiceInfo from '../components/mobile/single-choice-info.vue';
import BiCoverEnd from '../components/cover-end.vue';
import { chartConfig } from '../mock/index';
const ChartConfigFn = chartConfig();
import mixin from '../mixin/index';
export default {
name: 'bi-configurable',
mixins: [mixin],
components: {
BiCover,
BiCatalogue,
// 移动端模块
BiMobileBaseInfo,
BiMobileSingleChoiceInfo,
BiMobileSingleChoice,
BiCoverEnd,
BiMobileTitle
},
data() {
return {
page1: 0,
page2: 0,
page3Info: [],
singleChoice: [],
questionInfo: [
{
name: '总参与题目',
value: '20',
unit: '条'
},
{
name: '总参与数',
desc: '(人或者机构)',
value: '2000',
unit: '人'
}
],
baseInfo: [
[
{
name: '项目名称',
value: '在山西地区的零售药店巡店项目'
},
{
name: '服务商',
value: '北京医洋科技有限公司'
},
{
name: '任务月度',
value: '2020-03'
}
],
[
{
name: '任务量',
value: '222'
},
{
name: '项目执行人数',
value: '2131人'
},
{
name: '数据收集',
value: '415条'
}
],
[
{
name: '参与调研人数',
value: '213123'
},
{
name: '报表生成时间',
value: '2020-10-2'
}
]
]
};
},
computed: {
catalogueArrMobile() {
return [
{
name: '项目总览',
child: [
{
name: '项目总览',
page: 1
}
]
},
{
name: '项目相关调研模块',
child: [
{
name: '单因素分析',
page: 2
}
]
}
];
}
},
methods: {
setData() {
this.singleChoice = [
ChartConfigFn.create(60, 0, 1),
ChartConfigFn.create(60, 0, 2),
ChartConfigFn.create(20, 0, 5),
ChartConfigFn.create(25, 0, 6),
ChartConfigFn.create(15, 0, 11)
];
}
},
created() {
this.setData();
window.status = 'completed';
}
};
</script>
<style lang="scss" scoped>
.bi-block {
margin-top: 8px;
}
</style>
<!--
* @Description:
* @Date: 2021-06-17 20:27:04
-->
<template>
<div class="bi-configurable">
<BiCover></BiCover>
<BiCatalogue class="bi-block" :catalogueArr="catalogueArr"></BiCatalogue>
<BiOverview
class="bi-block"
name="项目总览"
title="关于双醋瑞因胶囊产品在云南省的零售药店巡店项目2020-03月度统计报表"
:data="baseInfo"
:textWrap="true"
></BiOverview>
<BiMission
class="bi-block"
name="项目执行任务模块"
:data="missionData"
@page="setPage(arguments, 'page1')"
></BiMission>
<BiSingleChoice
class="bi-block no-border"
:singleChoice="showSingleChoice"
:pageWrap="true"
@sort="sort(arguments, 'singleChoice', hideSingleChoice)"
@page="setPage(arguments, 'page2')"
>
<BiSingleChoiceInfo
index="3"
name="项目相关调研模块"
:info="textData"
></BiSingleChoiceInfo>
</BiSingleChoice>
<BiSingleChoice
class="bi-block no-border"
:singleChoice="showSingleChoiceMixin"
:pageWrap="true"
@sort="sort(arguments, 'singleChoiceMixin', hideSingleChoiceMixin)"
@page="setPage(arguments, 'page3', 'page3Info')"
></BiSingleChoice>
<BiCoverEnd title="奇正藏药医学沙龙推广项目数据报告"></BiCoverEnd>
<BiOperate
:questionData="[...singleChoice, ...singleChoiceMixin]"
></BiOperate>
</div>
</template>
<script>
import BiSingleChoiceInfo from '../components/singleChoiceInfo.vue';
import BiCover from '../components/cover.vue';
import BiCatalogue from '../components/catalogue.vue';
import BiOverview from '../components/overview.vue';
import BiMission from '../components/mission.vue';
import BiSingleChoice from '../components/singleChoice.vue';
import BiCoverEnd from '../components/cover-end.vue';
import BiOperate from '../components/operate.vue';
import mixin from '../mixin/index';
/**
* dealSingleChoice、sort、setPage
*/
import project from '../mixin/project';
import { chartConfig } from '../mock/index';
const ChartConfigFn = chartConfig();
export default {
name: 'bi-configurable',
mixins: [mixin, project],
components: {
BiCover,
BiCatalogue,
BiOverview,
BiMission,
BiSingleChoice,
BiSingleChoiceInfo,
BiCoverEnd,
BiOperate
},
data() {
return {
page1: 0,
page2: 0,
page3Info: [],
singleChoice: [],
singleChoiceMixin: [],
missionData: [],
questionInfo: [
{
name: '总参与题目',
value: '20',
unit: '条'
},
{
name: '总参与数',
desc: '(人或者机构)',
value: '2000',
unit: '人'
}
],
baseInfo: [
[
{
name: '项目名称',
value: '在山西地区的零售药店巡店项目'
},
{
name: '服务商',
value: '北京医洋科技有限公司'
},
{
name: '任务月度',
value: '2020-03'
}
],
[
{
name: '任务量',
value: '222'
},
{
name: '项目执行人数',
value: '2131人'
},
{
name: '数据收集',
value: '415条'
}
],
[
{
name: '参与调研人数',
value: '213123'
},
{
name: '报表生成时间',
value: '2020-10-2'
}
]
],
textData: [
[
{
name: '总参与题目:',
value: '20题'
},
{
name: '当前选取报告输出题目:',
value: '20题'
}
],
[
{
name: '总参与数(人或者机构):',
value: '1000'
},
{
name: '分析维度:',
value: '主体分析+交叉分析'
}
]
]
};
},
computed: {
catalogueArr() {
const { page1 = 0, page2 = 0, page3Info = [] } = this;
return [
{
name: '项目总览',
child: [
{
name: '项目总览',
page: 1
}
]
},
{
name: '项目执行任务模块',
child: [
{
name: '任务量分析',
page: page1 + 1
},
{
name: '执行任务人员画像',
page: page1 + 1
},
{
name: '项目参与人完成任务区间分布',
page: page1 + 1
}
]
},
{
name: '项目相关调研模块',
child: [
{
name: '单因素分析',
page: page1 + 2
},
...page3Info
.filter(item => item.name)
.map(item => {
return {
...item,
page: page1 + 1 + page2 + item.page
};
})
]
}
];
},
showSingleChoice() {
return this.dealSingleChoice(this.singleChoice);
},
hideSingleChoice() {
return this.dealSingleChoice(this.singleChoice, true);
},
showSingleChoiceMixin() {
return this.dealSingleChoice(this.singleChoiceMixin);
},
hideSingleChoiceMixin() {
return this.dealSingleChoice(this.singleChoiceMixin, true);
}
},
methods: {
setData() {
this.singleChoice = [
ChartConfigFn.create(60, 0, 1),
ChartConfigFn.create(60, 0, 2),
ChartConfigFn.create(20, 0, 5),
ChartConfigFn.create(25, 0, 6),
ChartConfigFn.create(15, 0, 11)
];
this.singleChoiceMixin = [
ChartConfigFn.create(4, 4, 1),
ChartConfigFn.create(6, 6, 2),
ChartConfigFn.create(8, 8, 3),
ChartConfigFn.create(10, 10, 4)
];
this.missionData = [
ChartConfigFn.create(4, 0, 12, {
hideDesc: true,
hideDelete: true,
width: 520,
height: 350
}),
ChartConfigFn.create(4, 0, 1, {
hideDesc: true,
hideDelete: true,
width: 520,
height: 350
}),
ChartConfigFn.create(4, 0, 1, {
hideLegend: true,
hideChart: true,
hideTitle: true
}),
ChartConfigFn.create(4, 0, 1, { hideDelete: true, height: 400 })
];
}
},
created() {
this.setData();
window.status = 'completed';
}
};
</script>
<style lang="scss" scoped>
.bi-block {
margin-top: 8px;
}
</style>
<!--
* @Description:
* @Date: 2021-06-17 20:27:04
-->
<template>
<div class="bi-configurable">
<BiCover class="mobile"></BiCover>
<BiCatalogue
class="bi-block"
:catalogueArr="catalogueArrMobile"
:class="{ mobile: !isPrint }"
></BiCatalogue>
<BiMobileBaseInfo class="bi-block mobile"></BiMobileBaseInfo>
<BiMobileSingleChoice
:singleChoice="singleChoice"
class="bi-block mobile"
:pageWrap="true"
@page="setPage(arguments, 'page2', 'page2Info')"
>
<BiMobileSingleChoiceInfo
index="2"
title="专区个人推广效果评估"
:info="questionInfo"
></BiMobileSingleChoiceInfo>
</BiMobileSingleChoice>
<BiMobileSingleChoice
:singleChoice="singleChoiceMixin"
class="bi-block mobile"
:pageWrap="true"
@page="setPage(arguments, 'page3', 'page3Info')"
>
<BiMobileSingleChoiceInfo
index="3"
title="单篇内容有效点击量分析图"
></BiMobileSingleChoiceInfo>
</BiMobileSingleChoice>
<BiCoverEnd class="bi-block" :class="{ mobile: isMobile }">
<BiMobileTitle index="4" title="信息披露"></BiMobileTitle>
</BiCoverEnd>
</div>
</template>
<script>
import BiMobileTitle from '../components/mobile/title.vue';
import BiCover from '../components/cover.vue';
import BiCatalogue from '../components/catalogue.vue';
import BiCoverEnd from '../components/cover-end.vue';
import BiMobileBaseInfo from '../components/mobile/base-info.vue';
import BiMobileSingleChoiceInfo from '../components/mobile/single-choice-info.vue';
import BiMobileSingleChoice from '../components/mobile/single-choice.vue';
import { chartConfig } from '../mock/index';
const ChartConfigFn = chartConfig();
import mixin from '../mixin/index';
import project from '../mixin/project';
export default {
name: 'bi-configurable',
mixins: [mixin, project],
components: {
BiCover,
BiCatalogue,
BiCoverEnd,
// 移动端模块
BiMobileSingleChoiceInfo,
BiMobileBaseInfo,
BiMobileSingleChoice,
BiMobileTitle
},
data() {
return {
page1: 0,
page2: 0,
page2Info: [],
page3Info: [],
singleChoice: [],
singleChoiceMixin: [],
questionInfo: [
{
name: '专区内容:',
value: '20'
},
{
name: '本期有效点击量:',
value: '2000'
},
{
name: '总执行数(人或者机构):',
value: '2000'
}
],
baseInfo: [
[
{
name: '发起方',
value: '在山西地区的零售药店巡店项目'
},
{
name: '服务商',
value: '北京医洋科技有限公司'
},
{
name: '任务时间',
value: '24天'
}
],
[
{
name: '任务开始时间',
value: '2021-04-02'
},
{
name: '任务结算时间',
value: '2021-04-02'
},
{
name: '报表生成时间',
value: '2020-10-2'
}
],
[
{
name: '本期个人数据数',
value: '213123'
},
{
name: '累计个人数据总数',
value: '2020-10-2'
}
]
],
textData: [
[
{
name: '专区内容:',
value: '20题'
},
{
name: '总执行数(人或者机构):',
value: '11111'
},
{
name: '本期有效点击量:',
value: '20000人次'
}
]
]
};
},
computed: {
catalogueArrMobile() {
const { page2 = 0, page2Info = [], page3Info = [] } = this;
return [
{
name: '项目总览',
child: [
{
name: '项目总览',
page: 1
}
]
},
{
name: '专区推广效果评估',
child: [
...page2Info
.filter(item => item.name)
.map(item => {
return {
...item,
page: item.page + 1
};
})
]
},
{
name: '单篇内容有效点击量分析题',
child: [
...page3Info
.filter(item => item.name)
.map(item => {
return {
...item,
page: item.page + page2 + 1
};
})
]
}
];
}
},
methods: {
setData() {
this.singleChoice = [
ChartConfigFn.create(30, 0, 2, {
blockTitle: '数字专区各篇内容有效点击量排名',
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(30, 0, 13, {
blockTitle: '数字专区有效点击量分布区域热力图',
width: 875,
height: 700,
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(30, 0, 5, {
blockTitle: '数字专区单日有效点击量走势图',
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(5, 0, 1, {
blockTitle: '数字专区单日点击量Top5日期分布图',
hideLegend: true
}),
ChartConfigFn.create(5, 0, 9, {
blockTitle: '数字专区单日点击量Top5占周期总有效点击量占比分析图',
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(30, 0, 5, {
blockTitle: '数字专区单日最大点击量各篇内容点击量排名',
hideLegend: true,
hideDesc: true
})
];
this.singleChoiceMixin = [
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
})
];
}
},
created() {
this.setData();
window.status = 'completed';
}
};
</script>
<style lang="scss" scoped>
.bi-block {
margin-top: 8px;
}
</style>
<!--
* @Description:
* @Date: 2021-06-17 20:27:04
-->
<template>
<div class="bi-zone">
<BiCover></BiCover>
<BiCatalogue class="bi-block" :catalogueArr="catalogueArr"></BiCatalogue>
<BiOverview
class="bi-block"
name="数据报告信息"
title="奇正藏药医学沙龙推广项目数据报告2021-04-28期"
:data="baseInfo"
></BiOverview>
<BiMission
class="bi-block"
name="项目执行人数据统计"
:data="missionData"
@page="setPage(arguments, 'page1')"
></BiMission>
<BiSingleChoice
class="bi-block no-border"
:textData="textData"
:singleChoice="singleChoice"
:pageWrap="true"
@sort="sort(arguments, 'singleChoice', hideSingleChoice)"
@page="setPage(arguments, 'page2', 'page2Info')"
>
<BiSingleChoiceInfo
index="3"
name="专区推广效果评估"
:info="textData"
></BiSingleChoiceInfo>
</BiSingleChoice>
<BiSingleChoice
style="margin-top:25px;"
class="bi-block no-border"
name="单篇内容有效点击量分析图"
:singleChoice="singleChoiceMixin"
:pageWrap="true"
@sort="sort(arguments, 'singleChoiceMixin', hideSingleChoiceMixin)"
@page="setPage(arguments, 'page3', 'page3Info')"
>
<BiSingleChoiceInfo
index="4"
name="单篇内容有效点击量分析图"
></BiSingleChoiceInfo>
</BiSingleChoice>
<BiCoverEnd title="奇正藏药医学沙龙推广项目数据报告"></BiCoverEnd>
<BiOperate
:questionData="[...singleChoice, ...singleChoiceMixin]"
></BiOperate>
</div>
</template>
<script>
import BiSingleChoiceInfo from '../components/singleChoiceInfo.vue';
import BiCover from '../components/cover.vue';
import BiCatalogue from '../components/catalogue.vue';
import BiOverview from '../components/overview.vue';
import BiMission from '../components/mission.vue';
import BiSingleChoice from '../components/singleChoice.vue';
import BiCoverEnd from '../components/cover-end.vue';
import BiOperate from '../components/operate.vue';
import mixin from '../mixin/index';
/**
* dealSingleChoice、sort、setPage
*/
import project from '../mixin/project';
import { chartConfig } from '../mock/index';
const ChartConfigFn = chartConfig();
export default {
name: 'bi-zone',
mixins: [mixin, project],
components: {
BiSingleChoiceInfo,
BiCover,
BiCatalogue,
BiOverview,
BiMission,
BiSingleChoice,
BiCoverEnd,
BiOperate
},
data() {
return {
page1: 0,
page2: 0,
page2Info: [],
page3Info: [],
singleChoice: [],
singleChoiceMixin: [],
missionData: [],
questionInfo: [
{
name: '专区内容:',
value: '20'
},
{
name: '本期有效点击量:',
value: '2000'
},
{
name: '总执行数(人或者机构):',
value: '2000'
}
],
baseInfo: [
[
{
name: '发起方',
value: '在山西地区的零售药店巡店项目'
},
{
name: '服务商',
value: '北京医洋科技有限公司'
},
{
name: '任务时间',
value: '24天'
}
],
[
{
name: '任务开始时间',
value: '2021-04-02'
},
{
name: '任务结算时间',
value: '2021-04-02'
},
{
name: '报表生成时间',
value: '2020-10-2'
}
],
[
{
name: '本期个人数据数',
value: '213123'
},
{
name: '累计个人数据总数',
value: '2020-10-2'
}
]
],
textData: [
[
{
name: '专区内容:',
value: '20题'
},
{
name: '总执行数(人或者机构):',
value: '11111'
},
{
name: '本期有效点击量:',
value: '20000人次'
}
]
]
};
},
computed: {
catalogueArr() {
const { page1 = 0, page2 = 0, page2Info = [], page3Info = [] } = this;
return [
{
name: '项目总览',
child: [
{
name: '项目总览',
page: 1
}
]
},
{
name: '项目执行任务模块',
child: [
{
name: '任务量分析',
page: page1 + 1
},
{
name: '执行任务人员画像',
page: page1 + 1
},
{
name: '项目参与人完成任务区间分布',
page: page1 + 1
}
]
},
{
name: '专区推广效果评估',
child: [
...page2Info
.filter(item => item.name)
.map(item => {
return {
...item,
page: item.page + page1 + 1
};
})
]
},
{
name: '单篇内容有效点击量分析题',
child: [
...page3Info
.filter(item => item.name)
.map(item => {
return {
...item,
page: item.page + page1 + page2 + 1
};
})
]
}
];
},
hideSingleChoice() {
return this.singleChoice.filter(item => item.isDelete == 1);
},
hideSingleChoiceMixin() {
return this.singleChoiceMixin.filter(item => item.isDelete == 1);
}
},
methods: {
setData() {
this.singleChoice = [
ChartConfigFn.create(30, 0, 2, {
blockTitle: '数字专区各篇内容有效点击量排名',
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(30, 0, 13, {
blockTitle: '数字专区有效点击量分布区域热力图',
width: 875,
height: 700,
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(30, 0, 5, {
blockTitle: '数字专区单日有效点击量走势图',
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(5, 0, 1, {
blockTitle: '数字专区单日点击量Top5日期分布图',
hideLegend: true
}),
ChartConfigFn.create(5, 0, 9, {
blockTitle: '数字专区单日点击量Top5占周期总有效点击量占比分析图',
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(30, 0, 5, {
blockTitle: '数字专区单日最大点击量各篇内容点击量排名',
hideLegend: true,
hideDesc: true
})
];
this.singleChoiceMixin = [
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
}),
ChartConfigFn.create(60, 0, 5, {
hideLegend: true,
hideDesc: true
})
];
this.missionData = [
ChartConfigFn.create(4, 0, 12, {
hideDesc: true,
hideDelete: true,
width: 520,
height: 350
}),
ChartConfigFn.create(4, 0, 1, {
hideDesc: true,
hideDelete: true,
width: 520,
height: 350
}),
ChartConfigFn.create(4, 0, 1, {
hideLegend: true,
hideChart: true,
hideTitle: true
}),
ChartConfigFn.create(4, 0, 1, { hideDelete: true, height: 400 })
];
}
},
created() {
this.setData();
window.status = 'completed';
}
};
</script>
<style lang="scss" scoped>
.bi-block {
margin-top: 8px;
}
</style>
/*
* @Description:
* @LastEditors: Please set LastEditors
* @Date: 2021-01-28 23:29:19
*/
var path = require('path');
var webpack = require('webpack');
var entry =
process.env.NODE_ENV === 'development'
? './src/main.js'
: './src/lib/index.js';
module.exports = {
entry: entry,
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'bundler.js',
library: 'Xrk',
libraryExport: 'default',
libraryTarget: 'umd',
umdNamedDefine: true
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {}
}
},
{
test: /\.js$/,
loader: 'babel-loader'
// exclude: /node_modules/
},
{
test: /\.(ttf|otf|woff|png|jpg|gif|svg)$/,
use: [
{
loader: 'url-loader',
options: {
limit: '8192',
name: 'imgs/[name].[hash].[ext]',
publicPath: './dist/'
}
}
]
}
]
},
resolve: {
alias: {
vue$: 'vue/dist/vue.esm.js'
},
extensions: ['*', '.js', '.vue', '.json']
},
devServer: {
host: '0.0.0.0',
historyApiFallback: true,
noInfo: true,
overlay: true,
proxy: {
'/relaCustomer': {
target: 'http://172.28.61.8:8888/'
}
}
},
performance: {
hints: false
},
devtool: '#eval-source-map'
};
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '#source-map';
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,
compress: {
warnings: false,
drop_console: false
}
}),
new webpack.LoaderOptionsPlugin({
minimize: true
})
]);
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!