前言
现如今市场上的人事系统五花八门,可做了大数据分析的人事系统少之又少,最近本人花了一个星期好好研究了大数据展示方面的内容,图表主要用的是echarts来实现的,官网地址:https://echarts.apache.org/zh/index.html
下面两张图片展示出我实现的员工和工资的大数据分析界面:
员工大数据分析中心
工资大数据分析中心
如何实现漂亮的图表
地图实现
首先引入js文件,去官网可以下载到这几个文件,引入到项目中就好了。
<script type="text/javascript" src="~/showdata/js/jquery.js"></script>
<script type="text/javascript" src="~/showdata/js/echarts.min.js"></script>
<script type="text/javascript" src="~/showdata/js/china.js"></script>
<script type="text/javascript" src="~/showdata/js/area_echarts_hr.js">
图层引入
<div class="map4" id="map_1"></div>
地图实现的js
$(function () {
map();
})
var lightProvince = [];
var provinceMap = {
台湾: 'taiwan',
河北: 'hebei',
山西: 'shanxi',
辽宁: 'liaoning',
吉林: 'jilin',
黑龙江: 'heilongjiang',
江苏: 'jiangsu',
浙江: 'zhejiang',
安徽: 'anhui',
福建: 'fujian',
江西: 'jiangxi',
山东: 'shandong',
河南: 'henan',
湖北: 'hubei',
湖南: 'hunan',
广东: 'guangdong',
海南: 'hainan',
四川: 'sichuan',
贵州: 'guizhou',
云南: 'yunnan',
陕西: 'shanxi1',
甘肃: 'gansu',
青海: 'qinghai',
新疆: 'xinjiang',
广西: 'guangxi',
内蒙古: 'neimenggu',
宁夏: 'ningxia',
西藏: 'xizang',
北京: 'beijing',
天津: 'tianjin',
上海: 'shanghai',
重庆: 'chongqing',
香港: 'xianggang',
澳门: 'aomen'
};
var py_provinceMap = {
china: '全国',
hebei: '河北',
shanxi: '山西',
liaoning: '辽宁',
jilin: '吉林',
heilongjiang: '黑龙江',
jiangsu: '江苏',
zhejiang: '浙江',
anhui: '安徽',
fujian: '福建',
jiangxi: '江西',
shandong: '山东',
henan: '河南',
hubei: '湖北',
hunan: '湖南',
guangdong: '广东',
hainan: '海南',
sichuan: '四川',
guizhou: '贵州',
yunnan: '云南',
shanxi: '陕西',
gansu: '甘肃',
qinghai: '青海',
xinjiang: '新疆',
guangxi: '广西',
neimenggu: '内蒙古',
ningxia: '宁夏',
xizang: '西藏',
beijing: '北京',
tianjin: '天津',
shanghai: '上海',
chongqing: '重庆'
};
var cityMap = {
北京市: '110100',
天津市: '120100',
上海市: '310100',
重庆市: '500100',
崇明县: '310200',
湖北省直辖县市: '429000',
铜仁市: '522200',
毕节市: '522400',
石家庄市: '130100',
唐山市: '130200',
秦皇岛市: '130300',
邯郸市: '130400',
邢台市: '130500',
保定市: '130600',
张家口市: '130700',
承德市: '130800',
沧州市: '130900',
廊坊市: '131000',
衡水市: '131100',
太原市: '140100',
大同市: '140200',
阳泉市: '140300',
长治市: '140400',
晋城市: '140500',
朔州市: '140600',
晋中市: '140700',
运城市: '140800',
忻州市: '140900',
临汾市: '141000',
吕梁市: '141100',
呼和浩特市: '150100',
包头市: '150200',
乌海市: '150300',
赤峰市: '150400',
通辽市: '150500',
鄂尔多斯市: '150600',
呼伦贝尔市: '150700',
巴彦淖尔市: '150800',
乌兰察布市: '150900',
兴安盟: '152200',
锡林郭勒盟: '152500',
阿拉善盟: '152900',
沈阳市: '210100',
大连市: '210200',
鞍山市: '210300',
抚顺市: '210400',
本溪市: '210500',
丹东市: '210600',
锦州市: '210700',
营口市: '210800',
阜新市: '210900',
辽阳市: '211000',
盘锦市: '211100',
铁岭市: '211200',
朝阳市: '211300',
葫芦岛市: '211400',
长春市: '220100',
吉林市: '220200',
四平市: '220300',
辽源市: '220400',
通化市: '220500',
白山市: '220600',
松原市: '220700',
白城市: '220800',
延边朝鲜族自治州: '222400',
哈尔滨市: '230100',
齐齐哈尔市: '230200',
鸡西市: '230300',
鹤岗市: '230400',
双鸭山市: '230500',
大庆市: '230600',
伊春市: '230700',
佳木斯市: '230800',
七台河市: '230900',
牡丹江市: '231000',
黑河市: '231100',
绥化市: '231200',
大兴安岭地区: '232700',
南京市: '320100',
无锡市: '320200',
徐州市: '320300',
常州市: '320400',
苏州市: '320500',
南通市: '320600',
连云港市: '320700',
淮安市: '320800',
盐城市: '320900',
扬州市: '321000',
镇江市: '321100',
泰州市: '321200',
宿迁市: '321300',
杭州市: '330100',
宁波市: '330200',
温州市: '330300',
嘉兴市: '330400',
湖州市: '330500',
绍兴市: '330600',
金华市: '330700',
衢州市: '330800',
舟山市: '330900',
台州市: '331000',
丽水市: '331100',
合肥市: '340100',
芜湖市: '340200',
蚌埠市: '340300',
淮南市: '340400',
马鞍山市: '340500',
淮北市: '340600',
铜陵市: '340700',
安庆市: '340800',
黄山市: '341000',
滁州市: '341100',
阜阳市: '341200',
宿州市: '341300',
六安市: '341500',
亳州市: '341600',
池州市: '341700',
宣城市: '341800',
福州市: '350100',
厦门市: '350200',
莆田市: '350300',
三明市: '350400',
泉州市: '350500',
漳州市: '350600',
南平市: '350700',
龙岩市: '350800',
宁德市: '350900',
南昌市: '360100',
景德镇市: '360200',
萍乡市: '360300',
九江市: '360400',
新余市: '360500',
鹰潭市: '360600',
赣州市: '360700',
吉安市: '360800',
宜春市: '360900',
抚州市: '361000',
上饶市: '361100',
济南市: '370100',
青岛市: '370200',
淄博市: '370300',
枣庄市: '370400',
东营市: '370500',
烟台市: '370600',
潍坊市: '370700',
济宁市: '370800',
泰安市: '370900',
威海市: '371000',
日照市: '371100',
莱芜市: '371200',
临沂市: '371300',
德州市: '371400',
聊城市: '371500',
滨州市: '371600',
菏泽市: '371700',
郑州市: '410100',
开封市: '410200',
洛阳市: '410300',
平顶山市: '410400',
安阳市: '410500',
鹤壁市: '410600',
新乡市: '410700',
焦作市: '410800',
濮阳市: '410900',
许昌市: '411000',
漯河市: '411100',
三门峡市: '411200',
南阳市: '411300',
商丘市: '411400',
信阳市: '411500',
周口市: '411600',
驻马店市: '411700',
省直辖县级行政区划: '469000',
武汉市: '420100',
黄石市: '420200',
十堰市: '420300',
宜昌市: '420500',
襄阳市: '420600',
鄂州市: '420700',
荆门市: '420800',
孝感市: '420900',
荆州市: '421000',
黄冈市: '421100',
咸宁市: '421200',
随州市: '421300',
恩施土家族苗族自治州: '422800',
长沙市: '430100',
株洲市: '430200',
湘潭市: '430300',
衡阳市: '430400',
邵阳市: '430500',
岳阳市: '430600',
常德市: '430700',
张家界市: '430800',
益阳市: '430900',
郴州市: '431000',
永州市: '431100',
怀化市: '431200',
娄底市: '431300',
湘西土家族苗族自治州: '433100',
广州市: '440100',
韶关市: '440200',
深圳市: '440300',
珠海市: '440400',
汕头市: '440500',
佛山市: '440600',
江门市: '440700',
湛江市: '440800',
茂名市: '440900',
肇庆市: '441200',
惠州市: '441300',
梅州市: '441400',
汕尾市: '441500',
河源市: '441600',
阳江市: '441700',
清远市: '441800',
东莞市: '441900',
中山市: '442000',
潮州市: '445100',
揭阳市: '445200',
云浮市: '445300',
南宁市: '450100',
柳州市: '450200',
桂林市: '450300',
梧州市: '450400',
北海市: '450500',
防城港市: '450600',
钦州市: '450700',
贵港市: '450800',
玉林市: '450900',
百色市: '451000',
贺州市: '451100',
河池市: '451200',
来宾市: '451300',
崇左市: '451400',
海口市: '460100',
三亚市: '460200',
三沙市: '460300',
成都市: '510100',
自贡市: '510300',
攀枝花市: '510400',
泸州市: '510500',
德阳市: '510600',
绵阳市: '510700',
广元市: '510800',
遂宁市: '510900',
内江市: '511000',
乐山市: '511100',
南充市: '511300',
眉山市: '511400',
宜宾市: '511500',
广安市: '511600',
达州市: '511700',
雅安市: '511800',
巴中市: '511900',
资阳市: '512000',
阿坝藏族羌族自治州: '513200',
甘孜藏族自治州: '513300',
凉山彝族自治州: '513400',
贵阳市: '520100',
六盘水市: '520200',
遵义市: '520300',
安顺市: '520400',
黔西南布依族苗族自治州: '522300',
黔东南苗族侗族自治州: '522600',
黔南布依族苗族自治州: '522700',
昆明市: '530100',
曲靖市: '530300',
玉溪市: '530400',
保山市: '530500',
昭通市: '530600',
丽江市: '530700',
普洱市: '530800',
临沧市: '530900',
楚雄彝族自治州: '532300',
红河哈尼族彝族自治州: '532500',
文山壮族苗族自治州: '532600',
西双版纳傣族自治州: '532800',
大理白族自治州: '532900',
德宏傣族景颇族自治州: '533100',
怒江傈僳族自治州: '533300',
迪庆藏族自治州: '533400',
拉萨市: '540100',
昌都地区: '542100',
山南地区: '542200',
日喀则地区: '542300',
那曲地区: '542400',
阿里地区: '542500',
林芝地区: '542600',
西安市: '610100',
铜川市: '610200',
宝鸡市: '610300',
咸阳市: '610400',
渭南市: '610500',
延安市: '610600',
汉中市: '610700',
榆林市: '610800',
安康市: '610900',
商洛市: '611000',
兰州市: '620100',
嘉峪关市: '620200',
金昌市: '620300',
白银市: '620400',
天水市: '620500',
武威市: '620600',
张掖市: '620700',
平凉市: '620800',
酒泉市: '620900',
庆阳市: '621000',
定西市: '621100',
陇南市: '621200',
临夏回族自治州: '622900',
甘南藏族自治州: '623000',
西宁市: '630100',
海东地区: '632100',
海北藏族自治州: '632200',
黄南藏族自治州: '632300',
海南藏族自治州: '632500',
果洛藏族自治州: '632600',
玉树藏族自治州: '632700',
海西蒙古族藏族自治州: '632800',
银川市: '640100',
石嘴山市: '640200',
吴忠市: '640300',
固原市: '640400',
中卫市: '640500',
乌鲁木齐市: '650100',
克拉玛依市: '650200',
吐鲁番地区: '652100',
哈密地区: '652200',
昌吉回族自治州: '652300',
博尔塔拉蒙古自治州: '652700',
巴音郭楞蒙古自治州: '652800',
阿克苏地区: '652900',
克孜勒苏柯尔克孜自治州: '653000',
喀什地区: '653100',
和田地区: '653200',
伊犁哈萨克自治州: '654000',
塔城地区: '654200',
阿勒泰地区: '654300',
自治区直辖县级行政区划: '659000',
台湾省: '710000',
香港特别行政区: '810100',
澳门特别行政区: '820000'
};
var lightColor = {
河北: '#ffa259',
山西: '#fe6845',
辽宁: '#fa4252',
吉林: '#3fc5f0',
黑龙江: '#c72c41',
江苏: '#f4efd3',
浙江: '#c72c41',
安徽: '#e13a9d',
福建: '#e13a9d',
江西: '#cf56a1',
山东: '#fa697c',
河南: '#a3f7bf',
湖北: '#3ed4ff',
湖南: '#9dab86',
广东: '#a6c84c',
海南: '#ffa259',
四川: '#cfb495',
贵州: '#f09595',
云南: '#4f98ca',
陕西: '#617be3',
甘肃: '#9aceff',
青海: '#9aceff',
新疆: '#02a8a8',
广西: '#fbdff0',
内蒙古: '#42e6a4',
宁夏: '#02a8a8',
西藏: '#f6c3e5',
北京: '#a278b5',
天津: '#d6e5fa',
上海: '#fbe3b9',
重庆: '#bac7a7'
};
var geoCoordMap = {
'新疆': [86.22, 44.30],
'九江': [116.00, 29.70],
'新乡': [116.402217, 35.311657],
' ': [79.92, 37.12],
' ': [86.85, 47.70],
'若羌县': [88.17, 39.02],
'上海': [121.4648, 31.2891],
'东莞': [113.8953, 22.901],
'东营': [118.7073, 37.5513],
'中山': [113.4229, 22.478],
'临汾': [111.4783, 36.1615],
'临沂': [118.3118, 35.2936],
'丹东': [124.541, 40.4242],
'丽水': [119.5642, 28.1854],
'乌鲁木齐': [87.9236, 43.5883],
'佛山': [112.8955, 23.1097],
'保定': [115.0488, 39.0948],
'兰州': [103.5901, 36.3043],
'包头': [110.3467, 41.4899],
'北京': [116.4551, 40.2539],
'北海': [109.314, 21.6211],
'南京': [118.8062, 31.9208],
'南宁': [108.479, 23.1152],
'南昌': [116.0046, 28.6633],
'南通': [121.1023, 32.1625],
'厦门': [118.1689, 24.6478],
'台州': [121.1353, 28.6688],
'合肥': [117.29, 32.0581],
'呼和浩特': [111.4124, 40.4901],
'咸阳': [108.4131, 34.8706],
'哈尔滨': [127.9688, 45.368],
'唐山': [118.4766, 39.6826],
'嘉兴': [120.9155, 30.6354],
'大同': [113.7854, 39.8035],
'大连': [122.2229, 39.4409],
'天津': [117.4219, 39.4189],
'太原': [112.3352, 37.9413],
'威海': [121.9482, 37.1393],
'宁波': [121.5967, 29.6466],
'宝鸡': [107.1826, 34.3433],
'宿迁': [118.5535, 33.7775],
'常州': [119.4543, 31.5582],
'广州': [113.5107, 23.2196],
'廊坊': [116.521, 39.0509],
'延安': [109.1052, 36.4252],
'张家口': [115.1477, 40.8527],
'徐州': [117.5208, 34.3268],
'德州': [116.6858, 37.2107],
'惠州': [114.6204, 23.1647],
'成都': [103.9526, 30.7617],
'扬州': [119.4653, 32.8162],
'承德': [117.5757, 41.4075],
'拉萨': [91.1865, 30.1465],
'无锡': [120.3442, 31.5527],
'日照': [119.2786, 35.5023],
'昆明': [102.9199, 25.4663],
'杭州': [119.5313, 29.8773],
'枣庄': [117.323, 34.8926],
'柳州': [109.3799, 24.9774],
'株洲': [113.5327, 27.0319],
'武汉': [114.3896, 30.6628],
'汕头': [117.1692, 23.3405],
'江门': [112.6318, 22.1484],
'沈阳': [123.1238, 42.1216],
'沧州': [116.8286, 38.2104],
'河源': [114.917, 23.9722],
'泉州': [118.3228, 25.1147],
'泰安': [117.0264, 36.0516],
'泰州': [120.0586, 32.5525],
'济南': [117.1582, 36.8701],
'济宁': [116.8286, 35.3375],
'海口': [110.3893, 19.8516],
'淄博': [118.0371, 36.6064],
'淮安': [118.927, 33.4039],
'深圳': [114.5435, 22.5439],
'清远': [112.9175, 24.3292],
'温州': [120.498, 27.8119],
'渭南': [109.7864, 35.0299],
'湖州': [119.8608, 30.7782],
'湘潭': [112.5439, 27.7075],
'滨州': [117.8174, 37.4963],
'潍坊': [119.0918, 36.524],
'烟台': [120.7397, 37.5128],
'玉溪': [101.9312, 23.8898],
'珠海': [113.7305, 22.1155],
'盐城': [120.2234, 33.5577],
'盘锦': [121.9482, 41.0449],
'石家庄': [114.4995, 38.1006],
'福州': [119.4543, 25.9222],
'秦皇岛': [119.2126, 40.0232],
'绍兴': [120.564, 29.7565],
'聊城': [115.9167, 36.4032],
'肇庆': [112.1265, 23.5822],
'舟山': [122.2559, 30.2234],
'苏州': [120.6519, 31.3989],
'莱芜': [117.6526, 36.2714],
'菏泽': [115.6201, 35.2057],
'营口': [122.4316, 40.4297],
'葫芦岛': [120.1575, 40.578],
'衡水': [115.8838, 37.7161],
'衢州': [118.6853, 28.8666],
'西宁': [101.4038, 36.8207],
'西安': [109.1162, 34.2004],
'贵阳': [106.6992, 26.7682],
'连云港': [119.1248, 34.552],
'邢台': [114.8071, 37.2821],
'邯郸': [114.4775, 36.535],
'郑州': [113.4668, 34.6234],
'鄂尔多斯': [108.9734, 39.2487],
'重庆': [107.7539, 30.1904],
'金华': [120.0037, 29.1028],
'铜川': [109.0393, 35.1947],
'银川': [106.3586, 38.1775],
'镇江': [119.4763, 31.9702],
'长春': [125.8154, 44.2584],
'长沙': [113.0823, 28.2568],
'长治': [112.8625, 36.4746],
'阳泉': [113.4778, 38.0951],
'青岛': [120.4651, 36.3373],
'韶关': [113.7964, 24.7028]
};
var provinces = ['shanghai', 'hebei', 'shanxi', 'neimenggu', 'liaoning', 'jilin', 'heilongjiang', 'jiangsu', 'zhejiang', 'anhui', 'fujian', 'jiangxi', 'shandong', 'henan', 'hubei', 'hunan', 'guangdong', 'guangxi', 'hainan', 'sichuan', 'guizhou', 'yunnan', 'xizang', 'shanxi1', 'gansu', 'qinghai', 'ningxia', 'xinjiang', 'beijing', 'tianjin', 'chongqing', 'xianggang', 'aomen', 'taiwan']
var provincesText = ['上海', '河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', '湖南', '广东', '广西', '海南', '四川', '贵州', '云南', '西藏', '陕西', '甘肃', '青海', '宁夏', '新疆', '北京', '天津', '重庆', '香港', '澳门', '台湾']
var planePath = 'path://M.6,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705';
var convertData = function (data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
var fromCoord = geoCoordMap[dataItem.fromName];
var toCoord = geoCoordMap[dataItem.toName];
if (fromCoord && toCoord) {
res.push({
fromName: dataItem.fromName,
toName: dataItem.toName,
coords: [fromCoord, toCoord]
});
}
}
return res;
};
function SetMap() {
var url = '../showdata/mapset.html';
$("#iframeWin").show();
//var name = 'add';
//var iWidth = 500;
//var iHeight = 500;
////获得窗口的垂直位置
//var iTop = (window.screen.availHeight - 30 - iHeight) / 2;
////获得窗口的水平位置
//var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;
//window.open(url, name, 'height=' + iHeight + ',,innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,titlebar=no');
};
var series = [];
var mapSelected = 'china';
var showMapText = false;
var count = 0;
var seriesIndex;
var dataLength;
var dataIndex;
var timeTicket;
var geoData = {};
var mapJsonData;
var color = ['#ffa259', '#fe6845', '#fa4252', '#3fc5f0', '#c72c41', '#f4efd3', '#c72c41', '#e13a9d', '#e13a9d', '#ffd800', '#51eaea', '#a3f7bf', '#3ed4ff', '#ffa022', '#a6c84c'];
var chartOption = {
title: {
show: true,
text: '实时货量流向图',
target: null,
subtext: '地图设置',
//sublink: '../showdata/mapset.html',
sublink: 'javascript:SetMap();',
subtarget: 'self',
x: 'center',
y: 'top',
textAlign: null,
backgroundColor: 'rgba(0,0,0,0)',
borderColor: '#ccc',
borderWidth: 0,
padding: 5,
itemGap: 10,
textStyle: {
fontSize: 30,
fontStyle: 'normal',
fontWeight: 'normal',
color: 'white'
}
},
tooltip: {
trigger: 'item',
},
legend: {
orient: 'vertical',
top: 'bottom',
left: 'right',
data: [],
textStyle: {
color: '#fff'
},
selectedMode: 'single'
},
geo: {
label: {
normal: {
show: showMapText,
color: 'white',
fontSize: 13
},
emphasis: {
show: false
}
},
roam: false,
layoutCenter: ['50%', '50%'],
layoutSize: "110%",
itemStyle: {
normal: {
areaColor: '#101f32',
borderColor: '#43d0d6'
},
emphasis: {
areaColor: '#617be3'
}
},
regions: []
},
series: []
};
var isProvince = function (name) {
return provincesText.some(function (province) {
return province === name
})
};
var isCity = function (name) {
var cityvalue = cityMap[name];
if (cityvalue != undefined) {
return true;
}
return false;
};
var facheList = function () {
series.push({
type: 'lines',
zlevel: 12,
effect: {
show: true,
period: 3,
trailLength: 0.7,
color: '#fff',
symbol: 'arrow',
symbolSize: 8,
xAxisIndex: 0,
yAxisIndex: 0,
polarIndex: 0,
geoIndex: 0,
calendarIndex: 0,
},
lineStyle: {
normal: {
color: 'white',
width: 1,
opacity: 0.8,
curveness: 0.2
}
},
data: convertData(geoData.facheList)
}, {
type: 'lines',
zlevel: 12,
effect: {
show: true,
period: 3,
trailLength: 0,
symbol: planePath,
symbolSize: 8
},
lineStyle: {
normal: {
color: '#9b45e4',
width: 1,
opacity: 0.6,
curveness: 0.2
}
},
data: convertData(geoData.facheList)
});
playFaCheList(geoData.facheList);
};
var cityList = function () {
for (let i = 0; i < geoData.cityList.length; i++) {
var ci = geoData.cityList[i];
series.push({
name: ci.name,
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: {
period: 4,
scale: 2.5,
brushType: 'stroke'
},
label: {
normal: {
//show: true,
position: 'right',
offset: [1, 0],
formatter: '{b}'
}
},
symbolSize: 10,
itemStyle: {
normal: {
color: '#00ffff'
},
emphasis: {
color: 'green'
}
},
tooltip: {
trigger: 'item',
padding: 0,
enterable: true,
transitionDuration: 1,
textStyle: {
color: '#000',
decoration: 'none',
},
showDelay: 2,
formatter: function (params) {
var tipHtml = '';
tipHtml = '<div style="width:200px;height:120px;background:rgba(22,80,158,0.8);border:1px solid rgba(7,166,255,0.7)">'
+ '<div style="width:100%;height:40px;line-height:40px;border-bottom:2px solid rgba(7,166,255,0.7);padding:0 20px">' + '<i style="display:inline-block;width:8px;height:8px;background:#16d6ff;border-radius:40px;">' + '</i>'
+ '<span style="margin-left:10px;color:#fff;font-size:16px;">' + params.name + '</span>' + '</div>'
+ '<div style="padding:10px">'
+ '<p style="color:#fff;font-size:15px;">发货库存:' + params.data.fhkc + '</p>'
+ '<p style="color:#fff;font-size:15px;">在途库存:' + params.data.ztkc + '</p>'
+ '<p style="color:#fff;font-size:15px;">到货库存:' + params.data.dhkc + '</p>'
+ '</div>' + '</div>';
return tipHtml;
},
axisPointer: {
show: true,
type: 'cross',
lineStyle: {
type: 'dashed',
width: 1
}
}
},
data: [{
name: ci.name,
value: geoCoordMap[ci.name],
fhkc: ci.fhkc,
ztkc: ci.ztkc,
dhkc: ci.dhkc
}]
});
};
};
var playList = function () {
series.push({
name: '',
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: -2,
rippleEffect: {
period: 0,
scale: 0,
brushType: 'stroke'
},
label: {
normal: {
show: false,
position: 'right',
offset: [5, 0],
formatter: '{b}'
}
},
symbolSize: 0,
itemStyle: {
normal: {
color: '#ffa259'
},
emphasis: {
color: 'green'
}
},
tooltip: {
trigger: 'item',
padding: 0,
enterable: true,
transitionDuration: 1,
textStyle: {
color: '#000',
decoration: 'none',
},
showDelay: 2,
formatter: function (params) {
var tipHtml = '';
tipHtml = '<div style="width:200px;height:120px;background:rgba(22,80,158,0.8);border:1px solid rgba(7,166,255,0.7)">'
+ '<div style="width:100%;height:40px;line-height:40px;border-bottom:2px solid rgba(7,166,255,0.7);padding:0 20px">' + '<i style="display:inline-block;width:8px;height:8px;background:#16d6ff;border-radius:40px;">' + '</i>'
+ '<span style="margin-left:10px;color:#fff;font-size:16px;">' + params.name + '</span>' + '</div>'
+ '<div style="padding:10px">'
+ '<p style="color:#fff;font-size:15px;">发货库存:' + params.data.fhkc + '</p>'
+ '<p style="color:#fff;font-size:15px;">在途库存:' + params.data.ztkc + '</p>'
+ '<p style="color:#fff;font-size:15px;">到货库存:' + params.data.dhkc + '</p>'
+ '</div>' + '</div>';
return tipHtml;
},
axisPointer: {
show: true,
type: 'cross',
lineStyle: {
type: 'dashed',
width: 1
}
}
},
data: geoData.cityList.map(function (ci) {
return {
name: ci.name,
value: geoCoordMap[ci.name],
fhkc: ci.fhkc,
ztkc: ci.ztkc,
dhkc: ci.dhkc
};
})
});
};
var seriesData = function () {
series = [];
facheList();
cityList();
//playList();
count = 0;
timeTicket = null;
seriesIndex = series.length - 1;
dataLength = series[seriesIndex].data.length;
dataIndex = 0;
chartOption.series = series;
};
var loadMap = function (param) {
var url = "../showdata/js/map/" + param + ".js";
$.ajax({
url: url,
dataType: "json"
}).done(function (data) {
mapJsonData = data;
echarts.registerMap(param, mapJsonData);
if (param != 'china' && param != '全国') {
showMapText = true;
}
else {
showMapText = false;
}
chartOption.geo.map = param;
chartOption.geo.label.normal.show = showMapText;
for (let i = 0; i < lightProvince.length; i++) {
let city = lightProvince[i];
chartOption.geo.regions.push({
name: city,
itemStyle: {
normal: {
areaColor: lightColor[city]
}
},
label: {
normal: {
show: true
},
emphasis: {
show: true
},
}
});
}
myMapChart.hideLoading();
myMapChart.setOption(chartOption);
});
};
var playFaCheList = function (data) {
//var html = '<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="author" content="" /> <style type="text/css"> *{margin:10px;padding:10px;border:0px; }body{font-size:20px;color:"white";} #demo{ overflow:hidden; height:100px; width:280px; margin:90px auto; position:relative; } #demo1{ height:auto; text-align:left; } #demo1 li{ list-style-type:none; height:22px; text-align:left; text-indent:15px; } </style></head><body><div id="demo"> <ul id="demo1"> '
//for (let i = 0 ; i < data.length; i++) {
// var item = data[i];
// html += '<li>' + item.fromName + '=>' + item.toName + '</li>'
//}
//html += '</li> </ul> <div id="demo2"></div></div><script type="text/javascript"> var speed=80 ; var demo=document.getElementById("demo"); var demo1=document.getElementById("demo1"); function Marquee(){ if(demo.scrollTop>=demo1.offsetHeight){ demo.scrollTop=0; } else{ demo.scrollTop=demo.scrollTop+1; } };var MyMar=setInterval(Marquee,speed); demo.onmouseover=function(){clearInterval(MyMar)}; demo.onmouseout=function(){MyMar=setInterval(Marquee,speed)};</script></body></html>'
//var x = document.getElementById("iframe_play_fc");
//x.srcdoc = html;
var ul = document.getElementById("fachelist_ul");
for (let i = 0 ; i < data.length; i++) {
let item = data[i];
let li = document.createElement("li");
li.innerHTML = '<li><a href="#">'
+ (i + 1) + ' . '
+ item.billdate + ' '
//+ item.inonevehicleflag
+ ' 车牌:' + item.vehicleno + ' '
+ '<span style="color:#ff8ba7">' + item.fromName + '=》'
+ item.full_toName + '</span> '
+ '</a></li>';
ul.appendChild(li);
}
}
function map() {
myMapChart = echarts.getInstanceByDom(document.getElementById('map_1'));
if (myMapChart == undefined) {
myMapChart = echarts.init(document.getElementById('map_1'));
}
myMapChart.showLoading({
text: '正在加载数据.....',
color: '#fff',
textColor: '#fff',
maskColor: '#46b3e6',
zlevel: 0
});
$.ajax({
url: "/BI/GetgeoCoordData",
type: "GET",
data: { cache: false },
dataType: 'json',
cache: false,
success: function (result) {
if (result.status) {
if (result.data.length > 0) {
var data = JSON.parse(result.data);
geoCoordMap = $.extend(geoCoordMap, data);
lightProvince = data.provinceList;
$.ajax({
url: "/BI/GetgeoData",
type: "GET",
data: { cache: false },
dataType: 'json',
cache: false,
success: function (result) {
if (result.status) {
if (result.data.length > 0) {
var data = JSON.parse(result.data);
geoData = data;
seriesData();
$.ajax({
url: "/BI/GetProvinceCode",
type: "GET",
dataType: 'json',
success: function (result) {
if (result.status) {
if (result.data.length > 0) {
if (result.data == 'china') {
mapSelected = 'china';
}
else {
mapSelected = py_provinceMap[result.data];
}
loadMap(result.data);
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
return;
},
dataType: "json"
}).fail(function (jqXHR, textStatus) {
console.log("Ajax Error: ", textStatus);
});
window.addEventListener("resize", function () {
myMapChart.resize();
});
var setProvinceCode = function (provinceCode) {
$.ajax({
url: "/BI/SetProvinceCode",
type: "GET",
data: { provinceCode: provinceCode },
dataType: 'json',
cache: false,
success: function (result) {
return;
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
return;
},
dataType: "json"
}).fail(function (jqXHR, textStatus) {
console.log("Ajax Error: ", textStatus);
});
};
myMapChart.on('click', function (ev) {
if (isProvince(ev.name)) {
mapSelected = ev.name
console.log(mapSelected)
loadMap(provinceMap[ev.name]);
}
else if (isCity(ev.name)) {
mapSelected = ev.name;
loadMap(cityMap[ev.name]);
}
else {
mapSelected = 'china'
loadMap(mapSelected)
}
});
//timeTicket && clearInterval(timeTicket);
//timeTicket = setInterval(function () {
// myMapChart.dispatchAction({
// type: 'showTip',
// seriesIndex: seriesIndex,
// dataIndex: dataIndex
// });
// count++;
// dataIndex++;
// if (dataIndex >= dataLength) {
// dataIndex = 0;
// }
//}, 5000);
//myMapChart.on('mouseover', function (params) {
// console.log(params)
// clearInterval(timeTicket);
// myMapChart.dispatchAction({
// type: 'showTip',
// seriesIndex: seriesIndex,
// dataIndex: dataIndex
// });
// count++;
// dataIndex++;
// if (dataIndex >= dataLength) {
// dataIndex = 0;
// }
//}, 5000);
//myMapChart.on('mouseout', function (params) {
// timeTicket && clearInterval(timeTicket);
// timeTicket = setInterval(function () {
// myMapChart.dispatchAction({
// type: 'showTip',
// seriesIndex: seriesIndex,
// dataIndex: dataIndex
// });
// count++;
// dataIndex++;
// if (dataIndex >= dataLength) {
// dataIndex = 0;
// }
// }, 5000)
//});
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
return;
},
dataType: "json"
}).fail(function (jqXHR, textStatus) {
console.log("Ajax Error: ", textStatus);
});
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
return;
},
dataType: "json"
}).fail(function (jqXHR, status) {
console.log("Ajax Error: ", status);
});
}
最后既可实现如上效果,点中相应的图例还进行预览。
图表
以这个图表为例,这个是柱状图。
同样先引入div图层
<div class="allnav" id="echart5_1"></div>
js调用实现
//员工学历分布
function echarts_GetXLData() {
var myChart = echarts.init(document.getElementById('echart5_1'));
var itemStyle = {
normal: {
color: new echarts.graphic.LinearGradient(
0, 1, 0, 0, [{
offset: 0,
color: '#2af598'
}, {
offset: 1,
color: '#009efd'
}]
),
barBorderRadius: 4
},
emphasis: {
color: new echarts.graphic.LinearGradient(
0, 1, 0, 0, [{
offset: 0,
color: '#2af598'
}, {
offset: 1,
color: '#009efd'
}]
),
barBorderRadius: 4
}
};
// 指定图表的配置项和数据
var option = {
options: []
};
myChart.setOption(option);
$.ajax({
url: "/paymentWelfare/GetSalaryBigDataBYXL",
type: "GET",
data: { cache: false },
dataType: 'json',
cache: false,
success: function (result) {
if (result.status) {
if (result.data.length > 0) {
var data = JSON.parse(result.data);
var namearr = [];
var valuearr = [];
for (let i in data) {
namearr.push(data[i].name);
valuearr.push(data[i].value);
}
myChart.setOption({
tooltip: {
trigger: 'axis',
textStyle: {
color: "#ffffff"
},
formatter: function (data) {
var x = data[0];
if (x == undefined) {
return "";
}
return x.name + "<br/>" + x.seriesName + ":" + x.data;
}
},
legend: {
show: true,
x: 'right',
top: 15,
data: ['学历'],
textStyle: {
color: 'white',
fontSize: 15
}
},
//calculable: true,
grid: {
y: 40,
y2: 80,
left: '12%',
right: '4%',
bottom: '10%'
},
xAxis: [{
type: 'category',
axisLabel: {
interval: 0,
rotate: 0,
textStyle: { fontSize: 12, color: '#ffffff' }
},
axisLine: {
lineStyle: {
color: 'white',
width: 1
}
},
data: namearr
}],
yAxis: [{
"axisTick": {
"show": false
},
//"splitLine": {
// "show": false
//},
type: 'value',
nameTextStyle: {
color: "white",
fontSize: 15,
padding: 10
},
axisLabel: {
textStyle: { color: 'white', fontSize: 12 },
title: { textStyle: { color: 'white' } }
},
axisLine: {
lineStyle: {
color: 'white',
width: 1
}
},
splitLine: {
lineStyle: {
type: 'dashed',
color: '#0d48e0'
}
},
}],
series: [{
name: '学历',
yAxisIndex: 0,
type: 'bar',
itemStyle: itemStyle,
barWidth: 25,
label: {
normal: {
show: true,
position: 'top',
//formatter: '{c}' + '万元',
color: 'white'
}
},
data: valuearr
}]
});
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
return;
},
dataType: "json"
}).fail(function (jqXHR, textStatus) {
console.log("Ajax Error: ", textStatus);
});
window.addEventListener("resize", function () {
myChart.resize();
});
}
后端代码调用,获取数据
/// <summary>
/// 学历
/// </summary>
/// <param name="cache"></param>
/// <returns></returns>
public ActionResult GetSalaryBigDataBYXL(bool cache = false)
{
string fileName = "xl.json";
if (cache == true)
{
string jsonData = GetData(fileName);
if (string.IsNullOrEmpty(jsonData) == false)
{
return Json(new { status = true, data = jsonData }, JsonRequestBehavior.AllowGet);
}
}
DataTable dt = GetHrBigData().Tables[3];
List<nameValue> data = new List<nameValue> { };
for (int i = 0; i < dt.Rows.Count; i++)
{
data.Add(new nameValue(dt.GetFieldValue<string>("name", i).ToStr(),
decimal.Round(dt.GetFieldValue<decimal>("count", i).ToDecimal(), 1)));
}
string json = data.ToJson();
SaveData(fileName, json);
return Json(new { status = true, data = json }, JsonRequestBehavior.AllowGet);
}
以上完成既可实现漂亮的图表了,其他饼图,折线图等等即同理实现,更新的实现效果多看看官网的帮助文档,你也可以实现漂亮的图表了,一起来交流学习吧!
消息滚动
<div class="xpanel xpanel-r-t">
<div class="title"><span>员工提醒信息播报</span></div>
<div class="scrollDiv" id="fachelist_div" style="height:70%;">
<ul id="fachelist_ul"></ul>
</div>
</div>
(function ($) {
$.fn.extend({
Scroll: function (opt, callback) {
//参数初始化
if (!opt) var opt = {};
var _this = this.eq(0).find("ul:first");
var lineH = _this.find("li:first").height(),
//line = opt.line ? parseInt(opt.line, 10) : parseInt(this.height() / lineH, 10),
line = 1,
speed = opt.speed ? parseInt(opt.speed, 10) : 2000,
timer = opt.timer ? parseInt(opt.timer, 10) : 3000;
if (line == 0) line = 1;
var upHeight = 0 - line * lineH;
scrollUp = function () {
_this.animate({
marginTop: upHeight
}, speed, function () {
for (i = 1; i <= line; i++) {
_this.find("li:first").appendTo(_this);
}
_this.css({
marginTop: 0
});
});
}
_this.hover(function () {
clearInterval(timerID);
}, function () {
timerID = setInterval("scrollUp()", timer);
}).mouseout();
}
});
})(jQuery);
$(document).ready(function () {
$("#fachelist_div").Scroll({
line: 4,
speed: 500,
timer: 4000
});
});
js文件获取数据代码
//消息提醒数据
function echarts_GetMsgData() {
var ul = document.getElementById("fachelist_ul");
$.ajax({
url: "/paymentWelfare/GetSalaryBigDataBYMsg",
type: "GET",
data: { cache: false },
dataType: 'json',
cache: false,
success: function (result) {
if (result.status) {
if (result.data.length > 0) {
var data = JSON.parse(result.data);
for (let i = 0 ; i < data.length; i++) {
let item = data[i];
let li = document.createElement("li");
li.innerHTML = '<li>' + '<span style="color:#FFFFFF">'
+ (i + 1) + ' . '
+ item.name + ' ' + '</span> '
+ '</li>';
ul.appendChild(li);
}
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
return;
},
dataType: "json"
}).fail(function (jqXHR, textStatus) {
console.log("Ajax Error: ", textStatus);
});
}
后台获取数据
/// <summary>
/// 获取消息
/// </summary>
/// <param name="cache"></param>
/// <returns></returns>
public ActionResult GetSalaryBigDataBYMsg(bool cache = false)
{
string fileName = "msg.json";
if (cache == true)
{
string jsonData = GetData(fileName);
if (string.IsNullOrEmpty(jsonData) == false)
{
return Json(new { status = true, data = jsonData }, JsonRequestBehavior.AllowGet);
}
}
DataTable dt = GetHrBigData().Tables[5];
List<nameValue> data = new List<nameValue> { };
for (int i = 0; i < dt.Rows.Count; i++)
{
data.Add(new nameValue(dt.GetFieldValue<string>("name", i).ToStr(),
decimal.Round(dt.GetFieldValue<decimal>("count", i).ToDecimal(), 1)));
}
string json = data.ToJson();
SaveData(fileName, json);
return Json(new { status = true, data = json }, JsonRequestBehavior.AllowGet);
}
以上完成既可以实现消息的滚屏显示
以上从代码实现的角度介绍了我是怎么实现的这样一个效果的过程,工资大数据实现同人事一样,都是相同的控件去实现。
结束语
做好大数据分析任重道远,本人也是今年在这方面投入了大力气去学习,之前用WPF实现了一个,可以看我上一篇写的博文,就有介绍过,实现以上两个界面的大数据是用BS来实现的,图表全部用的是echarts,实现出来的图表费用漂亮,其实在做好这样的一个效果出来首先还得去网上找一个好的模板,再去做调整,完成从一个全新开发可能难度较大,样式布局啥的都不会这么专业,我其实是省去了前面部分的工作了,只花了三四天时间既完成了以上效果,速度还是挺快的,公司领导层对这效果也是非常满意的,以后会加强在这方面的研发,让公司的业务,财务数据都能很好在图表方面进行呈现出来,这样客户也会非常喜欢的。
以上个人愚见,一起加强学习进步!
附件:工资模块实现的最初模板。
https://files.cnblogs.com/files/luoyuhao/echartssjmoban8947202005210009.zip
来源:oschina
链接:https://my.oschina.net/u/4394131/blog/4523302