271 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			271 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <template>
 | |
| 	<view class="content">
 | |
| 		<view class="themapdiv">
 | |
| 			<view class="my_market">
 | |
| 				<view class="ma_in" style="border-right: 2rpx solid #eeeeee;">
 | |
| 					<view> {{ '全国市场' }}</view>
 | |
| 					<view> {{ marketData.countryNum }}{{ '国家' }}</view>
 | |
| 					<view> {{ marketData.regionNum }}{{ '地区' }}</view>
 | |
| 
 | |
| 				</view>
 | |
| 				<view class="ma_in">
 | |
| 					<view>{{ '我的市场' }}</view>
 | |
| 					<view>{{ marketData.myCountryNum }}{{ '国家' }}</view>
 | |
| 					<view>{{ marketData.myRegionNum }}{{ '地区' }}</view>
 | |
| 				</view>
 | |
| 			</view>
 | |
| 			<view class="chart pt-10">
 | |
| 				<view id="mapChart" class="mapChart"></view>
 | |
| 				<view class="mapChoose">
 | |
| 					<view class="mapimg" v-if="userInfo.pkCountry == 1">
 | |
| 						<img class="theimg" v-if="theMapC == 2" @click="chooseMap(1)"
 | |
| 							src="../../../static/images/wordmap.png" alt="" />
 | |
| 						<img class="theimg" v-if="theMapC == 1" @click="chooseMap(2)"
 | |
| 							src='../../../static/images/chinamap.png' alt="" />
 | |
| 					</view>
 | |
| 				</view>
 | |
| 			</view>
 | |
| 		</view>
 | |
| 	</view>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| 	import {
 | |
| 		getMyMarket
 | |
| 	} from '@/config/mine.js'
 | |
| 	import {
 | |
| 		_debounce
 | |
| 	} from "@/config/common.js";
 | |
| 	import axios from "axios";
 | |
