This commit is contained in:
仲么了
2024-02-19 13:44:32 +08:00
commit 361cbb713d
238 changed files with 202544 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

11
.prettierrc Normal file
View File

@@ -0,0 +1,11 @@
{
"singleQuote": true,
"trailingComma": "none",
"tabWidth": 4,
"printWidth": 120,
"useTabs": false,
"semi": false,
"arrowParens": "avoid",
"endOfLine": "lf",
"htmlWhitespaceSensitivity": "ignore"
}

3
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
}

15
README.md Normal file
View File

@@ -0,0 +1,15 @@
Vue 3 + TypeScript + Vite
这个模板可以帮助您开始使用Vue 3和TypeScript在Vite中进行开发。该模板使用了Vue 3的<script setup>script setup
推荐的IDE设置
VS Code + Volar并禁用Vetur+ TypeScript Vue Plugin (Volar)。
在TS中对.vue导入提供类型支持
TypeScript 默认情况下无法处理.vue导入的类型信息因此我们用vue-tsc替换了tsc CLI进行类型检查。在编辑器中我们需要TypeScript Vue Plugin (Volar)来让TypeScript语言服务了解.vue类型。
如果独立的TypeScript插件对您来说不够快Volar还实现了一种Take Over Mode它的性能更好。您可以按照以下步骤启用它
禁用内置的TypeScript扩展
从VSCode的命令面板中运行Extensions: Show Built-in Extensions
找到TypeScript and JavaScript Language Features右键单击并选择Disable (Workspace)
通过运行Developer: Reload Window命令重新加载VSCode窗口。

13
index.html Normal file
View File

@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>电能质量数据监测云平台</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

47
package.json Normal file
View File

@@ -0,0 +1,47 @@
{
"name": "canneng-admin",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
"@fortawesome/fontawesome-free": "^6.5.1",
"@vueuse/core": "^10.7.0",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.6.2",
"crypto-js": "^4.2.0",
"echarts": "^5.4.3",
"echarts4": "npm:echarts@^4.9.0",
"element-plus": "^2.5.3",
"html2canvas": "^1.4.1",
"jquery": "^3.7.1",
"lodash-es": "^4.17.21",
"mitt": "^3.0.1",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"screenfull": "^6.0.2",
"use-element-plus-theme": "^0.0.5",
"vue": "^3.3.11",
"vue-draggable-resizable": "3.0.0-beta.2",
"vue-router": "4",
"vxe-table": "^4.5.17",
"xe-utils": "^3.5.14"
},
"devDependencies": {
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.10.5",
"@vitejs/plugin-vue": "^4.5.2",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"sass": "^1.69.5",
"typescript": "^5.2.2",
"vite": "^5.0.8",
"vue-tsc": "^1.8.25"
}
}

2461
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

1
public/vite.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

16
src/App.vue Normal file
View File

@@ -0,0 +1,16 @@
<template>
<el-config-provider :locale="zhCn">
<router-view></router-view>
</el-config-provider>
</template>
<script lang="ts" setup>
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import useSetTheme from '@/utils/setTheme'
useSetTheme()
</script>
<style lang="scss">
/* Your SCSS styles here */
</style>

View File

@@ -0,0 +1,15 @@
import request from '@/utils/request'
// 新增设备模版
export const addDevModel = (file:any) => {
let form = new FormData()
form.append('file', file)
return request({
url: '/access-boot/analyzeModel/addModel',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data',
},
data: form,
})
}

14
src/api/auth.ts Normal file
View File

@@ -0,0 +1,14 @@
import createAxios from '@/utils/request'
//登录获取token
export function getRouteMenu() {
return createAxios({
url: '/user-boot/function/getRouteMenu'
})
}
//获取字典
export function dictDataCache() {
return createAxios({
url: '/system-boot/dictType/dictDataCache'
})
}

32
src/api/common.ts Normal file
View File

@@ -0,0 +1,32 @@
import createAxios from '@/utils/request'
// 用户名列表
export function saveLogParam() {
return createAxios({
url: '/system-boot/audit/saveLogParam',
method: 'POST'
})
}
// 区域列表
export function getAreaList() {
return createAxios({
url: '/user-boot/dept/deptTree',
method: 'POST'
})
}
// 设备列表
export function getDeviceTree() {
return createAxios({
url: '/cs-device-boot/csLedger/deviceTree',
method: 'POST'
})
}
// 获取波形数据
export function analyseWave(params:string) {
return createAxios({
url: '/cs-harmonic-boot/event/analyseWave?eventId=' + params,
method: 'get'
})
}

View File

