Repository: yanghuayi/vue-ts-admin
Branch: master
Commit: 29c935b08b1d
Files: 108
Total size: 560.2 KB
Directory structure:
gitextract_w4k0vq3y/
├── .browserslistrc
├── .editorconfig
├── .eslintrc.js
├── .gitignore
├── README.md
├── babel.config.js
├── package.json
├── postcss.config.js
├── public/
│ ├── canvaslayer.js
│ └── index.html
├── src/
│ ├── App.less
│ ├── App.tsx
│ ├── api/
│ │ └── api.ts
│ ├── assets/
│ │ ├── json/
│ │ │ └── map.json
│ │ └── menu.json
│ ├── components/
│ │ ├── FilterTable/
│ │ │ ├── MFilter.less
│ │ │ ├── MFilter.tsx
│ │ │ ├── MTable.less
│ │ │ ├── MTable.tsx
│ │ │ └── index.vue
│ │ ├── HelloWorld.vue
│ │ ├── Layout/
│ │ │ ├── AppMain.less
│ │ │ ├── AppMain.tsx
│ │ │ ├── Header/
│ │ │ │ ├── Header.less
│ │ │ │ └── Header.tsx
│ │ │ └── Sidebar/
│ │ │ ├── MenuList.less
│ │ │ ├── MenuList.tsx
│ │ │ ├── Sidebar.less
│ │ │ └── Sidebar.tsx
│ │ ├── Loader/
│ │ │ └── index.vue
│ │ └── Spin/
│ │ ├── index.less
│ │ └── index.tsx
│ ├── global.d.ts
│ ├── interface/
│ │ └── index.ts
│ ├── main.ts
│ ├── mock/
│ │ ├── baseData.js
│ │ ├── customers.js
│ │ ├── dashboard.js
│ │ ├── index.js
│ │ └── login.js
│ ├── router/
│ │ ├── import_development.ts
│ │ ├── import_production.ts
│ │ └── index.ts
│ ├── shims-ant-design-vue.d.ts
│ ├── shims-tsx.d.ts
│ ├── shims-vue-amap.d.ts
│ ├── shims-vue.d.ts
│ ├── store/
│ │ ├── getters.ts
│ │ ├── index.ts
│ │ └── modules/
│ │ ├── app.ts
│ │ └── user.ts
│ ├── styles/
│ │ ├── global.less
│ │ └── var.less
│ ├── utils/
│ │ ├── city.ts
│ │ ├── config.ts
│ │ ├── coordTrasns.ts
│ │ ├── index.ts
│ │ └── request.ts
│ └── views/
│ ├── chart/
│ │ ├── apexCharts/
│ │ │ ├── area/
│ │ │ │ ├── dataSeries.ts
│ │ │ │ ├── dateSeries.ts
│ │ │ │ ├── githubData.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── params.ts
│ │ │ ├── bar/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── params.ts
│ │ │ ├── column/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── params.ts
│ │ │ ├── index.tsx
│ │ │ ├── line/
│ │ │ │ ├── dataSeries.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── params.ts
│ │ │ └── mixed/
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ └── params.ts
│ │ └── index.tsx
│ ├── components/
│ │ ├── form/
│ │ │ ├── baseForm/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── index.tsx
│ │ └── index.tsx
│ ├── customers/
│ │ ├── baseInfo/
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ └── infoModal.tsx
│ │ └── index.tsx
│ ├── dashboard/
│ │ ├── index.less
│ │ └── index.tsx
│ ├── error/
│ │ ├── 401.vue
│ │ └── 404.vue
│ ├── login/
│ │ ├── index.tsx
│ │ └── login.less
│ ├── map/
│ │ ├── index.tsx
│ │ └── trajectory/
│ │ ├── commonfun.ts
│ │ ├── data.json
│ │ ├── index.less
│ │ ├── index.tsx
│ │ └── mapControl.ts
│ └── project/
│ ├── detail/
│ │ ├── index.less
│ │ └── index.tsx
│ ├── index.tsx
│ └── list/
│ ├── index.less
│ └── index.tsx
├── tests/
│ └── e2e/
│ ├── custom-assertions/
│ │ └── elementCount.js
│ └── specs/
│ └── test.js
├── tsconfig.json
└── vue.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .browserslistrc
================================================
> 1%
last 2 versions
not ie <= 8
================================================
FILE: .editorconfig
================================================
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 100
================================================
FILE: .eslintrc.js
================================================
module.exports = {
root: true,
env: {
node: true,
},
extends: [
'plugin:vue/essential',
'@vue/airbnb',
'@vue/typescript',
],
rules: {
'max-len': 'off',
'new-cap': 'off',
'no-continue': 'off',
'experimentalDecorators': 'off',
'consistent-return': 'off',
'no-plusplus': 'off',
'guard-for-in': 'off',
'prefer-destructuring': 'off',
'prefer-promise-reject-errors': 'off',
'camelcase': 'off',
'eslint-import-resolver-typescript': {
'extensions': ['.ts', '.tsx', '.d.ts']
},
'space-infix-ops': 'off',
'import/prefer-default-export': 'off',
'no-restricted-syntax': 0,
'no-restricted-globals': 'off',
'global-require': 'off',
'import/no-dynamic-require': 'off',
'import/no-unresolved': 'off',
'import/newline-after-import': 'off',
'import/extensions': 'off',
'no-param-reassign': 'off',
'class-methods-use-this': 'off',
'linebreak-style': 'off',
'no-console': 'off',
'no-debugger': 'off',
'vue/attribute-hyphenation': [
'error',
'always'
],
'vue/html-end-tags': 'error',
'vue/html-indent': [
'error',
2
],
'vue/html-self-closing': 'error',
'vue/require-default-prop': 'error',
'vue/require-prop-types': 'error',
'vue/attributes-order': 'error',
'vue/order-in-components': 'error',
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
},
parserOptions: {
parser: '@typescript-eslint/parser',
},
};
================================================
FILE: .gitignore
================================================
.DS_Store
node_modules
/dist
/tests/e2e/reports/
selenium-debug.log
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
================================================
FILE: README.md
================================================
# vue-ts-admin
> 一个基于`typesciprt` + `vue` + `vue-cli@3.4.1`的中台管理系统
## [演示地址(https://vue-ts-admin.cqmimi.club/)](https://vue-ts-admin.cqmimi.club/)
### 特点
1. 基于`typescript`, 代码更加健壮,出bug几率更小
2. `tab`缓存页面,可以同时打开多个路由,并随意切换和关闭
3. 基于`ant-design-vue`, 美观大方,简洁明亮
4. 响应式架构,在移动端可以正常使用
### 持续更新中
### 项目截图