| 	export default {
 | |
| 		data() {
 | |
| 			return {
 | |
| 				userInfo: [],
 | |
| 				countryList: [],
 | |
| 				myChart: null,
 | |
| 				chinaCode: "china",
 | |
| 				curMapName: "china", // 当前地图名
 | |
| 				selectedMaps: [{
 | |
| 						name: "世界",
 | |
| 						code: "world",
 | |
| 					},
 | |
| 					{
 | |
| 						name: "China",
 | |
| 						code: "china",
 | |
| 					},
 | |
| 				],
 | |
| 				theMapC: 2, //1中国2世界
 | |
| 				colorList: [],
 | |
| 				marketData: {},
 | |
| 			}
 | |
| 		},
 | |
| 		onShow() {
 | |
| 			this.theMapC=2
 | |
| 			this.userInfo = uni.getStorageSync('User')
 | |
| 			if (this.userInfo.pkCountry != 1) {
 | |
| 				this.theMapC = 1; //1中国2世界
 | |
| 				this.chinaCode = "world";
 | |
| 				this.curMapName = "world"; // 当前地图名
 | |
| 			}else{
 | |
| 				this.theMapC = 2; //1中国2世界
 | |
| 				this.chinaCode = "china";
 | |
| 				this.curMapName = "china"; // 当前地图名
 | |
| 			}
 | |
| 			this.getMapData(this.chinaCode);
 | |
| 			window.addEventListener("resize", this.resizeCharts);
 | |
| 		},
 | |
| 		methods: {
 | |
| 			// 绘制地图
 | |
| 			async drawMapChart(mapName, mapJSON) {
 | |
| 				if (
 | |
| 					this.myChart != null &&
 | |
| 					this.myChart != "" &&
 | |
| 					this.myChart != undefined
 | |
| 				) {
 | |
| 					this.myChart.dispose();
 | |
| 				}
 | |
| 				this.myChart = this.$echarts.init(document.getElementById("mapChart"));
 | |
| 				this.$echarts.registerMap(mapName, mapJSON);
 | |
| 
 | |
| 				// 获取颜色列表
 | |
| 				const res = await getMyMarket();
 | |
| 				this.marketData = res.data;
 | |
| 				res.data.myMarketDetailVOList.forEach((ele) => {
 | |
| 					if (ele != null) {
 | |
| 						ele.name = ele.lightName;
 | |
| 					}
 | |
| 				});
 | |
| 				const thecolorJson = res.data.myMarketDetailVOList.filter(
 | |
| 					(item) => item !== null
 | |
| 				);
 | |
| 				// 修改颜色列表
 | |
| 				thecolorJson.forEach((item) => {
 | |
| 					item.itemStyle = {
 | |
| 						normal: {
 | |
| 							areaColor: "#005BAC", // 选中区域的颜色
 | |
| 						},
 | |
| 					};
 | |
| 				});
 | |
| 				this.myChart.setOption({
 | |
| 					series: [{
 | |
| 						type: "map",
 | |
| 						map: mapName,
 | |
| 						roam: false, // 是否开启鼠标缩放和平移漫游
 | |
| 						zoom: 1,
 | |
| 						selectedMode: "false", // 是否允许选中多个区域
 | |
| 						label: {
 | |
| 							show: false, //地图上地区文字的现实
 | |
| 							color: "#a8e6e1",
 | |
| 						},
 | |
| 
 | |
| 						emphasis: {
 | |
| 							label: {
 | |
| 								show: true,
 | |
| 								color: "#ffffff",
 | |
| 							},
 | |
| 						},
 | |
| 						itemStyle: {
 | |
| 							normal: {
 | |
| 								areaColor: "#bae7ff",
 | |
| 								borderColor: "#ffffff",
 | |
| 								borderWidth: 1,
 | |
| 							},
 | |
| 							//鼠标悬浮区域上的背景颜色
 | |
| 							emphasis: {
 | |
| 								show: true,
 | |
| 								areaColor: "#005BAC",
 | |
| 							},
 | |
| 						},
 | |
| 						tooltip: {
 | |
| 							trigger: "item",
 | |
| 							show: true,
 | |
| 							backgroundColor: "transparent",
 | |
| 
 | |
| 							textStyle: {
 | |
| 								width: 300,
 | |
| 								height: 300,
 | |
| 							},
 | |
| 						},
 | |
| 
 | |
| 						data: thecolorJson, // 使用修改后的颜色列表作为地图数据
 | |
| 					}, ],
 | |
| 				});
 | |
| 
 | |
| 				this.myChart.on("click", (params) => {});
 | |
| 			},
 | |
| 			initMapData(mapJson) {
 | |
| 				var thecolorJson = this.colorList;
 | |
| 				thecolorJson.map((item) => {
 | |
| 					item.itemStyle = {
 | |
| 						normal: {
 | |
| 							areaColor: "#005BAC", //选中区域的颜色
 | |
| 						},
 | |
| 					};
 | |
| 				});
 | |
| 				let mapData = [];
 | |
| 
 | |
| 				for (let i = 0; i < mapJson.features.length; i++) {
 | |
| 					mapData.push({
 | |
| 						name: mapJson.features[i].properties.name
 | |
| 					});
 | |
| 				}
 | |
| 				return thecolorJson;
 | |
| 			},
 | |
| 			// 地图标题菜单点击
 | |
| 			chooseMap(val) {
 | |
| 				//val==1中国val==2世界
 | |
| 				if (val == 1) {
 | |
| 					this.theMapC = 1;
 | |
| 					this.getMapData("world");
 | |
| 				} else if (val == 2) {
 | |
| 					this.theMapC = 2;
 | |
| 					this.getMapData("china");
 | |
| 				}
 | |
| 			},
 | |
| 			// 浏览器窗口大小改变时,重新加载图表以自适应
 | |
| 			resizeCharts: _debounce(function() {
 | |
| 				this.$echarts.init(document.getElementById("mapChart")).resize();
 | |
| 			}, 500),
 | |
| 			// 获取地图数据
 | |
| 			getMapData(map) {
 | |
| 				axios
 | |
| 					.get(`/static/map/${map}.json`)
 | |
| 					// .get(`/map/${map}.json`)
 | |
| 					.then((res) => {
 | |
| 						if (res.status == 200) {
 | |
| 							const mapJSON = res.data;
 | |
| 							this.drawMapChart(this.curMapName, mapJSON);
 | |
| 						}
 | |
| 					})
 | |
| 					.catch((err) => {
 | |
| 						this.$message({
 | |
| 							message: err,
 | |
| 							type: "error",
 | |
| 							showClose: true
 | |
| 						});
 | |
| 					});
 | |
| 			},
 | |
| 		},
 | |
| 		beforeDestroy() {
 | |
| 			window.addEventListener("resize", this.resizeCharts);
 | |
| 		},
 | |
| 	}
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| 	.content {
 | |
| 		padding: 22rpx 20rpx;
 | |
| 
 | |
| 		.themapdiv {
 | |
| 			background-color: #ffffff;
 | |
| 			border-radius: 20rpx;
 | |
| 
 | |
| 			.my_market {
 | |
| 				padding: 48rpx 0 0 0;
 | |
| 				width: 100%;
 | |
| 				display: flex;
 | |
| 				align-items: center;
 | |
| 
 | |
| 				.ma_in {
 | |
| 					flex: 1;
 | |
| 					text-align: center;
 | |
| 					font-size: 30rpx;
 | |
| 					font-family: Source Han Sans CN;
 | |
| 					font-weight: 400;
 | |
| 					color: #333333;
 | |
| 					line-height: 54rpx;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			.chart {
 | |
| 				.mapChart{
 | |
| 					width: 100%;
 | |
| 					height: 630rpx;
 | |
| 					position: relative;
 | |
| 				}
 | |
| 				
 | |
| 
 | |
| 				.mapChoose {
 | |
| 					position: absolute;
 | |
| 					left: 20rpx;
 | |
| 					top:680rpx;
 | |
| 					color: #eee;
 | |
| 
 | |
| 					.mapimg {
 | |
| 						width: 220rpx;
 | |
| 						height: 150rpx;
 | |
| 						border-radius: 20rpx;
 | |
| 						opacity: 1;
 | |
| 						border: 4rpx solid #cccccc;
 | |
| 						cursor: pointer;
 | |
| 
 | |
| 						.theimg {
 | |
| 							width: 100%;
 | |
| 							height: 100%;
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| </style> |