@@ -0,0 +1,17 @@
import createAxios from '@/utils/request'
// 装置基础数据和模板数据
export function getDeviceData(deviceId: string, type: string, lineId = '') {
let form = new FormData()
form.append('deviceId', deviceId)
form.append('lineId', lineId)
form.append('type', type)
return createAxios({
url: '/cs-device-boot/EquipmentDelivery/deviceData',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}

View File

@@ -0,0 +1,15 @@
import createAxios from '@/utils/request'
// 更新组和指标关系
export function getDevCapacity(devId: string) {
let form = new FormData()
form.append('id', devId)
return createAxios({
url: '/cs-device-boot/capacity/getDevCapacity',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}

View File

@@ -0,0 +1,15 @@
import createAxios from '@/utils/request'
// 根据数据集获取指标数据
export function getTargetById(id: string) {
let form = new FormData()
form.append('id', id)
return createAxios({
url: '/cs-device-boot/csDataArray/getTargetById',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}

View File

@@ -0,0 +1,10 @@
import createAxios from '@/utils/request'
// 更新组和指标关系
export function updateGroArr(data: any) {
return createAxios({
url: '/cs-device-boot/csGroArr/updateGroArr',
method: 'POST',
data
})
}

View File

@@ -0,0 +1,52 @@
import createAxios from '@/utils/request'
// 查询分组
export function getGroup(dataSet: string) {
let form = new FormData()
form.append('dataSet', dataSet)
return createAxios({
url: '/cs-device-boot/csGroup/getGroup',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
// 装置分组实时数据
export function deviceHisData(data: any) {
return createAxios({
url: '/cs-device-boot/csGroup/deviceHistoryData',
method: 'POST',
data: Object.assign(
{
endTime: '',
id: '',
lineId: '',
pageNum: 1,
pageSize: 20,
startTime: ''
},
data
)
})
}
// 装置分组历史数据
export function deviceRtData(data: any) {
let form = new FormData()
form.append('id', data.id)
form.append('lineId', data.lineId)
form.append('pageNum', data.pageNum)
form.append('pageSize', data.pageSize)
form.append('searchValue', data.searchValue)
return createAxios({
url: '/cs-device-boot/csGroup/deviceRtData',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}

View File

@@ -0,0 +1,17 @@
import createAxios from '@/utils/request'
// 设备列表
export function getDeviceTree() {
return createAxios({
url: '/cs-device-boot/csLedger/deviceTree',
method: 'POST'
})
}
// 监测点列表
export function getLineTree() {
return createAxios({
url: '/cs-device-boot/csLedger/lineTree',
method: 'POST'
})
}

View File

@@ -0,0 +1,10 @@
import request from '@/utils/request'
// 编辑设备模版
export const AuditDevModel = (data:any) => {
return request({
url: '/cs-device-boot/devmodel/AuditDevModel',
method: 'post',
data: data,
})
}

View File

@@ -0,0 +1,24 @@
import request from '@/utils/request'
// 新增程序版本
export const addEdData = (data) => {
return request({
url: '/cs-device-boot/edData/addEdData',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data',
},
data: data,
})
}
export const auditEdData = (data) => {
return request({
url: '/cs-device-boot/edData/auditEdData',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data',
},
data: data,
})
}

View File

@@ -0,0 +1,10 @@
import request from '@/utils/request'
// 上传拓扑图模板监测点位置
export const addLineTemplate = (data: any) => {
return request({
url: '/cs-device-boot/lineTemplate/addLineTemplate',
method: 'POST',
data: data
})
}

View File

@@ -0,0 +1,37 @@
import createAxios from '@/utils/request'
// 上传拓扑图
export const uploadTopo = file => {
let form = new FormData()
form.append('file', file)
return createAxios({
url: '/cs-device-boot/topologyTemplate/uploadImage',
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data'
},
data: form
})
}
// 查询拓扑图模板
export const getTopoTemplate = () => {
return createAxios({
url: '/cs-device-boot/topologyTemplate/queryImage',
method: 'POST'
})
}
//删除拓扑图模板
export const deleteTopoTemplate = id => {
let form = new FormData()
form.append('id', id)
return createAxios({
url: '/cs-device-boot/topologyTemplate/deleteImage',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}

View File

@@ -0,0 +1,55 @@
import createAxios from '@/utils/request'
// 查询游客配置
export const getVisitorConfig = () => {
return createAxios({
url: '/cs-device-boot/csTouristData/queryAll',
method: 'POST'
})
}
/**
* 查询营销人员未选择的工程
*/
export const queryEnginnerByUseId = (data: any) => {
return createAxios({
url: '/cs-device-boot/csMarketData/queryEnginnerByUseId',
method: 'post',
params: data
})
}
// 更新游客配置
export const updateVisitorConfig = (data: any) => {
return createAxios({
url: '/cs-device-boot/csTouristData/add',
method: 'POST',
data: data
})
}
// * 根据用户获取营销数据
export const queryByUseId = (data: any) => {
return createAxios({
url: 'cs-device-boot/csMarketData/queryByUseId',
method: 'POST',
params: data
})
}
// * 新增营销数据
export const add = (data: any) => {
return createAxios({
url: '/cs-device-boot/csMarketData/add',
method: 'POST',
data: data
})
}
/**
* 移除营销数据
*/
export const removeMarketData = (data: any) => {
return createAxios({
url: '/cs-device-boot/csMarketData/remove',
method: 'post',
params: data
})
}

View File

@@ -0,0 +1,14 @@
import createAxios from '@/utils/request'
// 查询设备数据趋势
export function getDeviceDataTrend(data: any) {
return createAxios({
url: '/cs-harmonic-boot/datatrend/querydatatrend',
method: 'POST',
data
})
}

View File

@@ -0,0 +1,20 @@
import createAxios from '@/utils/request'
// 更新组和指标关系
export function queryCommonStatisticalByTime(data: any) {
return createAxios({
url: '/cs-harmonic-boot/stable/queryCommonStatisticalByTime',
method: 'post',
data: Object.assign(
{
devId: '',
endTime: '',
frequency: '',
startTime: '',
statisticalId: '',
valueType: '',
},
data
),
})
}

View File

@@ -0,0 +1,30 @@
import createAxios from '@/utils/request'
/**
* 查询app个人中心信息详情
* @param id
*/
export const queryAppInfo = (type: string) => {
let form = new FormData()
form.append('type', type)
return createAxios({
url: '/cs-system-boot/appinfo/queryAppInfoByType',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
/**
* 新增app基础信息
**/
export const addAppInfo = (data: { type: string, content: string }) => {
return createAxios({
url: '/cs-system-boot/appinfo/addAppInfo',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,66 @@
import createAxios from '@/utils/request'
// 新增出厂设备
export const addEquipmentDelivery = (data: any) => {
return createAxios({
url: '/cs-device-boot/EquipmentDelivery/addEquipmentDelivery',
method: 'POST',
data: data
})
}
// 删除出厂设备
export const deleteEquipmentDelivery = (id: any) => {
let form = new FormData()
form.append('id', id)
return createAxios({
url: '/cs-device-boot/EquipmentDelivery/AuditEquipmentDelivery',
method: 'POST',
data: form
})
}
// 恢复出厂设置
export const resetEquipmentDelivery = (id: any) => {
let form = new FormData()
form.append('nDid', id)
return createAxios({
url: '/access-boot/device/resetFactory',
method: 'POST',
data: form
})
}
// 编辑出厂设备
export const editEquipmentDelivery = (data: any) => {
return createAxios({
url: '/cs-device-boot/EquipmentDelivery/updateEquipmentDelivery',
method: 'POST',
data: data
})
}
// 上传拓扑图
export const uploadTopo = (file: any) => {
let form = new FormData()
form.append('file', file)
return createAxios({
url: '/cs-device-boot/topologyTemplate/uploadImage',
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data'
},
data: form
})
}
// 批量导入设备
export const batchImportDevice = (file: any) => {
let form = new FormData()
form.append('file', file)
return createAxios({
url: '/cs-device-boot/EquipmentDelivery/importEquipment',
method: 'POST',
responseType: 'blob',
data: form
})
}

View File

@@ -0,0 +1,10 @@
import createAxios from '@/utils/request'
// 更新问题状态
export function auditFeedBack(data:any) {
return createAxios({
url: '/cs-system-boot/feedback/auditFeedBack',
method: 'post',
params:data
})
}

View File

@@ -0,0 +1,55 @@
import request from '@/utils/request'
// 新增字典数据
export const addCsDictData = (data: any) => {
return request({
url: '/system-boot/csDictData/add',
method: 'post',
data: data
})
}
// 查询字典数据
export const queryCsDictDataPage = (data: any) => {
return request({
url: '/system-boot/csDictData/list',
method: 'post',
data: Object.assign(
{
orderBy: '',
pageNum: 0,
pageSize: 0,
searchBeginTime: '',
searchEndTime: '',
searchState: 0,
searchValue: '',
dataType: '',
sortBy: ''
},
data
)
})
}
//删除字典数据
export const delCsDictData = (id: string) => {
let form = new FormData()
form.append('id', id)
return request({
url: '/system-boot/csDictData/delete',
method: 'post',
data: form,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
}
// 修改字典数据
export const updateCsDictData = (data: any) => {
return request({
url: '/system-boot/csDictData/update',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,23 @@
import createAxios from '@/utils/request'
// 查询指标
export const queryStatistical = (id:string) => {
let form = new FormData()
form.append('id', id)
return createAxios({
url: '/system-boot/csstatisticalset/queryStatistical',
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
// 绑定指标
export const addStatistical = (params:any) => {
return createAxios({
url: '/system-boot/csstatisticalset/addStatistical',
method: 'post',
data: params
})
}

View File

@@ -0,0 +1,30 @@
import createAxios from '@/utils/request'
export const dicDelete = (id: string) => {
let form = new FormData()
form.append('id', id)
return createAxios({
url: '/system-boot/dic/delete',
method: 'DELETE',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
export function dicAdd(data: any) {
return createAxios({
url: '/system-boot/dic/add',
method: 'post',
data: data
})
}
export function dicUpdate(data: any) {
return createAxios({
url: '/system-boot/dic/update',
method: 'put',
data: data
})
}

View File

@@ -0,0 +1,34 @@
import request from '@/utils/request'
export function dictDataUpdate(data: any) {
return request({
url: '/system-boot/dictData/update',
method: 'post',
data: data
})
}
export function dictDataDelete(data: any) {
return request({
url: '/system-boot/dictData/delete',
method: 'post',
data: data
})
}
export function dictDataGetTypeIdData(data: any) {
return request({
url: '/system-boot/dictData/getTypeIdData',
method: 'post',
data: data
})
}
export function dictDataAdd(data) {
return request({
url: '/system-boot/dictData/add',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,63 @@
import createAxios from '@/utils/request'
// 字典树接口
export function queryByCode(code: string) {
let form = new FormData()
form.append('code', code)
return createAxios({
url: '/system-boot/dictTree/queryByCode',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
// 字典树接口通过code
export function queryCsDictTree(pid: string) {
let form = new FormData()
form.append('pid', pid)
return createAxios({
url: '/system-boot/dictTree/query',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
// 字典树接口通过id
export function queryByid(id: string) {
let form = new FormData()
form.append('id', id)
return createAxios({
url: '/system-boot/dictTree/queryByid',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: form
})
}
//新增字典树数据
export const addDictTree = (data: any) => {
return createAxios({
url: '/system-boot/dictTree/add',
method: 'post',
data: data
})
}
// 编辑统计指标配置项
export const updateStatistical = (data) => {
return createAxios({
url: '/system-boot/dic/update',
method: 'PUT',
data: data
})
}

View File

@@ -0,0 +1,33 @@
import request from '@/utils/request'
export function dictTypeList(data: any) {
return request({
url: '/system-boot/dictType/list',
method: 'post',
data: data
})
}
export function dictTypeUpdate(data: any) {
return request({
url: '/system-boot/dictType/update',
method: 'post',
data: data
})
}
export function dictTypeAdd(data: any) {
return request({
url: '/system-boot/dictType/add',
method: 'post',
data: data
})
}
export function dictTypeDelete(data: any) {
return request({
url: '/system-boot/dictType/delete',
method: 'post',
data: data
})
}

26
src/api/systerm.ts Normal file
View File

@@ -0,0 +1,26 @@
import createAxios from '@/utils/request'
// 菜单修改
export function updateMenu(params: anyObj) {
return createAxios({
url: '/user-boot/function/update',
method: 'PUT',
data: params
})
}
export function addMenu(params: anyObj) {
return createAxios({
url: '/user-boot/function/add',
method: 'POST',
data: params
})
}
export function delMenu(id: string) {
return createAxios({
url: '/user-boot/function/delete?id=' + id,
method: 'delete'
})
}

View File

@@ -0,0 +1,42 @@
import createAxios from '@/utils/request'
export const functionTree = () => {
return createAxios({
url: '/user-boot/function/functionTree'
})
}
// 新增菜单接口
export function add(data: anyObj) {
return createAxios({
url: '/user-boot/function/add',
method: 'post',
data: data
})
}
// 修改菜单接口
export function update(data: anyObj) {
return createAxios({
url: '/user-boot/function/update',
method: 'put',
data: data
})
}
// 删除菜单接口
export function deleteMenu(id: string) {
return createAxios({
url: '/user-boot/function/delete?id=' + id,
method: 'delete',
})
}
// 更新角色菜单
export function updateRoleMenu(data:any) {
return createAxios({
url: '/user-boot/function/assignFunctionByRoleIndexes',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,8 @@
import createAxios from '@/utils/request'
export const refreshReferralCode = () => {
return createAxios({
url: '/user-boot/referralCode/refreshReferralCode',
method: 'post',
})
}

33
src/api/user-boot/role.ts Normal file
View File

@@ -0,0 +1,33 @@
import createAxios from '@/utils/request'
export function add(data: any) {
return createAxios({
url: '/user-boot/role/add',
method: 'post',
data: data
})
}
export function update(data: any) {
return createAxios({
url: '/user-boot/role/update',
method: 'post',
data: data
})
}
export function del(data: any) {
return createAxios({
url: '/user-boot/role/delete',
method: 'post',
data: data
})
}
export function roleList(id: number) {
return createAxios({
url: '/user-boot/role/selectRoleDetail?id=' + id,
method: 'post'
})
}

View File

@@ -0,0 +1,21 @@
import createAxios from '@/utils/request'
export function getFunctionsByRoleIndex(data) {
return createAxios({
url: '/user-boot/roleFunction/getFunctionsByRoleIndex',
method: 'post',
params: data
})
}
export function updateRoleMenu(data:any) {
return createAxios({
url: '/user-boot/function/assignFunctionByRoleIndexes',
method: 'post',
data: data
// params: roleIndex,functionIndexList
// data:{
// roleIndex,functionIndexList
// }
})
}

142
src/api/user-boot/user.ts Normal file
View File

@@ -0,0 +1,142 @@
import request from '@/utils/request'
import { LoginData } from '@/api/types'
import { useAdminInfo } from '@/stores/adminInfo'
import { sm3Digest } from '@/assets/commjs/sm3.js'
import { sm2, encrypt } from '@/assets/commjs/sm2.js'
// 获取公钥
export function gongkey(params?: any) {
if (!params) {
const adminInfo = useAdminInfo()
params = {
loginName: encrypt(adminInfo.$state.loginName)
}
}
return request({
url: '/user-boot/user/generateSm2Key',
method: 'get',
params
})
}
export async function pwdSm3(pwd: any, loginName?: string) {
let publicKey = await gongkey(
loginName
? {
loginName: encrypt(loginName)
}
: false
)
let sm3Pwd = sm3Digest(pwd) //SM3加密
return sm2(sm3Pwd + '|' + pwd, publicKey.data, 0)
}
//登录获取token
export async function login(params: any) {
params.password = await pwdSm3(params.password, params.username)
params.username = encrypt(params.username)
return request({
url: '/pqs-auth/oauth/token',
method: 'post',
params
})
}
//获取用户信息
export function getUserById() {
const adminInfo = useAdminInfo()
return request({
url: '/user-boot/user/getUserById?id=' + adminInfo.userIndex,
method: 'get'
})
}
// 刷新token
export function refreshToken(): Promise<any> {
const adminInfo = useAdminInfo()
return login({
grant_type: 'refresh_token',
refresh_token: adminInfo.refresh_token,
username: adminInfo.loginName
})
}
/**
* 获取营销用户列表
* @returns {AxiosPromise}
*/
export const getMarketList = () => {
return request({
url: '/user-boot/user/getMarketList',
method: 'post'
})
}
export function add(data: any) {
return request({
url: '/user-boot/user/add',
method: 'post',
data: data
})
}
export function edit(data: any) {
return request({
url: '/user-boot/user/update',
method: 'put',
data: data
})
}
export async function passwordConfirm(pwd: string) {
return request({
url: '/user-boot/user/passwordConfirm?password=' + (await pwdSm3(pwd)),
method: 'get'
})
}
export function deluser(data: any) {
return request({
url: '/user-boot/user/delete',
method: 'delete',
params: data
})
}
export function activateUser(data: any) {
return request({
url: '/user-boot/user/activateUser',
method: 'put',
params: data
})
}
export async function updatePassword(params: any) {
return request({
url: '/user-boot/user/updatePassword',
method: 'put',
params: {
id: params.id,
newPassword: await pwdSm3(params.newPassword)
}
})
}
export async function updateFirstPassword(params: any) {
return request({
url: '/user-boot/user/updateFirstPassword',
method: 'put',
data: {
name: encrypt(params.name),
password: await pwdSm3(params.password, params.name)
}
})
}
export function checkUser(data: any) {
return request({
url: '/user-boot/user/check',
method: 'put',
data: data
})
}

BIN
src/assets/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

BIN
src/assets/bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

3734
src/assets/commjs/sm2.js Normal file

File diff suppressed because it is too large Load Diff

257
src/assets/commjs/sm3.js Normal file
View File

@@ -0,0 +1,257 @@
/**
* 国密摘要算法SM3
* @param str:raw string
* @return the 256-bit hex string produced by SM3 from a raw string
*/
function sm3Digest(str) {
//1. 转换为二进制数组
var binArr = str2bin(str2rstr_utf8(str));
//2. 填充
var groupNum = alignSM3(binArr, str.length);
//3. 迭代压缩
var v = new Array(8);//初始值
v[0] = 0x7380166f;
v[1] = 0x4914b2b9;
v[2] = 0x172442d7;
v[3] = 0xda8a0600;
v[4] = 0xa96f30bc;
v[5] = 0x163138aa;
v[6] = 0xe38dee4d;
v[7] = 0xb0fb0e4e;
//按 512bit 分组进行压缩
for (var i = 0; i < groupNum; i++) {
v = compress(v, binArr, i);
}
return word2str(v, '');
}
/**
* 将数组转换为字符串。数组长度不定,每个元素为 32bit 的数字。
* @param words:数组,每个元素为 32bit 的数字
* @param seperator:在每个数组元素转换得到的字符串之间的分隔符
*/
function word2str(words, seperator) {
var prefix = Array(8).join('0');
for (var i = 0; i < words.length; i++) {
//若 hex 不足 8 位,则高位补 0
words[i] = (prefix + (words[i] >>> 0).toString(16)).slice(-8);
}
return words.join(seperator);
}
/**
* 将字符串转换为二进制数组,默认字符串编码为 UTF-8且范围在 0x00~0xFF 内。
* 若某些字符的编码超过此范围,则会只保留最低字节。加密可正常进行,但加密结果有误。
* 每个数组元素包含 4 个字符,即 32 bit。
* @param 字符串
* @return 数组,长度为(字符串长度 / 4每个元素为 32bit 的数字
*/
function str2bin(str) {
var binary = new Array(str.length >> 2);
for (var i = 0; i < str.length * 8; i += 8) {
binary[i >> 5] |= (str.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
}
return binary;
}
/**
* 对明文的二进制串进行填充
* <pre>
* | 满足 mod 512 = 448 | 固定 64 位 |
* | 明文二进制 |填充部分|明文二进制串的长度的二进制表示|
* xxxxxxxxxxxx 10.....0 0...........................xx
* </pre>
* @param arr:数组,每个元素为 32bit 的数字
* @param strLen明文字符串长度
* @return 数组,每个元素为 32bit 的数字,数组长度为 16 的倍数(包括 16
*/
function alignSM3(arr, strLen) {
//在明文二进制串后面拼接 1000 0000
arr[strLen >> 2] |= 0x80 << (24 - strLen % 4 * 8);
var groupNum = ((strLen + 8) >> 6) + 1;//以 512bit 为一组,总的组数
var wordNum = groupNum * 16;//一个 word 32bit总的 word 数
for (var i = (strLen >> 2) + 1; i < wordNum; i++) {
arr[i] = 0;
}
arr[wordNum - 1] = strLen * 8;//在末尾填上明文的二进制长度
return groupNum;
}
/**
* 压缩函数中的置换函数
*/
function p0(x) {
return x ^ bitRol(x, 9) ^ bitRol(x, 17);
}
/**
* 压缩函数中的置换函数
*/
function p1(x) {
return x ^ bitRol(x, 15) ^ bitRol(x, 23);
}
/**
* 循环左移
*/
function bitRol(input, n) {
return (input << n) | (input >>> (32 - n));
}
/**
* 压缩函数
*/
function compress(v, binArr, i) {
//将消息分组扩展成 132 个字
var w1 = new Array(68);
var w2 = new Array(64);
for (var j = 0; j < 68; j++) {
if (j < 16) {
w1[j] = binArr[i * 16 + j];
} else {
w1[j] = p1(w1[j-16] ^ w1[j-9] ^ bitRol(w1[j-3], 15)) ^ bitRol(w1[j-13], 7) ^ w1[j-6];
}
}
for (var j = 0; j < 64; j++) {
w2[j] = w1[j] ^ w1[j+4];
}
//压缩
var a = v[0];
var b = v[1];
var c = v[2];
var d = v[3];
var e = v[4];
var f = v[5];
var g = v[6];
var h = v[7];
var ss1;
var ss2;
var tt1;
var tt2;
for (var j = 0; j < 64; j++) {
ss1 = bitRol(addAll(bitRol(a, 12) , e , bitRol(t(j), j)), 7);
ss2 = ss1 ^ bitRol(a, 12);
tt1 = addAll(ff(a, b, c, j) , d , ss2 , w2[j]);
tt2 = addAll(gg(e, f, g, j) , h , ss1 , w1[j]);
d = c;
c = bitRol(b, 9);
b = a;
a = tt1;
h = g;
g = bitRol(f, 19);
f = e;
e = p0(tt2);
}
v[0] ^= a;
v[1] ^= b;
v[2] ^= c;
v[3] ^= d;
v[4] ^= e;
v[5] ^= f;
v[6] ^= g;
v[7] ^= h;
return v;
}
/**
* 常量 T 随 j 的不同而不同
*/
function t(j) {
if (0 <= j && j < 16) {
return 0x79CC4519;
} else if (j < 64) {
return 0x7A879D8A;
}
}
/**
* 布尔函数,随 j 的变化取不同的表达式
*/
function ff(x, y, z, j) {
if (0 <= j && j < 16) {
return x ^ y ^ z;
} else if (j < 64) {
return (x & y) | (x & z) | (y & z);
}
}
/**
* 布尔函数,随 j 的变化取不同的表达式
*/
function gg(x, y, z, j) {
if (0 <= j && j < 16) {
return x ^ y ^ z;
} else if (j < 64) {
return (x & y) | (~x & z);
}
}
/**
* 两数相加
* 避免某些 js 引擎的 32 位加法的 bug
*/
function safe_add(x, y) {
var lsw = ( x & 0xFFFF ) + (y & 0xFFFF);
var msw = ( x >> 16 ) + (y >> 16) + (lsw >> 16);
return (msw << 16) | ( lsw & 0xFFFF );
}
/**
* 将所有参数相加
*/
function addAll() {
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum = safe_add(sum, arguments[i]);
}
return sum;
}
/**
* UTF-16 --> UTF-8
*/
function str2rstr_utf8(input) {
var output = "" ;
var i = -1 ;
var x, y ;
while(++ i < input.length) {
//按 UTF-16 解码
x = input.charCodeAt(i);
y = i + 1 < input.length ? input .charCodeAt (i + 1) : 0 ;
if( 0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF ) {
x = 0x10000 + ((x & 0x03FF) << 10 ) + (y & 0x03FF);
i++;
}
//按 UTF-8 编码
if( x <= 0x7F ) {
output += String.fromCharCode(x);
}
else if(x <= 0x7FF) {
output += String.fromCharCode(
0xC0 | ((x >>> 6 ) & 0x1F),
0x80 | ( x & 0x3F ));
} else if(x <= 0xFFFF) {
output += String.fromCharCode(
0xE0 | ((x >>> 12) & 0x0F ),
0x80 | ((x >>> 6 ) & 0x3F),
0x80 | ( x & 0x3F ));
} else if(x <= 0x1FFFFF) {
output += String.fromCharCode(
0xF0 | ((x >>> 18) & 0x07 ),
0x80 | ((x >>> 12) & 0x3F),
0x80 | ((x >>> 6 ) & 0x3F),
0x80 | ( x & 0x3F ));
}
}
return output;
}
export {
sm3Digest
}

539
src/assets/font/demo.css Normal file
View File

@@ -0,0 +1,539 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

View File

@@ -0,0 +1,280 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iconfont Demo</title>
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
<link rel="stylesheet" href="demo.css">
<link rel="stylesheet" href="iconfont.css">
<script src="iconfont.js"></script>
<!-- jQuery -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
<!-- 代码高亮 -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
<style>
.main .logo {
margin-top: 0;
height: auto;
}
.main .logo a {
display: flex;
align-items: center;
}
.main .logo .sub-title {
margin-left: 0.5em;
font-size: 22px;
color: #fff;
background: linear-gradient(-45deg, #3967FF, #B500FE);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div class="main">
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
</a></h1>
<div class="nav-tabs">
<ul id="tabs" class="dib-box">
<li class="dib active"><span>Unicode</span></li>
<li class="dib"><span>Font class</span></li>
<li class="dib"><span>Symbol</span></li>
</ul>
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3482754" target="_blank" class="nav-more">查看项目</a>
</div>
<div class="tab-container">
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe635;</span>
<div class="name">密码</div>
<div class="code-name">&amp;#xe635;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe639;</span>
<div class="name">用户</div>
<div class="code-name">&amp;#xe639;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe617;</span>
<div class="name">back</div>
<div class="code-name">&amp;#xe617;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe63e;</span>
<div class="name">platform-manage</div>
<div class="code-name">&amp;#xe63e;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
<hr>
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
<ul>
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
</ul>
<blockquote>
<p>注意:新版 iconfont 支持两种方式引用多色图标SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
</blockquote>
<p>Unicode 使用步骤如下:</p>
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1703485952035') format('woff2'),
url('iconfont.woff?t=1703485952035') format('woff'),
url('iconfont.ttf?t=1703485952035') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
<pre><code class="language-css"
>.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre>
<code class="language-html"
>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-mima"></span>
<div class="name">
密码
</div>
<div class="code-name">.icon-mima
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-yonghu"></span>
<div class="name">
用户
</div>
<div class="code-name">.icon-yonghu
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-back"></span>
<div class="name">
back
</div>
<div class="code-name">.icon-back
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-platform-manage"></span>
<div class="name">
platform-manage
</div>
<div class="code-name">.icon-platform-manage
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
<hr>
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
<p>与 Unicode 使用方式相比,具有如下特点:</p>
<ul>
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
</code></pre>
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"
iconfont" 是你项目下的 font-family。可以通过编辑项目查看默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-mima"></use>
</svg>
<div class="name">密码</div>
<div class="code-name">#icon-mima</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-yonghu"></use>
</svg>
<div class="name">用户</div>
<div class="code-name">#icon-yonghu</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-back"></use>
</svg>
<div class="name">back</div>
<div class="code-name">#icon-back</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-platform-manage"></use>
</svg>
<div class="name">platform-manage</div>
<div class="code-name">#icon-platform-manage</div>
</li>
</ul>
<div class="article markdown">
<h2 id="symbol-">Symbol 引用</h2>
<hr>
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
<ul>
<li>支持多色图标了,不再受单色限制。</li>
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
</code></pre>
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
<pre><code class="language-html">&lt;style&gt;
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
&lt;/style&gt;
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
&lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
&lt;/svg&gt;
</code></pre>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('.tab-container .content:first').show()
$('#tabs li').click(function (e) {
var tabContent = $('.tab-container .content')
var index = $(this).index()
if ($(this).hasClass('active')) {
return
} else {
$('#tabs li').removeClass('active')
$(this).addClass('active')
tabContent.hide().eq(index).fadeIn()
}
})
})
</script>
</body>
</html>

View File

@@ -0,0 +1,31 @@
@font-face {
font-family: "iconfont"; /* Project id 3482754 */
src: url('iconfont.woff2?t=1703485952035') format('woff2'),
url('iconfont.woff?t=1703485952035') format('woff'),
url('iconfont.ttf?t=1703485952035') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-mima:before {
content: "\e635";
}
.icon-yonghu:before {
content: "\e639";
}
.icon-back:before {
content: "\e617";
}
.icon-platform-manage:before {
content: "\e63e";
}

View File

@@ -0,0 +1 @@
window._iconfont_svg_string_3482754='<svg><symbol id="icon-mima" viewBox="0 0 1024 1024"><path d="M860.58 489.4c-0.09-47.06-29.76-88.04-72.49-101.63-16.6-5.3-33.82-6.09-51.12-5.3-7.68 0.35-12.01 0.71-11.12-10.95 2.12-28.52 2.47-57.39 1.23-86.09-4.06-94.48-70.11-174.13-163.18-198.41-88.3-23.04-182.87 15.72-233.64 93.86-40.62 62.34-35.23 130.94-31.97 201.58-11.92 0-22.69-0.26-33.38 0-56.25 1.5-101.1 46-101.37 102.16-0.53 117.88-0.62 235.75 0 353.63 0.35 57.31 44.94 104.2 101.9 104.54 165.29 1.06 330.68 0.97 495.97 0 55.01-0.35 98.9-46.71 99.16-101.89 0.45-117.15 0.36-234.33 0.01-351.5zM566.02 666.18c-8.65 6.53-11.3 12.72-11.04 22.87 0.62 25.78 0.44 51.66 0.18 77.44-0.44 29.76-17.31 47.68-43.97 47.24-25.7-0.35-41.77-18.01-42.21-46.8-0.26-15.1-0.44-30.11 0-45.21 0.8-26.23-0.09-48.39-23.75-69.58-25.52-22.95-25.96-57.83-10.95-89.88 15.54-33.03 42.91-48.39 72.4-50.51 42.12 0.44 75.76 25.34 87.33 59.96 11.47 34.51 1.06 72.48-27.99 94.47z m59.86-283.44c-37.35-0.71-74.7-0.27-112.05-0.27-38.06 0-76.2-0.79-114.26 0.35-14.84 0.45-17.75-4.68-17.22-18.1 1.06-22.96 0.09-46 0.35-68.96 0.8-71.88 57.39-128.65 128.48-129 71.17-0.35 128.65 55.8 130.15 127.68 0.53 24.46-0.71 48.92 0.35 73.29 0.54 12.88-4.23 15.18-15.8 15.01z" fill="#050101" ></path></symbol><symbol id="icon-yonghu" viewBox="0 0 1024 1024"><path d="M502.496 63.136c125.888 0 227.936 100.384 227.936 224.192 0 123.84-102.048 224.224-227.936 224.224-125.888 0-227.936-100.384-227.936-224.224C274.56 163.488 376.64 63.136 502.496 63.136L502.496 63.136zM502.496 63.136c125.888 0 227.936 100.384 227.936 224.192 0 123.84-102.048 224.224-227.936 224.224-125.888 0-227.936-100.384-227.936-224.224C274.56 163.488 376.64 63.136 502.496 63.136L502.496 63.136zM417.024 586.304l189.984 0c162.624 0 294.432 129.632 294.432 289.6l0 18.656c0 63.04-131.84 65.44-294.432 65.44l-189.984 0c-162.624 0-294.432-0.096-294.432-65.44l0-18.656C122.592 715.936 254.4 586.304 417.024 586.304L417.024 586.304zM417.024 586.304" fill="#272636" ></path></symbol><symbol id="icon-back" viewBox="0 0 1024 1024"><path d="M482.7 249.9V106.1c0-37.4-45.3-56.2-71.7-29.7L140.3 347c-16.4 16.4-16.4 43 0 59.4L410.9 677c26.5 26.5 71.7 7.7 71.7-29.7v-155c96.1-0.3 271.5-10.7 271.5 227.7 0 118.1-92.8 216.8-216 239.6 198.1-24.4 326-236 326-361.9 0.1-292.6-309.4-346.3-381.4-347.8z" fill="" ></path></symbol><symbol id="icon-platform-manage" viewBox="0 0 1024 1024"><path d="M186.561 655.343v0.047l282.35 139.201c27.067 13.355 59.018 13.355 86.086 0l282.35-139.154L944.22 708.06c9.678 4.76 15.782 14.445 15.782 25.031 0 10.586-6.104 20.27-15.782 25.03L554.997 950c-27.058 13.335-58.98 13.335-86.04 0L79.738 758.076c-9.627-4.78-15.688-14.435-15.688-24.984 0-10.55 6.061-20.205 15.687-24.985l106.825-52.764zM554.997 74.016L944.22 265.939c9.625 4.774 15.686 14.43 15.686 24.984 0 10.549-6.061 20.205-15.686 24.98L554.997 507.828c-27.058 13.336-58.98 13.336-86.04 0L79.738 315.902c-9.627-4.774-15.688-14.43-15.688-24.979 0-10.554 6.061-20.21 15.687-24.984L468.91 74.016c27.068-13.355 59.02-13.355 86.087 0z" ></path><path d="M185.891 434.654l283.067 139.529c27.058 13.335 58.981 13.335 86.04 0l283.018-139.529 106.204 52.301c9.678 4.756 15.782 14.44 15.782 25.027 0 10.59-6.104 20.275-15.782 25.03L554.997 728.936c-27.058 13.335-58.98 13.335-86.04 0L79.738 537.013c-9.65-4.766-15.735-14.436-15.735-25.008 0-10.568 6.085-20.238 15.734-25.003l106.155-52.348z" ></path></symbol></svg>',function(n){var t=(t=document.getElementsByTagName("script"))[t.length-1],e=t.getAttribute("data-injectcss"),t=t.getAttribute("data-disable-injectsvg");if(!t){var o,c,i,l,a,d=function(t,e){e.parentNode.insertBefore(t,e)};if(e&&!n.__iconfont__svg__cssinject__){n.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(t){console&&console.log(t)}}o=function(){var t,e=document.createElement("div");e.innerHTML=n._iconfont_svg_string_3482754,(e=e.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",e=e,(t=document.body).firstChild?d(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(o,0):(c=function(){document.removeEventListener("DOMContentLoaded",c,!1),o()},document.addEventListener("DOMContentLoaded",c,!1)):document.attachEvent&&(i=o,l=n.document,a=!1,r(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,s())})}function s(){a||(a=!0,i())}function r(){try{l.documentElement.doScroll("left")}catch(t){return void setTimeout(r,50)}s()}}(window);

View File

@@ -0,0 +1,37 @@
{
"id": "3482754",
"name": "灿能——电能质量光伏全景管理系统",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "8765228",
"name": "密码",
"font_class": "mima",
"unicode": "e635",
"unicode_decimal": 58933
},
{
"icon_id": "677608",
"name": "用户",
"font_class": "yonghu",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "1471594",
"name": "back",
"font_class": "back",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "30132209",
"name": "platform-manage",
"font_class": "platform-manage",
"unicode": "e63e",
"unicode_decimal": 58942
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
src/assets/img/dw.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/img/point.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/assets/login-header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/assets/login/big_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/assets/login/jhui.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
src/assets/login/kt.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/assets/login/login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

BIN
src/assets/login/login2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

BIN
src/assets/login/login3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 KiB

BIN
src/assets/login/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
src/assets/login/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/assets/login/njcn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long

26630
src/assets/map/中国.json Normal file

File diff suppressed because it is too large Load Diff

5323
src/assets/map/云南.json Normal file

File diff suppressed because it is too large Load Diff

26630
src/assets/map/全国.json Normal file

File diff suppressed because it is too large Load Diff

1705
src/assets/map/冀北.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":710000,"name":"台湾省","center":[121.509062,25.044332],"centroid":[120.971485,23.749452],"childrenNum":0,"level":"province","acroutes":[100000],"parent":{"adcode":100000}},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.443558,22.441245],[120.517584,22.408536],[120.569903,22.361728],[120.640505,22.241347],[120.659209,22.15432],[120.662001,22.066983],[120.651464,22.033165],[120.667691,21.983168],[120.70157,21.927065],[120.743246,21.915569],[120.78155,21.923957],[120.85468,21.883333],[120.87291,21.897387],[120.866482,21.98436],[120.907315,22.033208],[120.904154,22.119757],[120.914955,22.302718],[120.981658,22.528305],[121.015009,22.584168],[121.033292,22.650725],[121.078498,22.669656],[121.170544,22.723133],[121.210481,22.770665],[121.237931,22.836327],[121.324708,22.945666],[121.354687,23.01006],[121.370388,23.084347],[121.409535,23.102669],[121.430294,23.137196],[121.415015,23.195973],[121.440358,23.272096],[121.479558,23.3223],[121.497788,23.419789],[121.521497,23.483198],[121.523078,23.538708],[121.587778,23.76102],[121.621604,23.92075],[121.659381,24.006893],[121.639992,24.064276],[121.643838,24.097713],[121.678085,24.133906],[121.689044,24.174401],[121.809172,24.339055],[121.826717,24.423579],[121.867498,24.478978],[121.885464,24.529677],[121.892524,24.617912],[121.862598,24.671515],[121.837993,24.76015],[121.845053,24.836269],[121.932883,24.938645],[122.012178,25.001469],[121.980776,25.03079],[121.947425,25.031955],[121.917077,25.137908],[121.842155,25.135332],[121.782407,25.160425],[121.750531,25.160716],[121.707327,25.191493],[121.700319,25.226913],[121.655324,25.241859],[121.623026,25.294694],[121.584986,25.308926],[121.535038,25.307515],[121.444415,25.270624],[121.413487,25.238912],[121.371864,25.159885],[121.319281,25.140691],[121.209322,25.127104],[121.133135,25.078728],[121.102102,25.075153],[121.024704,25.040479],[121.009688,24.993649],[120.960899,24.940227],[120.908475,24.852012],[120.892299,24.767526],[120.823753,24.688321],[120.762371,24.658335],[120.688661,24.600678],[120.64277,24.490172],[120.589187,24.432354],[120.546299,24.370413],[120.521009,24.312038],[120.470534,24.24259],[120.451461,24.182691],[120.392029,24.11824],[120.316158,23.984881],[120.278276,23.927798],[120.245768,23.840553],[120.175377,23.807385],[120.102773,23.700981],[120.094817,23.587466],[120.121741,23.504664],[120.107831,23.341264],[120.081434,23.29191],[120.018947,23.073115],[120.029537,23.048623],[120.131382,23.002118],[120.149138,22.896715],[120.200403,22.721101],[120.274272,22.560181],[120.297191,22.531315],[120.443558,22.441245]]],[[[124.542984,25.903911],[124.586346,25.913777],[124.572805,25.93974],[124.541825,25.931031],[124.542984,25.903911]]],[[[123.445286,25.725966],[123.472104,25.713024],[123.508933,25.723237],[123.514834,25.751226],[123.483063,25.768587],[123.444496,25.746514],[123.445286,25.725966]]],[[[119.64597,23.55091],[119.701081,23.550657],[119.678057,23.600041],[119.610089,23.603953],[119.594388,23.577245],[119.566306,23.584732],[119.562565,23.530377],[119.573788,23.505885],[119.609141,23.503864],[119.64597,23.55091]]],[[[123.667207,25.914066],[123.707092,25.916873],[123.678008,25.938667],[123.667207,25.914066]]],[[[119.506031,23.625567],[119.505241,23.575814],[119.472416,23.557136],[119.523207,23.563699],[119.525578,23.624895],[119.506031,23.625567]]],[[[119.49739,23.386683],[119.495125,23.350156],[119.516885,23.349903],[119.49739,23.386683]]],[[[119.557454,23.666474],[119.604083,23.616989],[119.615516,23.660925],[119.586485,23.675974],[119.557454,23.666474]]],[[[121.46823,22.676644],[121.476502,22.64166],[121.513541,22.631833],[121.5147,22.67639],[121.46823,22.676644]]],[[[121.510538,22.087185],[121.507693,22.048523],[121.534089,22.022146],[121.594522,21.995382],[121.604586,22.022699],[121.575028,22.037122],[121.575607,22.084421],[121.510538,22.087185]]],[[[122.097533,25.500168],[122.093581,25.47183],[122.124825,25.475932],[122.097533,25.500168]]],[[[119.421467,23.216684],[119.421309,23.18935],[119.453396,23.217697],[119.421467,23.216684]]],[[[120.355042,22.327259],[120.395454,22.342287],[120.383072,22.355573],[120.355042,22.327259]]]]}}]}

6409
src/assets/map/吉林.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

7270
src/assets/map/四川.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5474
src/assets/map/安徽.json Normal file

File diff suppressed because it is too large Load Diff

7366
src/assets/map/山东.json Normal file

File diff suppressed because it is too large Load Diff

2587
src/assets/map/山西.json Normal file

File diff suppressed because it is too large Load Diff

8581
src/assets/map/广东.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4186
src/assets/map/江苏.json Normal file

File diff suppressed because it is too large Load Diff

5264
src/assets/map/江西.json Normal file

File diff suppressed because it is too large Load Diff

2381
src/assets/map/河北.json Normal file

File diff suppressed because it is too large Load Diff

6633
src/assets/map/河南.json Normal file

File diff suppressed because it is too large Load Diff

5786
src/assets/map/浙江.json Normal file

File diff suppressed because it is too large Load Diff

866
src/assets/map/海南.json Normal file
View File

@@ -0,0 +1,866 @@
{
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"properties": { "adcode": 460100, "name": "海口", "center": [110.33119, 20.031971], "centroid": [110.422966, 19.852113], "childrenNum": 4, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 0, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.106525, 20.026851],
[110.161895, 19.977693],
[110.143932, 19.889106],
[110.186246, 19.864193],
[110.228283, 19.753767],
[110.208468, 19.716679],
[110.222357, 19.67974],
[110.262449, 19.687318],
[110.314208, 19.697421],
[110.340041, 19.720625],
[110.393373, 19.698053],
[110.372633, 19.654004],
[110.401151, 19.606626],
[110.455687, 19.574559],
[110.486705, 19.593357],
[110.519297, 19.563341],
[110.540223, 19.535532],
[110.611518, 19.526841],
[110.641333, 19.549122],
[110.636148, 19.593989],
[110.672814, 19.647214],
[110.623463, 19.664109],
[110.623, 19.735461],
[110.670314, 19.812776],
[110.704665, 19.805992],
[110.699573, 19.861512],
[110.676147, 19.860092],
[110.675314, 19.907868],
[110.634666, 19.965401],
[110.598, 19.98305],
[110.526612, 20.075206],
[110.495039, 20.077253],
[110.387355, 20.11347],
[110.318467, 20.109061],
[110.293282, 20.059614],
[110.24319, 20.077568],
[110.144395, 20.074418],
[110.106525, 20.026851]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 460200, "name": "三亚", "center": [109.508268, 18.247872], "centroid": [109.421656, 18.362263], "childrenNum": 4, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 1, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[108.932374, 18.335288],
[108.956448, 18.307433],
[109.006632, 18.323032],
[109.108298, 18.323828],
[109.138668, 18.267791],
[109.174686, 18.260149],
[109.28811, 18.264925],
[109.355887, 18.214922],
[109.441349, 18.199153],
[109.4632, 18.177171],
[109.527366, 18.169046],
[109.561718, 18.143554],
[109.63792, 18.171595],
[109.72616, 18.177808],
[109.749863, 18.19326],
[109.783381, 18.337516],
[109.805418, 18.347543],
[109.785048, 18.426622],
[109.809955, 18.459388],
[109.781159, 18.51107],
[109.725234, 18.493102],
[109.710882, 18.426462],
[109.665883, 18.391462],
[109.539866, 18.396713],
[109.515607, 18.429008],
[109.536996, 18.490717],
[109.535237, 18.53142],
[109.506163, 18.551291],
[109.423386, 18.574657],
[109.405146, 18.623443],
[109.332832, 18.575451],
[109.313295, 18.517429],
[109.246537, 18.558921],
[109.203574, 18.553517],
[109.185056, 18.507095],
[109.195148, 18.469407],
[109.072557, 18.452231],
[109.015243, 18.422645],
[108.932374, 18.335288]
]
]
]
}
},
{
"type": "Feature",
"properties": { "adcode": 460400, "name": "儋州", "center": [109.576782, 19.517486], "centroid": [109.390059, 19.579264], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 3, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[108.928671, 19.524313],
[108.939596, 19.497287],
[108.982744, 19.477213],
[108.997373, 19.431522],
[109.04478, 19.430415],
[109.051447, 19.487803],
[109.117557, 19.46757],
[109.13052, 19.479584],
[109.178389, 19.399262],
[109.26774, 19.376803],
[109.318943, 19.398155],
[109.384035, 19.355448],
[109.424405, 19.354815],
[109.457275, 19.39942],
[109.483848, 19.406063],
[109.506348, 19.359561],
[109.468386, 19.301178],
[109.541625, 19.311939],
[109.587365, 19.243249],
[109.611995, 19.252589],
[109.634031, 19.20256],
[109.673105, 19.207627],
[109.686994, 19.178965],
[109.706808, 19.22156],
[109.697271, 19.271267],
[109.713382, 19.309881],
[109.700234, 19.349436],
[109.647272, 19.357505],
[109.646439, 19.402425],
[109.737734, 19.407486],
[109.751993, 19.416974],
[109.728197, 19.496023],
[109.760048, 19.528895],
[109.7694, 19.578508],
[109.709308, 19.57756],
[109.659402, 19.611048],
[109.664216, 19.629685],
[109.582921, 19.637581],
[109.557366, 19.697421],
[109.599402, 19.730726],
[109.569218, 19.797947],
[109.564588, 19.854888],
[109.498663, 19.873339],
[109.410794, 19.895256],
[109.349591, 19.898724],
[109.30811, 19.9178],
[109.264592, 19.90503],
[109.255611, 19.867189],
[109.218574, 19.855834],
[109.15913, 19.790689],
[109.169501, 19.736724],
[109.147649, 19.704998],
[109.093668, 19.689844],
[109.048576, 19.620051],
[108.993392, 19.586723],
[108.928671, 19.524313]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469001, "name": "五指山", "center": [109.516662, 18.776921], "centroid": [109.511892, 18.824035], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 4, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.715419, 18.833686],
[109.699123, 18.889379],
[109.730512, 18.913649],
[109.676531, 18.925862],
[109.601532, 18.910318],
[109.55357, 18.946321],
[109.524033, 19.030986],
[109.468386, 19.032254],
[109.456349, 18.995635],
[109.424775, 18.990403],
[109.367739, 18.936171],
[109.34848, 18.946321],
[109.32635, 18.926338],
[109.343109, 18.877163],
[109.374591, 18.853998],
[109.353387, 18.812896],
[109.356628, 18.710653],
[109.398109, 18.671104],
[109.408016, 18.627733],
[109.448293, 18.655378],
[109.48857, 18.64664],
[109.539866, 18.659508],
[109.533662, 18.694295],
[109.576717, 18.714782],
[109.619865, 18.678252],
[109.641809, 18.72304],
[109.703012, 18.721769],
[109.681531, 18.786071],
[109.689216, 18.830036],
[109.715419, 18.833686]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469002, "name": "琼海", "center": [110.466785, 19.246011], "centroid": [110.421962, 19.210377], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 5, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.610593, 19.084394],
[110.619296, 19.152041],
[110.676703, 19.286302],
[110.706517, 19.320167],
[110.730035, 19.378859],
[110.633555, 19.391354],
[110.604574, 19.350386],
[110.584111, 19.367787],
[110.581426, 19.419504],
[110.546242, 19.46836],
[110.504853, 19.46836],
[110.484761, 19.443223],
[110.450317, 19.447492],
[110.423928, 19.413495],
[110.368744, 19.391829],
[110.327356, 19.315261],
[110.3593, 19.298646],
[110.344392, 19.228368],
[110.300226, 19.21586],
[110.224857, 19.221718],
[110.170598, 19.191317],
[110.150876, 19.208419],
[110.115229, 19.133191],
[110.124118, 19.04747],
[110.158562, 18.99944],
[110.229579, 19.002452],
[110.249949, 18.976292],
[110.465039, 19.074411],
[110.477539, 19.096912],
[110.521797, 19.102932],
[110.610593, 19.084394]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469005, "name": "文昌", "center": [110.753975, 19.612986], "centroid": [110.788535, 19.747363], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 6, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.730035, 19.378859],
[110.781053, 19.395783],
[110.844015, 19.450179],
[110.920774, 19.552598],
[111.008921, 19.60394],
[111.071327, 19.628895],
[111.044013, 19.763551],
[111.013643, 19.850472],
[110.969569, 20.010151],
[110.940959, 20.028583],
[110.871515, 20.011569],
[110.808738, 20.035672],
[110.778368, 20.068276],
[110.744665, 20.073946],
[110.717258, 20.148734],
[110.687073, 20.16353],
[110.655685, 20.134409],
[110.56226, 20.109691],
[110.526612, 20.075206],
[110.598, 19.98305],
[110.634666, 19.965401],
[110.675314, 19.907868],
[110.676147, 19.860092],
[110.699573, 19.861512],
[110.704665, 19.805992],
[110.670314, 19.812776],
[110.623, 19.735461],
[110.623463, 19.664109],
[110.672814, 19.647214],
[110.636148, 19.593989],
[110.641333, 19.549122],
[110.611518, 19.526841],
[110.540223, 19.535532],
[110.519297, 19.563341],
[110.469854, 19.531424],
[110.485779, 19.502345],
[110.520594, 19.509931],
[110.546242, 19.46836],
[110.581426, 19.419504],
[110.584111, 19.367787],
[110.604574, 19.350386],
[110.633555, 19.391354],
[110.730035, 19.378859]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469006, "name": "万宁", "center": [110.388793, 18.796216], "centroid": [110.324496, 18.830445], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 7, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.158562, 18.99944],
[110.108284, 18.944577],
[110.097729, 18.911746],
[110.045322, 18.884778],
[110.095785, 18.811467],
[110.057267, 18.758448],
[110.014952, 18.732885],
[110.020786, 18.658873],
[110.115877, 18.592774],
[110.137543, 18.606123],
[110.213931, 18.578789],
[110.246246, 18.609619],
[110.329393, 18.642509],
[110.36754, 18.632182],
[110.495316, 18.649976],
[110.500779, 18.752732],
[110.577908, 18.784642],
[110.590593, 18.839082],
[110.585871, 18.897786],
[110.610593, 19.084394],
[110.521797, 19.102932],
[110.477539, 19.096912],
[110.465039, 19.074411],
[110.249949, 18.976292],
[110.229579, 19.002452],
[110.158562, 18.99944]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469007, "name": "东方", "center": [108.653789, 19.10198], "centroid": [108.818801, 18.996184], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 8, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.125242, 18.878432],
[109.089779, 18.909842],
[109.113668, 18.969949],
[109.098853, 19.028291],
[109.008762, 19.050005],
[109.022929, 19.107052],
[108.99191, 19.13034],
[108.954874, 19.218869],
[108.916171, 19.218552],
[108.833209, 19.25987],
[108.783765, 19.244674],
[108.704136, 19.262719],
[108.644785, 19.349278],
[108.605712, 19.264619],
[108.591082, 19.141587],
[108.598305, 19.055869],
[108.630434, 19.003086],
[108.637841, 18.924593],
[108.595619, 18.872086],
[108.593212, 18.809404],
[108.659785, 18.716846],
[108.761543, 18.732091],
[108.81145, 18.720022],
[108.844412, 18.750827],
[108.928578, 18.790198],
[108.987003, 18.786547],
[109.015151, 18.808928],
[109.071076, 18.807499],
[109.094965, 18.857012],
[109.125242, 18.878432]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469021, "name": "定安", "center": [110.349235, 19.684966], "centroid": [110.312936, 19.483405], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 9, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.224857, 19.221718],
[110.300226, 19.21586],
[110.344392, 19.228368],
[110.3593, 19.298646],
[110.327356, 19.315261],
[110.368744, 19.391829],
[110.423928, 19.413495],
[110.450317, 19.447492],
[110.484761, 19.443223],
[110.504853, 19.46836],
[110.546242, 19.46836],
[110.520594, 19.509931],
[110.485779, 19.502345],
[110.469854, 19.531424],
[110.519297, 19.563341],
[110.486705, 19.593357],
[110.455687, 19.574559],
[110.401151, 19.606626],
[110.372633, 19.654004],
[110.393373, 19.698053],
[110.340041, 19.720625],
[110.314208, 19.697421],
[110.262449, 19.687318],
[110.221616, 19.629843],
[110.186524, 19.636791],
[110.160784, 19.67153],
[110.13134, 19.648003],
[110.137266, 19.56034],
[110.192172, 19.58925],
[110.196339, 19.535374],
[110.243005, 19.517675],
[110.227727, 19.450654],
[110.194024, 19.455871],
[110.164487, 19.426146],
[110.165691, 19.361459],
[110.188283, 19.306242],
[110.228098, 19.301969],
[110.224857, 19.221718]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469022, "name": "屯昌", "center": [110.102773, 19.362916], "centroid": [110.055723, 19.342208], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 10, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.115229, 19.133191],
[110.150876, 19.208419],
[110.170598, 19.191317],
[110.224857, 19.221718],
[110.228098, 19.301969],
[110.188283, 19.306242],
[110.165691, 19.361459],
[110.164487, 19.426146],
[110.194024, 19.455871],
[110.227727, 19.450654],
[110.243005, 19.517675],
[110.196339, 19.535374],
[110.192172, 19.58925],
[110.137266, 19.56034],
[110.101803, 19.54928],
[110.119488, 19.503293],
[110.072081, 19.492071],
[110.045785, 19.456029],
[110.020508, 19.485432],
[109.938287, 19.485749],
[109.94699, 19.468044],
[109.914583, 19.42409],
[109.912917, 19.391671],
[109.876436, 19.386926],
[109.826436, 19.343108],
[109.822733, 19.289626],
[109.923565, 19.239608],
[109.957638, 19.188625],
[110.026526, 19.17564],
[110.057267, 19.134617],
[110.115229, 19.133191]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469023, "name": "澄迈", "center": [110.007147, 19.737095], "centroid": [109.990417, 19.700201], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 11, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.137266, 19.56034],
[110.13134, 19.648003],
[110.160784, 19.67153],
[110.186524, 19.636791],
[110.221616, 19.629843],
[110.262449, 19.687318],
[110.222357, 19.67974],
[110.208468, 19.716679],
[110.228283, 19.753767],
[110.186246, 19.864193],
[110.143932, 19.889106],
[110.161895, 19.977693],
[110.106525, 20.026851],
[109.997638, 19.979899],
[109.965231, 19.993608],
[109.855047, 19.984153],
[109.879491, 19.885322],
[109.842269, 19.871446],
[109.884121, 19.853311],
[109.874306, 19.799524],
[109.897084, 19.77933],
[109.852732, 19.652582],
[109.786437, 19.608047],
[109.7694, 19.578508],
[109.760048, 19.528895],
[109.728197, 19.496023],
[109.751993, 19.416974],
[109.737734, 19.407486],
[109.793474, 19.379966],
[109.857269, 19.412388],
[109.876436, 19.386926],
[109.912917, 19.391671],
[109.914583, 19.42409],
[109.94699, 19.468044],
[109.938287, 19.485749],
[110.020508, 19.485432],
[110.045785, 19.456029],
[110.072081, 19.492071],
[110.119488, 19.503293],
[110.101803, 19.54928],
[110.137266, 19.56034]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469024, "name": "临高", "center": [109.687697, 19.908293], "centroid": [109.71548, 19.809704], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 12, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.855047, 19.984153],
[109.814307, 19.992977],
[109.761715, 19.981317],
[109.712271, 20.017398],
[109.585328, 19.98825],
[109.526626, 19.943494],
[109.498663, 19.873339],
[109.564588, 19.854888],
[109.569218, 19.797947],
[109.599402, 19.730726],
[109.557366, 19.697421],
[109.582921, 19.637581],
[109.664216, 19.629685],
[109.659402, 19.611048],
[109.709308, 19.57756],
[109.7694, 19.578508],
[109.786437, 19.608047],
[109.852732, 19.652582],
[109.897084, 19.77933],
[109.874306, 19.799524],
[109.884121, 19.853311],
[109.842269, 19.871446],
[109.879491, 19.885322],
[109.855047, 19.984153]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469025, "name": "白沙", "center": [109.452606, 19.224584], "centroid": [109.351743, 19.20989], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 13, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.298203, 18.960911],
[109.34848, 18.946321],
[109.367739, 18.936171],
[109.424775, 18.990403],
[109.456349, 18.995635],
[109.468386, 19.032254],
[109.524033, 19.030986],
[109.561347, 19.072668],
[109.601439, 19.053492],
[109.613569, 19.086454],
[109.687734, 19.118775],
[109.686994, 19.178965],
[109.673105, 19.207627],
[109.634031, 19.20256],
[109.611995, 19.252589],
[109.587365, 19.243249],
[109.541625, 19.311939],
[109.468386, 19.301178],
[109.506348, 19.359561],
[109.483848, 19.406063],
[109.457275, 19.39942],
[109.424405, 19.354815],
[109.384035, 19.355448],
[109.318943, 19.398155],
[109.26774, 19.376803],
[109.178389, 19.399262],
[109.13052, 19.479584],
[109.117557, 19.46757],
[109.051447, 19.487803],
[109.04478, 19.430415],
[109.043669, 19.342792],
[109.08265, 19.328869],
[109.142834, 19.265727],
[109.120242, 19.203985],
[109.163667, 19.14222],
[109.177093, 19.083443],
[109.271166, 19.067438],
[109.298203, 18.960911]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469026, "name": "昌江", "center": [109.053351, 19.260968], "centroid": [108.993675, 19.226048], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 14, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.04478, 19.430415],
[108.997373, 19.431522],
[108.982744, 19.477213],
[108.939596, 19.497287],
[108.928671, 19.524313],
[108.887004, 19.4897],
[108.806357, 19.450654],
[108.747654, 19.391671],
[108.694137, 19.387084],
[108.644785, 19.349278],
[108.704136, 19.262719],
[108.783765, 19.244674],
[108.833209, 19.25987],
[108.916171, 19.218552],
[108.954874, 19.218869],
[108.99191, 19.13034],
[109.022929, 19.107052],
[109.008762, 19.050005],
[109.098853, 19.028291],
[109.113668, 18.969949],
[109.089779, 18.909842],
[109.125242, 18.878432],
[109.141816, 18.904449],
[109.206722, 18.894772],
[109.265518, 18.905877],
[109.298203, 18.960911],
[109.271166, 19.067438],
[109.177093, 19.083443],
[109.163667, 19.14222],
[109.120242, 19.203985],
[109.142834, 19.265727],
[109.08265, 19.328869],
[109.043669, 19.342792],
[109.04478, 19.430415]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469027, "name": "乐东", "center": [109.175444, 18.74758], "centroid": [109.029671, 18.639822], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 15, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.405146, 18.623443],
[109.408016, 18.627733],
[109.398109, 18.671104],
[109.356628, 18.710653],
[109.353387, 18.812896],
[109.374591, 18.853998],
[109.343109, 18.877163],
[109.32635, 18.926338],
[109.34848, 18.946321],
[109.298203, 18.960911],
[109.265518, 18.905877],
[109.206722, 18.894772],
[109.141816, 18.904449],
[109.125242, 18.878432],
[109.094965, 18.857012],
[109.071076, 18.807499],
[109.015151, 18.808928],
[108.987003, 18.786547],
[108.928578, 18.790198],
[108.844412, 18.750827],
[108.81145, 18.720022],
[108.761543, 18.732091],
[108.659785, 18.716846],
[108.664137, 18.673328],
[108.641082, 18.565279],
[108.644971, 18.486741],
[108.658304, 18.462728],
[108.70997, 18.444119],
[108.776728, 18.442051],
[108.881264, 18.416599],
[108.932374, 18.335288],
[109.015243, 18.422645],
[109.072557, 18.452231],
[109.195148, 18.469407],
[109.185056, 18.507095],
[109.203574, 18.553517],
[109.246537, 18.558921],
[109.313295, 18.517429],
[109.332832, 18.575451],
[109.405146, 18.623443]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469028, "name": "陵水", "center": [110.037218, 18.505006], "centroid": [109.951436, 18.549546], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 16, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[110.014952, 18.732885],
[109.980416, 18.76718],
[109.94412, 18.771942],
[109.902361, 18.739395],
[109.891065, 18.754479],
[109.830696, 18.728597],
[109.773474, 18.809404],
[109.756159, 18.788928],
[109.771993, 18.723675],
[109.802177, 18.725263],
[109.839677, 18.67857],
[109.804677, 18.594364],
[109.846621, 18.57116],
[109.828751, 18.511229],
[109.781159, 18.51107],
[109.809955, 18.459388],
[109.785048, 18.426622],
[109.805418, 18.347543],
[109.919676, 18.375551],
[109.999767, 18.359797],
[110.070785, 18.376187],
[110.090507, 18.399258],
[110.116618, 18.506618],
[110.213931, 18.578789],
[110.137543, 18.606123],
[110.115877, 18.592774],
[110.020786, 18.658873],
[110.014952, 18.732885]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469029, "name": "保亭", "center": [109.70245, 18.636371], "centroid": [109.650759, 18.589686], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 17, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.715419, 18.833686],
[109.689216, 18.830036],
[109.681531, 18.786071],
[109.703012, 18.721769],
[109.641809, 18.72304],
[109.619865, 18.678252],
[109.576717, 18.714782],
[109.533662, 18.694295],
[109.539866, 18.659508],
[109.48857, 18.64664],
[109.448293, 18.655378],
[109.408016, 18.627733],
[109.405146, 18.623443],
[109.423386, 18.574657],
[109.506163, 18.551291],
[109.535237, 18.53142],
[109.536996, 18.490717],
[109.515607, 18.429008],
[109.539866, 18.396713],
[109.665883, 18.391462],
[109.710882, 18.426462],
[109.725234, 18.493102],
[109.781159, 18.51107],
[109.828751, 18.511229],
[109.846621, 18.57116],
[109.804677, 18.594364],
[109.839677, 18.67857],
[109.802177, 18.725263],
[109.771993, 18.723675],
[109.756159, 18.788928],
[109.773474, 18.809404],
[109.715419, 18.833686]
]
]
]
}
}, {
"type": "Feature",
"properties": { "adcode": 469030, "name": "琼中", "center": [109.839996, 19.03557], "centroid": [109.854584, 19.033919], "childrenNum": 0, "level": "city", "parent": { "adcode": 460000 }, "subFeatureIndex": 18, "acroutes": [100000, 460000] },
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[109.876436, 19.386926],
[109.857269, 19.412388],
[109.793474, 19.379966],
[109.737734, 19.407486],
[109.646439, 19.402425],
[109.647272, 19.357505],
[109.700234, 19.349436],
[109.713382, 19.309881],
[109.697271, 19.271267],
[109.706808, 19.22156],
[109.686994, 19.178965],
[109.687734, 19.118775],
[109.613569, 19.086454],
[109.601439, 19.053492],
[109.561347, 19.072668],
[109.524033, 19.030986],
[109.55357, 18.946321],
[109.601532, 18.910318],
[109.676531, 18.925862],
[109.730512, 18.913649],
[109.699123, 18.889379],
[109.715419, 18.833686],
[109.773474, 18.809404],
[109.830696, 18.728597],
[109.891065, 18.754479],
[109.902361, 18.739395],
[109.94412, 18.771942],
[109.980416, 18.76718],
[110.014952, 18.732885],
[110.057267, 18.758448],
[110.095785, 18.811467],
[110.045322, 18.884778],
[110.097729, 18.911746],
[110.108284, 18.944577],
[110.158562, 18.99944],
[110.124118, 19.04747],
[110.115229, 19.133191],
[110.057267, 19.134617],
[110.026526, 19.17564],
[109.957638, 19.188625],
[109.923565, 19.239608],
[109.822733, 19.289626],
[109.826436, 19.343108],
[109.876436, 19.386926]
]
]
]
}
}
]
}

6830
src/assets/map/湖北.json Normal file

File diff suppressed because it is too large Load Diff

7611
src/assets/map/湖南.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

4573
src/assets/map/甘肃.json Normal file

File diff suppressed because it is too large Load Diff

5223
src/assets/map/福建.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More