================================================
FILE: babel.config.js
================================================
module.exports = {
presets: [
'@vue/app',
],
plugins: [
[
'import',
{ libraryName: 'ant-design-vue', libraryDirectory: 'es', style: true },
],
],
};
================================================
FILE: package.json
================================================
{
"name": "new-vue-ts-admin",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"test:e2e": "vue-cli-service test:e2e"
},
"theme": {
"primary-color": "#1DA57A",
"border-radius-base": "3px",
"border-radius-sm": "2px",
"shadow-color": "rgba(0,0,0,0.05)",
"shadow-1-down": "4px 4px 40px @shadow-color",
"border-color-split": "#f4f4f4",
"border-color-base": "#e5e5e5",
"font-size-base": "13px",
"text-color": "#666"
},
"dependencies": {
"ant-design-vue": "^1.3.7",
"axios": "^0.18.0",
"babel-plugin-import": "^1.11.0",
"body-parser": "^1.18.3",
"chart.js": "^2.8.0",
"constants": "^0.0.2",
"cookies": "^0.7.3",
"extract-text-webpack-plugin": "^3.0.2",
"js-cookie": "^2.2.0",
"jsonp": "^0.2.1",
"lodash": "^4.17.11",
"mock": "^0.1.1",
"mockjs": "^1.0.1-beta3",
"moment": "^2.24.0",
"path-to-regexp": "^3.0.0",
"q": "^1.5.1",
"qs": "^6.7.0",
"vue": "^2.6.10",
"vue-amap": "^0.5.9",
"vue-class-component": "^7.0.2",
"vue-property-decorator": "^8.1.0",
"vue-router": "^3.0.2",
"vuex": "^3.1.0"
},
"devDependencies": {
"@types/chart.js": "^2.7.50",
"@types/js-cookie": "^2.2.2",
"@types/jsonp": "^0.2.0",
"@types/lodash": "^4.14.123",
"@types/qs": "^6.5.2",
"@vue/cli-plugin-babel": "^3.5.5",
"@vue/cli-plugin-e2e-nightwatch": "^3.5.1",
"@vue/cli-plugin-eslint": "^3.5.1",
"@vue/cli-plugin-typescript": "^3.5.3",
"@vue/cli-service": "^3.5.3",
"@vue/eslint-config-airbnb": "^4.0.0",
"@vue/eslint-config-typescript": "^4.0.0",
"babel-eslint": "^10.0.1",
"babel-plugin-component": "^1.1.1",
"babel-plugin-jsx-v-model": "^2.0.3",
"babel-plugin-syntax-jsx": "^6.18.0",
"eslint": "^5.16.0",
"eslint-plugin-vue": "^5.2.2",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"typescript": "~3.4.1",
"vue-jsx-hot-loader": "^1.4.0",
"vue-template-compiler": "^2.6.10"
}
}
================================================
FILE: postcss.config.js
================================================
module.exports = {
plugins: {
autoprefixer: {},
},
};
================================================
FILE: public/canvaslayer.js
================================================
/**
* 一直覆盖在当前地图视野的Canvas对象
*
* @author nikai (@胖嘟嘟的骨头, nikai@baidu.com)
*
* @param
* {
* map 地图实例对象
* }
*/
function CanvasLayer(options) {
this.options = options || {};
this.paneName = this.options.paneName || 'labelPane';
this.zIndex = this.options.zIndex || 0;
this._map = options.map;
this._lastDrawTime = null;
this.show();
}
CanvasLayer.prototype = new BMap.Overlay();
CanvasLayer.prototype.initialize = function (map) {
this._map = map;
const canvas = this.canvas = document.createElement('canvas');
const ctx = this.ctx = this.canvas.getContext('2d');
canvas.style.cssText = `${'position:absolute;'
+ 'left:0;'
+ 'top:0;'
+ 'z-index:'}${this.zIndex};`;
this.adjustSize();
this.adjustRatio(ctx);
map.getPanes()[this.paneName].appendChild(canvas);
const that = this;
map.addEventListener('resize', () => {
that.adjustSize();
that._draw();
});
return this.canvas;
};
CanvasLayer.prototype.adjustSize = function () {
const size = this._map.getSize();
const canvas = this.canvas;
canvas.width = size.width;
canvas.height = size.height;
canvas.style.width = `${canvas.width}px`;
canvas.style.height = `${canvas.height}px`;
};
CanvasLayer.prototype.adjustRatio = function (ctx) {
const backingStore = ctx.backingStorePixelRatio
|| ctx.webkitBackingStorePixelRatio
|| ctx.mozBackingStorePixelRatio
|| ctx.msBackingStorePixelRatio
|| ctx.oBackingStorePixelRatio
|| ctx.backingStorePixelRatio || 1;
const pixelRatio = (window.devicePixelRatio || 1) / backingStore;
const canvasWidth = ctx.canvas.width;
const canvasHeight = ctx.canvas.height;
ctx.canvas.width = canvasWidth * pixelRatio;
ctx.canvas.height = canvasHeight * pixelRatio;
ctx.canvas.style.width = `${canvasWidth}px`;
ctx.canvas.style.height = `${canvasHeight}px`;
ctx.scale(pixelRatio, pixelRatio);
};
CanvasLayer.prototype.draw = function () {
const self = this;
const args = arguments;
clearTimeout(self.timeoutID);
self.timeoutID = setTimeout(() => {
self._draw(...args);
}, 15);
};
CanvasLayer.prototype._draw = function () {
const map = this._map;
this.canvas.style.left = `${-map.offsetX}px`;
this.canvas.style.top = `${-map.offsetY}px`;
this.dispatchEvent('draw');
this.options.update && this.options.update.apply(this, arguments);
};
CanvasLayer.prototype.getContainer = function () {
return this.canvas;
};
CanvasLayer.prototype.show = function () {
if (!this.canvas) {
this._map.addOverlay(this);
}
this.canvas.style.display = 'block';
};
CanvasLayer.prototype.hide = function () {
this.canvas.style.display = 'none';
// this._map.removeOverlay(this);
};
CanvasLayer.prototype.setZIndex = function (zIndex) {
this.canvas.style.zIndex = zIndex;
};
CanvasLayer.prototype.getZIndex = function () {
return this.zIndex;
};
================================================
FILE: public/index.html
================================================
vue-ts-admin
================================================
FILE: src/App.less
================================================
.ant-table-thead > tr > th, .ant-table-tbody > tr > td {
padding: 12px 8px;
}
.ant-table-tbody {
background-color: #fff;
}
================================================
FILE: src/App.tsx
================================================
import {
Component, Prop, Emit, Vue, Inject, Provide,
} from 'vue-property-decorator';
import { LocaleProvider } from 'ant-design-vue';
import zh_CN from 'ant-design-vue/lib/locale-provider/zh_CN';
import 'moment/locale/zh-cn';
import AppMain from '@/components/Layout/AppMain';
import Loader from '@/components/Loader/index.vue';
import './App.less';
@Component({
components: {
loader: Loader,
'a-locale-provider': LocaleProvider,
},
})
export default class App extends Vue {
created() {
this.isMobile();
window.onresize = () => {
this.isMobile();
};
}
// 屏幕width 是否 < 768
isMobile() {
const { isMobile } = this.$store.state.app;
const body = document.querySelector('body');
const bodyWidth = body ? body.offsetWidth : 0;
if (isMobile && bodyWidth > 768) {
this.$store.dispatch('ChangeMobile', false);
} else if (!isMobile && bodyWidth <= 768) {
this.$store.dispatch('ChangeMobile', true);
}
}
render() {
const self = this;
return (
);
}
}
================================================
FILE: src/api/api.ts
================================================
import axios, { AxiosPromise, AxiosInstance } from 'axios';
import qs from 'qs';
import jsonp from 'jsonp';
import lodash from 'lodash';
import router from '@/router/index';
import { message } from 'ant-design-vue';
interface ApiList {
[key: string]: {
url: string; // 请求地址
fetchType?: string; // 数据格式,支持json,formData
method?: string; // 请求方法
headers?: any; // 头部携带信息
};
}
interface Options {
data: any;
url: string;
fetchType?: string;
method?: string;
headers?: any;
}
interface Apis {
[key: string]: (data: object) => Promise;
}
export default class Api {
service: AxiosInstance;
// 请求列表,在这里添加相应接口
apiList: ApiList = {
login: {
url: '/user/login',
fetchType: 'json',
method: 'post',
},
logout: {
url: '/user/logout',
fetchType: 'json',
method: 'post',
},
getUserInfo: {
url: '/user/getUserInfo',
fetchType: 'json',
method: 'post',
},
dashboard: {
url: '/dashboard',
fetchType: 'json',
method: 'post',
},
baseInfoAdd: {
url: '/customers/baseInfo/add',
fetchType: 'json',
method: 'post',
},
baseInfoUpdate: {
url: '/customers/baseInfo/update',
fetchType: 'json',
method: 'post',
},
baseInfoDelete: {
url: '/customers/baseInfo/delete',
fetchType: 'json',
method: 'post',
},
gpsToAddress: {
url: 'https://api.map.baidu.com/geocoder/v2/',
method: 'get',
fetchType: 'jsonp',
},
};
// 对外暴露方法
api: Apis = {};
constructor(options: { baseUrl: string }) {
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
this.service = axios.create({
baseURL: options.baseUrl, // api的base_url
timeout: 20000, // 请求超时时间
});
for (const i in this.apiList) {
this.api[i] = (data: any) => {
const { url } = this.apiList[i];
if (i === 'gpsToAddress') {
data = {
callback: 'renderReverse',
coordtype: data.coordinateSystem,
location: `${data.lat},${data.lng}`,
output: 'json',
pois: 1,
ak: '3oWu5SgExpeyXtRXbuDdRO08CoVMTloM',
};
}
return this.request({
method: this.apiList[i].method,
data,
fetchType: this.apiList[i].fetchType,
url,
headers: this.apiList[i].headers,
});
};
}
}
request = (options: Options) => this.fetch(options)
.then((response: any) => {
const { statusText, status } = response;
let { data } = response;
if (data instanceof Array) {
data = {
list: data,
};
}
// 登录超时判断
if (response.data.result && response.data.result.resultCode === 3) {
router.replace({ name: 'login' });
return Promise.reject({
success: false,
message: response.data.result.resultMessage,
});
}
return Promise.resolve({
success: true,
message: statusText,
statusCode: status,
data,
});
})
.catch((error: any) => {
const { response } = error;
let msg;
let statusCode;
if (response && response instanceof Object) {
const { data, statusText } = response;
statusCode = response.status;
msg = data.message || statusText;
} else {
statusCode = 600;
msg = error.message || 'Network Error';
}
message.error(msg);
return Promise.reject({ success: false, statusCode, message: msg });
});
fetch = (options: Options) => {
const {
url, data, fetchType, method = 'get',
} = options;
let cloneData: any = lodash.cloneDeep(data);
cloneData = qs.stringify(cloneData);
const headers = {
token: window.localStorage.getItem('token'),
...options.headers,
};
if (fetchType === 'jsonp') {
return new Promise((resolve, reject) => {
jsonp(
url,
{
param: `${qs.stringify(data)}&callback`,
name: `jsonp_${new Date().getTime()}`,
timeout: 4000,
},
(error, result) => {
if (error) {
reject(error);
}
resolve({ statusText: 'OK', status: 200, data: result });
},
);
});
}
if (fetchType === 'json') {
return this.service({
url,
method: method.toLowerCase(),
headers: {
'Content-Type': 'application/json',
...headers,
},
data,
});
}
if (fetchType === 'jsonfile') {
return axios.get(url, { headers });
}
switch (method.toLowerCase()) {
case 'get':
return this.service.get(`${url}?${cloneData}`, { headers });
case 'delete':
return this.service.delete(url, {
data: cloneData,
headers,
});
case 'post':
return this.service.post(url, cloneData, { headers });
case 'put':
return this.service.put(url, cloneData, { headers });
case 'patch':
return this.service.patch(url, cloneData, { headers });
default:
return this.service(options);
}
};
}
================================================
FILE: src/assets/json/map.json
================================================
{"110000":"北京市","110100":"北京市","110101":"东城区","110102":"西城区","110105":"朝阳区","110106":"丰台区","110107":"石景山区","110108":"海淀区","110109":"门头沟区","110111":"房山区","110112":"通州区","110113":"顺义区","110114":"昌平区","110115":"大兴区","110116":"怀柔区","110117":"平谷区","110118":"密云区","110119":"延庆区","120000":"天津市","120100":"天津市","120101":"和平区","120102":"河东区","120103":"河西区","120104":"南开区","120105":"河北区","120106":"红桥区","120110":"东丽区","120111":"西青区","120112":"津南区","120113":"北辰区","120114":"武清区","120115":"宝坻区","120116":"滨海新区","120117":"宁河区","120118":"静海区","120119":"蓟州区","130000":"河北省","130100":"石家庄市","130102":"长安区","130104":"桥西区","130105":"新华区","130107":"井陉矿区","130108":"裕华区","130109":"藁城区","130110":"鹿泉区","130111":"栾城区","130121":"井陉县","130123":"正定县","130125":"行唐县","130126":"灵寿县","130127":"高邑县","130128":"深泽县","130129":"赞皇县","130130":"无极县","130131":"平山县","130132":"元氏县","130133":"赵县","130181":"辛集市","130183":"晋州市","130184":"新乐市","130200":"唐山市","130202":"路南区","130203":"路北区","130204":"古冶区","130205":"开平区","130207":"丰南区","130208":"丰润区","130209":"曹妃甸区","130223":"滦县","130224":"滦南县","130225":"乐亭县","130227":"迁西县","130229":"玉田县","130281":"遵化市","130283":"迁安市","130300":"秦皇岛市","130302":"海港区","130303":"山海关区","130304":"北戴河区","130306":"抚宁区","130321":"青龙满族自治县","130322":"昌黎县","130324":"卢龙县","130400":"邯郸市","130402":"邯山区","130403":"丛台区","130404":"复兴区","130406":"峰峰矿区","130407":"肥乡区","130408":"永年区","130423":"临漳县","130424":"成安县","130425":"大名县","130426":"涉县","130427":"磁县","130430":"邱县","130431":"鸡泽县","130432":"广平县","130433":"馆陶县","130434":"魏县","130435":"曲周县","130481":"武安市","130500":"邢台市","130502":"桥东区","130503":"桥西区","130521":"邢台县","130522":"临城县","130523":"内丘县","130524":"柏乡县","130525":"隆尧县","130526":"任县","130527":"南和县","130528":"宁晋县","130529":"巨鹿县","130530":"新河县","130531":"广宗县","130532":"平乡县","130533":"威县","130534":"清河县","130535":"临西县","130581":"南宫市","130582":"沙河市","130600":"保定市","130602":"竞秀区","130606":"莲池区","130607":"满城区","130608":"清苑区","130609":"徐水区","130623":"涞水县","130624":"阜平县","130626":"定兴县","130627":"唐县","130628":"高阳县","130629":"容城县","130630":"涞源县","130631":"望都县","130632":"安新县","130633":"易县","130634":"曲阳县","130635":"蠡县","130636":"顺平县","130637":"博野县","130638":"雄县","130681":"涿州市","130682":"定州市","130683":"安国市","130684":"高碑店市","130700":"张家口市","130702":"桥东区","130703":"桥西区","130705":"宣化区","130706":"下花园区","130708":"万全区","130709":"崇礼区","130722":"张北县","130723":"康保县","130724":"沽源县","130725":"尚义县","130726":"蔚县","130727":"阳原县","130728":"怀安县","130730":"怀来县","130731":"涿鹿县","130732":"赤城县","130800":"承德市","130802":"双桥区","130803":"双滦区","130804":"鹰手营子矿区","130821":"承德县","130822":"兴隆县","130824":"滦平县","130825":"隆化县","130826":"丰宁满族自治县","130827":"宽城满族自治县","130828":"围场满族蒙古族自治县","130881":"平泉市","130900":"沧州市","130902":"新华区","130903":"运河区","130921":"沧县","130922":"青县","130923":"东光县","130924":"海兴县","130925":"盐山县","130926":"肃宁县","130927":"南皮县","130928":"吴桥县","130929":"献县","130930":"孟村回族自治县","130981":"泊头市","130982":"任丘市","130983":"黄骅市","130984":"河间市","131000":"廊坊市","131002":"安次区","131003":"广阳区","131022":"固安县","131023":"永清县","131024":"香河县","131025":"大城县","131026":"文安县","131028":"大厂回族自治县","131081":"霸州市","131082":"三河市","131100":"衡水市","131102":"桃城区","131103":"冀州区","131121":"枣强县","131122":"武邑县","131123":"武强县","131124":"饶阳县","131125":"安平县","131126":"故城县","131127":"景县","131128":"阜城县","131182":"深州市","140000":"山西省","140100":"太原市","140105":"小店区","140106":"迎泽区","140107":"杏花岭区","140108":"尖草坪区","140109":"万柏林区","140110":"晋源区","140121":"清徐县","140122":"阳曲县","140123":"娄烦县","140181":"古交市","140200":"大同市","140202":"城区","140203":"矿区","140211":"南郊区","140212":"新荣区","140221":"阳高县","140222":"天镇县","140223":"广灵县","140224":"灵丘县","140225":"浑源县","140226":"左云县","140227":"大同县","140300":"阳泉市","140302":"城区","140303":"矿区","140311":"郊区","140321":"平定县","140322":"盂县","140400":"长治市","140402":"城区","140411":"郊区","140421":"长治县","140423":"襄垣县","140424":"屯留县","140425":"平顺县","140426":"黎城县","140427":"壶关县","140428":"长子县","140429":"武乡县","140430":"沁县","140431":"沁源县","140481":"潞城市","140500":"晋城市","140502":"城区","140521":"沁水县","140522":"阳城县","140524":"陵川县","140525":"泽州县","140581":"高平市","140600":"朔州市","140602":"朔城区","140603":"平鲁区","140621":"山阴县","140622":"应县","140623":"右玉县","140624":"怀仁县","140700":"晋中市","140702":"榆次区","140721":"榆社县","140722":"左权县","140723":"和顺县","140724":"昔阳县","140725":"寿阳县","140726":"太谷县","140727":"祁县","140728":"平遥县","140729":"灵石县","140781":"介休市","140800":"运城市","140802":"盐湖区","140821":"临猗县","140822":"万荣县","140823":"闻喜县","140824":"稷山县","140825":"新绛县","140826":"绛县","140827":"垣曲县","140828":"夏县","140829":"平陆县","140830":"芮城县","140881":"永济市","140882":"河津市","140900":"忻州市","140902":"忻府区","140921":"定襄县","140922":"五台县","140923":"代县","140924":"繁峙县","140925":"宁武县","140926":"静乐县","140927":"神池县","140928":"五寨县","140929":"岢岚县","140930":"河曲县","140931":"保德县","140932":"偏关县","140981":"原平市","141000":"临汾市","141002":"尧都区","141021":"曲沃县","141022":"翼城县","141023":"襄汾县","141024":"洪洞县","141025":"古县","141026":"安泽县","141027":"浮山县","141028":"吉县","141029":"乡宁县","141030":"大宁县","141031":"隰县","141032":"永和县","141033":"蒲县","141034":"汾西县","141081":"侯马市","141082":"霍州市","141100":"吕梁市","141102":"离石区","141121":"文水县","141122":"交城县","141123":"兴县","141124":"临县","141125":"柳林县","141126":"石楼县","141127":"岚县","141128":"方山县","141129":"中阳县","141130":"交口县","141181":"孝义市","141182":"汾阳市","150000":"内蒙古自治区","150100":"呼和浩特市","150102":"新城区","150103":"回民区","150104":"玉泉区","150105":"赛罕区","150121":"土默特左旗","150122":"托克托县","150123":"和林格尔县","150124":"清水河县","150125":"武川县","150200":"包头市","150202":"东河区","150203":"昆都仑区","150204":"青山区","150205":"石拐区","150206":"白云鄂博矿区","150207":"九原区","150221":"土默特右旗","150222":"固阳县","150223":"达尔罕茂明安联合旗","150300":"乌海市","150302":"海勃湾区","150303":"海南区","150304":"乌达区","150400":"赤峰市","150402":"红山区","150403":"元宝山区","150404":"松山区","150421":"阿鲁科尔沁旗","150422":"巴林左旗","150423":"巴林右旗","150424":"林西县","150425":"克什克腾旗","150426":"翁牛特旗","150428":"喀喇沁旗","150429":"宁城县","150430":"敖汉旗","150500":"通辽市","150502":"科尔沁区","150521":"科尔沁左翼中旗","150522":"科尔沁左翼后旗","150523":"开鲁县","150524":"库伦旗","150525":"奈曼旗","150526":"扎鲁特旗","150581":"霍林郭勒市","150600":"鄂尔多斯市","150602":"东胜区","150603":"康巴什区","150621":"达拉特旗","150622":"准格尔旗","150623":"鄂托克前旗","150624":"鄂托克旗","150625":"杭锦旗","150626":"乌审旗","150627":"伊金霍洛旗","150700":"呼伦贝尔市","150702":"海拉尔区","150703":"扎赉诺尔区","150721":"阿荣旗","150722":"莫力达瓦达斡尔族自治旗","150723":"鄂伦春自治旗","150724":"鄂温克族自治旗","150725":"陈巴尔虎旗","150726":"新巴尔虎左旗","150727":"新巴尔虎右旗","150781":"满洲里市","150782":"牙克石市","150783":"扎兰屯市","150784":"额尔古纳市","150785":"根河市","150800":"巴彦淖尔市","150802":"临河区","150821":"五原县","150822":"磴口县","150823":"乌拉特前旗","150824":"乌拉特中旗","150825":"乌拉特后旗","150826":"杭锦后旗","150900":"乌兰察布市","150902":"集宁区","150921":"卓资县","150922":"化德县","150923":"商都县","150924":"兴和县","150925":"凉城县","150926":"察哈尔右翼前旗","150927":"察哈尔右翼中旗","150928":"察哈尔右翼后旗","150929":"四子王旗","150981":"丰镇市","152200":"兴安盟","152201":"乌兰浩特市","152202":"阿尔山市","152221":"科尔沁右翼前旗","152222":"科尔沁右翼中旗","152223":"扎赉特旗","152224":"突泉县","152500":"锡林郭勒盟","152501":"二连浩特市","152502":"锡林浩特市","152522":"阿巴嘎旗","152523":"苏尼特左旗","152524":"苏尼特右旗","152525":"东乌珠穆沁旗","152526":"西乌珠穆沁旗","152527":"太仆寺旗","152528":"镶黄旗","152529":"正镶白旗","152530":"正蓝旗","152531":"多伦县","152900":"阿拉善盟","152921":"阿拉善左旗","152922":"阿拉善右旗","152923":"额济纳旗","210000":"辽宁省","210100":"沈阳市","210102":"和平区","210103":"沈河区","210104":"大东区","210105":"皇姑区","210106":"铁西区","210111":"苏家屯区","210112":"浑南区","210113":"沈北新区","210114":"于洪区","210115":"辽中区","210123":"康平县","210124":"法库县","210181":"新民市","210200":"大连市","210202":"中山区","210203":"西岗区","210204":"沙河口区","210211":"甘井子区","210212":"旅顺口区","210213":"金州区","210214":"普兰店区","210224":"长海县","210281":"瓦房店市","210283":"庄河市","210300":"鞍山市","210302":"铁东区","210303":"铁西区","210304":"立山区","210311":"千山区","210321":"台安县","210323":"岫岩满族自治县","210381":"海城市","210400":"抚顺市","210402":"新抚区","210403":"东洲区","210404":"望花区","210411":"顺城区","210421":"抚顺县","210422":"新宾满族自治县","210423":"清原满族自治县","210500":"本溪市","210502":"平山区","210503":"溪湖区","210504":"明山区","210505":"南芬区","210521":"本溪满族自治县","210522":"桓仁满族自治县","210600":"丹东市","210602":"元宝区","210603":"振兴区","210604":"振安区","210624":"宽甸满族自治县","210681":"东港市","210682":"凤城市","210700":"锦州市","210702":"古塔区","210703":"凌河区","210711":"太和区","210726":"黑山县","210727":"义县","210781":"凌海市","210782":"北镇市","210800":"营口市","210802":"站前区","210803":"西市区","210804":"鲅鱼圈区","210811":"老边区","210881":"盖州市","210882":"大石桥市","210900":"阜新市","210902":"海州区","210903":"新邱区","210904":"太平区","210905":"清河门区","210911":"细河区","210921":"阜新蒙古族自治县","210922":"彰武县","211000":"辽阳市","211002":"白塔区","211003":"文圣区","211004":"宏伟区","211005":"弓长岭区","211011":"太子河区","211021":"辽阳县","211081":"灯塔市","211100":"盘锦市","211102":"双台子区","211103":"兴隆台区","211104":"大洼区","211122":"盘山县","211200":"铁岭市","211202":"银州区","211204":"清河区","211221":"铁岭县","211223":"西丰县","211224":"昌图县","211281":"调兵山市","211282":"开原市","211300":"朝阳市","211302":"双塔区","211303":"龙城区","211321":"朝阳县","211322":"建平县","211324":"喀喇沁左翼蒙古族自治县","211381":"北票市","211382":"凌源市","211400":"葫芦岛市","211402":"连山区","211403":"龙港区","211404":"南票区","211421":"绥中县","211422":"建昌县","211481":"兴城市","220000":"吉林省","220100":"长春市","220102":"南关区","220103":"宽城区","220104":"朝阳区","220105":"二道区","220106":"绿园区","220112":"双阳区","220113":"九台区","220122":"农安县","220182":"榆树市","220183":"德惠市","220200":"吉林市","220202":"昌邑区","220203":"龙潭区","220204":"船营区","220211":"丰满区","220221":"永吉县","220281":"蛟河市","220282":"桦甸市","220283":"舒兰市","220284":"磐石市","220300":"四平市","220302":"铁西区","220303":"铁东区","220322":"梨树县","220323":"伊通满族自治县","220381":"公主岭市","220382":"双辽市","220400":"辽源市","220402":"龙山区","220403":"西安区","220421":"东丰县","220422":"东辽县","220500":"通化市","220502":"东昌区","220503":"二道江区","220521":"通化县","220523":"辉南县","220524":"柳河县","220581":"梅河口市","220582":"集安市","220600":"白山市","220602":"浑江区","220605":"江源区","220621":"抚松县","220622":"靖宇县","220623":"长白朝鲜族自治县","220681":"临江市","220700":"松原市","220702":"宁江区","220721":"前郭尔罗斯蒙古族自治县","220722":"长岭县","220723":"乾安县","220781":"扶余市","220800":"白城市","220802":"洮北区","220821":"镇赉县","220822":"通榆县","220881":"洮南市","220882":"大安市","222400":"延边朝鲜族自治州","222401":"延吉市","222402":"图们市","222403":"敦化市","222404":"珲春市","222405":"龙井市","222406":"和龙市","222424":"汪清县","222426":"安图县","230000":"黑龙江省","230100":"哈尔滨市","230102":"道里区","230103":"南岗区","230104":"道外区","230108":"平房区","230109":"松北区","230110":"香坊区","230111":"呼兰区","230112":"阿城区","230113":"双城区","230123":"依兰县","230124":"方正县","230125":"宾县","230126":"巴彦县","230127":"木兰县","230128":"通河县","230129":"延寿县","230183":"尚志市","230184":"五常市","230200":"齐齐哈尔市","230202":"龙沙区","230203":"建华区","230204":"铁锋区","230205":"昂昂溪区","230206":"富拉尔基区","230207":"碾子山区","230208":"梅里斯达斡尔族区","230221":"龙江县","230223":"依安县","230224":"泰来县","230225":"甘南县","230227":"富裕县","230229":"克山县","230230":"克东县","230231":"拜泉县","230281":"讷河市","230300":"鸡西市","230302":"鸡冠区","230303":"恒山区","230304":"滴道区","230305":"梨树区","230306":"城子河区","230307":"麻山区","230321":"鸡东县","230381":"虎林市","230382":"密山市","230400":"鹤岗市","230402":"向阳区","230403":"工农区","230404":"南山区","230405":"兴安区","230406":"东山区","230407":"兴山区","230421":"萝北县","230422":"绥滨县","230500":"双鸭山市","230502":"尖山区","230503":"岭东区","230505":"四方台区","230506":"宝山区","230521":"集贤县","230522":"友谊县","230523":"宝清县","230524":"饶河县","230600":"大庆市","230602":"萨尔图区","230603":"龙凤区","230604":"让胡路区","230605":"红岗区","230606":"大同区","230621":"肇州县","230622":"肇源县","230623":"林甸县","230624":"杜尔伯特蒙古族自治县","230700":"伊春市","230702":"伊春区","230703":"南岔区","230704":"友好区","230705":"西林区","230706":"翠峦区","230707":"新青区","230708":"美溪区","230709":"金山屯区","230710":"五营区","230711":"乌马河区","230712":"汤旺河区","230713":"带岭区","230714":"乌伊岭区","230715":"红星区","230716":"上甘岭区","230722":"嘉荫县","230781":"铁力市","230800":"佳木斯市","230803":"向阳区","230804":"前进区","230805":"东风区","230811":"郊区","230822":"桦南县","230826":"桦川县","230828":"汤原县","230881":"同江市","230882":"富锦市","230883":"抚远市","230900":"七台河市","230902":"新兴区","230903":"桃山区","230904":"茄子河区","230921":"勃利县","231000":"牡丹江市","231002":"东安区","231003":"阳明区","231004":"爱民区","231005":"西安区","231025":"林口县","231081":"绥芬河市","231083":"海林市","231084":"宁安市","231085":"穆棱市","231086":"东宁市","231100":"黑河市","231102":"爱辉区","231121":"嫩江县","231123":"逊克县","231124":"孙吴县","231181":"北安市","231182":"五大连池市","231200":"绥化市","231202":"北林区","231221":"望奎县","231222":"兰西县","231223":"青冈县","231224":"庆安县","231225":"明水县","231226":"绥棱县","231281":"安达市","231282":"肇东市","231283":"海伦市","232700":"大兴安岭地区","232721":"呼玛县","232722":"塔河县","232723":"漠河县","310000":"上海市","310100":"上海市","310101":"黄浦区","310104":"徐汇区","310105":"长宁区","310106":"静安区","310107":"普陀区","310109":"虹口区","310110":"杨浦区","310112":"闵行区","310113":"宝山区","310114":"嘉定区","310115":"浦东新区","310116":"金山区","310117":"松江区","310118":"青浦区","310120":"奉贤区","310151":"崇明区","320000":"江苏省","320100":"南京市","320102":"玄武区","320104":"秦淮区","320105":"建邺区","320106":"鼓楼区","320111":"浦口区","320113":"栖霞区","320114":"雨花台区","320115":"江宁区","320116":"六合区","320117":"溧水区","320118":"高淳区","320200":"无锡市","320205":"锡山区","320206":"惠山区","320211":"滨湖区","320213":"梁溪区","320214":"新吴区","320281":"江阴市","320282":"宜兴市","320300":"徐州市","320302":"鼓楼区","320303":"云龙区","320305":"贾汪区","320311":"泉山区","320312":"铜山区","320321":"丰县","320322":"沛县","320324":"睢宁县","320381":"新沂市","320382":"邳州市","320400":"常州市","320402":"天宁区","320404":"钟楼区","320411":"新北区","320412":"武进区","320413":"金坛区","320481":"溧阳市","320500":"苏州市","320505":"虎丘区","320506":"吴中区","320507":"相城区","320508":"姑苏区","320509":"吴江区","320581":"常熟市","320582":"张家港市","320583":"昆山市","320585":"太仓市","320600":"南通市","320602":"崇川区","320611":"港闸区","320612":"通州区","320621":"海安县","320623":"如东县","320681":"启东市","320682":"如皋市","320684":"海门市","320700":"连云港市","320703":"连云区","320706":"海州区","320707":"赣榆区","320722":"东海县","320723":"灌云县","320724":"灌南县","320800":"淮安市","320803":"淮安区","320804":"淮阴区","320812":"清江浦区","320813":"洪泽区","320826":"涟水县","320830":"盱眙县","320831":"金湖县","320900":"盐城市","320902":"亭湖区","320903":"盐都区","320904":"大丰区","320921":"响水县","320922":"滨海县","320923":"阜宁县","320924":"射阳县","320925":"建湖县","320981":"东台市","321000":"扬州市","321002":"广陵区","321003":"邗江区","321012":"江都区","321023":"宝应县","321081":"仪征市","321084":"高邮市","321100":"镇江市","321102":"京口区","321111":"润州区","321112":"丹徒区","321181":"丹阳市","321182":"扬中市","321183":"句容市","321200":"泰州市","321202":"海陵区","321203":"高港区","321204":"姜堰区","321281":"兴化市","321282":"靖江市","321283":"泰兴市","321300":"宿迁市","321302":"宿城区","321311":"宿豫区","321322":"沭阳县","321323":"泗阳县","321324":"泗洪县","330000":"浙江省","330100":"杭州市","330102":"上城区","330103":"下城区","330104":"江干区","330105":"拱墅区","330106":"西湖区","330108":"滨江区","330109":"萧山区","330110":"余杭区","330111":"富阳区","330112":"临安区","330122":"桐庐县","330127":"淳安县","330182":"建德市","330200":"宁波市","330203":"海曙区","330205":"江北区","330206":"北仑区","330211":"镇海区","330212":"鄞州区","330213":"奉化区","330225":"象山县","330226":"宁海县","330281":"余姚市","330282":"慈溪市","330300":"温州市","330302":"鹿城区","330303":"龙湾区","330304":"瓯海区","330305":"洞头区","330324":"永嘉县","330326":"平阳县","330327":"苍南县","330328":"文成县","330329":"泰顺县","330381":"瑞安市","330382":"乐清市","330400":"嘉兴市","330402":"南湖区","330411":"秀洲区","330421":"嘉善县","330424":"海盐县","330481":"海宁市","330482":"平湖市","330483":"桐乡市","330500":"湖州市","330502":"吴兴区","330503":"南浔区","330521":"德清县","330522":"长兴县","330523":"安吉县","330600":"绍兴市","330602":"越城区","330603":"柯桥区","330604":"上虞区","330624":"新昌县","330681":"诸暨市","330683":"嵊州市","330700":"金华市","330702":"婺城区","330703":"金东区","330723":"武义县","330726":"浦江县","330727":"磐安县","330781":"兰溪市","330782":"义乌市","330783":"东阳市","330784":"永康市","330800":"衢州市","330802":"柯城区","330803":"衢江区","330822":"常山县","330824":"开化县","330825":"龙游县","330881":"江山市","330900":"舟山市","330902":"定海区","330903":"普陀区","330921":"岱山县","330922":"嵊泗县","331000":"台州市","331002":"椒江区","331003":"黄岩区","331004":"路桥区","331022":"三门县","331023":"天台县","331024":"仙居县","331081":"温岭市","331082":"临海市","331083":"玉环市","331100":"丽水市","331102":"莲都区","331121":"青田县","331122":"缙云县","331123":"遂昌县","331124":"松阳县","331125":"云和县","331126":"庆元县","331127":"景宁畲族自治县","331181":"龙泉市","340000":"安徽省","340100":"合肥市","340102":"瑶海区","340103":"庐阳区","340104":"蜀山区","340111":"包河区","340121":"长丰县","340122":"肥东县","340123":"肥西县","340124":"庐江县","340181":"巢湖市","340200":"芜湖市","340202":"镜湖区","340203":"弋江区","340207":"鸠江区","340208":"三山区","340221":"芜湖县","340222":"繁昌县","340223":"南陵县","340225":"无为县","340300":"蚌埠市","340302":"龙子湖区","340303":"蚌山区","340304":"禹会区","340311":"淮上区","340321":"怀远县","340322":"五河县","340323":"固镇县","340400":"淮南市","340402":"大通区","340403":"田家庵区","340404":"谢家集区","340405":"八公山区","340406":"潘集区","340421":"凤台县","340422":"寿县","340500":"马鞍山市","340503":"花山区","340504":"雨山区","340506":"博望区","340521":"当涂县","340522":"含山县","340523":"和县","340600":"淮北市","340602":"杜集区","340603":"相山区","340604":"烈山区","340621":"濉溪县","340700":"铜陵市","340705":"铜官区","340706":"义安区","340711":"郊区","340722":"枞阳县","340800":"安庆市","340802":"迎江区","340803":"大观区","340811":"宜秀区","340822":"怀宁县","340824":"潜山县","340825":"太湖县","340826":"宿松县","340827":"望江县","340828":"岳西县","340881":"桐城市","341000":"黄山市","341002":"屯溪区","341003":"黄山区","341004":"徽州区","341021":"歙县","341022":"休宁县","341023":"黟县","341024":"祁门县","341100":"滁州市","341102":"琅琊区","341103":"南谯区","341122":"来安县","341124":"全椒县","341125":"定远县","341126":"凤阳县","341181":"天长市","341182":"明光市","341200":"阜阳市","341202":"颍州区","341203":"颍东区","341204":"颍泉区","341221":"临泉县","341222":"太和县","341225":"阜南县","341226":"颍上县","341282":"界首市","341300":"宿州市","341302":"埇桥区","341321":"砀山县","341322":"萧县","341323":"灵璧县","341324":"泗县","341500":"六安市","341502":"金安区","341503":"裕安区","341504":"叶集区","341522":"霍邱县","341523":"舒城县","341524":"金寨县","341525":"霍山县","341600":"亳州市","341602":"谯城区","341621":"涡阳县","341622":"蒙城县","341623":"利辛县","341700":"池州市","341702":"贵池区","341721":"东至县","341722":"石台县","341723":"青阳县","341800":"宣城市","341802":"宣州区","341821":"郎溪县","341822":"广德县","341823":"泾县","341824":"绩溪县","341825":"旌德县","341881":"宁国市","350000":"福建省","350100":"福州市","350102":"鼓楼区","350103":"台江区","350104":"仓山区","350105":"马尾区","350111":"晋安区","350121":"闽侯县","350122":"连江县","350123":"罗源县","350124":"闽清县","350125":"永泰县","350128":"平潭县","350181":"福清市","350182":"长乐区","350200":"厦门市","350203":"思明区","350205":"海沧区","350206":"湖里区","350211":"集美区","350212":"同安区","350213":"翔安区","350300":"莆田市","350302":"城厢区","350303":"涵江区","350304":"荔城区","350305":"秀屿区","350322":"仙游县","350400":"三明市","350402":"梅列区","350403":"三元区","350421":"明溪县","350423":"清流县","350424":"宁化县","350425":"大田县","350426":"尤溪县","350427":"沙县","350428":"将乐县","350429":"泰宁县","350430":"建宁县","350481":"永安市","350500":"泉州市","350502":"鲤城区","350503":"丰泽区","350504":"洛江区","350505":"泉港区","350521":"惠安县","350524":"安溪县","350525":"永春县","350526":"德化县","350527":"金门县","350581":"石狮市","350582":"晋江市","350583":"南安市","350600":"漳州市","350602":"芗城区","350603":"龙文区","350622":"云霄县","350623":"漳浦县","350624":"诏安县","350625":"长泰县","350626":"东山县","350627":"南靖县","350628":"平和县","350629":"华安县","350681":"龙海市","350700":"南平市","350702":"延平区","350703":"建阳区","350721":"顺昌县","350722":"浦城县","350723":"光泽县","350724":"松溪县","350725":"政和县","350781":"邵武市","350782":"武夷山市","350783":"建瓯市","350800":"龙岩市","350802":"新罗区","350803":"永定区","350821":"长汀县","350823":"上杭县","350824":"武平县","350825":"连城县","350881":"漳平市","350900":"宁德市","350902":"蕉城区","350921":"霞浦县","350922":"古田县","350923":"屏南县","350924":"寿宁县","350925":"周宁县","350926":"柘荣县","350981":"福安市","350982":"福鼎市","360000":"江西省","360100":"南昌市","360102":"东湖区","360103":"西湖区","360104":"青云谱区","360105":"湾里区","360111":"青山湖区","360112":"新建区","360121":"南昌县","360123":"安义县","360124":"进贤县","360200":"景德镇市","360202":"昌江区","360203":"珠山区","360222":"浮梁县","360281":"乐平市","360300":"萍乡市","360302":"安源区","360313":"湘东区","360321":"莲花县","360322":"上栗县","360323":"芦溪县","360400":"九江市","360402":"濂溪区","360403":"浔阳区","360421":"柴桑区","360423":"武宁县","360424":"修水县","360425":"永修县","360426":"德安县","360428":"都昌县","360429":"湖口县","360430":"彭泽县","360481":"瑞昌市","360482":"共青城市","360483":"庐山市","360500":"新余市","360502":"渝水区","360521":"分宜县","360600":"鹰潭市","360602":"月湖区","360622":"余江县","360681":"贵溪市","360700":"赣州市","360702":"章贡区","360703":"南康区","360704":"赣县区","360722":"信丰县","360723":"大余县","360724":"上犹县","360725":"崇义县","360726":"安远县","360727":"龙南县","360728":"定南县","360729":"全南县","360730":"宁都县","360731":"于都县","360732":"兴国县","360733":"会昌县","360734":"寻乌县","360735":"石城县","360781":"瑞金市","360800":"吉安市","360802":"吉州区","360803":"青原区","360821":"吉安县","360822":"吉水县","360823":"峡江县","360824":"新干县","360825":"永丰县","360826":"泰和县","360827":"遂川县","360828":"万安县","360829":"安福县","360830":"永新县","360881":"井冈山市","360900":"宜春市","360902":"袁州区","360921":"奉新县","360922":"万载县","360923":"上高县","360924":"宜丰县","360925":"靖安县","360926":"铜鼓县","360981":"丰城市","360982":"樟树市","360983":"高安市","361000":"抚州市","361002":"临川区","361003":"东乡区","361021":"南城县","361022":"黎川县","361023":"南丰县","361024":"崇仁县","361025":"乐安县","361026":"宜黄县","361027":"金溪县","361028":"资溪县","361030":"广昌县","361100":"上饶市","361102":"信州区","361103":"广丰区","361121":"上饶县","361123":"玉山县","361124":"铅山县","361125":"横峰县","361126":"弋阳县","361127":"余干县","361128":"鄱阳县","361129":"万年县","361130":"婺源县","361181":"德兴市","370000":"山东省","370100":"济南市","370102":"历下区","370103":"市中区","370104":"槐荫区","370105":"天桥区","370112":"历城区","370113":"长清区","370114":"章丘区","370124":"平阴县","370125":"济阳县","370126":"商河县","370200":"青岛市","370202":"市南区","370203":"市北区","370211":"黄岛区","370212":"崂山区","370213":"李沧区","370214":"城阳区","370281":"胶州市","370282":"即墨区","370283":"平度市","370285":"莱西市","370300":"淄博市","370302":"淄川区","370303":"张店区","370304":"博山区","370305":"临淄区","370306":"周村区","370321":"桓台县","370322":"高青县","370323":"沂源县","370400":"枣庄市","370402":"市中区","370403":"薛城区","370404":"峄城区","370405":"台儿庄区","370406":"山亭区","370481":"滕州市","370500":"东营市","370502":"东营区","370503":"河口区","370505":"垦利区","370522":"利津县","370523":"广饶县","370600":"烟台市","370602":"芝罘区","370611":"福山区","370612":"牟平区","370613":"莱山区","370634":"长岛县","370681":"龙口市","370682":"莱阳市","370683":"莱州市","370684":"蓬莱市","370685":"招远市","370686":"栖霞市","370687":"海阳市","370700":"潍坊市","370702":"潍城区","370703":"寒亭区","370704":"坊子区","370705":"奎文区","370724":"临朐县","370725":"昌乐县","370781":"青州市","370782":"诸城市","370783":"寿光市","370784":"安丘市","370785":"高密市","370786":"昌邑市","370800":"济宁市","370811":"任城区","370812":"兖州区","370826":"微山县","370827":"鱼台县","370828":"金乡县","370829":"嘉祥县","370830":"汶上县","370831":"泗水县","370832":"梁山县","370881":"曲阜市","370883":"邹城市","370900":"泰安市","370902":"泰山区","370911":"岱岳区","370921":"宁阳县","370923":"东平县","370982":"新泰市","370983":"肥城市","371000":"威海市","371002":"环翠区","371003":"文登区","371082":"荣成市","371083":"乳山市","371100":"日照市","371102":"东港区","371103":"岚山区","371121":"五莲县","371122":"莒县","371200":"莱芜市","371202":"莱城区","371203":"钢城区","371300":"临沂市","371302":"兰山区","371311":"罗庄区","371312":"河东区","371321":"沂南县","371322":"郯城县","371323":"沂水县","371324":"兰陵县","371325":"费县","371326":"平邑县","371327":"莒南县","371328":"蒙阴县","371329":"临沭县","371400":"德州市","371402":"德城区","371403":"陵城区","371422":"宁津县","371423":"庆云县","371424":"临邑县","371425":"齐河县","371426":"平原县","371427":"夏津县","371428":"武城县","371481":"乐陵市","371482":"禹城市","371500":"聊城市","371502":"东昌府区","371521":"阳谷县","371522":"莘县","371523":"茌平县","371524":"东阿县","371525":"冠县","371526":"高唐县","371581":"临清市","371600":"滨州市","371602":"滨城区","371603":"沾化区","371621":"惠民县","371622":"阳信县","371623":"无棣县","371625":"博兴县","371626":"邹平县","371700":"菏泽市","371702":"牡丹区","371703":"定陶区","371721":"曹县","371722":"单县","371723":"成武县","371724":"巨野县","371725":"郓城县","371726":"鄄城县","371728":"东明县","410000":"河南省","410100":"郑州市","410102":"中原区","410103":"二七区","410104":"管城回族区","410105":"金水区","410106":"上街区","410108":"惠济区","410122":"中牟县","410181":"巩义市","410182":"荥阳市","410183":"新密市","410184":"新郑市","410185":"登封市","410200":"开封市","410202":"龙亭区","410203":"顺河回族区","410204":"鼓楼区","410205":"禹王台区","410212":"祥符区","410221":"杞县","410222":"通许县","410223":"尉氏县","410225":"兰考县","410300":"洛阳市","410302":"老城区","410303":"西工区","410304":"瀍河回族区","410305":"涧西区","410306":"吉利区","410311":"洛龙区","410322":"孟津县","410323":"新安县","410324":"栾川县","410325":"嵩县","410326":"汝阳县","410327":"宜阳县","410328":"洛宁县","410329":"伊川县","410381":"偃师市","410400":"平顶山市","410402":"新华区","410403":"卫东区","410404":"石龙区","410411":"湛河区","410421":"宝丰县","410422":"叶县","410423":"鲁山县","410425":"郏县","410481":"舞钢市","410482":"汝州市","410500":"安阳市","410502":"文峰区","410503":"北关区","410505":"殷都区","410506":"龙安区","410522":"安阳县","410523":"汤阴县","410526":"滑县","410527":"内黄县","410581":"林州市","410600":"鹤壁市","410602":"鹤山区","410603":"山城区","410611":"淇滨区","410621":"浚县","410622":"淇县","410700":"新乡市","410702":"红旗区","410703":"卫滨区","410704":"凤泉区","410711":"牧野区","410721":"新乡县","410724":"获嘉县","410725":"原阳县","410726":"延津县","410727":"封丘县","410728":"长垣县","410781":"卫辉市","410782":"辉县市","410800":"焦作市","410802":"解放区","410803":"中站区","410804":"马村区","410811":"山阳区","410821":"修武县","410822":"博爱县","410823":"武陟县","410825":"温县","410882":"沁阳市","410883":"孟州市","410900":"濮阳市","410902":"华龙区","410922":"清丰县","410923":"南乐县","410926":"范县","410927":"台前县","410928":"濮阳县","411000":"许昌市","411002":"魏都区","411003":"建安区","411024":"鄢陵县","411025":"襄城县","411081":"禹州市","411082":"长葛市","411100":"漯河市","411102":"源汇区","411103":"郾城区","411104":"召陵区","411121":"舞阳县","411122":"临颍县","411200":"三门峡市","411202":"湖滨区","411203":"陕州区","411221":"渑池县","411224":"卢氏县","411281":"义马市","411282":"灵宝市","411300":"南阳市","411302":"宛城区","411303":"卧龙区","411321":"南召县","411322":"方城县","411323":"西峡县","411324":"镇平县","411325":"内乡县","411326":"淅川县","411327":"社旗县","411328":"唐河县","411329":"新野县","411330":"桐柏县","411381":"邓州市","411400":"商丘市","411402":"梁园区","411403":"睢阳区","411421":"民权县","411422":"睢县","411423":"宁陵县","411424":"柘城县","411425":"虞城县","411426":"夏邑县","411481":"永城市","411500":"信阳市","411502":"浉河区","411503":"平桥区","411521":"罗山县","411522":"光山县","411523":"新县","411524":"商城县","411525":"固始县","411526":"潢川县","411527":"淮滨县","411528":"息县","411600":"周口市","411602":"川汇区","411621":"扶沟县","411622":"西华县","411623":"商水县","411624":"沈丘县","411625":"郸城县","411626":"淮阳县","411627":"太康县","411628":"鹿邑县","411681":"项城市","411700":"驻马店市","411702":"驿城区","411721":"西平县","411722":"上蔡县","411723":"平舆县","411724":"正阳县","411725":"确山县","411726":"泌阳县","411727":"汝南县","411728":"遂平县","411729":"新蔡县","419001":"济源市","420000":"湖北省","420100":"武汉市","420102":"江岸区","420103":"江汉区","420104":"硚口区","420105":"汉阳区","420106":"武昌区","420107":"青山区","420111":"洪山区","420112":"东西湖区","420113":"汉南区","420114":"蔡甸区","420115":"江夏区","420116":"黄陂区","420117":"新洲区","420200":"黄石市","420202":"黄石港区","420203":"西塞山区","420204":"下陆区","420205":"铁山区","420222":"阳新县","420281":"大冶市","420300":"十堰市","420302":"茅箭区","420303":"张湾区","420304":"郧阳区","420322":"郧西县","420323":"竹山县","420324":"竹溪县","420325":"房县","420381":"丹江口市","420500":"宜昌市","420502":"西陵区","420503":"伍家岗区","420504":"点军区","420505":"猇亭区","420506":"夷陵区","420525":"远安县","420526":"兴山县","420527":"秭归县","420528":"长阳土家族自治县","420529":"五峰土家族自治县","420581":"宜都市","420582":"当阳市","420583":"枝江市","420600":"襄阳市","420602":"襄城区","420606":"樊城区","420607":"襄州区","420624":"南漳县","420625":"谷城县","420626":"保康县","420682":"老河口市","420683":"枣阳市","420684":"宜城市","420700":"鄂州市","420702":"梁子湖区","420703":"华容区","420704":"鄂城区","420800":"荆门市","420802":"东宝区","420804":"掇刀区","420821":"京山县","420822":"沙洋县","420881":"钟祥市","420900":"孝感市","420902":"孝南区","420921":"孝昌县","420922":"大悟县","420923":"云梦县","420981":"应城市","420982":"安陆市","420984":"汉川市","421000":"荆州市","421002":"沙市区","421003":"荆州区","421022":"公安县","421023":"监利县","421024":"江陵县","421081":"石首市","421083":"洪湖市","421087":"松滋市","421100":"黄冈市","421102":"黄州区","421121":"团风县","421122":"红安县","421123":"罗田县","421124":"英山县","421125":"浠水县","421126":"蕲春县","421127":"黄梅县","421181":"麻城市","421182":"武穴市","421200":"咸宁市","421202":"咸安区","421221":"嘉鱼县","421222":"通城县","421223":"崇阳县","421224":"通山县","421281":"赤壁市","421300":"随州市","421303":"曾都区","421321":"随县","421381":"广水市","422800":"恩施土家族苗族自治州","422801":"恩施市","422802":"利川市","422822":"建始县","422823":"巴东县","422825":"宣恩县","422826":"咸丰县","422827":"来凤县","422828":"鹤峰县","429004":"仙桃市","429005":"潜江市","429006":"天门市","429021":"神农架林区","430000":"湖南省","430100":"长沙市","430102":"芙蓉区","430103":"天心区","430104":"岳麓区","430105":"开福区","430111":"雨花区","430112":"望城区","430121":"长沙县","430124":"宁乡市","430181":"浏阳市","430200":"株洲市","430202":"荷塘区","430203":"芦淞区","430204":"石峰区","430211":"天元区","430221":"株洲县","430223":"攸县","430224":"茶陵县","430225":"炎陵县","430281":"醴陵市","430300":"湘潭市","430302":"雨湖区","430304":"岳塘区","430321":"湘潭县","430381":"湘乡市","430382":"韶山市","430400":"衡阳市","430405":"珠晖区","430406":"雁峰区","430407":"石鼓区","430408":"蒸湘区","430412":"南岳区","430421":"衡阳县","430422":"衡南县","430423":"衡山县","430424":"衡东县","430426":"祁东县","430481":"耒阳市","430482":"常宁市","430500":"邵阳市","430502":"双清区","430503":"大祥区","430511":"北塔区","430521":"邵东县","430522":"新邵县","430523":"邵阳县","430524":"隆回县","430525":"洞口县","430527":"绥宁县","430528":"新宁县","430529":"城步苗族自治县","430581":"武冈市","430600":"岳阳市","430602":"岳阳楼区","430603":"云溪区","430611":"君山区","430621":"岳阳县","430623":"华容县","430624":"湘阴县","430626":"平江县","430681":"汨罗市","430682":"临湘市","430700":"常德市","430702":"武陵区","430703":"鼎城区","430721":"安乡县","430722":"汉寿县","430723":"澧县","430724":"临澧县","430725":"桃源县","430726":"石门县","430781":"津市市","430800":"张家界市","430802":"永定区","430811":"武陵源区","430821":"慈利县","430822":"桑植县","430900":"益阳市","430902":"资阳区","430903":"赫山区","430921":"南县","430922":"桃江县","430923":"安化县","430981":"沅江市","431000":"郴州市","431002":"北湖区","431003":"苏仙区","431021":"桂阳县","431022":"宜章县","431023":"永兴县","431024":"嘉禾县","431025":"临武县","431026":"汝城县","431027":"桂东县","431028":"安仁县","431081":"资兴市","431100":"永州市","431102":"零陵区","431103":"冷水滩区","431121":"祁阳县","431122":"东安县","431123":"双牌县","431124":"道县","431125":"江永县","431126":"宁远县","431127":"蓝山县","431128":"新田县","431129":"江华瑶族自治县","431200":"怀化市","431202":"鹤城区","431221":"中方县","431222":"沅陵县","431223":"辰溪县","431224":"溆浦县","431225":"会同县","431226":"麻阳苗族自治县","431227":"新晃侗族自治县","431228":"芷江侗族自治县","431229":"靖州苗族侗族自治县","431230":"通道侗族自治县","431281":"洪江市","431300":"娄底市","431302":"娄星区","431321":"双峰县","431322":"新化县","431381":"冷水江市","431382":"涟源市","433100":"湘西土家族苗族自治州","433101":"吉首市","433122":"泸溪县","433123":"凤凰县","433124":"花垣县","433125":"保靖县","433126":"古丈县","433127":"永顺县","433130":"龙山县","440000":"广东省","440100":"广州市","440103":"荔湾区","440104":"越秀区","440105":"海珠区","440106":"天河区","440111":"白云区","440112":"黄埔区","440113":"番禺区","440114":"花都区","440115":"南沙区","440117":"从化区","440118":"增城区","440200":"韶关市","440203":"武江区","440204":"浈江区","440205":"曲江区","440222":"始兴县","440224":"仁化县","440229":"翁源县","440232":"乳源瑶族自治县","440233":"新丰县","440281":"乐昌市","440282":"南雄市","440300":"深圳市","440303":"罗湖区","440304":"福田区","440305":"南山区","440306":"宝安区","440307":"龙岗区","440308":"盐田区","440309":"龙华区","440310":"坪山区","440400":"珠海市","440402":"香洲区","440403":"斗门区","440404":"金湾区","440500":"汕头市","440507":"龙湖区","440511":"金平区","440512":"濠江区","440513":"潮阳区","440514":"潮南区","440515":"澄海区","440523":"南澳县","440600":"佛山市","440604":"禅城区","440605":"南海区","440606":"顺德区","440607":"三水区","440608":"高明区","440700":"江门市","440703":"蓬江区","440704":"江海区","440705":"新会区","440781":"台山市","440783":"开平市","440784":"鹤山市","440785":"恩平市","440800":"湛江市","440802":"赤坎区","440803":"霞山区","440804":"坡头区","440811":"麻章区","440823":"遂溪县","440825":"徐闻县","440881":"廉江市","440882":"雷州市","440883":"吴川市","440900":"茂名市","440902":"茂南区","440904":"电白区","440981":"高州市","440982":"化州市","440983":"信宜市","441200":"肇庆市","441202":"端州区","441203":"鼎湖区","441204":"高要区","441223":"广宁县","441224":"怀集县","441225":"封开县","441226":"德庆县","441284":"四会市","441300":"惠州市","441302":"惠城区","441303":"惠阳区","441322":"博罗县","441323":"惠东县","441324":"龙门县","441400":"梅州市","441402":"梅江区","441403":"梅县区","441422":"大埔县","441423":"丰顺县","441424":"五华县","441426":"平远县","441427":"蕉岭县","441481":"兴宁市","441500":"汕尾市","441502":"城区","441521":"海丰县","441523":"陆河县","441581":"陆丰市","441600":"河源市","441602":"源城区","441621":"紫金县","441622":"龙川县","441623":"连平县","441624":"和平县","441625":"东源县","441700":"阳江市","441702":"江城区","441704":"阳东区","441721":"阳西县","441781":"阳春市","441800":"清远市","441802":"清城区","441803":"清新区","441821":"佛冈县","441823":"阳山县","441825":"连山壮族瑶族自治县","441826":"连南瑶族自治县","441881":"英德市","441882":"连州市","441900":"东莞市","442000":"中山市","445100":"潮州市","445102":"湘桥区","445103":"潮安区","445122":"饶平县","445200":"揭阳市","445202":"榕城区","445203":"揭东区","445222":"揭西县","445224":"惠来县","445281":"普宁市","445300":"云浮市","445302":"云城区","445303":"云安区","445321":"新兴县","445322":"郁南县","445381":"罗定市","450000":"广西壮族自治区","450100":"南宁市","450102":"兴宁区","450103":"青秀区","450105":"江南区","450107":"西乡塘区","450108":"良庆区","450109":"邕宁区","450110":"武鸣区","450123":"隆安县","450124":"马山县","450125":"上林县","450126":"宾阳县","450127":"横县","450200":"柳州市","450202":"城中区","450203":"鱼峰区","450204":"柳南区","450205":"柳北区","450206":"柳江区","450222":"柳城县","450223":"鹿寨县","450224":"融安县","450225":"融水苗族自治县","450226":"三江侗族自治县","450300":"桂林市","450302":"秀峰区","450303":"叠彩区","450304":"象山区","450305":"七星区","450311":"雁山区","450312":"临桂区","450321":"阳朔县","450323":"灵川县","450324":"全州县","450325":"兴安县","450326":"永福县","450327":"灌阳县","450328":"龙胜各族自治县","450329":"资源县","450330":"平乐县","450331":"荔浦县","450332":"恭城瑶族自治县","450400":"梧州市","450403":"万秀区","450405":"长洲区","450406":"龙圩区","450421":"苍梧县","450422":"藤县","450423":"蒙山县","450481":"岑溪市","450500":"北海市","450502":"海城区","450503":"银海区","450512":"铁山港区","450521":"合浦县","450600":"防城港市","450602":"港口区","450603":"防城区","450621":"上思县","450681":"东兴市","450700":"钦州市","450702":"钦南区","450703":"钦北区","450721":"灵山县","450722":"浦北县","450800":"贵港市","450802":"港北区","450803":"港南区","450804":"覃塘区","450821":"平南县","450881":"桂平市","450900":"玉林市","450902":"玉州区","450903":"福绵区","450921":"容县","450922":"陆川县","450923":"博白县","450924":"兴业县","450981":"北流市","451000":"百色市","451002":"右江区","451021":"田阳县","451022":"田东县","451023":"平果县","451024":"德保县","451026":"那坡县","451027":"凌云县","451028":"乐业县","451029":"田林县","451030":"西林县","451031":"隆林各族自治县","451081":"靖西市","451100":"贺州市","451102":"八步区","451103":"平桂区","451121":"昭平县","451122":"钟山县","451123":"富川瑶族自治县","451200":"河池市","451202":"金城江区","451203":"宜州区","451221":"南丹县","451222":"天峨县","451223":"凤山县","451224":"东兰县","451225":"罗城仫佬族自治县","451226":"环江毛南族自治县","451227":"巴马瑶族自治县","451228":"都安瑶族自治县","451229":"大化瑶族自治县","451300":"来宾市","451302":"兴宾区","451321":"忻城县","451322":"象州县","451323":"武宣县","451324":"金秀瑶族自治县","451381":"合山市","451400":"崇左市","451402":"江州区","451421":"扶绥县","451422":"宁明县","451423":"龙州县","451424":"大新县","451425":"天等县","451481":"凭祥市","460000":"海南省","460100":"海口市","460105":"秀英区","460106":"龙华区","460107":"琼山区","460108":"美兰区","460200":"三亚市","460202":"海棠区","460203":"吉阳区","460204":"天涯区","460205":"崖州区","460300":"三沙市","460321":"西沙群岛","460322":"南沙群岛","460323":"中沙群岛","460324":"永乐群岛","460400":"儋州市","469001":"五指山市","469002":"琼海市","469005":"文昌市","469006":"万宁市","469007":"东方市","469021":"定安县","469022":"屯昌县","469023":"澄迈县","469024":"临高县","469025":"白沙黎族自治县","469026":"昌江黎族自治县","469027":"乐东黎族自治县","469028":"陵水黎族自治县","469029":"保亭黎族苗族自治县","469030":"琼中黎族苗族自治县","500000":"重庆市","500100":"重庆市","500101":"万州区","500102":"涪陵区","500103":"渝中区","500104":"大渡口区","500105":"江北区","500106":"沙坪坝区","500107":"九龙坡区","500108":"南岸区","500109":"北碚区","500110":"綦江区","500111":"大足区","500112":"渝北区","500113":"巴南区","500114":"黔江区","500115":"长寿区","500116":"江津区","500117":"合川区","500118":"永川区","500119":"南川区","500120":"璧山区","500151":"铜梁区","500152":"潼南区","500153":"荣昌区","500154":"开州区","500155":"梁平区","500156":"武隆区","500229":"城口县","500230":"丰都县","500231":"垫江县","500233":"忠县","500235":"云阳县","500236":"奉节县","500237":"巫山县","500238":"巫溪县","500240":"石柱土家族自治县","500241":"秀山土家族苗族自治县","500242":"酉阳土家族苗族自治县","500243":"彭水苗族土家族自治县","510000":"四川省","510100":"成都市","510104":"锦江区","510105":"青羊区","510106":"金牛区","510107":"武侯区","510108":"成华区","510112":"龙泉驿区","510113":"青白江区","510114":"新都区","510115":"温江区","510116":"双流区","510117":"郫都区","510121":"金堂县","510129":"大邑县","510131":"蒲江县","510132":"新津县","510181":"都江堰市","510182":"彭州市","510183":"邛崃市","510184":"崇州市","510185":"简阳市","510300":"自贡市","510302":"自流井区","510303":"贡井区","510304":"大安区","510311":"沿滩区","510321":"荣县","510322":"富顺县","510400":"攀枝花市","510402":"东区","510403":"西区","510411":"仁和区","510421":"米易县","510422":"盐边县","510500":"泸州市","510502":"江阳区","510503":"纳溪区","510504":"龙马潭区","510521":"泸县","510522":"合江县","510524":"叙永县","510525":"古蔺县","510600":"德阳市","510603":"旌阳区","510623":"中江县","510626":"罗江县","510681":"广汉市","510682":"什邡市","510683":"绵竹市","510700":"绵阳市","510703":"涪城区","510704":"游仙区","510705":"安州区","510722":"三台县","510723":"盐亭县","510725":"梓潼县","510726":"北川羌族自治县","510727":"平武县","510781":"江油市","510800":"广元市","510802":"利州区","510811":"昭化区","510812":"朝天区","510821":"旺苍县","510822":"青川县","510823":"剑阁县","510824":"苍溪县","510900":"遂宁市","510903":"船山区","510904":"安居区","510921":"蓬溪县","510922":"射洪县","510923":"大英县","511000":"内江市","511002":"市中区","511011":"东兴区","511024":"威远县","511025":"资中县","511083":"隆昌市","511100":"乐山市","511102":"市中区","511111":"沙湾区","511112":"五通桥区","511113":"金口河区","511123":"犍为县","511124":"井研县","511126":"夹江县","511129":"沐川县","511132":"峨边彝族自治县","511133":"马边彝族自治县","511181":"峨眉山市","511300":"南充市","511302":"顺庆区","511303":"高坪区","511304":"嘉陵区","511321":"南部县","511322":"营山县","511323":"蓬安县","511324":"仪陇县","511325":"西充县","511381":"阆中市","511400":"眉山市","511402":"东坡区","511403":"彭山区","511421":"仁寿县","511423":"洪雅县","511424":"丹棱县","511425":"青神县","511500":"宜宾市","511502":"翠屏区","511503":"南溪区","511521":"宜宾县","511523":"江安县","511524":"长宁县","511525":"高县","511526":"珙县","511527":"筠连县","511528":"兴文县","511529":"屏山县","511600":"广安市","511602":"广安区","511603":"前锋区","511621":"岳池县","511622":"武胜县","511623":"邻水县","511681":"华蓥市","511700":"达州市","511702":"通川区","511703":"达川区","511722":"宣汉县","511723":"开江县","511724":"大竹县","511725":"渠县","511781":"万源市","511800":"雅安市","511802":"雨城区","511803":"名山区","511822":"荥经县","511823":"汉源县","511824":"石棉县","511825":"天全县","511826":"芦山县","511827":"宝兴县","511900":"巴中市","511902":"巴州区","511903":"恩阳区","511921":"通江县","511922":"南江县","511923":"平昌县","512000":"资阳市","512002":"雁江区","512021":"安岳县","512022":"乐至县","513200":"阿坝藏族羌族自治州","513201":"马尔康市","513221":"汶川县","513222":"理县","513223":"茂县","513224":"松潘县","513225":"九寨沟县","513226":"金川县","513227":"小金县","513228":"黑水县","513230":"壤塘县","513231":"阿坝县","513232":"若尔盖县","513233":"红原县","513300":"甘孜藏族自治州","513301":"康定市","513322":"泸定县","513323":"丹巴县","513324":"九龙县","513325":"雅江县","513326":"道孚县","513327":"炉霍县","513328":"甘孜县","513329":"新龙县","513330":"德格县","513331":"白玉县","513332":"石渠县","513333":"色达县","513334":"理塘县","513335":"巴塘县","513336":"乡城县","513337":"稻城县","513338":"得荣县","513400":"凉山彝族自治州","513401":"西昌市","513422":"木里藏族自治县","513423":"盐源县","513424":"德昌县","513425":"会理县","513426":"会东县","513427":"宁南县","513428":"普格县","513429":"布拖县","513430":"金阳县","513431":"昭觉县","513432":"喜德县","513433":"冕宁县","513434":"越西县","513435":"甘洛县","513436":"美姑县","513437":"雷波县","520000":"贵州省","520100":"贵阳市","520102":"南明区","520103":"云岩区","520111":"花溪区","520112":"乌当区","520113":"白云区","520115":"观山湖区","520121":"开阳县","520122":"息烽县","520123":"修文县","520181":"清镇市","520200":"六盘水市","520201":"钟山区","520203":"六枝特区","520221":"水城县","520281":"盘州市","520300":"遵义市","520302":"红花岗区","520303":"汇川区","520304":"播州区","520322":"桐梓县","520323":"绥阳县","520324":"正安县","520325":"道真仡佬族苗族自治县","520326":"务川仡佬族苗族自治县","520327":"凤冈县","520328":"湄潭县","520329":"余庆县","520330":"习水县","520381":"赤水市","520382":"仁怀市","520400":"安顺市","520402":"西秀区","520403":"平坝区","520422":"普定县","520423":"镇宁布依族苗族自治县","520424":"关岭布依族苗族自治县","520425":"紫云苗族布依族自治县","520500":"毕节市","520502":"七星关区","520521":"大方县","520522":"黔西县","520523":"金沙县","520524":"织金县","520525":"纳雍县","520526":"威宁彝族回族苗族自治县","520527":"赫章县","520600":"铜仁市","520602":"碧江区","520603":"万山区","520621":"江口县","520622":"玉屏侗族自治县","520623":"石阡县","520624":"思南县","520625":"印江土家族苗族自治县","520626":"德江县","520627":"沿河土家族自治县","520628":"松桃苗族自治县","522300":"黔西南布依族苗族自治州","522301":"兴义市","522322":"兴仁县","522323":"普安县","522324":"晴隆县","522325":"贞丰县","522326":"望谟县","522327":"册亨县","522328":"安龙县","522600":"黔东南苗族侗族自治州","522601":"凯里市","522622":"黄平县","522623":"施秉县","522624":"三穗县","522625":"镇远县","522626":"岑巩县","522627":"天柱县","522628":"锦屏县","522629":"剑河县","522630":"台江县","522631":"黎平县","522632":"榕江县","522633":"从江县","522634":"雷山县","522635":"麻江县","522636":"丹寨县","522700":"黔南布依族苗族自治州","522701":"都匀市","522702":"福泉市","522722":"荔波县","522723":"贵定县","522725":"瓮安县","522726":"独山县","522727":"平塘县","522728":"罗甸县","522729":"长顺县","522730":"龙里县","522731":"惠水县","522732":"三都水族自治县","530000":"云南省","530100":"昆明市","530102":"五华区","530103":"盘龙区","530111":"官渡区","530112":"西山区","530113":"东川区","530114":"呈贡区","530115":"晋宁区","530124":"富民县","530125":"宜良县","530126":"石林彝族自治县","530127":"嵩明县","530128":"禄劝彝族苗族自治县","530129":"寻甸回族彝族自治县","530181":"安宁市","530300":"曲靖市","530302":"麒麟区","530303":"沾益区","530321":"马龙县","530322":"陆良县","530323":"师宗县","530324":"罗平县","530325":"富源县","530326":"会泽县","530381":"宣威市","530400":"玉溪市","530402":"红塔区","530403":"江川区","530422":"澄江县","530423":"通海县","530424":"华宁县","530425":"易门县","530426":"峨山彝族自治县","530427":"新平彝族傣族自治县","530428":"元江哈尼族彝族傣族自治县","530500":"保山市","530502":"隆阳区","530521":"施甸县","530523":"龙陵县","530524":"昌宁县","530581":"腾冲市","530600":"昭通市","530602":"昭阳区","530621":"鲁甸县","530622":"巧家县","530623":"盐津县","530624":"大关县","530625":"永善县","530626":"绥江县","530627":"镇雄县","530628":"彝良县","530629":"威信县","530630":"水富县","530700":"丽江市","530702":"古城区","530721":"玉龙纳西族自治县","530722":"永胜县","530723":"华坪县","530724":"宁蒗彝族自治县","530800":"普洱市","530802":"思茅区","530821":"宁洱哈尼族彝族自治县","530822":"墨江哈尼族自治县","530823":"景东彝族自治县","530824":"景谷傣族彝族自治县","530825":"镇沅彝族哈尼族拉祜族自治县","530826":"江城哈尼族彝族自治县","530827":"孟连傣族拉祜族佤族自治县","530828":"澜沧拉祜族自治县","530829":"西盟佤族自治县","530900":"临沧市","530902":"临翔区","530921":"凤庆县","530922":"云县","530923":"永德县","530924":"镇康县","530925":"双江拉祜族佤族布朗族傣族自治县","530926":"耿马傣族佤族自治县","530927":"沧源佤族自治县","532300":"楚雄彝族自治州","532301":"楚雄市","532322":"双柏县","532323":"牟定县","532324":"南华县","532325":"姚安县","532326":"大姚县","532327":"永仁县","532328":"元谋县","532329":"武定县","532331":"禄丰县","532500":"红河哈尼族彝族自治州","532501":"个旧市","532502":"开远市","532503":"蒙自市","532504":"弥勒市","532523":"屏边苗族自治县","532524":"建水县","532525":"石屏县","532527":"泸西县","532528":"元阳县","532529":"红河县","532530":"金平苗族瑶族傣族自治县","532531":"绿春县","532532":"河口瑶族自治县","532600":"文山壮族苗族自治州","532601":"文山市","532622":"砚山县","532623":"西畴县","532624":"麻栗坡县","532625":"马关县","532626":"丘北县","532627":"广南县","532628":"富宁县","532800":"西双版纳傣族自治州","532801":"景洪市","532822":"勐海县","532823":"勐腊县","532900":"大理白族自治州","532901":"大理市","532922":"漾濞彝族自治县","532923":"祥云县","532924":"宾川县","532925":"弥渡县","532926":"南涧彝族自治县","532927":"巍山彝族回族自治县","532928":"永平县","532929":"云龙县","532930":"洱源县","532931":"剑川县","532932":"鹤庆县","533100":"德宏傣族景颇族自治州","533102":"瑞丽市","533103":"芒市","533122":"梁河县","533123":"盈江县","533124":"陇川县","533300":"怒江傈僳族自治州","533301":"泸水市","533323":"福贡县","533324":"贡山独龙族怒族自治县","533325":"兰坪白族普米族自治县","533400":"迪庆藏族自治州","533401":"香格里拉市","533422":"德钦县","533423":"维西傈僳族自治县","540000":"西藏自治区","540100":"拉萨市","540102":"城关区","540103":"堆龙德庆区","540121":"林周县","540122":"当雄县","540123":"尼木县","540124":"曲水县","540126":"达孜县","540127":"墨竹工卡县","540200":"日喀则市","540202":"桑珠孜区","540221":"南木林县","540222":"江孜县","540223":"定日县","540224":"萨迦县","540225":"达孜区","540226":"昂仁县","540227":"谢通门县","540228":"白朗县","540229":"仁布县","540230":"康马县","540231":"定结县","540232":"仲巴县","540233":"亚东县","540234":"吉隆县","540235":"聂拉木县","540236":"萨嘎县","540237":"岗巴县","540300":"昌都市","540302":"卡若区","540321":"江达县","540322":"贡觉县","540323":"类乌齐县","540324":"丁青县","540325":"察雅县","540326":"八宿县","540327":"左贡县","540328":"芒康县","540329":"洛隆县","540330":"边坝县","540400":"林芝市","540402":"巴宜区","540421":"工布江达县","540422":"米林县","540423":"墨脱县","540424":"波密县","540425":"察隅县","540426":"朗县","540500":"山南市","540502":"乃东区","540521":"扎囊县","540522":"贡嘎县","540523":"桑日县","540524":"琼结县","540525":"曲松县","540526":"措美县","540527":"洛扎县","540528":"加查县","540529":"隆子县","540530":"错那县","540531":"浪卡子县","542400":"那曲市","542421":"色尼区","542422":"嘉黎县","542423":"比如县","542424":"聂荣县","542425":"安多县","542426":"申扎县","542427":"索县","542428":"班戈县","542429":"巴青县","542430":"尼玛县","542431":"双湖县","542500":"阿里地区","542521":"普兰县","542522":"札达县","542523":"噶尔县","542524":"日土县","542525":"革吉县","542526":"改则县","542527":"措勤县","610000":"陕西省","610100":"西安市","610102":"新城区","610103":"碑林区","610104":"莲湖区","610111":"灞桥区","610112":"未央区","610113":"雁塔区","610114":"阎良区","610115":"临潼区","610116":"长安区","610117":"高陵区","610118":"鄠邑区","610122":"蓝田县","610124":"周至县","610200":"铜川市","610202":"王益区","610203":"印台区","610204":"耀州区","610222":"宜君县","610300":"宝鸡市","610302":"渭滨区","610303":"金台区","610304":"陈仓区","610322":"凤翔县","610323":"岐山县","610324":"扶风县","610326":"眉县","610327":"陇县","610328":"千阳县","610329":"麟游县","610330":"凤县","610331":"太白县","610400":"咸阳市","610402":"秦都区","610403":"杨陵区","610404":"渭城区","610422":"三原县","610423":"泾阳县","610424":"乾县","610425":"礼泉县","610426":"永寿县","610427":"彬县","610428":"长武县","610429":"旬邑县","610430":"淳化县","610431":"武功县","610481":"兴平市","610500":"渭南市","610502":"临渭区","610503":"华州区","610522":"潼关县","610523":"大荔县","610524":"合阳县","610525":"澄城县","610526":"蒲城县","610527":"白水县","610528":"富平县","610581":"韩城市","610582":"华阴市","610600":"延安市","610602":"宝塔区","610603":"安塞区","610621":"延长县","610622":"延川县","610623":"子长县","610625":"志丹县","610626":"吴起县","610627":"甘泉县","610628":"富县","610629":"洛川县","610630":"宜川县","610631":"黄龙县","610632":"黄陵县","610700":"汉中市","610702":"汉台区","610721":"南郑区","610722":"城固县","610723":"洋县","610724":"西乡县","610725":"勉县","610726":"宁强县","610727":"略阳县","610728":"镇巴县","610729":"留坝县","610730":"佛坪县","610800":"榆林市","610802":"榆阳区","610803":"横山区","610822":"府谷县","610824":"靖边县","610825":"定边县","610826":"绥德县","610827":"米脂县","610828":"佳县","610829":"吴堡县","610830":"清涧县","610831":"子洲县","610881":"神木市","610900":"安康市","610902":"汉滨区","610921":"汉阴县","610922":"石泉县","610923":"宁陕县","610924":"紫阳县","610925":"岚皋县","610926":"平利县","610927":"镇坪县","610928":"旬阳县","610929":"白河县","611000":"商洛市","611002":"商州区","611021":"洛南县","611022":"丹凤县","611023":"商南县","611024":"山阳县","611025":"镇安县","611026":"柞水县","620000":"甘肃省","620100":"兰州市","620102":"城关区","620103":"七里河区","620104":"西固区","620105":"安宁区","620111":"红古区","620121":"永登县","620122":"皋兰县","620123":"榆中县","620200":"嘉峪关市","620300":"金昌市","620302":"金川区","620321":"永昌县","620400":"白银市","620402":"白银区","620403":"平川区","620421":"靖远县","620422":"会宁县","620423":"景泰县","620500":"天水市","620502":"秦州区","620503":"麦积区","620521":"清水县","620522":"秦安县","620523":"甘谷县","620524":"武山县","620525":"张家川回族自治县","620600":"武威市","620602":"凉州区","620621":"民勤县","620622":"古浪县","620623":"天祝藏族自治县","620700":"张掖市","620702":"甘州区","620721":"肃南裕固族自治县","620722":"民乐县","620723":"临泽县","620724":"高台县","620725":"山丹县","620800":"平凉市","620802":"崆峒区","620821":"泾川县","620822":"灵台县","620823":"崇信县","620824":"华亭县","620825":"庄浪县","620826":"静宁县","620900":"酒泉市","620902":"肃州区","620921":"金塔县","620922":"瓜州县","620923":"肃北蒙古族自治县","620924":"阿克塞哈萨克族自治县","620981":"玉门市","620982":"敦煌市","621000":"庆阳市","621002":"西峰区","621021":"庆城县","621022":"环县","621023":"华池县","621024":"合水县","621025":"正宁县","621026":"宁县","621027":"镇原县","621100":"定西市","621102":"安定区","621121":"通渭县","621122":"陇西县","621123":"渭源县","621124":"临洮县","621125":"漳县","621126":"岷县","621200":"陇南市","621202":"武都区","621221":"成县","621222":"文县","621223":"宕昌县","621224":"康县","621225":"西和县","621226":"礼县","621227":"徽县","621228":"两当县","622900":"临夏回族自治州","622901":"临夏市","622921":"临夏县","622922":"康乐县","622923":"永靖县","622924":"广河县","622925":"和政县","622926":"东乡族自治县","622927":"积石山保安族东乡族撒拉族自治县","623000":"甘南藏族自治州","623001":"合作市","623021":"临潭县","623022":"卓尼县","623023":"舟曲县","623024":"迭部县","623025":"玛曲县","623026":"碌曲县","623027":"夏河县","630000":"青海省","630100":"西宁市","630102":"城东区","630103":"城中区","630104":"城西区","630105":"城北区","630121":"大通回族土族自治县","630122":"湟中县","630123":"湟源县","630200":"海东市","630202":"乐都区","630203":"平安区","630222":"民和回族土族自治县","630223":"互助土族自治县","630224":"化隆回族自治县","630225":"循化撒拉族自治县","632200":"海北藏族自治州","632221":"门源回族自治县","632222":"祁连县","632223":"海晏县","632224":"刚察县","632300":"黄南藏族自治州","632321":"同仁县","632322":"尖扎县","632323":"泽库县","632324":"河南蒙古族自治县","632500":"海南藏族自治州","632521":"共和县","632522":"同德县","632523":"贵德县","632524":"兴海县","632525":"贵南县","632600":"果洛藏族自治州","632621":"玛沁县","632622":"班玛县","632623":"甘德县","632624":"达日县","632625":"久治县","632626":"玛多县","632700":"玉树藏族自治州","632701":"玉树市","632722":"杂多县","632723":"称多县","632724":"治多县","632725":"囊谦县","632726":"曲麻莱县","632800":"海西蒙古族藏族自治州","632801":"格尔木市","632802":"德令哈市","632821":"乌兰县","632822":"都兰县","632823":"天峻县","640000":"宁夏回族自治区","640100":"银川市","640104":"兴庆区","640105":"西夏区","640106":"金凤区","640121":"永宁县","640122":"贺兰县","640181":"灵武市","640200":"石嘴山市","640202":"大武口区","640205":"惠农区","640221":"平罗县","640300":"吴忠市","640302":"利通区","640303":"红寺堡区","640323":"盐池县","640324":"同心县","640381":"青铜峡市","640400":"固原市","640402":"原州区","640422":"西吉县","640423":"隆德县","640424":"泾源县","640425":"彭阳县","640500":"中卫市","640502":"沙坡头区","640521":"中宁县","640522":"海原县","650000":"新疆维吾尔自治区","650100":"乌鲁木齐市","650102":"天山区","650103":"沙依巴克区","650104":"新市区","650105":"水磨沟区","650106":"头屯河区","650107":"达坂城区","650109":"米东区","650121":"乌鲁木齐县","650200":"克拉玛依市","650202":"独山子区","650203":"克拉玛依区","650204":"白碱滩区","650205":"乌尔禾区","650400":"吐鲁番市","650402":"高昌区","650421":"鄯善县","650422":"托克逊县","650500":"哈密市","650502":"伊州区","650521":"巴里坤哈萨克自治县","650522":"伊吾县","652300":"昌吉回族自治州","652301":"昌吉市","652302":"阜康市","652323":"呼图壁县","652324":"玛纳斯县","652325":"奇台县","652327":"吉木萨尔县","652328":"木垒哈萨克自治县","652700":"博尔塔拉蒙古自治州","652701":"博乐市","652702":"阿拉山口市","652722":"精河县","652723":"温泉县","652800":"巴音郭楞蒙古自治州","652801":"库尔勒市","652822":"轮台县","652823":"尉犁县","652824":"若羌县","652825":"且末县","652826":"焉耆回族自治县","652827":"和静县","652828":"和硕县","652829":"博湖县","652900":"阿克苏地区","652901":"阿克苏市","652922":"温宿县","652923":"库车县","652924":"沙雅县","652925":"新和县","652926":"拜城县","652927":"乌什县","652928":"阿瓦提县","652929":"柯坪县","653000":"克孜勒苏柯尔克孜自治州","653001":"阿图什市","653022":"阿克陶县","653023":"阿合奇县","653024":"乌恰县","653100":"喀什地区","653101":"喀什市","653121":"疏附县","653122":"疏勒县","653123":"英吉沙县","653124":"泽普县","653125":"莎车县","653126":"叶城县","653127":"麦盖提县","653128":"岳普湖县","653129":"伽师县","653130":"巴楚县","653131":"塔什库尔干塔吉克自治县","653200":"和田地区","653201":"和田市","653221":"和田县","653222":"墨玉县","653223":"皮山县","653224":"洛浦县","653225":"策勒县","653226":"于田县","653227":"民丰县","654000":"伊犁哈萨克自治州","654002":"伊宁市","654003":"奎屯市","654004":"霍尔果斯市","654021":"伊宁县","654022":"察布查尔锡伯自治县","654023":"霍城县","654024":"巩留县","654025":"新源县","654026":"昭苏县","654027":"特克斯县","654028":"尼勒克县","654200":"塔城地区","654201":"塔城市","654202":"乌苏市","654221":"额敏县","654223":"沙湾县","654224":"托里县","654225":"裕民县","654226":"和布克赛尔蒙古自治县","654300":"阿勒泰地区","654301":"阿勒泰市","654321":"布尔津县","654322":"富蕴县","654323":"福海县","654324":"哈巴河县","654325":"青河县","654326":"吉木乃县","659001":"石河子市","659002":"阿拉尔市","659003":"图木舒克市","659004":"五家渠市","659005":"北屯市","659006":"铁门关市","659007":"双河市","659008":"可克达拉市","659009":"昆玉市","710000":"台湾省","710100":"台北市","710101":"中正区","710102":"大同区","710103":"中山区","710104":"万华区","710105":"信义区","710106":"松山区","710107":"大安区","710108":"南港区","710109":"北投区","710110":"内湖区","710111":"士林区","710112":"文山区","710200":"新北市","710201":"板桥区","710202":"土城区","710203":"新庄区","710204":"新店区","710205":"深坑区","710206":"石碇区","710207":"坪林区","710208":"乌来区","710209":"五股区","710210":"八里区","710211":"林口区","710212":"淡水区","710213":"中和区","710214":"永和区","710215":"三重区","710216":"芦洲区","710217":"泰山区","710218":"树林区","710219":"莺歌区","710220":"三峡区","710221":"汐止区","710222":"金山区","710223":"万里区","710224":"三芝区","710225":"石门区","710226":"瑞芳区","710227":"贡寮区","710228":"双溪区","710229":"平溪区","710300":"桃园市","710301":"桃园区","710302":"中坜区","710303":"平镇区","710304":"八德区","710305":"杨梅区","710306":"芦竹区","710307":"大溪区","710308":"龙潭区","710309":"龟山区","710310":"大园区","710311":"观音区","710312":"新屋区","710313":"复兴区","710400":"台中市","710401":"中区","710402":"东区","710403":"西区","710404":"南区","710405":"北区","710406":"西屯区","710407":"南屯区","710408":"北屯区","710409":"丰原区","710410":"大里区","710411":"太平区","710412":"东势区","710413":"大甲区","710414":"清水区","710415":"沙鹿区","710416":"梧栖区","710417":"后里区","710418":"神冈区","710419":"潭子区","710420":"大雅区","710421":"新小区","710422":"石冈区","710423":"外埔区","710424":"大安区","710425":"乌日区","710426":"大肚区","710427":"龙井区","710428":"雾峰区","710429":"和平区","710500":"台南市","710501":"中西区","710502":"东区","710503":"南区","710504":"北区","710505":"安平区","710506":"安南区","710507":"永康区","710508":"归仁区","710509":"新化区","710510":"左镇区","710511":"玉井区","710512":"楠西区","710513":"南化区","710514":"仁德区","710515":"关庙区","710516":"龙崎区","710517":"官田区","710518":"麻豆区","710519":"佳里区","710520":"西港区","710521":"七股区","710522":"将军区","710523":"学甲区","710524":"北门区","710525":"新营区","710526":"后壁区","710527":"白河区","710528":"东山区","710529":"六甲区","710530":"下营区","710531":"柳营区","710532":"盐水区","710533":"善化区","710534":"大内区","710535":"山上区","710536":"新市区","710537":"安定区","710600":"高雄市","710601":"楠梓区","710602":"左营区","710603":"鼓山区","710604":"三民区","710605":"盐埕区","710606":"前金区","710607":"新兴区","710608":"苓雅区","710609":"前镇区","710610":"旗津区","710611":"小港区","710612":"凤山区","710613":"大寮区","710614":"鸟松区","710615":"林园区","710616":"仁武区","710617":"大树区","710618":"大社区","710619":"冈山区","710620":"路竹区","710621":"桥头区","710622":"梓官区","710623":"弥陀区","710624":"永安区","710625":"燕巢区","710626":"阿莲区","710627":"茄萣区","710628":"湖内区","710629":"旗山区","710630":"美浓区","710631":"内门区","710632":"杉林区","710633":"甲仙区","710634":"六龟区","710635":"茂林区","710636":"桃源区","710637":"那玛夏区","710700":"基隆市","710701":"中正区","710702":"七堵区","710703":"暖暖区","710704":"仁爱区","710705":"中山区","710706":"安乐区","710707":"信义区","710800":"新竹市","710801":"东区","710802":"北区","710803":"香山区","710900":"嘉义市","710901":"东区","710902":"西区","719001":"宜兰县","719002":"新竹县","719003":"苗栗县","719004":"彰化县","719005":"南投县","719006":"嘉义县","719007":"云林县","719008":"屏东县","719009":"台东县","719010":"花莲县","719011":"澎湖县","719012":"金门县","719013":"连江县","810000":"香港特别行政区","810101":"中西区","810102":"湾仔区","810103":"东区","810104":"南区","810105":"油尖旺区","810106":"深水埗区","810107":"九龙城区","810108":"黄大仙区","810109":"观塘区","810110":"北区","810111":"大埔区","810112":"沙田区","810113":"西贡区","810114":"荃湾区","810115":"屯门区","810116":"元朗区","810117":"葵青区","810118":"离岛区","820000":"澳门特别行政区","820101":"花地玛堂区","820102":"圣安多尼堂区","820103":"大堂区","820104":"望德堂区","820105":"风顺堂区","820106":"嘉模堂区","820107":"圣方济各堂区","820108":"路氹城","820109":"澳门新城"}
================================================
FILE: src/assets/menu.json
================================================
[
{
"id": "1",
"icon": "icon-dashboard",
"name": "首页",
"route": "/",
"role": true
},
{
"id": "2",
"icon": "icon-xitong",
"name": "系统管理",
"role": [
"/sys/org/list",
"/sys/role/list",
"/sys/user/list",
"/sys/shop/list",
"/sys/permission/list",
"/sys/weixinuser/list"
]
},
{
"id": "21",
"bpid": "2",
"mpid": "2",
"name": "门店管理",
"route": "/system/shopManage",
"role": "/sys/org/list"
},
{
"id": "22",
"bpid": "2",
"mpid": "2",
"name": "角色管理",
"route": "/system/role",
"role": "/sys/role/list"
},
{
"id": "23",
"bpid": "2",
"mpid": "2",
"name": "web用户",
"route": "/system/user",
"role": "/sys/user/list"
},
{
"id": "24",
"bpid": "2",
"mpid": "2",
"name": "店铺设置",
"route": "/system/shopSettings",
"role": "/sys/shop/list"
},
{
"id": "25",
"bpid": "2",
"mpid": "-1",
"name": "部门管理",
"route": "/system/org",
"role": true
},
{
"id": "26",
"bpid": "2",
"mpid": "2",
"name": "权限管理",
"route": "/system/authorityManage",
"role": "/sys/permission/list"
},
{
"id": "27",
"bpid": "2",
"mpid": "2",
"name": "微信用户",
"route": "/system/weChatManage",
"role": "/sys/weixinuser/list"
},
{
"id": "3",
"icon": "icon-chepai",
"name": "车型管理",
"role": [
"/model/brand/list",
"/model/series/list",
"/model/vm/list"
]
},
{
"id": "31",
"bpid": "3",
"mpid": "3",
"name": "品牌管理",
"route": "/allModalManage/brandManage",
"role": "/model/brand/list"
},
{
"id": "32",
"bpid": "3",
"mpid": "3",
"name": "车系管理",
"route": "/allModalManage/seriesManage",
"role": "/model/series/list"
},
{
"id": "33",
"bpid": "3",
"mpid": "3",
"name": "车型管理",
"route": "/allModalManage/modalManage",
"role": "/model/vm/list"
},
{
"id": "4",
"icon": "icon-shebeiliebiao",
"name": "设备管理",
"route": "/terminalManage",
"role": [
"/terminal/manage/list"
]
},
{
"id": "5",
"icon": "icon-car",
"name": "车辆管理",
"route": "/carManage",
"role": [
"/car/vehicle/list",
"/car/monitor/list"
]
},
{
"id": "51",
"bpid": "5",
"mpid": "5",
"icon": "setting",
"name": "车辆信息",
"route": "/carManage/carList",
"role": "/car/vehicle/list"
},
{
"id": "52",
"bpid": "5",
"mpid": "5",
"icon": "setting",
"name": "车辆监控",
"route": "/carManage/carMonitor",
"role": "/car/monitor/list"
},
{
"id": "6",
"icon": "icon-web-icon-",
"name": "客户管理",
"route": "/clientsManage",
"role": [
"/user/customerattr/list",
"/user/customer/list"
]
},
{
"id": "61",
"bpid": "6",
"mpid": "6",
"name": "客户基本信息",
"route": "/clientsManage/clientsInfo",
"role": "/user/customer/list",
"icon": "setting"
},
{
"id": "62",
"bpid": "6",
"mpid": "6",
"name": "客户车辆信息",
"route": "/clientsManage/clientsCar",
"role": "/user/customerattr/list",
"icon": "setting"
},
{
"id": "621",
"bpid": "61",
"mpid": "-1",
"name": "客户车辆详情",
"route": "/clientsManage/clientsCar/clientsCarDetails",
"role": "/user/customerattr/list"
},
{
"id": "7",
"icon": "icon-baoyang",
"name": "保养管理",
"route": "/reverseManage",
"role": [
"/mainten/appointorder/list"
]
},
{
"id": "71",
"bpid": "7",
"mpid": "7",
"name": "保养订单",
"route": "/reverseManage/reverseOrder",
"role": "/mainten/appointorder/list",
"icon": "setting"
},
{
"id": "711",
"bpid": "71",
"mpid": "-1",
"name": "App预约",
"route": "/reverseManage/reverseOrder/appReverse",
"role": "/mainten/appointorder/list"
},
{
"id": "712",
"bpid": "71",
"mpid": "-1",
"name": "系统转预约",
"route": "/reverseManage/reverseOrder/sysReverse",
"role": "/mainten/appointorder/list"
},
{
"id": "713",
"bpid": "71",
"mpid": "-1",
"name": "今日预约到店",
"route": "/reverseManage/reverseOrder/todayReverse",
"role": "/mainten/appointorder/list"
},
{
"id": "714",
"bpid": "71",
"mpid": "-1",
"name": "编辑预约单",
"route": "/reverseManage/reverseOrder/reverseDetails",
"role": "/mainten/appointorder/list"
},
{
"id": "72",
"bpid": "7",
"mpid": "7",
"name": "保养提醒",
"route": "/reverseManage/maintainRemind",
"role": "/mainten/conf/list",
"icon": "setting"
},
{
"id": "721",
"bpid": "72",
"mpid": "72",
"name": "实时里程查询",
"route": "/reverseManage/maintainRemind/realTimeSearch",
"role": "/mainten/conf/list"
},
{
"id": "722",
"bpid": "72",
"mpid": "72",
"name": "未处理保养提醒",
"route": "/reverseManage/maintainRemind/unMaintain",
"role": "/mainten/conf/list"
},
{
"id": "7221",
"bpid": "722",
"mpid": "-1",
"name": "保养里程",
"route": "/reverseManage/maintainRemind/unMaintain/remainDistance",
"role": "/mainten/conf/list"
},
{
"id": "7222",
"bpid": "722",
"mpid": "-1",
"name": "保养时间",
"route": "/reverseManage/maintainRemind/unMaintain/remainTime",
"role": "/mainten/conf/list"
},
{
"id": "7223",
"bpid": "722",
"mpid": "-1",
"name": "保养详情",
"route": "/reverseManage/maintainRemind/unMaintain/reverseDetail",
"role": "/mainten/conf/list"
},
{
"id": "723",
"bpid": "72",
"mpid": "72",
"name": "已处理保养提醒",
"route": "/reverseManage/maintainRemind/processedMaintain",
"role": "/mainten/remainOrder/findList"
},
{
"id": "73",
"bpid": "7",
"mpid": "7",
"name": "保养提醒设置",
"route": "/reverseManage/remainSettings",
"role": "/mainten/remainOrder/findList",
"icon": "setting"
},
{
"id": "8",
"icon": "icon-jiuyuan",
"name": "救援管理",
"route": "/rescueManage",
"role": "/rescue/order/list"
},
{
"id": "81",
"bpid": "8",
"mpid": "8",
"icon": "setting",
"name": "救援服务",
"route": "/rescueManage/rescueService",
"role": "/rescue/order/list"
},
{
"id": "81",
"bpid": "8",
"mpid": "-1",
"icon": "setting",
"name": "救援服务",
"route": "/rescueManage/rescueService/rescueDetail",
"role": "/rescue/order/list"
},
{
"id": "82",
"bpid": "8",
"mpid": "8",
"name": "救援统计",
"route": "/rescueManage/rescueCount",
"role": "/rescue/order/list"
},
{
"id": "9",
"icon": "icon-xinxi",
"name": "信息管理",
"route": "/infoManage",
"role": [
"/msg/info/list",
"/msg/examine/list",
"/msg/systemMessage/list"
]
},
{
"id": "91",
"bpid": "9",
"mpid": "9",
"icon": "setting",
"name": "信息发布",
"route": "/infoManage/infoPublic",
"role": "/msg/info/list"
},
{
"id": "911",
"bpid": "91",
"mpid": "-1",
"name": "信息列表",
"route": "/infoManage/infoPublic/infoPublicList",
"role": "/msg/info/list"
},
{
"id": "912",
"bpid": "91",
"mpid": "-1",
"name": "店铺广告",
"route": "/infoManage/infoPublic/shopSeq",
"role": "/msg/info/list"
},
{
"id": "92",
"bpid": "9",
"mpid": "9",
"icon": "setting",
"name": "信息审核",
"route": "/infoManage/infoReview",
"role": "/msg/examine/list"
},
{
"id": "921",
"bpid": "92",
"mpid": "-1",
"name": "信息审核",
"route": "/infoManage/infoReview/infoReviewDetail",
"role": "/msg/examine/list"
},
{
"id": "93",
"bpid": "9",
"mpid": "9",
"icon": "setting",
"name": "系统消息",
"route": "/infoManage/sysInfo",
"role": "/msg/systemMessage/list"
},
{
"id": "11",
"icon": "icon-alarm-settings",
"name": "告警管理",
"route": "/alarm",
"role": [
"/fence/alarm/list",
"/fence/rail/list"
]
},
{
"id": "111",
"bpid": "11",
"mpid": "11",
"icon": "setting",
"name": "告警消息",
"route": "/alarm/alertList",
"role": "/fence/alarm/list"
},
{
"id": "112",
"bpid": "11",
"mpid": "11",
"icon": "setting",
"name": "电子围栏",
"route": "/alarm/elecFence",
"role": "/fence/rail/list"
},
{
"id": "12",
"icon": "icon-tongji",
"name": "数据统计",
"route": "/dataManage",
"role": "/statistic/data/statNew"
}
]
================================================
FILE: src/components/FilterTable/MFilter.less
================================================
@import '../../styles/var.less';
.filter-wrap {
position: relative;
.ant-form-inline .ant-form-item {
margin-right: 0;
width: 100%;
position: relative;
top: -4px;
.ant-form-item-control-wrapper,
.ant-form-item-control,
.ant-form-item-children {
width: 100%;
}
}
.btn-wrap {
text-align: left;
button {
margin-right: 10px;
}
.right-btn {
float: right;
}
}
.filter-mormal {
background-color: #fff;
padding: 10px;
transition: .4s all ease-in-out;
transform: translateY(0);
.ant-form {
position: relative;
top: 4px;
}
}
.filter-grade {
position: absolute;
background-color: #fff;
left: 0;
top: 0;
z-index: 999;
width: 100%;
padding: 10px;
transition: .4s all ease-in-out;
transform: translateY(-200%);
border-bottom: 1px solid #ececec;
}
.grade-btn {
margin-left: 20px;
font-size: 12px;
color: @primary-color;
[class*=" iconfont-"], [class^="iconfont-"] {
font-size: 14px;
margin-left: 5px;
position: relative;
top: 1px;
}
}
&.showGrade {
.filter-mormal {
transform: translateY(-100%);
}
.filter-grade {
transform: translateY(0);
}
}
}
.checkbox-list {
text-align: left;
.el-checkbox+.el-checkbox {
margin-left: 0;
}
.el-checkbox {
width: 25%;
margin-bottom: 10px;
}
.dialog-footer {
text-align: center;
margin-top: 10px;
}
}
================================================
FILE: src/components/FilterTable/MFilter.tsx
================================================
import {
Component, Prop, Emit, Vue,
} from 'vue-property-decorator';
import {
Input, Select, Form, TimePicker, DatePicker, Cascader, Row, Col, Button, Modal, Checkbox, Radio,
} from 'ant-design-vue';
import { FilterFormList, tableList } from '@/interface';
import './MFilter.less';
@Component({
components: {
'a-input': Input,
'a-option': Select.Option,
'a-select': Select,
'a-form': Form,
'a-form-item': Form.Item,
'a-time-picker': TimePicker,
'a-date-picker': DatePicker,
'a-range-picker': DatePicker.RangePicker,
'a-cascader': Cascader,
'a-row': Row,
'a-col': Col,
'a-button': Button,
'a-modal': Modal,
'a-radio-group': Radio.Group,
'a-radio-button': Radio.Button,
'a-checkbox-group': Checkbox.Group,
'a-checkbox': Checkbox,
},
props: {
Form,
},
})
class MFilterClass extends Vue {
// 筛选表单生成参数
@Prop({ default: [] })
private filterList!: FilterFormList[];
// 筛选表单高级生成参数
@Prop({ default: [] })
private filterGrade!: FilterFormList[];
// 筛选表单存储数据参数
@Prop({ default: {} }) private filterParams!: any;
// 是否展示新增按钮
@Prop({ default: false }) private addBtn!: boolean;
// 是否展示导出按钮
@Prop({ default: false }) private exportBtn!: boolean;
// 导出按钮回调事件
@Prop({ default: () => { } }) private exportFun!: Function;
// tablelist 参数
@Prop({ default: [] }) private tableList!: tableList[];
@Prop({ default: '100px' }) private labelWidth!: string;
@Prop({ default: 'filterTable' }) private localName!: string;
// data
params: any = JSON.parse(JSON.stringify(this.filterParams));
// 初始化表格筛选参数
initParams: any = JSON.parse(JSON.stringify(this.filterParams));
btnXl: number = 24 - (this.filterList.length * 3);
btnlg: number = 24 - (this.filterList.length * 3);
btnmd: number = 24 - (this.filterList.length * 4);
// 弹出窗开关
setModel: boolean = false;
// 表格显示的列表
checkList: Array = [];
// 高级搜索开关
showGrade: boolean = false;
// 高级筛选高度
tableMarginTop: number = 0;
constructor(props: any) {
super(props);
const self = this;
const saveList = window.localStorage.getItem(this.localName);
if (saveList) {
this.checkList = saveList.split(',');
}
}
created() {
if (!this.checkList.length) {
this.tableList.map((item) => {
if (item.dataIndex) {
this.checkList.push(item.dataIndex);
}
return false;
});
}
}
// methods
@Emit()
onSearch(): void {
this.$emit('search', Object.assign(this.params, this.Form.getFieldsValue()));
}
@Emit()
reset(): void {
this.Form.resetFields();
this.$emit('clearOut');
this.params = JSON.parse(JSON.stringify(this.initParams));
this.$emit('search', this.Form.resetFields());
}
@Emit()
levelcodeChange(val: any, key: string): void {
const value = JSON.parse(JSON.stringify(val));
this.params.levelCode = value.pop();
}
@Emit()
openSetting(): void {
this.setModel = true;
}
@Emit()
closeModal(): void {
this.setModel = false;
}
@Emit()
gradeSwitch(val: boolean): void {
this.showGrade = val;
this.tableMarginTop = val
? (this.$refs.filterGrade as Element).clientHeight
: (this.$refs.filterNormal as Element).clientHeight;
this.$emit('tableHeight', this.tableMarginTop);
}
@Emit()
addFun(): void {
this.$emit('addFun');
}
formItem(getFieldDecorator: any, item: FilterFormList, index: number, grade?: boolean) {
let itemDom = null;
switch (item.type) {
case 'input':
itemDom = ;
break;
case 'select':
itemDom =
{
item.options && item.options.map((items: any, indexs: number) => { items.label })
}
;
break;
case 'cascader':
itemDom = ;
break;
case 'levelcode':
itemDom = ) => this.levelcodeChange(e, item.key)}>;
break;
case 'datetime':
itemDom =
;
break;
case 'date':
itemDom =
;
break;
case 'datetimerange':
itemDom = ) => this.rangeChange(e, item.value ? item.value : [])}
placeholder={item.placeholder}>
;
break;
case 'checkboxButton':
itemDom =
{
item.options && item.options.map((
items,
indexs: number,
) =>
{items.label}
)
}
;
break;
default: break;
}
if (grade) {
return (
{getFieldDecorator(item.key)(itemDom)}
);
}
return (
{
getFieldDecorator(item.key)(itemDom)
}
);
}
nomalLayout = {
span: 4,
xl: 3,
lg: 3,
md: 4,
sm: 8,
xs: 12,
}
gradeLayout = {
span: 8,
xl: 8,
lg: 8,
md: 12,
sm: 12,
xs: 12,
}
formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
md: { span: 8 },
lg: { span: 6 },
xl: { span: 6 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
md: { span: 16 },
lg: { span: 18 },
xl: { span: 18 },
},
}
// 时间区间赋值操作
rangeChange(data: any, value: string[]) {
this.params[value[0]] = data[0].format('YYYY-MM-DD hh:mm:ss');
this.params[value[1]] = data[1].format('YYYY-MM-DD hh:mm:ss');
}
render() {
const { getFieldDecorator } = this.Form as any;
const { isMobile } = this.$store.state.app;
return (
{
this.filterList.map((item, index) => this.formItem(getFieldDecorator, item, index))
}
{this.btnElement(true)}
{
this.filterGrade.length
?
{
this.filterGrade.map((item, index) => this.formItem(getFieldDecorator, item, index, true))
}
{this.btnElement(false)}
: null
}
{
this.tableList.map((item, index) =>
{item.title})
}
);
}
setTable() {
if (this.checkList.length > 0) {
window.localStorage.setItem(this.localName, this.checkList.join(','));
this.$emit('setTable', this.checkList);
this.setModel = false;
} else {
this.$message.error('At least one column!');
}
}
btnElement(isNormal: boolean): JSX.Element {
return (
);
}
}
const MFilter = Form.create({
props: {
filterList: Array,
filterGrade: Array,
filterParams: Object,
addBtn: Boolean,
exportBtn: Boolean,
exportFun: Function,
tableList: Array,
labelWidth: String,
},
})(MFilterClass);
export default MFilter;
================================================
FILE: src/components/FilterTable/MTable.less
================================================
@import '../../styles/var.less';
.m-table {
padding: 10px;
position: relative;
transition: all .4s ease-in-out;
.el-dropdown-link {
font-size: 12px;
color: @primary-color;
cursor: pointer;
}
.pagination {
padding: 10px 0;
}
.el-table {
th> {
background: #fafafa;
color: rgba(0,0,0,.85);
.cell {
font-size: 13px;
text-align: center;
}
}
td,
th {
.cell {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 12px;
}
}
}
.table-opreat {
font-size: 12px;
a {
margin: 0 5px;
&.linkDisabled {
color: #acacac;
&:hover {
color: #acacac;
opacity: 1;
cursor: not-allowed;
}
}
&.link-blue {
color: @primary-color;
}
&.link-red {
color: #fa4059;
}
&.link-green {
color: #52c41a;
}
&.link-orange {
color: #faad14;
}
&:hover {
opacity: 0.7;
}
}
.disabled {
color: #acacac;
opacity: 1;
cursor: not-allowed;
}
}
}
================================================
FILE: src/components/FilterTable/MTable.tsx
================================================
import {
Component, Prop, Emit, Vue, Inject, Provide,
} from 'vue-property-decorator';
import {
Popconfirm, Table, Dropdown, Menu, Button, Icon,
} from 'ant-design-vue';
import { tableList, Opreat, Directives } from '@/interface';
import Spin from '@/components/Spin';
import './MTable.less';
@Component({
components: {
'a-table': Table,
'a-popconfirm': Popconfirm,
'm-spin': Spin,
'a-dropdown': Dropdown,
'a-menu-item': Menu.Item,
'a-menu': Menu,
'a-button': Button,
'a-icon': Icon,
},
})
export default class MTable extends Vue {
@Prop() private tableList!: tableList[];
@Prop() private url!: string;
@Prop() private dataType!: string;
@Prop({
default: () => ({
code: 'result.resultCode',
codeOK: '0',
message: 'result.resultMessage',
data: 'entity.data',
total: 'entity.count',
}),
}) private backParams!: {
code: string,
message: string,
data: string,
codeOK: string | number,
total: string
};
// 外部参数
@Prop({ default: {} })
private outParams!: any;
// 行ID
@Prop({ default: 'id' }) private rowKey!: string;
// 操作栏数据
@Prop({ default: () => [] }) private opreat!: Opreat[];
// 操作栏width
@Prop({ default: '100px' }) private opreatWidth!: string;
// 本地存储名称
@Prop({ default: 'filter-table' }) private localName!: string;
// 请求报错回调
@Prop() private fetchError!: Function;
// 表格列数据
@Prop() private tableParams!: any;
// 请求类型
@Prop({ default: 'post' }) private fetchType!: string;
// 表格分页大小参数
@Prop({ default: () => ['5', '10', '15', '20', '50', '100'] }) private pageSizeList!: number[];
@Prop({ default: 10 }) private defaultPageSize!: number;
@Prop() private highlightCurrentRow!: boolean;
@Prop({ default: null }) private scroll!: {x: number, y: number};
// data
tableData: any = [];
pageParams: {
pageSize: number,
pageNum: number,
page: boolean,
} = {
pageSize: this.defaultPageSize,
pageNum: 1,
page: true,
};
loading: boolean = false;
// 数据总数
dataTotal: number = 0;
constructor(props: any) {
super(props);
const self = this;
}
created() {
this.getData();
}
reload() {
this.pageParams.pageNum = 1;
this.getData();
}
/**
* @method 获取表格数据
*/
getData() {
this.loading = true;
window.ajax.request({
url: this.url,
method: this.fetchType,
fetchType: this.dataType,
data: Object.assign(
this.tableParams ? this.tableParams : {},
this.pageParams,
this.outParams,
),
}).then((res: any) => {
this.loading = false;
const code = this.getValue(this.backParams.code, res);
if (code === this.backParams.codeOK) {
this.tableData = this.getValue(this.backParams.data, res);
this.dataTotal = this.getValue(this.backParams.total, res)
? this.getValue(this.backParams.total, res) : 0;
} else {
this.$message.error(this.getValue(this.backParams.message, res));
}
});
}
/**
* @method 根据backParams参数,获取对应值
* @param {string} position 需要值的位置, 格式为 data.entity.list
* @param {object} res 返回的表格数据
*/
getValue(position: string, res: any) {
let data = JSON.parse(JSON.stringify(res));
const keyList = position.split('.');
keyList.forEach((item, index) => {
if (data !== null && data[item] !== null) {
data = data[item];
} else {
data = null;
return false;
}
return true;
});
return data;
}
// 选择变化
selectChange(val: any) {
this.$emit('selectChange', val);
}
// 单选
currentChange(val: any) {
this.$emit('currentChange', val);
}
render() {
if (this.opreat.length && this.tableList[this.tableList.length -1].title !== '操作') {
this.tableList.push({
title: '操作',
dataIndex: 'action',
width: this.opreatWidth,
customRender: this.opreatJSX,
});
}
return (
);
}
/**
* @method 操作栏的渲染函数,参数对应antd的Columns>customRender的参数
* @param {any} text 当前列的值
* @param {object} record 当前行的值
* @param {number} index 当前列的序列号
*/
opreatJSX(text: any, record: any, index: number) {
// 操作超过4个,就用下拉菜单方式
if (this.opreat.length > 4) {
return this.menuClick(command, record)}>
操作栏
{
this.opreat.map((item, indexs) =>
{typeof item.text === 'function' ? item.text(record) : item.text}
)
}
;
}
// 普通模式
return ;
}
tableChange(pagination: any, filters: any, sorter: any) {
this.pageParams.pageSize = pagination.pageSize;
this.pageParams.pageNum = pagination.current;
this.getData();
}
menuClick(key: string, row: any) {
this.$emit('tableClick', key, row);
}
}
================================================
FILE: src/components/FilterTable/index.vue
================================================
================================================
FILE: src/components/HelloWorld.vue
================================================
{{ msg }}
For guide and recipes on how to configure / customize this project,
check out the
vue-cli documentation.
Installed CLI Plugins
Essential Links
Ecosystem
================================================
FILE: src/components/Layout/AppMain.less
================================================
.app-main {
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-ms-flex-direction: row;
flex-direction: row;
display: flex;
.page-content {
width: e('calc(100vw - 200px)');
height: 100vh;
position: relative;
padding-top: 56px;
overflow-y: auto;
.page-wrap {
height: e('calc(100vh - 98px)');
width: 100%;
overflow-x: hidden;
overflow: auto;
}
}
@media screen and (max-width: 768px) {
.page-content {
width: 100vw;
}
}
&.sideLayout {
.side-bar {
min-width: 64px;
width: 64px;
.logo-wrap h1{
display: none;
}
}
.page-content {
width: e('calc(100vw - 64px)');
}
}
.page-tabs {
text-align: left;
.ant-tabs-bar {
margin-bottom: 0;
}
.el-tabs__header {
margin-bottom: 0;
.el-tabs__nav {
border: none;
}
.el-tabs__item {
background-color: #ececec;
&.is-active {
background-color: #fff;
}
}
}
}
}
================================================
FILE: src/components/Layout/AppMain.tsx
================================================
import {
Component, Prop, Emit, Vue, Watch, Provide,
} from 'vue-property-decorator';
import { Tabs } from 'ant-design-vue';
import config from '@/utils/config';
import { menuItem } from '@/interface';
import Header from '@/components/Layout/Header/Header';
import Sidebar from '@/components/Layout/Sidebar/Sidebar';
import './AppMain.less';
@Component({
components: {
'a-tabs': Tabs,
'a-tab-pane': Tabs.TabPane,
},
})
export default class AppMain extends Vue {
@Prop() private menuData!: menuItem[];
// data
onTabs: any = '1';
@Watch('$route', { immediate: true, deep: true })
routeChange(to: any, from: any) {
this.$store.dispatch('AddTabPane', to.path);
}
@Emit()
removeTab(name: string) {
console.log(this);
this.$store.dispatch('RemoveTab', name);
}
@Emit()
tabChange(name: any) {
this.tabList.forEach((item: any, indexs: number) => {
if (item.name === name) {
this.$router.push({ name: item.name, params: { id: item.params }, query: item.query });
this.$store.dispatch('TabChange', item.name);
}
});
}
@Emit()
onTabEdit(targetKey: string, action: string) {
if (action === 'remove') {
this.removeTab(targetKey);
}
}
tabList = [];
render() {
const {
sidebar: { opened = 1 }, tabList, tabActiveKey, keepList, isMobile,
} = this.$store.state.app;
this.onTabs = tabActiveKey; // 激活状态保存
this.tabList = tabList;
if (config.openPages.indexOf(this.$route.path) > -1) {
return (
);
}
return (
{
isMobile ? null :
}
{
tabList.map((item: any, index: number) => 1} key={item.name}
tab={item.name}>
)
}
);
}
}
================================================
FILE: src/components/Layout/Header/Header.less
================================================
@import '../../../styles/var.less';
@headerHeight: 56px;
.header-wrap {
height: @headerHeight;
background-color: #fff;
text-align: left;
display: flex;
justify-content: space-between;
box-shadow: 4px 4px 40px 0 rgba(0,0,0,.05);
position: absolute;
width: 100%;
left: 0;
top: 0;
z-index: 999;
.menu-btn {
line-height: @headerHeight;
width: @headerHeight;
display: inline-block;
text-align: center;
transition: .3s all ease-in-out;
cursor: pointer;
&:hover {
color: @primary-color;
background-color: lighten(@primary-color, 25%);
}
}
.header-bread {
margin-left: 20px;
display: inline-block;
font-size: 12px;
}
.header-menu {
display: flex;
list-style: none;
color: #666;
li {
width: @headerHeight;
height: @headerHeight;
line-height: @headerHeight;
text-align: center;
cursor: pointer;
.el-badge__content.is-fixed {
top: 10px;
}
&:hover {
color: @primary-color;
background-color: lighten(@primary-color, 25%);
.el-dropdown-link {
color: @primary-color;
}
}
&.user {
width: auto;
padding: 0 20px;
.ant-dropdown-link {
height: 56px;
display: block;
}
.name {
margin-left: 10px;
font-size: 14px;
font-weight: 400;
}
}
}
}
}
================================================
FILE: src/components/Layout/Header/Header.tsx
================================================
import {
Component, Prop, Emit, Vue, Watch,
} from 'vue-property-decorator';
import {
Badge, Dropdown, Breadcrumb, Popover, Icon, Menu,
} from 'ant-design-vue';
import Cookies from 'js-cookie';
import { menuItem, routerItem } from '@/interface';
import { routeToArray } from '@/utils';
import MenuList from '@/components/Layout/Sidebar/MenuList';
import './Header.less';
interface breadItem {
url: string,
text: string,
}
@Component({
components: {
'a-badge': Badge,
'a-dropdown': Dropdown,
'a-menu-item': Menu.Item,
'a-breadcrumb': Breadcrumb,
'a-breadcrumb-item': Breadcrumb.Item,
'a-popover': Popover,
'menu-list': MenuList,
'a-icon': Icon,
'a-menu-divider': Menu.Divider,
'a-menu': Menu,
},
})
export default class Header extends Vue {
@Prop() private username!: string;
// data
menuData: routerItem[] = [];
breadList: breadItem[] = [];
onIndex: number = 0;
@Watch('$route', { immediate: true, deep: true })
routeChange(to: any, from: any) {
const toDepth = routeToArray(to.path);
this.onIndex = 0;
this.breadList = [];
this.routerBread(this.menuData, toDepth.routeArr);
}
@Watch('menuData')
initRouteBread() {
const toDepth = routeToArray(this.$route.path);
this.routerBread(this.menuData, toDepth.routeArr);
}
@Emit()
routerBread(data: routerItem[], toDepth: string[]) {
data.map((item: routerItem) => {
if (item.path === toDepth[this.onIndex]) {
this.breadList.push({
url: item.path,
text: item.name ? item.name : '',
});
if (item.children && (toDepth.length - 1) >= this.onIndex) {
this.onIndex += 1;
this.routerBread(item.children, toDepth);
}
}
return true;
});
}
@Emit()
menuClick(params: {item: any, key: string, keyPath: string[]}): void {
const self = this;
switch (params.key) {
case '1':
break;
case '2':
break;
case '3':
Cookies.remove('token');
this.$router.push('/login');
break;
default:
break;
}
}
@Emit()
switchSidebar(): void {
this.$store.dispatch('ToggleSideBar');
}
render() {
const { username } = this;
const { menuData, sidebar: { opened }, isMobile } = this.$store.state.app;
this.menuData = menuData;
return (
);
}
}
================================================
FILE: src/components/Layout/Sidebar/MenuList.less
================================================
@import '../../../styles/var.less';
.left-menu {
text-align: left;
border-right: none;
height: e('calc(100vh - 82px)');
overflow-x: hidden;
overflow-y: auto;
[class*=" iconfont-"], [class^="iconfont-"] {
margin-right: 10px;
position: relative;
top: 2px;
}
}
================================================
FILE: src/components/Layout/Sidebar/MenuList.tsx
================================================
import {
Component, Emit, Vue, Prop, Watch,
} from 'vue-property-decorator';
import { Menu, Icon } from 'ant-design-vue';
import { routerItem } from '@/interface';
import { routeToArray } from '@/utils/index';
import './MenuList.less';
@Component({
components: {
'a-menu': Menu,
'a-submenu': Menu.SubMenu,
'a-menu-item-group': Menu.ItemGroup,
'a-menu-item': Menu.Item,
'a-icon': Icon,
},
})
export default class MenuList extends Vue {
@Prop({ default: '#010101' }) private bgColor!: string;
@Prop({ default: '#fff' }) private txtColor!: string;
keys: string[] = []
openKeys: string[] = []
@Watch('$route', { immediate: true, deep: true })
routeChange(to: any, from: any) {
this.keys = routeToArray(to.path).routeArr;
const open = this.keys.concat();
open.pop();
this.openKeys = open || [];
}
openChange(openKeys: string[]) {
this.openKeys = openKeys;
}
render() {
const { menuData, sidebar: { opened } } = this.$store.state.app;
return (
);
}
renderMenu(menuData: routerItem[], parentPath?: string): (JSX.Element | null)[] {
return menuData.map((item: routerItem) => {
if (item.children) {
let isEmpty = true;
item.children.forEach((items: routerItem) => {
if (!items.hidden) {
isEmpty = false;
}
});
if (isEmpty) {
return
{item.name}
;
}
return
{item.name}
{this.renderMenu(item.children, parentPath ? `${parentPath}/${item.path}` : item.path)}
;
} if (item.hidden) {
return null;
}
return
{item.name}
;
});
}
openPage(path: string) {
this.$router.push(path);
}
}
================================================
FILE: src/components/Layout/Sidebar/Sidebar.less
================================================
@import '../../../styles/var.less';
.side-bar {
max-width: 200px;
min-width: 200px;
width: 200px;
background-color: #010101;
transition: .3s all ease-in-out;
height: 100vh;
max-height: 100vh;
.ant-menu-dark {
background-color: #010101;
.ant-menu-inline.ant-menu-sub {
background-color: #232323;
}
}
.ant-menu-inline-collapsed {
width: 64px;
}
.ant-menu-inline-collapsed > .ant-menu-item,
.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item, .ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title {
padding: 0 20px !important;
span {
display: none;
}
}
.logo-wrap {
display: flex;
text-align: center;
padding: 20px 0;
img {
width: 42px;
height: 42px;
display: inline;
margin-left: 10px;
}
h1 {
font-size: 16px;
display: inline;
color: @primary-color;
line-height: 42px;
padding-left: 10px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
================================================
FILE: src/components/Layout/Sidebar/Sidebar.tsx
================================================
import { Component, Vue } from 'vue-property-decorator';
import config from '@/utils/config';
import MenuList from '@/components/Layout/Sidebar/MenuList';
import './Sidebar.less';
@Component
export default class SiderBar extends Vue {
render() {
const { menuData, sidebar: { opened } } = this.$store.state.app;
return (
{config.name}
);
}
}
================================================
FILE: src/components/Loader/index.vue
================================================
================================================
FILE: src/components/Spin/index.less
================================================
.spin-wrap {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 999;
background-color: rgba(255, 255, 255, .65);
display: none;
&.show {
display: block;
}
.ant-spin {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
}
.ant-spin {
font-family:Monospaced Number, Chinese Quote, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Helvetica Neue, Helvetica, Arial, sans-serif;
font-size:14px;
line-height:1.5;
color:rgba(0, 0, 0, .65);
-webkit-box-sizing:border-box;
box-sizing:border-box;
margin:0;
padding:0;
list-style:none;
color:#1890ff;
vertical-align:middle;
text-align:center;
opacity:0;
position:absolute;
-webkit-transition:-webkit-transform .3s cubic-bezier(.78, .14, .15, .86);
transition:-webkit-transform .3s cubic-bezier(.78, .14, .15, .86);
transition:transform .3s cubic-bezier(.78, .14, .15, .86);
transition:transform .3s cubic-bezier(.78, .14, .15, .86), -webkit-transform .3s cubic-bezier(.78, .14, .15, .86);
display:none
}
.ant-spin-spinning {
opacity:1;
position:static;
display:inline-block
}
.ant-spin-nested-loading {
position:relative
}
.ant-spin-nested-loading>div>.ant-spin {
display:block;
position:absolute;
height:100%;
max-height:320px;
width:100%;
z-index:4
}
.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot {
position:absolute;
top:50%;
left:50%;
margin:-10px
}
.ant-spin-nested-loading>div>.ant-spin .ant-spin-text {
position:absolute;
top:50%;
width:100%;
padding-top:5px;
text-shadow:0 1px 2px #fff
}
.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot {
margin-top:-20px
}
.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot {
margin:-7px
}
.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text {
padding-top:2px
}
.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot {
margin-top:-17px
}
.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot {
margin:-16px
}
.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text {
padding-top:11px
}
.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot {
margin-top:-26px
}
.ant-spin-container {
position:relative;
zoom:1
}
.ant-spin-container:after, .ant-spin-container:before {
content:"";
display:table
}
.ant-spin-container:after {
clear:both
}
.ant-spin-blur {
pointer-events:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
overflow:hidden;
opacity:.7;
-webkit-filter:blur(.5px);
filter:blur(.5px);
//-webkit-filter:progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, MakeShadow\=false);
//filter:progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, MakeShadow\=false)
}
.ant-spin-blur:after {
content:"";
position:absolute;
left:0;
right:0;
top:0;
bottom:0;
background:#fff;
opacity:.3;
-webkit-transition:all .3s;
transition:all .3s;
z-index:10
}
.ant-spin-tip {
color:rgba(0, 0, 0, .45)
}
.ant-spin-dot {
position:relative;
display:inline-block;
font-size:20px;
width:20px;
height:20px
}
.ant-spin-dot i {
width:9px;
height:9px;
border-radius:100%;
background-color:#1890ff;
-webkit-transform:scale(.75);
-ms-transform:scale(.75);
transform:scale(.75);
display:block;
position:absolute;
opacity:.3;
-webkit-animation:antSpinMove 1s infinite linear alternate;
animation:antSpinMove 1s infinite linear alternate;
-webkit-transform-origin:50% 50%;
-ms-transform-origin:50% 50%;
transform-origin:50% 50%
}
.ant-spin-dot i:first-child {
left:0;
top:0
}
.ant-spin-dot i:nth-child(2) {
right:0;
top:0;
-webkit-animation-delay:.4s;
animation-delay:.4s
}
.ant-spin-dot i:nth-child(3) {
right:0;
bottom:0;
-webkit-animation-delay:.8s;
animation-delay:.8s
}
.ant-spin-dot i:nth-child(4) {
left:0;
bottom:0;
-webkit-animation-delay:1.2s;
animation-delay:1.2s
}
.ant-spin-dot-spin {
-webkit-transform:rotate(45deg);
-ms-transform:rotate(45deg);
transform:rotate(45deg);
-webkit-animation:antRotate 1.2s infinite linear;
animation:antRotate 1.2s infinite linear
}
.ant-spin-sm .ant-spin-dot {
font-size:14px;
width:14px;
height:14px
}
.ant-spin-sm .ant-spin-dot i {
width:6px;
height:6px
}
.ant-spin-lg .ant-spin-dot {
font-size:32px;
width:32px;
height:32px
}
.ant-spin-lg .ant-spin-dot i {
width:14px;
height:14px
}
.ant-spin.ant-spin-show-text .ant-spin-text {
display:block
}
@media (-ms-high-contrast:active), (-ms-high-contrast:none) {
.ant-spin-blur {
background:#fff;
opacity:.5
}
}
@-webkit-keyframes antSpinMove {
to {
opacity:1
}
}
@keyframes antSpinMove {
to {
opacity:1
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform:rotate(405deg);
transform:rotate(405deg)
}
}
@keyframes antRotate {
to {
-webkit-transform:rotate(405deg);
transform:rotate(405deg)
}
}
================================================
FILE: src/components/Spin/index.tsx
================================================
import {
Component, Prop, Emit, Vue, Inject, Provide,
} from 'vue-property-decorator';
import './index.less';
@Component
export default class Spin extends Vue {
@Prop({ default: false }) show!: boolean;
render() {
return (
);
}
}
================================================
FILE: src/global.d.ts
================================================
interface Window {
api: {
[key: string]: (
data: any,
) => Promise<{
success: boolean;
message: string;
statusCode: number;
data: any;
}>;
};
ajax: any;
ApexCharts: any;
BMap: any;
BMapLib: any;
wangEditor: any;
CanvasLayer: any;
pointCollection: any;
BMAP_POINT_SIZE_HUGE: any;
BMAP_POINT_SHAPE_CIRCLE: any;
BMAP_DRAWING_CIRCLE: any;
BMAP_DRAWING_POLYGON: any;
BMAP_DRAWING_RECTANGLE: any;
}
interface Date {
Format(fmt: string): string;
}
interface returnData {
success: boolean;
message: string;
statusCode: number;
data: any;
}
declare module '*.json';
================================================
FILE: src/interface/index.ts
================================================
import { VNode } from 'vue';
import { ScopedSlot } from 'vue/types/vnode';
/**
* @interface 筛选表格的表单参数
* @param key 表单的key值,对应filterParams里面的值
* @param type 表单的类型,分为10种
* @param label 表单前面的标题文字
* @param placeholder 表单的占位文字
* @param value 用于范围选择或者多个值的情况,
* @param fieldNames antd的cascader组件的,自定义 options 中 label name children 的字段
* https://vue.ant.design/components/cascader-cn/#API
* @param options 用于下拉选择的选择项,可以异步加载
* @param change 表单的change事件
* @param disabledTime 时间范围选择的不可选日期,
*/
type FilterType = 'input' | 'select' | 'cascader' | 'levelcode' | 'datetime' | 'date' | 'datetimerange' | 'checkboxButton';
export interface FilterFormList {
key: string;
type: FilterType;
label: string;
placeholder: string | string[];
value?: string[];
fieldNames?: any;
options?: Array<{ value: any, label: string }>;
change?: Function;
disabledTime?: (dates: [object, object], partial: 'start'|'end') => any;
}
export interface TableColumnFilter {
text: string,
value: any
}
export interface ColumnFilterItem {
text?: string;
value?: string;
children?: any;
}
export declare type SortOrder = 'ascend' | 'descend';
// column
export interface tableList {
/**
* specify how content is aligned
* @default 'left'
* @type string
*/
align?: 'left' | 'right' | 'center';
/**
* Span of this column's title
* @type number
*/
colSpan?: number;
/**
* Display field of the data record, could be set like a.b.c
* @type string
*/
dataIndex: string;
/**
* Default order of sorted values: 'ascend' 'descend' null
* @type string
*/
defaultSortOrder?: SortOrder;
/**
* Customized filter overlay
* @type any (slot)
*/
filterDropdown?: any;
/**
* Whether filterDropdown is visible
* @type boolean
*/
filterDropdownVisible?: boolean;
/**
* Whether the dataSource is filtered
* @default false
* @type boolean
*/
filtered?: boolean;
/**
* Controlled filtered value, filter icon will highlight
* @type string[]
*/
filteredValue?: string[];
/**
* Customized filter icon
* @default false
* @type any
*/
filterIcon?: any;
/**
* Whether multiple filters can be selected
* @default true
* @type boolean
*/
filterMultiple?: boolean;
/**
* Filter menu config
* @type object[]
*/
filters?: ColumnFilterItem[];
/**
* Set column to be fixed: true(same as left) 'left' 'right'
* @default false
* @type boolean | string
*/
fixed?: boolean | 'left' | 'right';
/**
* Unique key of this column, you can ignore this prop if you've set a unique dataIndex
* @type string
*/
key?: string;
/**
* Renderer of the table cell. The return value should be a VNode,
* or an object for colSpan/rowSpan config
* @type Function | ScopedSlot
*/
customRender?: Function | ScopedSlot;
/**
* Sort function for local sort, see Array.sort's compareFunction.
* If you need sort buttons only, set to true
* @type boolean | Function
*/
sorter?: boolean | Function;
/**
* Order of sorted values: 'ascend' 'descend' false
* @type boolean | string
*/
sortOrder?: boolean | SortOrder;
/**
* Title of this column
* @type any (string | slot)
*/
title: any;
/**
* Width of this column
* @type string | number
*/
width?: string | number;
/**
* Set props on per cell
* @type Function
*/
customCell?: (
record: any,
rowIndex: number,
) => {
props: object;
attrs: object;
on: object;
class: object;
style: object;
nativeOn: object;
};
/**
* Set props on per header cell
* @type
*/
customHeaderCell?: (
column: any,
) => {
props: object;
attrs: object;
on: object;
class: object;
style: object;
nativeOn: object;
};
/**
* Callback executed when the confirm filter button is clicked,
* Use as a filter event when using template or jsx
* @type Function
*/
onFilter?: Function;
/**
* Callback executed when filterDropdownVisible is changed,
* Use as a filterDropdownVisible event when using template or jsx
* @type Function
*/
onFilterDropdownVisibleChange?: (visible: boolean) => void;
/**
* When using columns, you can use this property to configure
* the properties that support the slot,
* such as slots: { filterIcon: 'XXX'}
* @type object
*/
slots?: object;
/**
* When using columns, you can use this property to configure
* the properties that support the slot-scope,
* such as scopedSlots: { customRender: 'XXX'}
* @type object
*/
scopedSlots?: object;
}
/**
* @interface 表格组件-操作栏参数
* @param {string} key 操作的key值,用于回调事件匹配
* @param {string} rowKey 当前行数据的id值,用于自动化测试,方便区别
* @param {Function/string} color 文字颜色,可以根据当前行数据动态返回颜色值
* @param {string} text 可以根据当前行数据动态返回文字
* @param {Function} disabled 可以根据当前数据动态返回状态
* @param {Function/string} roles 可以动态返回权限,控制是否展示
*/
export interface Opreat {
key: string,
rowKey: string,
color: Function | string,
text: Function | string,
disabled?: Function;
roles: Function | boolean,
msg?: Function | string,
}
/**
* @interface 表格tag设置
* @param {} key
*/
export interface tableTag {
key: number,
color: string,
value: number,
label: string,
}
export interface menuItem {
id: number,
title: string,
url?: string,
icon?: string,
permission: string | Array | boolean,
children?: Array