cmy 8 months ago
parent
commit
b10bfc6171
100 changed files with 20912 additions and 14064 deletions
  1. 4 25
      .gitignore
  2. 261 436
      App.vue
  3. 0 284
      README.md
  4. 3 3
      androidPrivacy.json
  5. 161 229
      api/activity.js
  6. 0 431
      api/admin.js
  7. 0 480
      api/api.js
  8. 0 19
      api/esp.js
  9. 0 86
      api/files.js
  10. 66 0
      api/functionalUnit.js
  11. 118 0
      api/hall.js
  12. 71 0
      api/index.js
  13. 0 123
      api/kefu.js
  14. 99 0
      api/login.js
  15. 0 43
      api/lottery.js
  16. 0 305
      api/new_store.js
  17. 186 343
      api/order.js
  18. 0 20
      api/points_mall.js
  19. 194 0
      api/product.js
  20. 0 208
      api/public.js
  21. 26 0
      api/quick.js
  22. 88 0
      api/set.js
  23. 89 0
      api/shop.js
  24. 0 93
      api/short-video.js
  25. 0 548
      api/store.js
  26. 0 16
      api/upload.js
  27. 149 701
      api/user.js
  28. 156 0
      api/wallet.js
  29. 0 101
      api/work.js
  30. 38 0
      api/wx.js
  31. 1 4
      components/Loading/index.vue
  32. 0 214
      components/addressWindow/index.vue
  33. 0 266
      components/areaWindow/index.vue
  34. 0 428
      components/authorize/index.vue
  35. 0 142
      components/cartDiscount/index.vue
  36. 0 232
      components/cartList/index.vue
  37. 152 0
      components/codeImage.vue
  38. 10 24
      components/countDown/index.vue
  39. 0 292
      components/couponListWindow/index.vue
  40. 0 248
      components/couponWindow/index.vue
  41. 0 150
      components/cusPreviewImg/index.vue
  42. 0 98
      components/customForm/index.vue
  43. 0 193
      components/d_goodList/index.vue
  44. 0 340
      components/eidtUserModal/index.vue
  45. 18 0
      components/empty.vue
  46. 2 15
      components/emptyPage.vue
  47. 0 185
      components/ewcomerPop/index.vue
  48. 0 310
      components/filterPopup/index.vue
  49. 0 226
      components/goodClass/index.vue
  50. 0 169
      components/goodList/index.vue
  51. 0 144
      components/groupGoodsList/index.vue
  52. 0 159
      components/guide/index.vue
  53. 22 36
      components/home/index.vue
  54. 0 160
      components/homeList/index.vue
  55. 33 0
      components/js_sdk/xb-copy/uni-copy.js
  56. 268 452
      components/jyf-parser/jyf-parser.vue
  57. 92 97
      components/jyf-parser/libs/CssHandler.js
  58. 414 456
      components/jyf-parser/libs/MpHtmlParser.js
  59. 46 46
      components/jyf-parser/libs/config.js
  60. 0 35
      components/jyf-parser/libs/handler.sjs
  61. 6 28
      components/jyf-parser/libs/handler.wxs
  62. 187 162
      components/jyf-parser/libs/trees.vue
  63. 0 144
      components/kefu/index.vue
  64. 0 94
      components/kefuIcon/index.vue
  65. 545 0
      components/lb-picker/README.md
  66. 87 0
      components/lb-picker/index.vue
  67. 0 0
      components/lb-picker/lib/custom-parse-format.min.js
  68. 0 0
      components/lb-picker/lib/dayjs.min.js
  69. 1 0
      components/lb-picker/lib/object-support.min.js
  70. 93 0
      components/lb-picker/mixins/index.js
  71. 378 0
      components/lb-picker/pickers/date-selector-picker.vue
  72. 135 0
      components/lb-picker/pickers/multi-selector-picker.vue
  73. 108 0
      components/lb-picker/pickers/selector-picker.vue
  74. 116 0
      components/lb-picker/pickers/unlinked-selector-picker.vue
  75. 40 0
      components/lb-picker/style/picker-item.scss
  76. 166 0
      components/lb-picker/style/picker.scss
  77. 121 0
      components/lb-picker/utils.js
  78. 14402 0
      components/lee-select-city/city.json
  79. 14 0
      components/lee-select-city/hot-cities.json
  80. 83 0
      components/lee-select-city/lee-latter-list.vue
  81. 434 0
      components/lee-select-city/lee-select-city.vue
  82. 0 349
      components/maramlee-waterfalls-flow/maramlee-waterfalls-flow.vue
  83. 421 0
      components/newlist/nowList.vue
  84. 0 512
      components/orderGoods/index.vue
  85. 0 160
      components/pageFooter/index.vue
  86. 0 478
      components/payment/index.vue
  87. 0 199
      components/privacyAgreementPopup/index.vue
  88. 0 186
      components/productConSwiper/index.vue
  89. 0 860
      components/productWindow/index.vue
  90. 0 125
      components/recommend/index.vue
  91. 68 0
      components/returnButton.vue
  92. 252 0
      components/seckill/seckill.vue
  93. 0 180
      components/service/index.vue
  94. 196 0
      components/share.vue
  95. 0 198
      components/skeleton/index.vue
  96. 0 246
      components/splitOrder/index.vue
  97. 292 0
      components/ss-calendar/ss-calendar.vue
  98. 0 207
      components/storeLis/index.vue
  99. 0 181
      components/thorui/tui-collapse.vue
  100. 0 140
      components/thorui/tui-drawer.vue

+ 4 - 25
.gitignore

@@ -1,26 +1,5 @@
 .DS_Store
-node_modules
-/dist
-
-# local env files
-.env.local
-.env.*.local
-.history
-# Log files
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# Editor directories and files
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
-build.sh
-.idea
-unpackage
-project.config.json
-.hbuilderx
+unpackage/dist
+unpackage/cache
+unpackage/release
+.hbuilderx

+ 261 - 436
App.vue

@@ -1,481 +1,306 @@
 <script>
+	/**
+	 * vuex管理登陆状态,具体可以参考官方登陆模板示例
+	 */
 	import {
-		checkLogin
-	} from './libs/login';
+		mapMutations
+	} from 'vuex';
+	// #ifdef H5
 	import {
-		HTTP_REQUEST_URL
-	} from './config/app';
-	import {
-		getShopConfig,
-		silenceAuth,
-		getLogo
-	} from '@/api/public';
-	import Auth from '@/libs/wechat.js';
-	import Routine from './libs/routine.js';
-	import {
-		colorChange
-	} from '@/api/api.js';
+		weixindata,
+		setRouter
+	} from './utils/wxAuthorized';
+	// #endif
+	// #ifdef APP-PLUS
 	import {
-		mapGetters
-	} from "vuex"
-	// #ifdef MP
-	// let livePlayer = requirePlugin('live-player-plugin')
+		getUpApp
+	} from './utils/upApp.js';
 	// #endif
-	// let green =
-	// 	'--view-theme: #42CA4D;--view-priceColor:#FF7600;--view-minorColor:rgba(108, 198, 94, 0.5);--view-minorColorT:rgba(66, 202, 77, 0.1);--view-bntColor:#FE960F;--view-assistColor:#FE960F;'
-	// let red =
-	// 	'--view-theme: #e93323;--view-priceColor:#e93323;--view-minorColor:rgba(233, 51, 35, 0.5);--view-minorColorT:rgba(233, 51, 35, 0.1);--view-bntColor:#FE960F;--view-assistColor:#FE960F;'
-	let blue =
-		'--view-theme: #08C4E6;--view-priceColor:#08C4E6;--view-minorColor:rgba(58, 139, 236, 0.5);--view-minorColorT:rgba(9, 139, 243, 0.1);--view-bntColor:#22CAFD;--view-assistColor:#C4D9EC;'
-	// let pink =
-	// 	'--view-theme: #FF448F;--view-priceColor:#FF448F;--view-minorColor:rgba(255, 68, 143, 0.5);--view-minorColorT:rgba(255, 68, 143, 0.1);--view-bntColor:#282828;--view-assistColor:#FEAC41;'
-	// let orange =
-	// 	'--view-theme: #FE5C2D;--view-priceColor:#FE5C2D;--view-minorColor:rgba(254, 92, 45, 0.5);--view-minorColorT:rgba(254, 92, 45, 0.1);--view-bntColor:#FDB000;--view-assistColor:#FDB000;'
-	// let gold =
-	//     '--view-theme: #E0A558;--view-priceColor:#DA8C18;--view-minorColor:rgba(224, 165, 88, 0.5);--view-minorColorT:rgba(224, 165, 88, 0.1);--view-bntColor:#1A1A1A;'
-
-
 	export default {
-		globalData: {
-			spid: 0,
-			code: 0,
-			isLogin: false,
-			userInfo: {},
-			MyMenus: [],
-			globalData: false,
-			isIframe: false,
-			tabbarShow: true,
-			windowHeight: 0
-		},
-		computed: mapGetters(['isLogin', 'cartNum','userInfo']),
-		watch: {
-			isLogin: {
-				deep: true, //深度监听设置为 true
-				handler: function(newV, oldV) {
-					if (newV) {
-						// this.getCartNum()
-					} else {
-						this.$store.commit('indexData/setCartNum', '')
-					}
-				}
-			},
-			cartNum(newCart, b) {
-				this.$store.commit('indexData/setCartNum', newCart + '')
-				if (newCart > 0) {
-					uni.setTabBarBadge({
-						index: 3,
-						text: newCart>99?'99+':newCart+''
-					})
-				} else {
-					uni.hideTabBarRedDot({
-						index: 3
-					})
-				}
-			}
-		},
-		onLaunch: async function(option) {
-			uni.hideTabBar()
-			//#ifdef APP
-			plus.screen.lockOrientation("portrait-primary");
-			//#endif
-			let that = this;
-			getLogo().then(res => {
-				uni.setStorageSync('BASIC_CONFIG', res.data)
-			});
-			colorChange('color_change').then(res => {
-				let navigation = res.data.navigation; //判断悬浮导航是否显示
-				let statusColor = res.data.status; //判断显示啥颜色
-				uni.setStorageSync('navigation', navigation);
-				uni.$emit('navOk', navigation);
-				uni.setStorageSync('statusColor', statusColor);
-				uni.$emit('colorOk', statusColor);
-				uni.setStorageSync('viewColor', blue)
-				uni.$emit('ok', blue)
-				// switch (res.data.status) {
-				// 	case 1:
-				// 		uni.setStorageSync('viewColor', blue)
-				// 		uni.$emit('ok', blue)
-				// 		break;
-				// 	case 2:
-				// 		uni.setStorageSync('viewColor', green)
-				// 		uni.$emit('ok', green)
-				// 		break;
-				// 	case 3:
-				// 		uni.setStorageSync('viewColor', red)
-				// 		uni.$emit('ok', red)
-				// 		break;
-				// 	case 4:
-				// 		uni.setStorageSync('viewColor', pink)
-				// 		uni.$emit('ok', pink)
-				// 		break;
-				// 	case 5:
-				// 		uni.setStorageSync('viewColor', orange)
-				// 		uni.$emit('ok', orange)
-				// 		break;
-				// 	case 6:
-				// 		uni.setStorageSync('viewColor', gold)
-				// 		uni.$emit('ok', gold)
-				// 		break;
-				// 	default:
-				// 		uni.setStorageSync('viewColor', red)
-				// 		uni.$emit('ok', red)
-				// 		break
-				// }
-			});
-			if (option.query.spid) {
-				that.$Cache.set('spid', option.query.spid);
-				that.globalData.spid = option.query.spid;
-			}
-			// #ifdef APP-PLUS || H5
-			uni.getSystemInfo({
-				success: function(res) {
-					// 首页没有title获取的整个页面的高度,里面的页面有原生标题要减掉就是视口的高度
-					// 状态栏是动态的可以拿到 标题栏是固定写死的是44px
-					let height = res.windowHeight - res.statusBarHeight - 44
-					// #ifdef H5 || APP-PLUS
-					that.globalData.windowHeight = res.windowHeight + 'px'
-					// #endif
-					// // #ifdef APP-PLUS
-					// that.globalData.windowHeight = height + 'px'
-					// // #endif
+		data() {
+			return {
+				/* 保存微信信息 */
+				appData: {
 
 				}
-			});
-			// #endif	
-			// #ifdef MP
-			if (HTTP_REQUEST_URL == '') {
-				console.error(
-					"请配置根目录下的config.js文件中的 'HTTP_REQUEST_URL'\n\n请修改开发者工具中【详情】->【AppID】改为自己的Appid\n\n请前往后台【小程序】->【小程序配置】填写自己的 appId and AppSecret"
-				);
-				return false;
-			}
-			if (option.query.hasOwnProperty('scene')) {
-
-				switch (option.scene) {
-					//扫描小程序码
-					case 1047:
-						let val = that.$util.getUrlParams(decodeURIComponent(option.query.scene));
-						that.globalData.code = val.spid === undefined ? val : val.spid;
-						break;
-						//长按图片识别小程序码
-					case 1048:
-						that.globalData.code = option.query.scene;
-						break;
-						//手机相册选取小程序码
-					case 1049:
-						that.globalData.code = option.query.scene;
-						break;
-						//直接进入小程序
-					case 1001:
-						that.globalData.spid = option.query.scene;
-						break;
-				}
-			}
-			this.checkUpdateVersion();
-			// #endif
-			// getShopConfig().then(res => {
-			// 	this.$store.commit('SETPHONESTATUS', res.data.status);
-			// });
-			// 获取导航高度;
-			uni.getSystemInfo({
-				success: function(res) {
-					that.globalData.navHeight = res.statusBarHeight * (750 / res.windowWidth) + 91;
-				}
-			});
-			// #ifdef MP
-			let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
-			that.globalData.navH = menuButtonInfo.top * 2 + menuButtonInfo.height / 2;
-			const version = uni.getSystemInfoSync().SDKVersion
-			if (Routine.compareVersion(version, '2.21.2') >= 0) {
-				console.log(version)
-				that.$Cache.set('MP_VERSION_ISNEW', true)
-			} else {
-				that.$Cache.set('MP_VERSION_ISNEW', false)
+			};
+		},
+		methods: {
+			...mapMutations('user', ['setUserInfo', 'login', 'hasLogin'])
+		},
+		onLaunch: function(urlObj) {
+			let obj = this;
+			// 加载缓存中的用户信息
+			let userInfo = uni.getStorageSync('userInfo') || '';
+			// 判断是否拥有用户信息
+			if (userInfo.uid) {
+				//更新登陆状态
+				uni.getStorage({
+					key: 'userInfo',
+					success: res => {
+						obj.setUserInfo(res.data);
+						obj.login(res.data);
+					}
+				});
 			}
-			// #endif
-
 			// #ifdef H5
-			// 添加crmeb chat 统计
-			var __s = document.createElement('script');
-			__s.src = `${HTTP_REQUEST_URL}/api/get_script`;
-			document.head.appendChild(__s);
-
-			// uni.getSystemInfo({
-			// 	success(e) {
-			// 		/* 窗口宽度大于420px且不在PC页面且不在移动设备时跳转至 PC.html 页面 */
-			// 		if (e.windowWidth > 420 && !window.top.isPC && !/iOS|Android/i.test(e.system)) {
-			// 			window.location.pathname = '/static/html/pc.html';
-			// 		}
-			// 	}
-			// });
-			if (option.query.hasOwnProperty('type')) {
-				this.globalData.isIframe = true;
-			} else {
-				this.globalData.isIframe = false;
+			// 保存路由对象
+			setRouter(this.$router);
+			//判断是否已经缓存浏览器
+			let bool = uni.getStorageSync('weichatBrowser') || '';
+			if (bool === '') {
+				//判断是否为微信浏览
+				bool = navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger';
+				// 保存当前是否为微信内核浏览器
+				uni.setStorageSync('weichatBrowser', bool);
 			}
-
-			if (window.location.pathname !== '/' && !this.isWork()) {
-				let snsapiBase = 'snsapi_base';
-				let urlData = location.pathname + location.search;
-				if (!that.$store.getters.isLogin && uni.getStorageSync('authIng')) {
-					uni.setStorageSync('authIng', false)
-				}
-				if (!that.$store.getters.isLogin && Auth.isWeixin()) {
-					let code,
-						state,
-						scope = ''
-
-					if (option.query.code instanceof Array) {
-						code = option.query.code[option.query.code.length - 1]
-					} else {
-						code = option.query.code
-					}
-
-
-					if (code && code != uni.getStorageSync('snsapiCode') && location.pathname.indexOf(
-							'/pages/users/wechat_login/index') === -1) {
-						// 存储静默授权code
-						uni.setStorageSync('snsapiCode', code);
-						try {
-							let res = await silenceAuth({
-								code: code,
-								snsapi: 'snsapi_base',
-								spread_spid: that.$Cache.get('spid')
-							}).catch(error => {
-								uni.hideLoading()
-								return this.$util.Tips({
-									title: error
-								})
-							});
-							uni.setStorageSync('snRouter', decodeURIComponent(decodeURIComponent(option.query
-								.back_url)));
-							if (res.data.key !== undefined && res.data.key) {
-								this.$Cache.set('snsapiKey', res.data.key);
-							} else {
-								let time = res.data.expires_time - this.$Cache.time();
-								this.$store.commit('LOGIN', {
-									token: res.data.token,
-									time: time
-								});
-
-								this.$store.commit('SETUID', res.data.userInfo.uid);
-								this.$store.commit('UPDATE_USERINFO', res.data.userInfo);
-								if (option.query.back_url) {
-									location.replace(decodeURIComponent(decodeURIComponent(option.query
-										.back_url)));
-								}
-							}
-						} catch (e) {
-							let url = ''
-							if (option.query.back_url instanceof Array) {
-								url = option.query.back_url[option.query.back_url.length - 1]
-							} else {
-								url = option.query.back_url
-							}
-							if (!that.$Cache.has('snsapiKey')) {
-								if (location.pathname.indexOf('/pages/users/wechat_login/index') === -1) {
-									Auth.oAuth('snsapi_userinfo', url);
-								}
-							}
-						}
-					} else {
-						if (!this.$Cache.has('snsapiKey')) {
-							if (location.pathname.indexOf('/pages/users/wechat_login/index') === -1) {
-								Auth.oAuth(snsapiBase, urlData);
-							}
-						}
-					}
-				} else {
-					if (option.query.back_url) {
-						location.replace(uni.getStorageSync('snRouter'));
-					}
-				}
+			if (bool) {
+				// 加载微信信息
+				weixindata();
 			}
 			// #endif
-			// #ifdef MP
-			// 小程序静默授权
-			if (!this.$store.getters.isLogin) {
-				Routine.getCode()
-					.then(code => {
-						this.silenceAuth(code);
-					})
-					.catch(res => {
-						uni.hideLoading();
-					});
+			// #ifdef APP-PLUS
+			// 判断是否升级
+			getUpApp();
+			// 获取当前运行系统
+			let system = uni.getStorageSync('platform') || '';
+			if (!system) {
+				uni.setStorage({
+					key: 'platform',
+					data: uni.getSystemInfoSync().platform
+				});
 			}
 			// #endif
 		},
-		onShow(options) {
-			let that = this;
-			uni.hideTabBar()
-			//直播间分享
-			// #ifdef MP
-			// const sceneList = [1007, 1008, 1014, 1044, 1045, 1046, 1047, 1048, 1049, 1073, 1154, 1155];
-			//  if (sceneList.includes(options.scene)) {
-			// 	livePlayer.getShareParams()
-			// 		.then(res => {
-			// 			//记录推广人uid
-			// 			if(res.custom_params.pid){
-			// 				 that.$Cache.set('spid', res.custom_params.pid);
-			// 				 that.globalData.spid = res.custom_params.pid;
-			// 			}
-			// 		}).catch(err => {
-			// 		})
-			// }
-			// #endif
-		},
-		mounted() {
-			// setTimeout((e) => {
-			// 	if (this.$store.getters.isLogin) {
-			// 		this.getCartNum()
-			// 	}
-			// }, 100)
-		},
-		methods: {
-			// 小程序静默授权
-			silenceAuth(code) {
-				let that = this;
-				let spid = that.globalData.spid ? that.globalData.spid : '';
-				silenceAuth({
-						code: code,
-						spread_spid: spid,
-						spread_code: that.globalData.code
-					})
-					.then(res => {
-						if (res.data.token !== undefined && res.data.token) {
-							uni.hideLoading();
-							let time = res.data.expires_time - this.$Cache.time();
-							that.$store.commit('LOGIN', {
-								token: res.data.token,
-								time: time
-							});
-							that.$store.commit('SETUID', res.data.userInfo.uid);
-							that.$store.commit('UPDATE_USERINFO', res.data.userInfo);
-						}
-					})
-					.catch(err => {
-						return that.$util.Tips({
-							title:err
-						})
-					});
-			},
-			isWork() {
-				return navigator.userAgent.toLowerCase().indexOf('wxwork') !== -1 && navigator.userAgent.toLowerCase()
-					.indexOf("micromessenger") !== -1
-			},
-			/**
-			 * 检测当前的小程序
-			 * 是否是最新版本,是否需要下载、更新
-			 */
-			checkUpdateVersion() {
-				//判断微信版本是否 兼容小程序更新机制API的使用
-				if (wx.canIUse('getUpdateManager')) { 
-					const updateManager = wx.getUpdateManager();
-					//检测版本更新
-					updateManager.onCheckForUpdate(function(res) {
-						if (res.hasUpdate) {
-							updateManager.onUpdateReady(function() {
-								wx.showModal({
-									title: '温馨提示',
-									content: '检测到新版本,是否重启小程序?',
-									showCancel: false,
-									success: function(res) {
-										if (res.confirm) {
-											// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
-											updateManager.applyUpdate()
-										}
-									}
-								})
-							})
-							updateManager.onUpdateFailed(function() {
-								// 新版本下载失败
-								wx.showModal({
-									title: '已有新版本',
-									content: '请您删除小程序,重新搜索进入',
-								})
-							})
-						}
-					})
-				} else {
-					wx.showModal({
-						title: '溫馨提示',
-						content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
-					})
-				}
-			}
+		onShow: function() {
+			// 加载拦截
+			// console.log('App Show');
 		},
 		onHide: function() {
-
+			// console.log('App Hide');
 		}
 	};
 </script>
 
 <style lang="scss">
-	/* #ifndef APP-PLUS-NVUE || APP-NVUE */
-	@import url('@/plugin/emoji-awesome/css/tuoluojiang.css');
-	@import url('@/plugin/animate/animate.min.css');
-	@import 'static/css/base.css';
-	@import 'static/iconfont/iconfont.css';
-	@import 'static/css/guildford.css';
-	@import 'static/css/style.scss';
+	/*全局公共样式和字体图标*/
+	@import '/static/css/cmy.css';
 	@import "uview-ui/index.scss";
 
-	view {
+	view,
+	scroll-view,
+	swiper,
+	swiper-item,
+	cover-view,
+	cover-image,
+	icon,
+	text,
+	rich-text,
+	progress,
+	button,
+	checkbox,
+	form,
+	input,
+	label,
+	radio,
+	slider,
+	switch,
+	textarea,
+	navigator,
+	audio,
+	camera,
+	image,
+	video {
 		box-sizing: border-box;
 	}
 
-	page {
-		font-family: PingFang SC;
-	}
-	body,html {
-	    -webkit-user-select: none;
-	    user-select: none;
-	    width: 100%;
-	    height: auto !important;
+	/* 骨架屏替代方案 */
+	.Skeleton {
+		background: #f3f3f3;
+		padding: 20rpx 0;
+		border-radius: 8rpx;
 	}
-	
-	.activityFrame{
-			background-size: 100% 100%;
-			background-repeat: no-repeat;
-			position: absolute;
-			top:0;
-			left:0;
+
+	/* 图片载入替代方案 */
+	.image-wrapper {
+		font-size: 0;
+		background: #f3f3f3;
+		border-radius: 4px;
+
+		image {
 			width: 100%;
 			height: 100%;
-			z-index: 1;
+			transition: 0.6s;
+			opacity: 0;
+
+			&.loaded {
+				opacity: 1;
+			}
+		}
 	}
-	
-	.placeholder{
-		color: #ccc;
+
+	// 设置富文本中图片最大宽度
+	uni-rich-text img {
+		max-width: 100% !important;
 	}
 
-	.bg-color-red {
-		background-color: var(--view-theme) !important;
+	/*边框*/
+	.b-b:after,
+	.b-t:after {
+		position: absolute;
+		z-index: 3;
+		left: 0;
+		right: 0;
+		height: 0;
+		content: '';
+		transform: scaleY(0.5);
+		border-bottom: 1px solid $border-color-base;
 	}
 
-	.syspadding {
-		padding-top: var(--status-bar-height);
+	.b-b:after {
+		bottom: 0;
 	}
 
-	.flex {
-		display: flex;
+	.b-t:after {
+		top: 0;
 	}
 
-	.uni-scroll-view::-webkit-scrollbar {
-		/* 隐藏滚动条,但依旧具备可以滚动的功能 */
-		display: none;
+	/* button样式改写 */
+	uni-button,
+	button {
+		height: 80rpx;
+		line-height: 80rpx;
+		font-size: $font-lg + 2rpx;
+		font-weight: normal;
+
+		&.no-border:before,
+		&.no-border:after {
+			border: 0;
+		}
 	}
 
-	::-webkit-scrollbar {
-		width: 0;
-		height: 0;
-		color: transparent;
+	uni-button[type='default'],
+	button[type='default'] {
+		color: $font-color-dark;
 	}
 
-	.uni-system-open-location .map-content.fix-position {
-		height: 100vh;
-		top: 0;
-		bottom: 0;
+	/* input 样式 */
+	.input-placeholder {
+		color: #999999;
+	}
+
+	.placeholder {
+		color: #999999;
+	}
+
+	// 边距样式
+	@for $i from 1 to 4 {
+		.margin-l-#{$i * 10} {
+			margin-left: $i * 10rpx !important;
+		}
+
+		.margin-r-#{$i * 10} {
+			margin-right: $i * 10rpx !important;
+		}
+
+		.margin-t-#{$i * 10} {
+			margin-top: $i * 10rpx !important;
+		}
+
+		.margin-b-#{$i * 10} {
+			margin-bottom: $i * 10rpx !important;
+		}
+
+		.margin-#{$i * 10} {
+			margin: $i * 10rpx !important;
+		}
+
+		.margin-v-#{$i * 10} {
+			margin-top: $i * 10rpx !important;
+			margin-bottom: $i * 10rpx !important;
+		}
+
+		.margin-c-#{$i * 10} {
+			margin-left: $i * 10rpx !important;
+			margin-right: $i * 10rpx !important;
+		}
+
+		.padding-l-#{$i * 10} {
+			padding-left: $i * 10rpx !important;
+		}
+
+		.padding-r-#{$i * 10} {
+			padding-right: $i * 10rpx !important;
+		}
+
+		.padding-t-#{$i * 10} {
+			padding-top: $i * 10rpx !important;
+		}
+
+		.padding-b-#{$i * 10} {
+			padding-bottom: $i * 10rpx !important;
+		}
+
+		.padding-#{$i * 10} {
+			padding: $i * 10rpx !important;
+		}
+
+		.padding-v-#{$i * 10} {
+			padding-top: $i * 10rpx !important;
+			padding-bottom: $i * 10rpx !important;
+		}
+
+		.padding-c-#{$i * 10} {
+			padding-left: $i * 10rpx !important;
+			padding-right: $i * 10rpx !important;
+		}
+	}
+
+	// 字体大小
+	.font-size-sm {
+		font-size: $font-sm;
+	}
+
+	.font-size-base {
+		font-size: $font-base;
+	}
+
+	.font-size-lg {
+		font-size: $font-lg;
+	}
+
+	// 字体颜色
+	.font-color-yellow {
+		color: $color-yellow;
+	}
+
+	.font-color-gray {
+		color: $color-gray;
+	}
+
+	.font-color-red {
+		color: $color-red;
+	}
+
+	// 边框颜色
+	.border-color-yellow {
+		border: 1rpx solid $color-yellow;
+	}
+
+	// 修改默认背景颜色
+	uni-page-wrapper {
+		background-color: $page-color-base;
+	}
+
+	page {
+		background-color: $page-color-base;
+		// 设置默认字体
+		font-family: PingFang SC, STHeitiSC-Light, Helvetica-Light, arial, sans-serif, Droid Sans Fallback;
+	}
+
+	.alertprogress {
+		background-color: #FFF;
+		border-radius: 10rpx;
+		padding: 30rpx 50rpx;
 	}
-	/* #endif */
-</style>
+</style>

+ 0 - 284
README.md

@@ -1,284 +0,0 @@
-# CRMEB 移动端
-## 开发规范
-市面上常用的命名规范:
-
-* camelCase(小驼峰式命名法 —— 首字母小写)
-* PascalCase(大驼峰式命名法 —— 首字母大写)
-* kebab-case(短横线连接式)
-* snake_a(下划线连接式)
-
-##### 项目文件命名
-#####1、项目名
-#####全部采用小写方式, 以下划线分隔。 例:crmeb_pro_uniapp;
-#####2、组件(components)
-#####优先选择单个单词命名,多个单词命名以小驼峰式命名。例:crmebPro;
-#####3、pages里面的文件名;
-#####全部采用小写方式, 优先选择单个单词命名,多个单词命名以下划线分隔,组件参考第2条。 例:crmeb_pro_uniapp;
-#####4、css文件名;
-#####全部采用小写方式, 优先选择单个单词命名,多个单词命名以短横线分隔。例:crmeb-pro.css
-#####5、JavaScript 文件名;
-#####全部采用小写方式, 优先选择单个单词命名,多个单词命名以短横线分隔。例:crmeb-pro.js
-#####6、HTML 文件名;
-#####全部采用小写方式, 优先选择单个单词命名,多个单词命名以下划线分隔。例:crmeb_pro.html
-#####7、图像文件名;
-#####全部采用小写方式, 优先选择单个单词命名,多个单词命名以短横线分隔。例:crmeb-pro.jpg
-
-## 目录结构
-主要目录结构及说明:
-~~~
-├── api                       # 请求接口
-│   ├── activity              # 活动接口
-│   ├── admin                 # 管理端接口
-│   ├── api                   # 文章优惠券等接口
-│   ├── esp                   # esp接口
-│   ├── kefu                  # 客服接口
-│   ├── lottery               # 抽奖活动接口
-│   ├── order                 # 订单接口
-│   ├── points_mall           # 积分商城接口
-│   ├── public                # 配置类接口
-│   ├── store                 # 商品接口
-│   ├── user                  # 我的接口
-│   └──work                   # 企业微信接口
-│   ├── components            # 公共组件
-│   │    └──addressWindow          # 选择地址
-│   │    └──cartDiscount         # 购物车优惠明细
-│   │    └──cartList             # 购物车列表
-│   │    └──countDown           # 倒计时
-│   │    └──couponListWindow           # 优惠券列表
-│   │    └──couponWindow          # 首页优惠券
-│   │    └──cusPreviewImg          # 规格轮播
-│   │    └──customForm          # 自定义组件
-│   │    └──d_goodList          # 分类二的组件
-│   │    └──goodClass          # 分类三的组件
-│   │    └──goodList          # 营销组件
-│   │    └──guide          # 闪屏组件
-│   │    └──home          # 悬浮导航
-│   │    └──homeList          # 导航列表
-│   │    └──jyf-parser          # 富文本
-│   │    └──kefuIcon          # 客服
-│   │    └──Loading          # 加载
-│   │    └──orderGoods          # 订单商品
-│   │    └──pageFooter          # 底部导航
-│   │    └──payment          # 支付
-│   │    └──productConSwiper          # 商品轮播
-│   │    └──productWindow          # 商品属性
-│   │    └──recommend          # 热门推荐
-│   │    └──skeleton          # 骨架屏
-│   │    └──storeLis          # 门店列表
-│   │    └──swipers          # 轮播
-│   │    └──uni-calendar          # 日期
-│   │    └──uniNoticeBar          # 跑马灯
-│   │    └──userEvaluation          # 评价
-│   │    └──zb-code          # 二维码生成插件
-│   │    └──emptyPage          # 无数据时显示页面
-│   ├── config               # 项目配置文件
-│   ├── libs                  
-│   │    └──login            # 登录
-│   │    └──network            # 检测长链接
-│   │    └──new_chat            # 检测长链接
-│   │    └──order            # 订单跳转
-│   │    └──routine            # 授权
-│   │    └──wechat            # h5授权支付等函数
-│   │    └──work            # 企业微信
-│   ├── mixins                # 通用混合
-│   │    └──color          # 一键换色
-│   │    └──SendVerifyCode  # 获取验证码
-│   ├── pages                 # 所有页面
-│   │    └──activity              # 活动
-│   │         └──bargain # 砍价状态列表
-│   │         └──components # 组件
-│   │               └──giftGoods      # 商品赠品列表
-│   │         └──discount      # 活动折扣列表
-│   │         └──goods_bargain        # 砍价商品列表
-│   │         └──goods_bargain_details # 砍价详情
-│   │         └──goods_combination     # 拼团列表
-│   │         └──goods_combination_details    # 拼团详情
-│   │         └──goods_combination_status   # 拼团状态
-│   │         └──goods_seckill   # 秒杀列表
-│   │         └──goods_seckill_details   # 秒杀详情
-│   │         └──poster-poster   # 海报
-│   │         └──presell   # 预售列表
-│   │         └──static   # 图片
-│   │    └──admin             # 管理端
-│   │         └──components   # 组件
-│   │               └──priceChange      # 改价以及备注弹窗
-│   │               └──ucharts      # 统计图
-│   │               └──writeOffSwitching      # 核销列表
-│   │         └──custom_date   # 选择日期
-│   │         └──delivery   # 订单发货
-│   │         └──distribution   
-│   │               └──orderDetail      # 订单详情
-│   │               └──scanning      # 扫描结果
-│   │               └──index      # 配送员
-│   │         └──order   # 订单统计
-│   │         └──order_cancellation   # 订单核销
-│   │         └──orderDetail   # 订单详情
-│   │         └──orderList   # 订单列表
-│   │         └──static   # 图片
-│   │         └──statistics   # 订单数据统计
-│   │         └──store   # 门店管理
-│   │               └──custom_date      # 选择日期
-│   │               └──deliverGoods      # 订单发货
-│   │               └──order      # 订单管理
-│   │               └──orderDetail      # 订单详情
-│   │               └──scanning      # 扫描结果
-│   │               └──statistics      # 订单数据统计
-│   │               └──index      # 门店中心
-│   │    └──annex   # 会员
-│   │         └──offline_pay      # 支付
-│   │         └──offline_result      # 支付结果
-│   │         └──special      # 专题页
-│   │         └──vip_active      # 激活会员
-│   │         └──vip_clause      # 会员协议
-│   │         └──vip_coupon      # 会员优惠券
-│   │         └──vip_paid      # SVIP会员
-│   │         └──web_view      # 外部链接跳转
-│   │    └──auth   # 登录页
-│   │    └──columnGoods            
-│   │         └──HotNewGoods   
-│   │               └──feedback      # 我的客服
-│   │               └──index      # 精品推荐
-│   │         └──live_list    #推荐好货
-│   │         └──static    #图片
-│   │    └──extension
-│   │         └──components    #组件
-│   │               └──shareInfo      # 分享  
-│   │               └──vconsole.min      # 查看后台打印
-│   │         └──customer_list  
-│   │               └──chat      # 客服聊天界面  
-│   │         └──invite_friend    #邀请好友
-│   │         └──news_details    #资讯详情
-│   │         └──news_list    #资讯   
-│   │         └──static    #图片
-│   │    └──goods
-│   │         └──admin_order_detail    #订单详情
-│   │         └──components    #组件
-│   │               └──invoiceModal      # 选择发票 
-│   │               └──invoicePicker      # 添加发票信息 
-│   │               └──lottery      # 抽奖转盘 
-│   │               └──maramlee-waterfalls-flow      # 客服聊天界面 
-│   │         └──goods_comment_con    #组件
-│   │               └──comment_con      # 评价详情
-│   │               └──index      # 商品评价
-│   │               └──lottery_comment      # 订单评价
-│   │         └──goods_comment_list    #商品评分列表
-│   │         └──goods_details_store    #门店列表
-│   │         └──goods_list    #商品列表
-│   │         └──goods_logistics    #商品物流
-│   │         └──goods_return    #申请退货
-│   │         └──goods_return_list    #退货列表
-│   │         └──goods_search    #商品搜索
-│   │         └──lottery     
-│   │               └──grids
-│   │                    └──index  #抽奖活动
-│   │                    └──record   #中奖纪录
-│   │         └──order_confirm    #确认订单
-│   │         └──order_details    #订单详情
-│   │         └──order_pay    #订单支付
-│   │         └──order_pay_status    #支付成功
-│   │         └──order_refund_goods    #退回商品
-│   │         └──order_pay_status    #退回商品
-│   │         └──static    #图片
-│   │    └──goods_cate 分类
-│   │    └──goods_details 商品详情
-│   │    └──guide 闪屏
-│   │    └──index 首页
-│   │    └──order_addcart 购物车
-│   │    └──points_mall 积分商城
-│   │         └──components    #组件
-│   │               └──productWindow      #商品规格 
-│   │         └──static    #图片
-│   │         └──exchange_record    #兑换记录
-│   │         └──index    #积分商城首页
-│   │         └──integral_goods_details    #商品详情
-│   │         └──integral_goods_list    #商品列表
-│   │         └──integral_order    #积分订单
-│   │         └──integral_order_details    #兑换订单详情
-│   │         └──integral_order_status    #兑换成功
-│   │         └──logistics_details    #兑换物流详情
-│   │         └──user_address    #选择地址
-│   │    └──user 个人中心
-│   │    └──users 我的
-│   │         └──alipay_invoke    #支付提示
-│   │         └──commission_rank    #佣金排行
-│   │         └──components    #组件
-│   │               └──areaWindow      #选择地区
-│   │               └──login_mobile      #登录
-│   │               └──pageHeader      #头部导航
-│   │               └──timeSlot      #时间日期插件
-│   │         └──login    #登录
-│   │         └──message_center    
-│   │               └──index      #消息中心
-│   │               └──messageDetail      #消息详情
-│   │         └──privacy    #协议
-│   │         └──promoter_rank    #推广人排行
-│   │         └──promoter-list    #推广人列表
-│   │         └──promoter-order    #推广人订单
-│   │         └──retrievePassword    #忘记密码
-│   │         └──scan_login    #授权登录
-│   │         └──static    #图片
-│   │         └──user_address    #选择地址
-│   │         └──user_address_list    #地址管理
-│   │         └──user_bill    #账单明细
-│   │         └──user_cancellation    #注销说明
-│   │         └──user_cash    #提现
-│   │         └──user_coupon    #我的优惠券
-│   │         └──user_distribution_level    #分销等级
-│   │         └──user_get_coupon    #领取优惠券
-│   │         └──user_goods_collection    #收藏商品
-│   │         └──user_info    #个人资料
-│   │         └──user_integral    #积分详情
-│   │         └──user_invoice_form    #添加新发票
-│   │         └──user_invoice_list    #发票管理
-│   │         └──user_invoice_order    #订单详情
-│   │         └──user_money    #我的账户
-│   │         └──user_payment    #余额充值
-│   │         └──user_phone    #绑定手机
-│   │         └──user_pwd_edit    #修改密码
-│   │         └──user_return_list    #退货列表
-│   │         └──user_sgin    #签到
-│   │         └──user_sgin_list    #签到记录
-│   │         └──user_spread_code    #分销海报
-│   │         └──user_spread_money    #佣金记录
-│   │         └──user_spread_user    #我的推广
-│   │         └──user_vip    #我的等级
-│   │         └──user_vip_areer    #经验记录
-│   │         └──visit_list    #浏览记录
-│   │         └──wechat_login    #账户登录
-│   │    └──work 企业微信
-│   │         └──components    #组件
-│   │               └──tabNav      #导航 
-│   │         └──groupInfo    #群组信息
-│   │         └──orderDetail    #订单详情
-│   │         └──orderList    #交易管理
-│   │         └──record    #记录
-│   │         └──userInfo    #客户信息
-│   ├── plugins                # 插件
-│   ├── static                 # 静态文件
-│   ├── store                  # Vuex 状态管理
-│   ├── utils                  # js工具
-│   ├── App                # 入口文件
-│   ├── main.js                # 入口文件,注册vue等
-│   └── pages.json                # 页面配置
-~~~
-## 开发打包项目
-~~~
-uniapp开发工具必须为HBuilder
-
-# 启动项目(本地开发环境)
-点击运行
-
-# 打包项目
-点击发行
-~~~
-
-
-###开发团队:
-
-##### 前端开发:小小、娜娜
-##### 后端开发:等风来、zhypy
-##### 产品经理:木子刀客
-##### UI设计:xy-yyds
-##### 测试:夏天
-
-注:排名不分前后

+ 3 - 3
androidPrivacy.json

@@ -2,13 +2,13 @@
     "version" : "1",
     "prompt" : "template",
     "title" : "用户协议与隐私政策",
-    "message" : "\t请务必审慎阅读、充分理解“用户协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。<br/>
- 你可以阅读 <a href=\"pages/columnGoods/static/yhxy.html\">《用户协议》</a>与 <a href=\"pages/columnGoods/static/yszc.html\">《隐私政策》</a>了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。",
+    "message" : "\t请务必审慎阅读、充分理解“用户协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。<br/>\r\r
+ 你可以阅读 <a href=\"hybrid/html/yhxy.html\">《用户协议》</a>与 <a href=\"hybrid/html/yszc.html\">《隐私政策》</a>了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。",
     "buttonAccept" : "同意并接受",
     "buttonRefuse" : "暂不同意",
     "second" : {
         "title" : "确认提示",
-        "message" : "进入应用前,你需先同意<a href=\"pages/columnGoods/static/yhxy.html\">《用户协议》</a>与<a href=\"pages/columnGoods/static/yszc.html\">《隐私政策》</a>,否则将退出应用。",
+        "message" : "进入应用前,你需先同意<a href=\"hybrid/html/yhxy.html\">《用户协议》</a>与<a href=\"hybrid/html/yszc.html\">《隐私政策》</a>,否则将退出应用。",
         "buttonAccept" : "同意并继续",
         "buttonRefuse" : "退出应用"
     },

+ 161 - 229
api/activity.js

@@ -1,344 +1,276 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
 import request from "@/utils/request.js";
 /**
  * 
  * 所有活动接口 包括:拼团,砍价,秒杀
  * 
- */
-
-/**
- * 拼团列表
- * 
- */
-export function getCombinationList(data) {
-	return request.get('combination/list', data, {
-		noAuth: true
+*/
+// 砍价产品详情
+export function getBargainDetail(data,id) {
+	return request({
+		url: '/api/bargain/detail/' + id,
+		method: 'get',
+		data
 	});
 }
 
 /**
- * 拼团详情
- * 
+ * 砍价产品详情
  */
-export function getCombinationDetail(id) {
-	return request.get('combination/detail/' + id,{},{noAuth: true});
-}
+// export function getBargainDetail(id) {
+//   return request.get("bargain/detail/" + id);
+// }
 
-/**
- * 拼团 开团
- */
-export function getCombinationPink(id) {
-	return request.get("combination/pink/" + id);
+//砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格
+export function postBargainHelpCount(data) {
+	return request({
+		url: '/api/bargain/help/count',
+		method: 'post',
+		data
+	});
 }
 
 /**
- * 拼团 取消开团
+ * 砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格
  */
-export function postCombinationRemove(data) {
-	return request.post("combination/remove", data);
-}
+// export function postBargainHelpCount(data) {
+//   return request.post("bargain/help/count", data);
+// }
 
-/**
- * 砍价列表
- */
-export function getBargainList(data) {
-	return request.get("bargain/list", data, {
-		noAuth: true
+//砍价 开启砍价用户信息
+export function postBargainStartUser(data) {
+	return request({
+		url: '/api/bargain/start/user',
+		method: 'post',
+		data
 	});
 }
 
 /**
- * 拼团轮播
- * 
+ * 砍价 开启砍价用户信息
  */
-export function getCombinationBannerList(data) {
-	return request.get('combination/banner_list', data, {
-		noAuth: true
-	});
-}
+// export function postBargainStartUser(data) {
+//   return request.post("bargain/start/user", data);
+// }
 
-/**
- * 拼团人数
- * 
- */
-export function getPink(data) {
-	return request.get('pink', data, {
-		noAuth: true
+//砍价开启
+export function postBargainStart(data) {
+	return request({
+		url: '/api/bargain/start',
+		method: 'post',
+		data
 	});
 }
 
 /**
- * 
- * 砍价列表(已参与)
- * @param object data
+ * 砍价开启
  */
-export function getBargainUserList(data) {
-	return request.get('bargain/user/list', data);
-}
-
+// export function postBargainStart(bargainId) {
+//   return request.post("bargain/start", { bargainId: bargainId});
+// }
 
-/**
- * 砍价产品详情
- */
-export function getBargainDetail(id) {
-	return request.get("bargain/detail/" + id, {},{
-		noAuth: true
+// 砍价 砍掉金额
+export function postBargainHelpPrice(data) {
+	return request({
+		url: '/api/bargain/help/price',
+		method: 'post',
+		data
 	});
 }
 
 /**
- * 砍价 开启砍价用户信息
+ * 砍价 砍掉金额
  */
-export function postBargainStartUser(data) {
-	return request.post("bargain/start/user", data);
-}
+// export function postBargainHelpPrice(data) {
+//   return request.post("bargain/help/price", data);
+// }
 
-/**
- * 砍价开启
- */
-export function postBargainStart(bargainId) {
-	return request.post("bargain/start", {
-		bargainId: bargainId
+// 砍价 帮助好友砍价
+export function postBargainHelp(data) {
+	return request({
+		url: '/api/bargain/help',
+		method: 'post',
+		data
 	});
 }
 
 /**
  * 砍价 帮助好友砍价
  */
-export function postBargainHelp(data) {
-	return request.post("bargain/help", data);
-}
+// export function postBargainHelp(data) {
+//   return request.post("bargain/help", data);
+// }
 
-/**
- * 砍价 砍掉金额
- */
-export function postBargainHelpPrice(data) {
-	return request.post("bargain/help/price", data);
+// 砍价 砍价帮
+export function postBargainHelpList(data) {
+	return request({
+		url: '/api/bargain/help/list',
+		method: 'post',
+		data
+	});
 }
 
+
 /**
  * 砍价 砍价帮
  */
-export function postBargainHelpList(data) {
-	return request.post("bargain/help/list", data);
-}
+// export function postBargainHelpList(data) {
+//   return request.post("bargain/help/list", data);
+// }
 
-/**
- * 砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格
- */
-export function postBargainHelpCount(data) {
-	return request.post("bargain/help/count", data);
+// 砍价 观看/分享/参与次数
+export function postBargainShare(data) {
+	return request({
+		url: '/api/bargain/share',
+		method: 'post',
+		data
+	});
 }
 
 /**
  * 砍价 观看/分享/参与次数
  */
-export function postBargainShare(bargainId) {
-	return request.post("bargain/share", {
-		bargainId: bargainId
-	});
-}
+// export function postBargainShare(bargainId) {
+//   return request.post("bargain/share", { bargainId: bargainId});
+// }
 
-/**
- * 秒杀产品时间区间
- * 
- */
-export function getSeckillIndexTime() {
-	return request.get('seckill/index', {}, {
-		noAuth: true
+// 砍价列表(已参与)
+export function getBargainUserList(data) {
+	return request({
+		url: '/api/bargain/user/list',
+		method: 'get',
+		data
 	});
 }
 
 /**
- * 秒杀产品列表
- * @param int time
+ * 
+ * 砍价列表(已参与)
  * @param object data
- */
-export function getSeckillList(time, data) {
-	return request.get('seckill/list/' + time, data, {
-		noAuth: true
-	});
-}
+*/
+// export function getBargainUserList(data){
+//   return request.get('bargain/user/list',data);
+// }
 
-/**
- * 秒杀产品详情
- * @param int id
- */
-export function getSeckillDetail(id, data) {
-	return request.get('seckill/detail/' + id, data,{
-		noAuth: true
+// 砍价取消
+export function getBargainUserCancel(data) {
+	return request({
+		url: '/api/bargain/user/cancel',
+		method: 'post',
+		data
 	});
 }
 
 /**
- * 砍价海报
- * @param object data
- * 
+ * 砍价取消
  */
-export function getBargainPoster(data) {
-	return request.post('bargain/poster', data)
-}
+// export function getBargainUserCancel(data) {
+//   return request.post("/bargain/user/cancel", data);
+// }
 
-/**
- * 拼团海报
- * @param object data
- * 
- */
-export function getCombinationPoster(data) {
-	return request.post('combination/poster', data)
-}
 
-/**
- * 砍价取消
- */
-export function getBargainUserCancel(data) {
-	return request.post("bargain/user/cancel", data);
-}
 
-/**
- * 获取秒杀小程序二维码
- */
-export function seckillCode(id, data) {
-	return request.get("seckill/code/" + id, data);
-}
 
-/**
- * 获取拼团小程序二维码
- */
-export function scombinationCode(id) {
-	return request.get("combination/code/" + id);
-}
 
 /**
- * 获取砍价海报详细信息
- */
-export function getCombinationPosterData(id) {
-	return request.get("combination/poster_info/" + id);
+ * 拼团列表
+ * 
+*/
+export function getCombinationList(data) {
+  return request.get('combination/list', data,{noAuth:true});
 }
 
-
 /**
- * 获取砍价海报详细信息
- */
-export function getBargainPosterData(id) {
-	return request.get("bargain/poster_info/" + id);
+ * 拼团详情
+ * 
+*/
+export function getCombinationDetail(id) {
+  return request.get('combination/detail/'+id);
 }
 
 /**
- * 获取积分订单详细信息
+ * 拼团 开团
  */
-export function integralOrderConfirm(data) {
-	return request.post('store_integral/order/confirm', data);
+export function getCombinationPink(id) {
+  return request.get("combination/pink/" + id);
 }
 
 /**
- * 获取积分订单创建
+ * 拼团 取消开团
  */
-export function integralOrderCreate(data) {
-	return request.post('store_integral/order/create', data);
+export function postCombinationRemove(data) {
+  return request.post("combination/remove",data);
 }
+
 /**
- * 获取积分订单详情
- * @param string cartId
+ * 砍价列表
  */
-export function integralOrderDetails(order) {
-	return request.get(`store_integral/order/detail/${order}`);
+export function getBargainList(data) {
+  return request.get("bargain/list", data,{noAuth:true});
 }
 
+
 /**
- * 积分产品详情
- * @param int id
  * 
- */
-export function getIntegralProductDetail(id) {
-	return request.get('store_integral/detail/' + id, {}, {
-		noAuth: true
-	});
+ * 取消砍价
+ * @param int bargainId
+*/
+export function bargainUserCancel(bargainId){
+  return request.post('bargain/user/cancel', { bargainId: bargainId})
 }
 
 /**
- * 积分商城商品列表
- * @param object data
- */
-export function getStoreIntegralList(data) {
-	return request.get('store_integral/list', data, {
-		noAuth: true
-	});
+ * 秒杀产品时间区间
+ * 
+*/
+export function getSeckillIndexTime(){
+  return request.get('seckill/index',{},{noAuth:true});
 }
 
 /**
- * 积分兑换列表
+ * 秒杀产品列表
+ * @param int time
  * @param object data
- */
-export function getIntegralOrderList(data) {
-	return request.get('store_integral/order/list', data);
+*/
+export function getSeckillList(time,data){
+  return request.get('seckill/list/'+time,data,{noAuth:true});
 }
 
 /**
- * 积分兑换详情
- */
-export function getLogisticsDetails(orderId) {
-	return request.get(`store_integral/order/express/${orderId}`);
+ * 秒杀产品详情
+ * @param int id
+*/
+export function getSeckillDetail(id){
+  return request.get('seckill/detail/'+id);
 }
 
 /**
- * 积分兑换订单确认收货
+ * 砍价海报
  * @param object data
- */
-export function orderTake(data) {
-	return request.post(`store_integral/order/take`, data);
+ * 
+*/
+export function getBargainPoster(data){
+  return request.post('bargain/poster',data)
 }
 
 /**
- * 积分兑换订单删除
+ * 拼团海报
  * @param object data
- */
-export function orderDel(data) {
-	return request.post(`store_integral/order/del`, data);
-}
-
-/**
- * 预售商品列表
- */
-export function getAdvancellList(data) {
-  return request.get("presale/list", data);
-}
-
-/**
- * 限时折扣商品列表
- */
-export function promotionsList(type,data) {
-  return request.get("v2/promotions/productList/"+type, data);
+ * 
+*/
+export function getCombinationPoster(data){
+  return request.post('combination/poster',data)
 }
 
 /**
- * 活动赠送商品
+ * 获取秒杀小程序二维码
  */
-export function giveInfo(id) {
-  return request.get("v2/promotions/give_info/"+id);
+export function seckillCode(id,data) {
+  return request.get("seckill/code/"+id,data);
 }
 
 /**
- * 秒杀商品二维码
- * @param {Object} id
+ * 获取拼团小程序二维码
  */
-export function seckillQRCode(id) {
-  return request.get(`seckill/code/${id}`);
+export function scombinationCode(id) {
+  return request.get("combination/code/"+id);
 }
-
-/**
- * 获取拼团商品详情二维码
- * @param {Object} id
- */
-export function combinationQRCode(id) {
-  return request.get(`combination/detail_code/${id}`);
-}

+ 0 - 431
api/admin.js

@@ -1,431 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-
-import request from "@/utils/request.js";
-
-/**
- * 统计数据
- */
-export function getStatisticsInfo() {
-	return request.get("admin/order/statistics", {}, {
-		login: true
-	});
-}
-/**
- * 订单月统计
- */
-export function getStatisticsMonth(where) {
-	return request.get("admin/order/data", where, {
-		login: true
-	});
-}
-/**
- * 订单月统计
- */
-export function getAdminOrderList(where) {
-	return request.get("admin/order/list", where, {
-		login: true
-	});
-}
-/**
- * 订单改价
- */
-export function setAdminOrderPrice(data) {
-	return request.post("admin/order/price", data, {
-		login: true
-	});
-}
-/**
- * 订单备注
- */
-export function setAdminOrderRemark(data) {
-	return request.post("admin/order/remark", data, {
-		login: true
-	});
-}
-/**
- * 订单备注(退款)
- */
-export function setAdminRefundRemark(data) {
-	return request.post("admin/refund_order/remark", data, {
-		login: true
-	});
-}
-/**
- * 订单详情
- */
-export function getAdminOrderDetail(orderId) {
-	return request.get("admin/order/detail/" + orderId, {}, {
-		login: true
-	});
-}
-/**
- * 订单详情(退款)
- */
-export function getAdminRefundDetail(orderId) {
-	return request.get("admin/refund_order/detail/" + orderId, {}, {
-		login: true
-	});
-}
-
-/**
- * 订单发货保存
- */
-export function setAdminOrderDelivery(id, data) {
-	return request.post("admin/order/delivery/keep/" + id, data, {
-		login: true
-	});
-}
-/**
- * 订单统计图
- */
-export function getStatisticsTime(data) {
-	return request.get("admin/order/time", data, {
-		login: true
-	});
-}
-/**
- * 线下付款订单确认付款
- */
-export function setOfflinePay(data) {
-	return request.post("admin/order/offline", data, {
-		login: true
-	});
-}
-/**
- * 订单确认退款
- */
-export function setOrderRefund(data) {
-	return request.post("admin/order/refund", data, {
-		login: true
-	});
-}
-
-/**
- * 获取快递公司
- * @returns {*}
- */
-export function getLogistics(data) {
-	return request.get("logistics", data, {
-		login: false
-	});
-}
-
-/**
- * 订单核销
- * @returns {*}
- */
-export function orderVerific(verify_code, is_confirm) {
-	return request.post("order/order_verific", {
-		verify_code,
-		is_confirm
-	});
-}
-
-/**
- * 获取物流公司模板
- * @returns {*}
- */
-export function orderExportTemp(data) {
-	return request.get("admin/order/export_temp", data);
-}
-
-/**
- * 获取订单打印默认配置
- * @returns {*}
- */
-export function orderDeliveryInfo(id) {
-	return request.get("admin/order/delivery_info/"+id);
-}
-
-/**
- * 配送员列表
- * @returns {*}
- */
-export function orderOrderDelivery() {
-	return request.get("admin/order/delivery");
-}
-
-
-// 门店
-
-/**
- * 用户信息
- */
-export function userInfo() {
-	return request.get("store/staff/info");
-}
-
-
-/**
- * 门店中心-订单统计
- */
-export function orderInfo(data) {
-	return request.get("store/order/statistics",data);
-}
-
-
-
-/**
- * 门店中心-统计菜单
- */
-export function statisticsMenuApi(data) {
-	return request.get("store/staff/statistics",data);
-}
-
-
-
-/**
- * 门店中心-详细数据列表
- */
-export function getListApi(data) {
-	return request.get("store/order/data",data);
-}
-
-
-/**
- * 门店中心-数据详情-列表
- */
-export function getStatisticsListApi(type,data) {
-	return request.get("store/staff/data/"+type,data);
-}
-
-
-/**
- * 门店中心-订单管理列表
- */
-export function getOrderlistApi(data) {
-	return request.get("store/order/list",data);
-}
-
-/**
- * 门店中心-订单管理列表(退款)
- */
-export function getRefundlistApi(data) {
-	return request.get("store/refund/list",data);
-}
-
-/**
- * 门店中心-订单管理备注
- */
-export function getOrderreMarkApi(data) {
-	return request.post("store/order/remark",data);
-}
-
-/**
- * 门店中心-订单管理备注(退款)
- */
-export function getRefundMarkApi(data) {
-	return request.post("store/refund/remark",data);
-}
-
-/**
- * 门店中心-订单管理改价
- */
-export function getOrderPriceApi(data) {
-	return request.post("store/order/price",data);
-}
-
-/**
- * 门店中心-订单管理确定付款
- */
-export function getOrderOfflineApi(data) {
-	return request.post("store/order/offline",data);
-}
-
-
-/**
- * 门店中心-去发货-用户
- */
-export function getOrderDeliveryinfoApi(id) {
-	return request.get("store/order/delivery_info/"+id);
-}
-
-/**
- * 门店中心-去发货-获取快递公司
- */
-export function getOrderExportApi(data) {
-	return request.get("store/order/export_all", data, {
-		login: false
-	});
-}
-/**
- * 门店中心-去发货-获取物流公司模板
- * @returns {*}
- */
-export function getOrderExportTemp(data) {
-	return request.get("store/order/export_temp", data);
-}
-
-/**
- * 门店中心-去发货-订单发货保存
- */
-export function setOrderDelivery(id, data) {
-	return request.post("store/order/delivery/" + id, data, {
-		login: true
-	});
-}
-/**
- * 门店中心-去发货-获取配送员列表
- * @returns {*}
- */
-export function getOrderDelivery() {
-	return request.get("store/delivery/list");
-}
-/**
- * 门店中心-订单确认退款
- */
-export function OrderRefund(data) {
-	return request.post("store/order/refund", data, {
-		login: true
-	});
-}
-
-/**
- * 门店中心-订单详情
- */
-export function OrderDetail(id) {
-	return request.get("store/order/detail/"+id);
-}
-
-/**
- * 门店中心-订单详情(退款)
- */
-export function refundDetail(id) {
-	return request.get("store/refund/detail/"+id);
-}
-
-
-/**
- * 配送员-获取用户信息
- */
-export function deliveryInfo(id) {
-	return request.get("store/delivery/info");
-}
-
-
-/**
- * 配送员-获取配送统计数据
- */
-export function deliveryStatistics(data) {
-	return request.get("store/delivery/statistics",data);
-}
-
-
-/**
- * 配送员-获取配送统计数据列表
- */
-export function deliveryList(data) {
-	return request.get("store/delivery/data",data);
-}
-
-
-
-/**
- * 配送员-获取订单列表数据列表
- */
-export function deliveryOrderList(data) {
-	return request.get("store/delivery/order",data);
-}
-
-
-/**
- * 门店中心-订单取消、删除
- */
-export function OrderDel(id) {
-	return request.delete("store/order/del/"+id);
-}
-
-
-/**
- * 门店中心-订单取消、取消
- */
-export function OrderCancel(id) {
-	return request.post("store/order/cancel/"+id);
-}
-
-
-/**
- * 配送员-扫码核销获取订单信息
- */
-export function orderWriteoffInfo(type,data) {
-	return request.get("store/order/writeoff_info/"+type,data);
-}
-
-
-
-
-/**
- * 配送员-核销订单获取商品信息
- */
-export function orderCartInfo(type,data) {
-	return request.get("store/order/cart_info/"+type,data);
-}
-
-
-/**
- * 配送员-订单核销
- */
-export function orderWriteoff(type,data) {
-	return request.post("store/order/writeoff/"+type,data);
-}
-
-/**
- * 统计管理-获取订单可拆分商品列表
- */
-export function orderSplitInfo(id) {
-	return request.get("admin/order/split_cart_info/"+id);
-}
-
-/**
- * 统计管理-提交
- */
-export function orderSplitDelivery(id,data) {
-	return request.put("admin/order/split_delivery/"+id,data);
-}
-
-/**
- * 统计管理-退货退款
- */
-export function orderRefundAgree(id) {
-	return request.post("admin/order/refund_agree/"+id);
-}
-
-/**
- * 门店中心-获取订单可拆分商品列表
- */
-export function storeSplitInfo(id) {
-	return request.get("store/order/split_cart_info/"+id);
-}
-
-/**
- * 门店中心-提交
- */
-export function storeSplitDelivery(id,data) {
-	return request.put("store/order/split_delivery/"+id,data);
-}
-
-/**
- * 门店中心-退货退款
- */
-export function storeRefundAgree(id) {
-	return request.post("store/order/refund_agree/"+id);
-}
-
-/**
- * 平台-退款列表
- */
-export function adminRefundList(data) {
-	return request.get("admin/refund_order/list",data);
-}
-
-
-

+ 0 - 480
api/api.js

@@ -1,480 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-/**
- * 公共接口 ,优惠券接口 , 行业此讯 , 手机号码注册
- * 
- */
-export function getAjcaptcha(data) {
-	return request.get("ajcaptcha", data, {
-		noAuth: true
-	});
-}
-
-export function ajcaptchaCheck(data) {
-	return request.post("ajcheck", data, {
-		noAuth: true
-	});
-}
-/**
- * 获取主页数据 无需授权
- * 
- */
-export function getIndexData() {
-	return request.get("v2/index", {}, {
-		noAuth: true
-	});
-}
-/**
- * 获取服务器类型
- * 
- */
-export function getServerType() {
-	return request.get("v2/site_serve", {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取登录授权login
- * 
- */
-export function getLogo() {
-	return request.get('wechat/get_logo', {}, {
-		noAuth: true
-	});
-}
-
-
-/**
- * 保存form_id
- * @param string formId 
- */
-export function setFormId(formId) {
-	return request.post("wechat/set_form_id", {
-		formId: formId
-	});
-}
-
-/**
- * 领取优惠卷
- * @param int couponId
- * 
- */
-export function setCouponReceive(couponId) {
-	return request.post('coupon/receive', {
-		couponId: couponId
-	});
-}
-/**
- * 优惠券列表
- * @param object data
- */
-export function getCoupons(data) {
-	return request.get('v2/coupons', data, {
-		noAuth: true
-	})
-}
-
-/**
- * 我的优惠券
- * @param int types 0全部  1未使用 2已使用
- */
-export function getUserCoupons(types, data) {
-	return request.get('coupons/user/' + types, data)
-}
-
-/**
- * 首页新人优惠券
- * 
- */
-export function getNewCoupon() {
-	return request.get('v2/new_coupon')
-}
-
-/**
- * 文章分类列表
- * 
- */
-export function getArticleCategoryList() {
-	return request.get('article/category/list', {}, {
-		noAuth: true
-	})
-}
-
-/**
- * 文章列表
- * @param int cid
- * 
- */
-export function getArticleList(cid, data) {
-	return request.get('article/list/' + cid, data, {
-		noAuth: true
-	})
-}
-
-/**
- * 文章 热门列表
- * 
- */
-export function getArticleHotList() {
-	return request.get('article/hot/list', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 文章 轮播列表
- * 
- */
-export function getArticleBannerList() {
-	return request.get('article/banner/list', {}, {
-		noAuth: true
-	})
-}
-
-/**
- * 文章详情
- * @param int id 
- * 
- */
-export function getArticleDetails(id) {
-	return request.get('article/details/' + id, {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 手机号+验证码登录接口
- * @param object data
- */
-export function loginMobile(data) {
-	return request.post('login/mobile', data, {
-		noAuth: true
-	})
-}
-
-/**
- * 获取短信KEY
- * @param object phone
- */
-export function verifyCode() {
-	return request.get('verify_code', {}, {
-		noAuth: true
-	})
-}
-
-/**
- * 验证码发送
- * @param object phone
- */
-export function registerVerify(data) {
-	return request.post('register/verify',data, {
-		noAuth: true
-	})
-}
-
-/**
- * 手机号注册
- * @param object data
- * 
- */
-export function phoneRegister(data) {
-	return request.post('register', data, {
-		noAuth: true
-	});
-}
-
-/**
- * 手机号修改密码
- * @param object data
- * 
- */
-export function phoneRegisterReset(data) {
-	return request.post('register/reset', data, {
-		noAuth: true
-	})
-}
-
-/**
- * 手机号+密码登录
- * @param object data
- * 
- */
-export function phoneLogin(data) {
-	return request.post('login', data, {
-		noAuth: true
-	})
-}
-
-/**
- * 切换H5登录
- * @param object data
- */
-// #ifdef MP
-export function switchH5Login() {
-	return request.post('switch_h5', {
-		'from': 'routine'
-	});
-}
-// #endif
-
-/*
- * h5切换公众号登陆
- * */
-// #ifdef H5
-export function switchH5Login() {
-	return request.post("switch_h5", {
-		'from': "wechat"
-	});
-}
-// #endif
-
-/**
- * 绑定手机号
- * 
- */
-export function bindingPhone(data) {
-	return request.post('binding', data, {
-		noAuth: true
-	});
-}
-
-
-
-/**
- * 绑定手机号
- * 
- */
-export function bindingUserPhone(data) {
-	return request.post('user/binding', data);
-}
-
-/**
- * 退出登錄
- * 
- */
-export function logout() {
-	return request.get('logout');
-}
-
-/**
- * 获取订阅消息id
- */
-export function getTemlIds() {
-	return request.get('wechat/teml_ids', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 首页拼团数据
- */
-export function pink() {
-	return request.get('pink', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取城市信息
- */
-export function getCity() {
-	return request.get('city_list', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取省市区街道
- */
-export function getCityData(pid) {
-	return request.get('city', {'pid':pid}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取小程序观看列表
- */
-export function getLiveList(page, limit) {
-	return request.get('wechat/live', {
-		page,
-		limit
-	}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取首页DIY;
- */
-export function getDiy(id) {
-	return request.get('diy/get_diy/' + id, {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 一键换色;
- */
-export function colorChange(name) {
-	return request.get('v2/diy/color_change/' + name, {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取公众号关注
- * @returns {*}
- */
-export function follow() {
-	return request.get("wechat/follow", {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 更换手机号码
- * @returns {*}
- */
-export function updatePhone(data) {
-	return request.post("user/updatePhone", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 首页优惠券弹窗
- * @returns {*}
- */
-export function getCouponV2() {
-	return request.get("v2/get_today_coupon", {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 新用户优惠券弹窗
- * @returns {*}
- */
-export function getCouponNewUser() {
-	return request.get("v2/new_coupon", {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 首页快速选择数据
- * @param {Object} data
- */
-export function category(data) {
-	return request.get("category", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 个人搜索历史
- * @param {Object} data
- */
-export function searchList(data) {
-	return request.get('v2/user/search_list', data, {
-		noAuth: true
-	});
-}
-
-/**
- * 删除搜索历史
- */
-export function clearSearch() {
-	return request.get('v2/user/clean_search');
-}
-
-/**
- * App微信登录
- * @returns {*}
- */
-export function wechatAppAuth(data) {
-	return request.post("wechat/app_auth", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 客服配置
- */
-export function customerType() {
-	return request.get('get_customer_type',{},{
-		noAuth: true
-	});
-}
-
-/**
- * 获取开屏广告
- * @returns {*}
- */
-export function getOpenAdv(data) {
-	return request.get("get_open_adv", {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取版权
- * 
- */
-export function copyRight() {
-	return request.get('get_copyright', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取用户信息
- * 
- */
-export function diyUserInfo() {
-	return request.get('diy/user_info', {});
-}
-
-/**
- * 新人专享
- * 
- */
-export function newcomerList(data) {
-	return request.get('diy/newcomer_list', data,{
-		noAuth: true
-	});
-}
-
-/**
- * 获取DIY版本接口
- * @param {Object} id
- */
-export function getDiyVersion(id) {
-	return request.get(`diy/diy_version/${id}`, {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 商品分类类版本
- */
-export function getCategoryVersion() {
-	return request.get('category_version', {}, {
-		noAuth: true
-	});
-}
-
-
-
-

+ 0 - 19
api/esp.js

@@ -1,19 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * erp设置
- * 
- */
-export function erpConfig(id,data) {
-	return request.get('admin/erp/config');
-}

+ 0 - 86
api/files.js

@@ -1,86 +0,0 @@
-import request from "@/utils/request.js";
-
-//档案保存
-export function filesAdd(data) {
-  return request.post("user/dossier",data);
-}
-//档案列表
-export function filesList(data) {
-  return request.get("user/dossier",data);
-}
-//档案详情
-export function filesInfo(id) {
-	return request.get('user/dossier/' + id, {},{
-	});
-}
-//删除档案
-export function delFiles(id, data) {
-	return request.delete('user/dossier/'+id, data)
-}
-//获取组合数据接口
-export function getData(data) {
-  return request.get("data_360",data);
-}
-
-
-
-//舌诊记录
-export function tongueList(data) {
-	return request.get("tongue",data);
-}
-//舌诊信息
-export function tongueInfo(id) {
-  return request.get('user/tongue/' + id, {},{
-});
-}
-//保存舌诊
-export function tongueAdd(id, data) {
-	return request.post("user/tongue/" + id, data);
-}
-//删除舌诊
-export function delTongue(data) {
-	return request.delete('user/tongue/'+id, data)
-}
-
-//新建舌诊
-export function addFiles(id, data) {
-	return request.post("store/work/tongue/" + id, data);
-}
-
-
-//获取客服列表
-export function kfLst(data) {
-	return request.get("kf_lst",data);
-}
-
-//获取次卡商品规格
-export function getAttrs(data) {
-	return request.get("products/get_attrs",data);
-}
-//创建套餐
-export function savePackage(data) {
-	return request.post("store/discounts/save",data);
-}
-export function packageInfo(id,data) {
-	return request.get("store_discounts/" + id, data);
-}
-//获取门店员工接口
-export function storeStaff(data) {
-	return request.get("store_staff_lst", data);
-}
-//门店预约
-export function subscribe(data) {
-	return request.post("subscribe/save", data);
-}
-//预约订单
-export function subscribelst(data) {
-	return request.get("subscribe/get_lst", data);
-}
-//获取预约订单详情
-export function subscribeInfo(data) {
-	return request.get("subscribe/info", data);
-}
-//取消预约订单
-export function cancelSubscribe(data) {
-	return request.get("subscribe/cancel", data);
-}

+ 66 - 0
api/functionalUnit.js

@@ -0,0 +1,66 @@
+import request from '@/utils/request'
+
+//获取优惠券列表
+export function getCouponsList(data,types) {
+	//优惠券状态 0全部 1未使用 2已使用
+	return request({
+		url: '/api/coupons/user/'+types,
+		method: 'get',
+		data
+	});
+}
+
+//领取优惠券
+export function setCoupons(data) {
+	return request({
+		url: '/api/coupon/receive',
+		method: 'post',
+		data
+	});
+}
+
+//获取可使用优惠券
+export function couponsOrder(data,price) {
+	return request({
+		url: '/api/coupons/order/'+price,
+		method: 'get',
+		data
+	});
+}
+
+
+//	积分列表
+export function integrallist(data) {
+	return request({
+		url: '/api/integral/list',
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取签到列表
+export function signList(data) {
+	return request({
+		url: '/api/sign/list',
+		method: 'get',
+		data
+	});
+}
+// 点击签到
+export function integral(data) {
+	return request({
+		url: '/api/sign/integral',
+		method: 'post',
+		data
+	});
+}
+
+// 签到信息
+export function signUser(data) {
+	return request({
+		url: '/api/sign/user',
+		method: 'post',
+		data
+	});
+}

+ 118 - 0
api/hall.js

@@ -0,0 +1,118 @@
+import request from "@/utils/request.js";
+
+//查看会馆列表
+export function auction_gu(data) {
+	return request({
+		url: '/api/auction/auction_gu',
+		method: 'get',
+		data
+	});
+}
+
+//查看场次列表
+export function auction_list(data) {
+	return request({
+		url: '/api/auction_list',
+		method: 'get',
+		data
+	});
+}
+
+//预约场次
+export function subscribe(data) {
+	return request({
+		url: '/api/auction/subscribe',
+		method: 'post',
+		data
+	});
+}
+
+//判断是否能进场
+export function advance(data) {
+	return request({
+		url: '/api/auction/advance',
+		method: 'get',
+		data
+	});
+}
+
+//场次里商品列表
+export function auction_product(data) {
+	return request({
+		url: '/api/auction/auction_product',
+		method: 'get',
+		data
+	});
+}
+
+//场次里商品详情
+export function details(data) {
+	return request({
+		url: '/api/auction/details',
+		method: 'get',
+		data
+	});
+}
+
+//查看商品历史记录
+export function belong(data) {
+	return request({
+		url: '/api/auction/belong',
+		method: 'get',
+		data
+	});
+}
+
+//购买商品
+export function purchase(data) {
+	return request({
+		url: '/api/auction/purchase',
+		method: 'post',
+		data
+	});
+}
+
+//挂售详情
+export function gsxq(data) {
+	return request({
+		url: '/api/auction/gsxq',
+		method: 'get',
+		data
+	});
+}
+
+//挂售
+export function hanging_sale(data) {
+	return request({
+		url: '/api/auction/hanging_sale',
+		method: 'post',
+		data
+	});
+}
+
+//购买倒计时
+export function count_down(data) {
+	return request({
+		url: '/api/auction/count_down',
+		method: 'get',
+		data
+	});
+}
+
+// 获取key
+export function verify_code(data) {
+	return request({
+		url: '/api/auction/verify_code',
+		method: 'get',
+		data
+	});
+}
+
+// 获取图形验证码
+export function captcha(data) {
+	return request({
+		url: '/api/auction/captcha',
+		method: 'get',
+		data
+	});
+}

+ 71 - 0
api/index.js

@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+// 促销商品
+export function groom4(data) {
+	return request({
+		url: '/api/groom/list/4',
+		method: 'get',
+		data
+	});
+}
+// 精品推荐
+export function groom1(data) {
+	return request({
+		url: '/api/groom/list/1',
+		method: 'get',
+		data
+	});
+}
+// 新品首发
+export function groom3(data) {
+	return request({
+		url: '/api/groom/list/3',
+		method: 'get',
+		data
+	});
+}
+
+// 获取首页信息
+export function loadIndexs(data) {
+	return request({
+		url: '/api/index',
+		method: 'get',
+		data
+	});
+}
+
+// 店铺列表
+export function store_list(data) {
+	return request({
+		url: '/api/store_list',
+		method: 'get',
+		data
+	});
+}
+
+// 店铺详情
+export function store_details(data, id) {
+	return request({
+		url: '/api/store_details/' + id,
+		method: 'get',
+		data
+	});
+}
+
+// 导航栏信息
+export function order_info(data) {
+	return request({
+		url: '/api/user/order_info',
+		method: 'get',
+		data
+	});
+}
+
+// 导航栏信息详情
+export function bill_info(data) {
+	return request({
+		url: '/api/user/bill_info',
+		method: 'get',
+		data
+	});
+}

+ 0 - 123
api/kefu.js

@@ -1,123 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 客服登录
- * @param data object 用户账号密码
- */
-export function kefuLogin(data) {
-  return request.post("login", data, { noAuth : true,kefu:true });
-}
-
-/**
- * 获取左侧客服聊天用户列表
- * @constructor
- */
-export function record (data) {
-  return request.get("store/record", data, { noAuth : true,kefu:true });
-}
-
-/**
- * 客服话术
- * @constructor
- */
-export function speeChcraft (data) {
-  return request.get("service/speechcraft", data, { noAuth : true,kefu:true });
-}
-
-/**
- * 客服转接列表
- * @constructor
- */
-export function transferList (data) {
-  return request.get("service/transfer_list", data, { noAuth : true,kefu:true });
-}
-
-/**
- * 商品购买记录
- * @constructor
- */
-export function productCart (id,data) {
-  return request.get("product/cart/"+id,data, { noAuth : true,kefu:true });
-}
-
-/**
- * 热销商品
- * @constructor
- */
-export function productHot (id,data) {
-  return request.get("product/hot/"+id,data, { noAuth : true,kefu:true });
-}
-
-/**
- * 商品足记
- * @constructor
- */
-export function productVisit (id,data) {
-  return request.get("product/visit/"+id,data, { noAuth : true,kefu:true });
-}
-
-/**
- * 客服用户聊天列表
- * @constructor
- */
-export function serviceList (data) { 
-  return request.get("service/list",data, { noAuth : true,kefu:true });
-}
-
-/**
- * 客服转接
- * @constructor
- */
-export function serviceTransfer (data) { 
-  return request.post("service/transfer",data, { noAuth : true,kefu:true });
-}
-
-/**
- * 客服详细信息
- * @constructor
- */
-export function serviceInfo (data) { 
-  return request.get("service/info",data, { noAuth : true,kefu:true });
-}
-
-/**
- * 客服反馈头部信息
- * @constructor
- */
-export function serviceFeedBack () { 
-  return request.get("user/service/feedback");
-}
-
-/**
- * 客服反馈
- * @constructor
- */
-export function feedBackPost (data) { 
-  return request.post("user/service/feedback", data);
-}
-
-/**
- * 检测登录code
- * @constructor
- */
-export function codeStauts (data) { 
-  return request.get("user/code",data);
-}
-
-/**
- * 客服扫码登录code
- * @constructor
- */
-export function kefuScanLogin (data) { 
-  return request.post("user/code",data);
-}

+ 99 - 0
api/login.js

@@ -0,0 +1,99 @@
+import request from '@/utils/request'
+
+// 登录
+export function login(data) {
+	return request({
+		url: '/api/login',
+		method: 'post',
+		data
+	});
+}
+// 注册
+export function register(data) {
+	return request({
+		url: '/api/register',
+		method: 'post',
+		data
+	});
+}
+// 验证码
+export function verify(data) {
+	// type=register为注册
+	// type=login为登录
+	return request({
+		url: '/api/register/verify',
+		method: 'post',
+		data
+	});
+}
+// 图形验证码
+export function sms_captcha(data) {
+	// type=register为注册
+	// type=login为登录
+	return request({
+		url: '/api/sms_captcha',
+		method: 'get',
+		data
+	});
+}
+
+// 获取图片验证码key
+export function verify_code(data) {
+	// type=register为注册
+	// type=login为登录
+	return request({
+		url: '/api/verify_code',
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取用户信息
+export function getUserInfo(data) {
+	return request({
+		url: '/api/userinfo',
+		method: 'get',
+		data
+	});
+}
+
+// 短信登录
+export function loginMobile(data) {
+	return request({
+		url: '/api/login/mobile',
+		method: 'post',
+		data
+	});
+}
+// #ifdef APP-PLUS
+// 微信授权登录
+export function loginWx(data) {
+	return request({
+		url: '/api/wechat/appauth',
+		method: 'get',
+		data
+	});
+}
+// #endif
+//绑定手机号
+export function bangding(data) {
+	return request({
+		url: '/api/binding',
+		method: 'POST',
+		data
+	});
+}
+
+
+/**
+ * 获取图片上传加密key
+ */
+export function getUpimgKey(data) {
+  return request({
+  	url: '/api/upload/sign',
+  	method: 'POST',
+  	data
+  });
+}
+

+ 0 - 43
api/lottery.js

@@ -1,43 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 获取抽奖详情信息
- * 
- */
-export function getLotteryData(type) {
-	return request.get(`v2/lottery/info/${type}`);
-}
-
-/**
- * 参与抽奖
- * 
- */
-export function startLottery(data) {
-	return request.post(`v2/lottery`, data);
-}
-
-/**
- * 领奖
- * 
- */
-export function receiveLottery(data) {
-	return request.post(`v2/lottery/receive`, data);
-}
-
-/**
- * 获取中奖记录
- * 
- */
-export function getLotteryList(data) {
-	return request.get(`v2/lottery/record`, data);
-}

+ 0 - 305
api/new_store.js

@@ -1,305 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 获取附近门店
- * @param int id
- * 
- */
-export function getnearbyStore(data) {
-	return request.get('nearby_store',data, {
-		noAuth: true
-	});
-}
-
-
-/**
- * 门店商品列表
- * @param int id
- * 
- */
-export function getProducts(data) {
-	return request.get('store/products' ,data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取门店客服列表
- * @param int id
- * 
- */
-export function getCustomerList(store_id) {
-	return request.get('store/customer/list/' + store_id, {},{
-		noAuth: true
-	});
-}
-
-/**
- * 获取门店客服详情
- * @param int id
- * 
- */
-export function getCustomerInfo(store_id) {
-	return request.get('store/customer/info/' + store_id, {},{
-		noAuth: true
-	});
-}
-
-/**
- * 门店商品分类
- * @param int id
- */
-export function getStoreCategory(data) {
-	return request.get('store/category', data,{
-		noAuth: true
-	});
-}
-
-/**
- * 门店商品品牌
- * @param int id
- */
-export function getStoreBrand(data) {
-	return request.get('store/brand', data,{
-		noAuth: true
-	});
-}
-
-
-/**
- * 附近门店列表
- * @param int data
- */
-export function getList( data) {
-	return request.get('store/list',data, {
-	noAuth: true
-	
-	});
-}
-
-/**
- * 删除收藏产品
- * @param int id
- * @param string category product=普通产品,product_seckill=秒杀产品
- */
-export function collectDel(id, category) {
-	return request.post('collect/del', {
-		id: id,
-		category: category === undefined ? 'product' : category
-	});
-}
-
-/**
- * 购车添加
- * 
- */
-export function postCartAdd(data) {
-	return request.post('cart/add', data);
-}
-
-/**
- * 获取分类列表
- * 
- */
-export function getCategoryList() {
-	return request.get('category', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取产品列表
- * @param object data
- */
-export function getProductslist(data) {
-	return request.get('products', data, {
-		noAuth: true
-	});
-}
-
-
-
-/**
- * 获取推荐产品
- * 
- */
-export function getProductHot(page, limit) {
-	return request.get("product/hot", {
-		page: page === undefined ? 1 : page,
-		limit: limit === undefined ? 4 : limit
-	}, {
-		noAuth: true
-	});
-}
-/**
- * 批量收藏
- * 
- * @param object id  产品编号 join(',') 切割成字符串
- * @param string category 
- */
-export function collectAll(id, category) {
-	return request.post('collect/all', {
-		id: id,
-		category: category === undefined ? 'product' : category
-	});
-}
-
-/**
- * 首页产品的轮播图和产品信息
- * @param int type 
- * 
- */
-export function getGroomList(type, data) {
-	return request.get('groom/list/' + type, data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取收藏列表
- * @param object data
- */
-export function getCollectUserList(data) {
-	return request.get('collect/user', data)
-}
-
-/**
- * 获取浏览记录列表
- * @param object data
- */
-export function getVisitList(data) {
-	return request.get('user/visit_list', data)
-}
-
-/**
- * 获取浏览记录列表-删除
- * @param object data
- */
-export function deleteVisitList(data) {
-	return request.delete('user/visit', data)
-}
-
-/**
- * 获取产品评论
- * @param int id
- * @param object data
- * 
- */
-export function getReplyList(id, data) {
-	return request.get('v2/reply/list/' + id, data,{noAuth: true})
-}
-
-/**
- * 产品评价数量和好评度
- * @param int id
- */
-export function getReplyConfig(id) {
-	return request.get('reply/config/' + id,{},{noAuth: true});
-}
-
-/**
- * 评论点赞
- * @param int id
- */
-export function getReplyPraise(id) {
-	return request.post('reply/reply_praise/' + id);
-}
-
-/**
- * 取消评论点赞
- * @param int id
- */
-export function getUnReplyPraise(id) {
-	return request.post('reply/un_reply_praise/' + id);
-}
-
-/**
- * 获取评论详情
- * @param int id
- */
-export function getReplyInfo(id) {
-	return request.get('reply/info/' + id);
-}
-
-/**
- * 获取评论回复列表
- * @param int id
- */
-export function getReplyComment(id,data) {
-	return request.get('reply/comment/' + id,data);
-}
-
-/**
- * 评论回复点赞
- * @param int id
- */
-export function postReplyPraise(id) {
-	return request.post('reply/praise/' + id);
-}
-
-/**
- * 取消评论回复点赞
- * @param int id
- */
-export function postUnReplyPraise(id) {
-	return request.post('reply/un_praise/' + id);
-}
-
-/**
- * 保存商品评价回复
- * @param int id
- */
-export function replyComment(id,data) {
-	return request.post('reply/comment/' + id,data);
-}
-
-/**
- * 获取搜索关键字获取
- * 
- */
-export function getSearchKeyword() {
-	return request.get('search/keyword', {}, {
-		noAuth: true
-	});
-}
-
-
-/**
- * 获取新人礼信息
- * 
- */
-export function newcomerInfo() {
-	return request.get('marketing/newcomer/info', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 新人专享商品
- * 
- */
-export function newcomerList(data) {
-	return request.get('marketing/newcomer/product_list', data, {
-		noAuth: true
-	});
-}
-
-/**
- * 新人大礼包弹窗
- * 
- */
-export function newcomerGift(data) {
-	return request.get('marketing/newcomer/gift');
-}
-
-

+ 186 - 343
api/order.js

@@ -1,394 +1,237 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 获取购物车列表
- * @param numType boolean true 购物车数量,false=购物车产品数量
- */
-export function getCartCounts(numType,storeId) {
-	return request.get("cart/count", {
-		numType: numType === undefined ? 0 : numType,
-		store_id:storeId
+import request from '@/utils/request'
+import {
+	upFilse
+} from '@/utils/request'
+// 订单确认
+export function confirm(data) {
+	return request({
+		url: '/api/order/confirm',
+		method: 'post',
+		data
 	});
 }
-/**
- * 获取购物车列表
- * 
- */
-export function getCartList(data) {
-	return request.get("cart/list", data);
-}
-
-/**
- * 购物车计算
- * 
- */
-export function cartCompute(data) {
-	return request.post("cart/compute", data);
-}
-
-/**
- * 修改购物车
- * 
- */
-export function getResetCart(data) {
-	return request.post("v2/reset_cart", data);
-}
-
-/**
- * 修改购物车数量
- * @param int cartId  购物车id
- * @param int number 修改数量
- */
-export function changeCartNum(cartId, number) {
-	return request.post("cart/num", {
-		id: cartId,
-		number: number
+//获取可使用优惠券
+export function couponsOrder(data, price) {
+	return request({
+		url: '/api/coupons/order/' + price,
+		method: 'get',
+		data
 	});
 }
-/**
- * 清除购物车
- * @param object ids join(',') 切割成字符串
- */
-export function cartDel(ids,storeId) {
-	if (typeof ids === 'object')
-		ids = ids.join(',');
-	return request.post('cart/del', {
-		ids: ids,
-		store_id: storeId
+//获取优惠券列表
+export function getCouponsList(data, types) {
+	//优惠券状态 0全部 1未使用 2已使用
+	return request({
+		url: '/api/coupons/user/' + types,
+		method: 'get',
+		data
 	});
 }
-/**
- * 订单列表
- * @param object data
- */
-export function getOrderList(data) {
-	return request.get('order/list', data);
-}
-
-/**
- * 新订单列表 2.1版本
- * @param object data
- */
-export function getNewOrderList(data) {
-	return request.get('order/refund/list', data);
-}
-
-/**
- * 订单产品信息
- * @param string unique 
- */
-export function orderProduct(unique) {
-	return request.post('order/product', {
-		unique: unique
+//提交评论
+export function order_comment(data) {
+	return request({
+		url: '/api/order/comment',
+		method: 'post',
+		data
 	});
 }
-
-/**
- * 订单评价
- * @param object data
- * 
- */
-export function orderComment(data) {
-	return request.post('order/comment', data);
-}
-
-/**
- * 订单支付
- * @param object data
- */
-export function orderPay(data) {
-	return request.post('order/pay', data);
-}
-
-/**
- * 订单统计数据
- */
-export function orderData() {
-	return request.get('order/data')
-}
-
-/**
- * 订单取消
- * @param string id
- * 
- */
-export function orderCancel(id) {
-	return request.post('order/cancel', {
-		id: id
+//订单产品信息
+export function product(data) {
+	return request({
+		url: '/api/order/product',
+		method: 'post',
+		data
 	});
 }
-
-/**
- * 删除已完成订单
- * @param string uni
- * 
- */
-export function orderDel(uni) {
-	return request.post('order/del', {
-		uni: uni
+// 快递查询
+export function express_query(data) {
+	return request({
+		url: '/api/order/express_query',
+		method: 'get',
+		data
 	});
 }
-
-/**
- * 删除已退款和拒绝退款的订单
- * @param string uni
- * 
- */
-export function refundOrderDel(uni) {
-	return request.get('order/refund/del/' + uni, {});
-}
-
-
-/**
- * 订单详情
- * @param string uni 
- */
-export function getOrderDetail(uni) {
-	return request.get('order/detail/' + uni);
-}
-
-/**
- * 退款订单详情
- * @param string uni 
- */
-export function getRefundOrderDetail(uni) {
-	return request.get('order/refund/detail/' + uni);
-}
-
-/**
- * 放弃申请退款
- * @param string uni 
- */
-export function cancelRefundOrder(uni) {
-	return request.post('order/refund/cancel/' + uni);
-}
-
-/**
- * 再次下单
- * @param string uni
- * 
- */
-export function orderAgain(uni) {
-	return request.post('order/again', {
-		uni: uni
+//上传图片
+export function upload(data, successCallback, errorCallback, sizeCallback,Progress) {
+	upFilse({
+		url: '/api/upload/image',
+		method: 'post',
+		data
+	}, successCallback, errorCallback, sizeCallback,Progress);
+}
+// 订单列表
+export function orderList(data) {
+	return request({
+		url: '/api/order/list',
+		method: 'get',
+		data
 	});
 }
-
-/**
- * 订单收货
- * @param string uni
- * 
- */
-export function orderTake(uni) {
-	return request.post('order/take', {
-		uni: uni
+// 订单详细
+export function orderDetail(data, orderid) {
+	return request({
+		url: '/api/order/detail/' + orderid,
+		method: 'get',
+		data
 	});
 }
 
-/**
- * 订单查询物流信息
- * @returns {*}
- */
-export function express(uni, type) {
-	return request.get("order/express/" + uni + (type ? '/' + type : ''));
-}
-
-/**
- * 获取退款理由
- * 
- */
-export function ordeRefundReason() {
-	return request.get('order/refund/reason');
-}
-
-/**
- * 订单退款审核
- * @param object data
- */
-export function orderRefundVerify(data) {
-	return request.post('order/refund/verify', data);
-}
-
-/**
- * 订单确认获取订单详细信息
- * @param string cartId
- */
-export function orderConfirm(cartId, news, addressId, shippingType, store_id, couponId, luckRecordId) {
-	return request.post('order/confirm', {
-		cartId,
-		'new': news,
-		addressId,
-		'shipping_type': shippingType,
-		store_id,
-		'couponId':couponId,
-		luckRecordId
+// 取消订单
+export function orderCancel(data) {
+	return request({
+		url: '/api/order/cancel',
+		method: 'post',
+		data
 	});
 }
 
-/**
- * 获取当前金额能使用的优惠卷
- * @param string price
- * 
- */
-export function getCouponsOrderPrice(price, data) {
-	return request.get('coupons/order/' + price, data)
-}
-
-/**
- * 订单创建
- * @param string key
- * @param object data
- * 
- */
-export function orderCreate(key, data) {
-	return request.post('order/create/' + key, data);
-}
-
-/**
- * 计算订单金额
- * @param key
- * @param data
- * @returns {*}
- */
-export function postOrderComputed(key, data) {
-	return request.post("order/computed/" + key, data);
+// 删除订单
+export function orderDel(data) {
+	return request({
+		url: '/api/order/del',
+		method: 'get',
+		data
+	});
 }
-
-/**
- * 订单优惠券
- * @param key
- * @param data
- * @returns {*}
- */
-export function orderCoupon(orderId) {
-	return request.post("v2/order/product_coupon/" + orderId);
+// 申请退款
+export function refund(data) {
+	return request({
+		url: '/api/order/refund/verify',
+		method: 'post',
+		data
+	});
 }
-
-/**
- * 计算会员线下付款金额
- * @param {Object} data
- */
-export function offlineCheckPrice(data) {
-	return request.post("order/offline/check/price", data);
+// 退款理由列表
+export function refundReason(data) {
+	return request({
+		url: '/api/order/refund/reason',
+		method: 'get',
+		data
+	});
 }
 
-/**
- * 线下扫码付款
- * @param {Object} data
- */
-export function offlineCreate(data) {
-	return request.post("order/offline/create", data);
+// 确认收货
+export function orderTake(data) {
+	return request({
+		url: '/api/order/take',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 支付方式开关
- */
-export function orderOfflinePayType() {
-	return request.get('order/offline/pay/type');
+// 订单支付
+export function orderPay(data) {
+	return request({
+		url: '/api/order/pay',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 开票记录
- */
-export function orderInvoiceList(data) {
-	return request.get('v2/order/invoice_list', data);
+// 创建订单
+export function createOrderkey(data, key) {
+	return request({
+		url: '/api/order/create/' + key,
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 开票订单详情
- * @param {Object} id
- */
-export function orderInvoiceDetail(id) {
-	return request.get(`v2/order/invoice_detail/${id}`);
+// 统计订单金额
+export function computedOrderkey(data) {
+	return request({
+		url: '/api/order/computed/' + data.orderkey,
+		method: 'post',
+		data
+	});
 }
 
-
-/**
- * 支付宝支付
- * @param {Object} key
- * @param {Object} quitUrl
- */
-export function aliPay(key, quitUrl) {
-	return request.get('ali_pay', {
-		key,
-		quitUrl
-	}, {
-		noAuth: true
+// 通过审核
+export function adopt(data) {
+	return request({
+		url: '/api/auction/adopt',
+		method: 'post',
+		data
 	});
 }
 
-
-/**
- * 退货物流单号提交
- * @param {Object} data
- */
-export function refundExpress(data) {
-	return request.post("order/refund/express", data);
+//买单订单列表
+export function user_auction_order(data) {
+	return request({
+		url: '/api/auction/user_auction_order',
+		method: 'get',
+		data
+	});
 }
 
-/**
- * 分类购物车列表
- */
-export function vcartList(data) {
-	return request.get("v2/cart_list",data);
+//卖单订单列表
+export function seller(data) {
+	return request({
+		url: '/api/auction/seller',
+		method: 'get',
+		data
+	});
 }
 
-/**
- * 支付订单
- */
-export function payCashier(storeId) {
-	return request.get(`order/pay_cashier?store_id=${storeId}`);
+// 上传凭证
+export function up_image(data) {
+	return request({
+		url: '/api/auction/up_image',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 退款商品列表
- */
-export function refundGoodsList(orderId) {
-	return request.get(`order/refund/cart_info/${orderId}`);
+// 修改凭证
+export function edit_voucher(data) {
+	return request({
+		url: '/api/edit_voucher',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 申请退款商品列表
- */
-export function postRefundGoods(data) {
-	return request.post(`order/refund/cart_info`, data);
+// 取消挂售
+export function cancel(data) {
+	return request({
+		url: '/api/auction/cancel',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 退款商品提交
- */
-export function returnGoodsSubmit(id, data) {
-	return request.post(`order/refund/apply/${id}`, data);
+//判断是否有新订单
+export function untreated(data) {
+	return request({
+		url: '/api/auction/untreated',
+		method: 'get',
+		data
+	});
 }
 
-/**
- * 确认订单详情(是否显示快递配送)
- */
-export function checkShipping(data) {
-	return request.post(`order/check_shipping`, data);
+//申诉
+export function plead(data) {
+	return request({
+		url: '/api/auction/plead',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 配送订单详情
- */
-export function deliveryDetail(id) {
-	return request.get(`delivery_order/detail/${id}`);
+//撤销申诉
+export function revoke(data) {
+	return request({
+		url: '/api/auction/revoke',
+		method: 'post',
+		data
+	});
 }
 
-/**
- * 订单核销记录
- * @param {Object} id
- */
-export function orderWriteRecords(id, data) {
-	return request.get(`order/write/records/${id}`, data);
-}
+// 获取时间
+export function time(data) {
+	return request({
+		url: '/api/time',
+		method: 'get',
+		data
+	});
+}

+ 0 - 20
api/points_mall.js

@@ -1,20 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 积分商城
- */
-export function getStoreIntegral(data) {
-	return request.get("store_integral/index", data, {
-		noAuth: true
-	});
-}

+ 194 - 0
api/product.js

@@ -0,0 +1,194 @@
+import request from '@/utils/request'
+
+// 获取商品列表
+export function getProducts(data) {
+	// 	{
+	// 参数名称	是否必须	示例	备注
+	// sid			否			二级分类编号
+	// cid			否			一级分类编号(!)
+	// keyword		否			搜索
+	// priceOrder	否			价格排序
+	// salesOrder	否			销量排序
+	// news			否			是否新品
+	// page			否			分页参数起始值
+	// limit		否			分页数步长值
+	// }
+	return request({
+		url: '/api/products',
+		method: 'get',
+		data
+	});
+}
+// 获取商品详情
+export function goodsDetail(data, id) {
+	return request({
+		url: '/api/product/detail/' + id,
+		method: 'get',
+		data
+	});
+}
+// 获取商品详情
+export function goodsDetailInt(data, id) {
+	return request({
+		url: '/api/good_exchange/detail/' + id,
+		method: 'get',
+		data
+	});
+}
+
+
+// 砍价列表
+export function getBargainList(data) {
+	return request({
+		url: '/api/bargain/list',
+		method: 'get',
+		data
+	});
+}
+// 加入购物车
+export function cartAdd(data) {
+	return request({
+		url: '/api/cart/add',
+		method: 'post',
+		data
+	});
+}
+
+// 收藏商品
+export function collectAdd(data) {
+	return request({
+		url: '/api/collect/add',
+		method: 'post',
+		data
+	});
+}
+
+// 取消收藏商品
+export function collectDel(data) {
+	return request({
+		url: '/api/collect/del',
+		method: 'post',
+		data
+	});
+}
+
+// 获取搜搜关键字
+export function searchKeyword(data) {
+	return request({
+		url: '/api/search/keyword',
+		method: 'get',
+		data
+	});
+}
+
+// 获取热门分类信息
+export function groomList(data, type) {
+	// 获取产品类型 1 医斯佳专区 2 新品 3 CBB专区 4随意嗨购 5置换
+	return request({
+		url: '/api/groom/list/' + type,
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取秒杀商品详细
+export function seckillGoods(data, id) {
+	return request({
+		url: '/api/seckill/detail/' + id,
+		method: 'get',
+		data
+	});
+}
+
+// 获取拼团商品详细
+export function groupGoods(data, id) {
+	return request({
+		url: '/api/combination/detail/' + id,
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取商品分类
+export function getCategoryList(data) {
+	return request({
+		url: '/api/category',
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取拼团列表
+export function getCombinationList(data) {
+	return request({
+		url: '/api/combination/list',
+		method: 'get',
+		data
+	});
+}
+
+//取消拼团
+export function getCombinationLisRemove(data, id) {
+	return request({
+		url: '/api/combination/remove' + id,
+		method: 'get',
+		data
+	});
+}
+
+//拼团开团页面数据
+export function getCombinationLisPink(data, id) {
+	return request({
+		url: '/api/combination/pink/' + id,
+		method: 'get',
+		data
+	});
+}
+
+// 获取拼团海报
+export function getCombinationPoster(data) {
+	return request({
+		url: '/api/combination/poster',
+		method: 'post',
+		data
+	});
+}
+
+
+// 获取秒杀分类
+export function getSeckillClass(data) {
+	return request({
+		url: '/api/seckill/index',
+		method: 'get',
+		data
+	});
+}
+// 获取秒杀列表
+export function getSeckillList(data, id) {
+	return request({
+		url: '/api/seckill/list/' + id,
+		method: 'get',
+		data
+	});
+}
+
+
+// 产品评价数量和好评度
+export function reply_config(data, id) {
+	return request({
+		url: '/api/reply/config/' + id,
+		method: 'get',
+		data
+	});
+}
+// 获取产品评论
+export function reply_list(data, id) {
+	return request({
+		url: '/api/reply/list/' + id,
+		method: 'get',
+		data
+	});
+}

+ 0 - 208
api/public.js

@@ -1,208 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-import wechat from "@/libs/wechat.js";
-
-/**
- * 获取微信sdk配置
- * @returns {*}
- */
-export function getWechatConfig() {
-  return request.get(
-    "wechat/config",
-    { url: wechat.signLink() },
-    { noAuth: true }
-  );
-}
-
-/**
- * 获取登录授权login
- * 
-*/
-export function getLogo()
-{
-  return request.get('wechat/get_logo', {}, { noAuth : true});
-}
-
-/**
- * 小程序用户登录
- * @param data object 小程序用户登陆信息
- */
-export function login(data) {
-  return request.post("wechat/mp_auth", data, { noAuth : true });
-}
-
-/**
- * 静默授权
- * @param {Object} data
- */
-export function silenceAuth(data) {
-	//#ifdef MP
-  return request.get("v2/wechat/silence_auth", data, { noAuth : true });
-  //#endif
-  //#ifdef H5
-  return request.get("v2/wechat/wx_silence_auth", data, { noAuth : true });
-  //#endif
-}
-
-/**
- * 分享
- * @returns {*}
- */
-export function getShare() {
-  return request.get("share", {}, { noAuth: true });
-}
-
-/**
- * 获取关注海报
- * @returns {*}
- */
-export function follow() {
-  return request.get("wechat/follow", {}, { noAuth: true });
-}
-
-/**
- * code生成用户
- * @returns {*}
- */
-// export function authLogin(data) {
-// 	return request.get("v2/wechat/silence_auth_login", data, {
-// 		noAuth: true
-// 	});
-// }
-
-export function authType(data) {
-	return request.get("v2/routine/auth_type", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 公众号登录
- * @returns {*}
- */
-export function wechatAuthLogin(data) {
-	return request.get("v2/wechat/auth_login", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 公众号绑定手机号
- * @param {Object} data
- */
-export function wechatBindingPhone(data) {
-	return request.post('v2/wechat/auth_binding_phone', data, {
-		noAuth: true
-	});
-}
-
-/**
- * 授权登录
- * @returns {*}
- */
-export function authLogin(data) {
-	return request.get("v2/routine/auth_login", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取图片base64
- * @retins {*}
- * */
-export function imageBase64(image, code) {
-  return request.post(
-    "image_base64",
-    { image: image, code: code },
-    { noAuth: true }
-  );
-}
-
-/**
- * 自动复制口令功能
- * @returns {*}
- */
-export function copyWords() {
-  return request.get("copy_words", {}, { noAuth: true });
-}
-
-/**
- * 获取商城是否强制绑定手机号
- */
-export function getShopConfig() {
-	return request.get('v2/bind_status' ,{} ,{noAuth : true});
-}
-
-/**
- * 小程序绑定手机号
- * @param {Object} data
- */
-export function getUserPhone(data){
-	return request.post('v2/auth_bindind_phone',data,{noAuth : true});
-}
-
-/**
- * 小程序绑定手机号(最新)
- * @param {Object} data
- */
-export function routineBindingPhone(data) {
-	return request.post('v2/routine/auth_binding_phone', data, {
-		noAuth: true
-	});
-}
-
-/**
- * 小程序手机号登录
- * @param {Object} data
- */
-export function phoneLogin(data) {
-	return request.post('v2/routine/phone_login', data, {
-		noAuth: true
-	});
-}
-
-/**
- * 小程序用户登录
- * @param data object 小程序用户登陆信息
- */
-export function routineLogin(data) {
-	return request.get("v2/wechat/routine_auth", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取微信sdk配置
- * @returns {*}
- */
-export function wechatAuthV2(code, spid) {
-	return request.get(
-		"v2/wechat/auth", 
-		{code : code, spread_spid : spid}, 
-		{noAuth: true}
-	);
-}
-
-/**
- * 获取组件底部菜单
- * @param data object 获取组件底部菜单
- */
-export function getNavigation(data) {
-	return request.get("navigation", data, {
-		noAuth: true
-	});
-}
-export function getSubscribe(){
-	return request.get("subscribe", {}, {
-		noAuth: true
-	});
-}

+ 26 - 0
api/quick.js

@@ -0,0 +1,26 @@
+import request from '@/utils/request'
+
+// 获取兑换比例
+export function getTicket(data) {
+	return request({
+		url: '/api/ticket',
+		method: 'get',
+		data
+	});
+}
+// 兑换文票
+export function getExchange(data) {
+	return request({
+		url: '/api/exchange',
+		method: 'post',
+		data
+	});
+}
+// 兑换文票
+export function getExchangeList(data) {
+	return request({
+		url: '/api/exchange_list',
+		method: 'get',
+		data
+	});
+}

+ 88 - 0
api/set.js

@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+// 修改用户信息
+export function userEdit(data) {
+	return request({
+		url: '/api/user/edit',
+		method: 'post',
+		data
+	});
+}
+
+//退出登录
+export function logout(data) {
+	return request({
+		url: '/api/logout',
+		method: 'get',
+		data
+	});
+}
+//修改密码
+export function registerReset(data) {
+	return request({
+		url: '/api/register/reset',
+		method: 'post',
+		data
+	});
+}
+
+//绑定手机
+export function binding(data) {
+	return request({
+		url: '/api/binding',
+		method: 'post',
+		data
+	});
+}
+// #ifdef APP-PLUS
+//苹果生成账户
+export function applelogin(data) {
+	return request({
+		url: '/api/applelogin',
+		method: 'post',
+		data
+	});
+}
+// #endif
+export function realName(data) {
+	return request({
+		url: '/api/rname',
+		method: 'post',
+		data
+	});
+}
+
+//是否设置过交易密码
+export function is_pas(data) {
+	return request({
+		url: '/api/is_pas',
+		method: 'get',
+		data
+	});
+}
+
+
+//修改交易密码
+export function transaction(data) {
+	return request({
+		url: '/api/set_payment',
+		method: 'post',
+		data
+	});
+}
+//实名认证获取验证码
+export function checkUser(data) {
+	return request({
+		url: '/api/user/check',
+		method: 'post',
+		data
+	});
+}
+
+export function test(data) {
+	return request({
+		url: '/api/test',
+		method: 'get',
+		data
+	});
+}

+ 89 - 0
api/shop.js

@@ -0,0 +1,89 @@
+import request from "@/utils/request.js";
+
+//获取店铺分类
+export function store_cate(data) {
+	return request({
+		url: '/api/store/category',
+		method: 'get',
+		data
+	});
+}
+//获取店铺列表
+export function getStoreList(data) {
+	return request({
+		url: '/api/store_list',
+		method: 'get',
+		data
+	});
+}
+
+//获取店铺详情
+export function getStoreDetail(data, id) {
+	return request({
+		url: '/api/store_details/' + id,
+		method: 'get',
+		data
+	});
+}
+
+// 获取优惠券详情
+export function getYhqDetail(data) {
+	return request({
+		url: '/api/coupon_datalis',
+		method: 'get',
+		data
+	})
+}
+
+export function getGift(data) {
+	return request({
+		url: '/api/share',
+		method: 'post',
+		data
+	})
+}
+
+// 地址逆解析/api/address
+export function getCity(data) {
+	return request({
+		url: '/api/address',
+		method: 'get',
+		data
+	})
+}
+
+//兑换
+export function goDh(data) {
+	return request({
+		url: '/api/exchange',
+		method: 'post',
+		data
+	})
+}
+
+//转赠
+export function gozz(data) {
+	return request({
+		url: '/api/donation',
+		method: 'post',
+		data
+	})
+}
+
+// 发布优惠券
+export function storeCoupon(data) {
+	return request({
+		url: '/api/store_coupon',
+		method: 'post',
+		data
+	})
+}
+
+// 充值记录 
+export function order(data) {
+	return request({
+		url: '/api/shop/order',
+		method: 'get',
+		data
+	})
+}

+ 0 - 93
api/short-video.js

@@ -1,93 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 短视频列表
- * 
- */
-export function videoList(data) {
-  return request.get(
-    "marketing/short_video",data,{ noAuth: true }
-  );
-}
-
-/**
- * diy短视频列表
- * 
- */
-export function diyVideoList(data) {
-  return request.get(
-    "diy/video_list",data,{ noAuth: true }
-  );
-}
-
-/**
- * 短视频点赞、收藏、分享
- * 
- */
-export function markeVideo(type,id) {
-  return request.get(
-    `marketing/short_video/${type}/${id}`
-  );
-}
-
-/**
- * 短视频评论列表
- * 
- */
-export function commentList(id,data) {
-  return request.get(
-    `marketing/short_video/comment/${id}`,data
-  );
-}
-
-/**
- * 短视频评价、评价回复
- * 
- */
-export function markeComment(data) {
-  return request.post(
-    `marketing/short_video/comment/${data.id}/${data.pid}`,{content:data.content}
-  );
-}
-
-/**
- * 短视频评价回复列表
- * 
- */
-export function replyCommentList(pid,data) {
-  return request.get(
-    `marketing/short_video/comment_reply/${pid}`,data
-  );
-}
-
-/**
- * 视频评论点赞
- * 
- */
-export function replyCommentLike(type,id) {
-  return request.get(
-    `marketing/short_video/comment/${type}/${id}`
-  );
-}
-
-/**
- * 短视频关联商品列表
- * 
- */
-export function videoProduct(id,data) {
-  return request.get(
-    `marketing/short_video/product/${id}`,data
-  );
-}
-
-

+ 0 - 548
api/store.js

@@ -1,548 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 获取产品详情
- * @param int id
- * 
- */
-export function getProductDetail(id,data) {
-	return request.get('product/detail/' + id, data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取门店产品详情
- * @param int id
- * 
- */
-export function getProductStoreDetail(id,data) {
-	return request.get('product/store/detail/' + id, data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取产品活动相关详情
- * @param int id
- * 
- */
-export function getProductCtivity(id,data) {
-	return request.get('product/detail/activity/' + id, data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取产品详情中推荐商品列表
- * @param int id
- * 
- */
-export function getProductRecommend(id) {
-	return request.get('product/detail/recommend/' + id, {},{
-		noAuth: true
-	});
-}
-
-/**
- * 产品分享二维码 推广员
- * @param int id
- */
-// #ifdef H5  || APP-PLUS
-export function getProductCode(id) {
-	return request.get('product/code/' + id, {});
-}
-// #endif
-// #ifdef MP
-export function getProductCode(id) {
-	return request.get('product/code/' + id, {
-		user_type: 'routine'
-	});
-}
-// #endif
-
-/**
- * 添加收藏
- * @param int id
- * @param string category product=普通产品,product_seckill=秒杀产品
- */
-export function collectAdd(id, category) {
-	return request.post('collect/add', {
-		id: id,
-		'category': category === undefined ? 'product' : category
-	});
-}
-
-/**
- * 删除收藏产品
- * @param int id
- * @param string category product=普通产品,product_seckill=秒杀产品
- */
-export function collectDel(id, category) {
-	return request.post('collect/del', {
-		id: id,
-		category: category === undefined ? 'product' : category
-	});
-}
-
-/**
- * 购车添加
- * 
- */
-export function postCartAdd(data) {
-	return request.post('cart/add', data);
-}
-
-/**
- * 获取分类列表
- * 
- */
-export function getCategoryList() {
-	return request.get('category', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 商品详情diy
- * @param {*} data 
- */
-export function diyProduct() {
-	return request.get('v2/diy/product_detail', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取产品列表
- * @param object data
- */
-export function getProductslist(data) {
-	return request.get('products', data, {
-		noAuth: true
-	});
-}
-
-
-
-/**
- * 获取推荐产品
- * 
- */
-export function getProductHot(page, limit) {
-	return request.get("product/hot", {
-		page: page === undefined ? 1 : page,
-		limit: limit === undefined ? 4 : limit
-	}, {
-		noAuth: true
-	});
-}
-/**
- * 批量收藏
- * 
- * @param object id  产品编号 join(',') 切割成字符串
- * @param string category 
- */
-export function collectAll(id, category) {
-	return request.post('collect/all', {
-		id: id,
-		category: category === undefined ? 'product' : category
-	});
-}
-
-/**
- * 首页产品的轮播图和产品信息
- * @param int type 
- * 
- */
-export function getGroomList(type, data) {
-	return request.get('groom/list/' + type, data, {
-		noAuth: true
-	});
-}
-
-/**
- * 获取收藏列表
- * @param object data
- */
-export function getCollectUserList(data) {
-	return request.get('collect/user', data)
-}
-
-/**
- * 获取浏览记录列表
- * @param object data
- */
-export function getVisitList(data) {
-	return request.get('user/visit_list', data)
-}
-
-/**
- * 获取浏览记录列表-删除
- * @param object data
- */
-export function deleteVisitList(data) {
-	return request.delete('user/visit', data)
-}
-
-/**
- * 获取产品评论
- * @param int id
- * @param object data
- * 
- */
-export function getReplyList(id, data) {
-	return request.get('v2/reply/list/' + id, data,{noAuth: true})
-}
-
-/**
- * 产品评价数量和好评度
- * @param int id
- */
-export function getReplyConfig(id) {
-	return request.get('reply/config/' + id,{},{noAuth: true});
-}
-
-/**
- * 评论点赞
- * @param int id
- */
-export function getReplyPraise(id) {
-	return request.post('reply/reply_praise/' + id);
-}
-
-/**
- * 取消评论点赞
- * @param int id
- */
-export function getUnReplyPraise(id) {
-	return request.post('reply/un_reply_praise/' + id);
-}
-
-/**
- * 获取评论详情
- * @param int id
- */
-export function getReplyInfo(id) {
-	return request.get('reply/info/' + id);
-}
-
-/**
- * 获取评论回复列表
- * @param int id
- */
-export function getReplyComment(id,data) {
-	return request.get('reply/comment/' + id,data);
-}
-
-/**
- * 评论回复点赞
- * @param int id
- */
-export function postReplyPraise(id) {
-	return request.post('reply/praise/' + id);
-}
-
-/**
- * 取消评论回复点赞
- * @param int id
- */
-export function postUnReplyPraise(id) {
-	return request.post('reply/un_praise/' + id);
-}
-
-/**
- * 保存商品评价回复
- * @param int id
- */
-export function replyComment(id,data) {
-	return request.post('reply/comment/' + id,data);
-}
-
-/**
- * 获取搜索关键字获取
- * 
- */
-export function getSearchKeyword() {
-	return request.get('search/keyword', {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 门店列表
- * @returns {*}
- */
-export function storeListApi(data) {
-	return request.get("store_list", data, {
-		noAuth: true
-	});
-}
-
-/**
- * 套餐列表
- * @param int id
- * 
- */
-export function storeDiscountsList(id) {
-	return request.get('store_discounts/list/' + id, {}, {
-		noAuth: true
-	});
-}
-
-/**
- * 购车添加、减少、修改
- * 
-*/
-export function postCartNum(data) {
-  return request.post('v2/set_cart_num', data);
-}
-
-/**
- * 获取首页的属性
- * @returns {*}
- */
-export function getAttr(id,type) {
-  return request.get("v2/get_attr/"+id+"/"+type);
-}
-
-/**
- * 获取店员推广微信会员卡二维码
- */
-export function storeCardApi() {
-	return request.get("store/staff/card/code");
-}
-
-/**
- * 分类列表-品牌列表
- */
-export function brand(data) {
-	return request.get("brand",data,{
-		noAuth: true
-	});
-}
-
-/**
- * 新人专享商品详情
- */
-export function newcomerDetail(id) {
-	return request.get("marketing/newcomer/product_detail/"+id,{},{
-		noAuth: true
-	});
-}
-
-/**
- * 发起拼单
- * @param {Object} data
- */
-export function initCollage(data) {
-	return request.get("v2/user/initiate/collage",data);
-}
-
-/**
- * 检查用户是否发起拼单
- */
-export function hasCollage() {
-	return request.get("v2/is/user/initiate/collage");
-}
-
-/**
- * 检查拼单
- * @param {Object} data
- */
-export function getCollage(data) {
-	return request.get("v2/is/initiate/collage", data);
-}
-
-/**
- * 拼单购物车列表
- * @param {Object} data
- */
-export function getCollageCart(data) {
-	return request.get("v2/user/initiate/collage/cart_list", data);
-}
-
-/**
- * 拼单用户购物车统计数量
- * @param {Object} data
- */
-export function getCollageCount(data) {
-	return request.get("v2/user/initiate/collage/count", data);
-}
-
-/**
- * 用户添加拼单商品
- * @param {Object} data
- */
-export function addCollageCart(data) {
-  return request.post('v2/add/collage/partake', data);
-}
-
-/**
- * 获取用户拼单数据
- * @param {Object} data
- */
-export function getCollagePartake(data) {
-	return request.get("v2/user/collage/partake", data);
-}
-
-/**
- * 复制他人拼单商品
- * @param {Object} data
- */
-export function duplicateCollagePartake(data) {
-	return request.get("v2/duplicate/collage/partake", data);
-}
-
-/**
- * 用户清空拼单数据
- * @param {Object} data
- */
-export function emptyCollagePartake(data) {
-	return request.get("v2/empty/collage/partake", data);
-}
-
-/**
- * 取消拼单
- * @param {Object} data
- */
-export function cancelCollage(data) {
-	return request.get("v2/user/cancel", data);
-}
-
-/**
- * 结算拼单
- * @param {Object} data
- */
-export function settleCollage(data) {
-	return request.get("v2/user/settle/collage", data);
-}
-
-/**
- * 验证是否在配送范围
- * @param {Object} data
- */
-export function isWithin(data) {
-	return request.get("v2/is/within", data);
-}
-
-/**
- * 门店桌码配置
- */
-export function getTableData(data) {
-	return request.get("v2/table/data", data);
-}
-
-/**
- * 记录桌码
- * @param {Object} data
- */
-export function addTableCode(data) {
-	return request.get("v2/add/table/code", data);
-}
-
-/**
- * 检查桌码记录
- * @param {Object} data
- */
-export function isTableCode(data) {
-	return request.get("v2/is/table/code", data);
-}
-
-/**
- * 处理换桌商品
- * @param {Object} data
- */
-export function changeTable(data) {
-	return request.get("v2/changing/table", data);
-}
-
-/**
- * 购物车统计数量
- * @param {Object} data
- */
-export function getCartCount(data) {
-	return request.get("v2/cart/count", data);
-}
-
-/**
- * 获取门店信息
- * @param {Object} data
- */
-export function getStoreData(data) {
-	return request.get("v2/get/store/data", data);
-}
-
-/**
- * 获取购物车
- * @param {Object} data
- */
-export function getCateList(data) {
-	return request.get("v2/get/cate/list", data);
-}
-
-/**
- * 用户添加桌码商品
- * @param {Object} data
- */
-export function addTableCate(data) {
-	return request.get("v2/add/table/cate", data);
-}
-
-/**
- * 确认下单
- * @param {Object} data
- */
-export function placeOrder(data) {
-	return request.get("v2/user/place/order", data);
-}
-
-/**
- * 获取桌码数据
- * @param {Object} data
- */
-export function getTablePartake(data) {
-	return request.get("v2/get/table/partake", data);
-}
-
-/**
- * 获取二维码信息
- * @param {Object} data
- */
-export function getCodeData(data) {
-	return request.get("v2/get/code/data", data);
-}
-
-/**
- * 获取桌码记录
- * @param {Object} data
- */
-export function getTableCode(data) {
-	return request.get("v2/get/table/code", data);
-}
-
-/**
- * 桌码结账
- * @param {Object} data
- */
-export function settleTable(data) {
-	return request.get("v2/user/settle/table", data);
-}
-
-/**
- * 用户清空购物车
- * @param {Object} data
- */
-export function emptyTableData(data) {
-	return request.get("v2/user/empty/data", data);
-}

+ 0 - 16
api/upload.js

@@ -1,16 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-
-export function upload(data) {
-  return request.post("upload/video",data);
-}

+ 149 - 701
api/user.js

@@ -1,763 +1,211 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
+import request from '@/utils/request'
 
-import request from "@/utils/request.js";
-
-/**
- * 获取用户信息
- * 
- */
-export function getUserInfo() {
-	return request.get('user');
-}
-
-/**
- * 登录成功后更新公众号用户信息
- */
-export function updateWechatInfo(data) {
-	return request.get('v2/user/wechat', data);
-}
-
-/**
- * 设置用户分享
- * 
- */
-export function userShare() {
-	return request.post('user/share');
-}
-
-/**
- * h5用户登录
- * @param data object 用户账号密码
- */
-export function loginH5(data) {
-	return request.post("login", data, {
-		noAuth: true
+// 订单统计信息
+export function orderData(data) {
+	return request({
+		url: '/api/order/data',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * h5用户手机号登录
- * @param data object 用户手机号 也只能
- */
-export function loginMobile(data) {
-	return request.post("login/mobile", data, {
-		noAuth: true
+// 获取用户信息
+export function getUserInfo(data) {
+	console.log('请求数据');
+	return request({
+		url: '/api/user',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * 验证码key
- */
-export function getCodeApi() {
-	return request.get("verify_code", {}, {
-		noAuth: true
+// 用户分享图
+export function spreadBanner(data) {
+	return request({
+		url: '/api/spread/banner',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * h5用户发送验证码
- * @param data object 用户手机号
- */
-export function registerVerify(data) {
-	return request.post("register/verify", data, {
-		noAuth: true
+// 获取地址列表
+export function getAddressList(data) {
+	return request({
+		url: '/api/address/list',
+		method: 'get',
+		data
 	});
 }
-
-/**
- * h5用户手机号注册
- * @param data object 用户手机号 验证码 密码
- */
-export function register(data) {
-	return request.post("register", data, {
-		noAuth: true
+// 修改地址
+export function addressEdit(data) {
+	return request({
+		url: '/api/address/edit',
+		method: 'post',
+		data
 	});
 }
-
-/**
- * 用户手机号修改密码
- * @param data object 用户手机号 验证码 密码
- */
-export function registerReset(data) {
-	return request.post("register/reset", data, {
-		noAuth: true
+// 删除地址
+export function addressDel(data) {
+	return request({
+		url: '/api/address/del',
+		method: 'post',
+		data
 	});
 }
-
-/**
- * 申请供应商接口
- *
- */
-export function applySupplier(id,data) {
-	return request.post("user/apply/supplier/"+id, data, {
-		noAuth: true
+// 设为默认地址
+export function setAddressDefault(data) {
+	return request({
+		url: '/api/address/default/set',
+		method: 'post',
+		data
 	});
 }
-
-/**
- * 供应商详情接口
- *
- */
-export function userApply(id) {
-	return request.get("user/apply/"+id,{},{
-		noAuth: true
+// 购物车列表
+export function getCartList(data) {
+	return request({
+		url: '/api/cart/list',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * 供应商记录接口
- *
- */
-export function recordList(id) {
-	return request.get("user/apply/record",{},{
-		noAuth: true
+// 修改购物车数量
+export function getCartNum(data) {
+	return request({
+		url: '/api/cart/num',
+		method: 'post',
+		data
 	});
 }
-
-/**
- * 获取用户中心菜单
- *
- */
-export function getMenuList() {
-	return request.get("menu/user", {}, {
-		noAuth: true
+//删除购物车
+export function cartDel(data) {
+	return request({
+		url: '/api/cart/del',
+		method: 'post',
+		data
 	});
 }
-
-/*
- * 签到用户信息
- * */
-export function postSignUser(sign) {
-	return request.post("sign/user", sign);
-}
-
-/**
- * 获取签到配置
- * 
- */
-export function getSignConfig() {
-	return request.get('sign/config')
-}
-
-/**
- * 获取签到列表
- * @param object data
- */
-export function getSignList(data) {
-	return request.get('sign/list', data);
-}
-
-/**
- * 用户签到
- */
-export function setSignIntegral() {
-	return request.post('sign/integral')
-}
-
-/**
- * 签到列表(年月)
- * @param object data
- * 
- */
-export function getSignMonthList(data) {
-	return request.get('sign/month', data)
-}
-
-/**
- * 活动状态
- * 
- */
-export function userActivity() {
-	return request.get('user/activity');
-}
-
-/*
- * 资金明细(types|0=全部,1=消费,2=充值,3=返佣,4=提现)这个接口暂时废弃
- * */
-export function getCommissionInfo(q, types) {
-	return request.get("spread/commission/" + types, q);
-}
-
-// 资金明细(types|0=全部,1=消费,2=充值,3=返佣,4=提现)
-export function moneyList(q, types) {
-	return request.get("v2/user/money_list/" + types, q);
-}
-
-/*
- * 积分记录
- * */
-export function getIntegralList(q) {
-	return request.get("integral/list", q);
-}
-
-/**
- * 获取分销海报图片
- * 
- */
-export function spreadBanner() {
-	//#ifdef H5 || APP-PLUS
-	return request.get('spread/banner', {
-		type: 2
-	});
-	//#endif
-	//#ifdef MP
-	return request.get('spread/banner', {
-		type: 1
+//获取收藏夹列表
+export function getcollectList(data) {
+	return request({
+		url: '/api/collect/user',
+		method: 'get',
+		data
 	});
-	//#endif
-
-}
-
-/**
- *
- * 获取推广用户一级和二级
- * @param object data
- */
-export function spreadPeople(data) {
-	return request.post('spread/people', data);
-}
-
-/**
- * 
- * 推广佣金/提现总和
- * @param int type
- */
-export function spreadCount(type) {
-	return request.get('spread/count/' + type);
-}
-
-/*
- * 推广数据
- * */
-export function getSpreadInfo() {
-	return request.get("commission");
-}
-
-
-/**
- * 
- * 推广订单
- * @param object data
- */
-export function spreadOrder(data) {
-	return request.post('spread/order', data);
-}
-
-/*
- * 获取推广人排行
- * */
-export function getRankList(q) {
-	return request.get("rank", q);
-}
-
-/*
- * 获取佣金排名
- * */
-export function getBrokerageRank(q) {
-	return request.get("brokerage_rank", q);
-}
-
-/**
- * 提现申请
- * @param object data
- */
-export function extractCash(data) {
-	return request.post('extract/cash', data)
-}
-
-/**
- * 提现银行/提现最低金额
- * 
- */
-export function extractBank() {
-	return request.get('extract/bank');
-}
-
-/**
- * 会员等级列表
- * 
- */
-export function userLevelGrade() {
-	return request.get('user/level/grade');
-}
-
-/**
- * 获取某个等级任务
- * @param int id 任务id
- */
-export function userLevelTask(id) {
-	return request.get('user/level/task/' + id);
-}
-
-
-/**
- * 检查用户是否可以成为会员
- * 
- */
-export function userLevelDetection() {
-	return request.get('user/level/detection');
-}
-
-/**
- * 
- * 地址列表
- * @param object data
- */
-export function getAddressList(data) {
-	return request.get('address/list', data);
-}
-
-/**
- * 设置默认地址
- * @param int id
- */
-export function setAddressDefault(id) {
-	return request.post('address/default/set', {
-		id: id
-	})
-}
-
-/**
- * 修改 添加地址
- * @param object data
- */
-export function editAddress(data) {
-	return request.post('address/edit', data);
-}
-
-/**
- * 删除地址
- * @param int id
- * 
- */
-export function delAddress(id) {
-	return request.post('address/del', {
-		id: id
-	})
-}
-
-/**
- * 获取单个地址
- * @param int id 
- */
-export function getAddressDetail(id) {
-	return request.get('address/detail/' + id);
-}
-
-/**
- * 修改用户信息
- * @param object
- */
-export function userEdit(data) {
-	return request.post('user/edit', data);
-}
-
-/*
- * 退出登录
- * */
-export function getLogout() {
-	return request.get("logout");
-}
-/**
- * 小程序充值
- * 
- */
-export function rechargeRoutine(data) {
-	return request.post('recharge/routine', data)
 }
-
-/**
- * 充值
- * 
- */
-export function rechargeRecharge(data) {
-	return request.post('recharge/recharge', data)
-}
-
-/*
- * 公众号充值
- * */
-export function rechargeWechat(data) {
-	return request.post("recharge/wechat", data);
-}
-/**
- * 获取默认地址
- * 
- */
-export function getAddressDefault() {
-	return request.get('address/default');
-}
-
-/**
- * 充值金额选择
- */
-export function getRechargeApi() {
-	return request.get("recharge/index");
-}
-
-/**
- * 登陆记录
- */
-export function setVisit(data) {
-	return request.post('user/set_visit', {
-		...data
-	}, {
-		noAuth: true
+// 取消收藏
+export function delcollect(data) {
+	return request({
+		url: '/api/collect/del',
+		method: 'post',
+		data
 	});
 }
 
-/**
- * 客服列表
- */
-export function serviceList() {
-	return request.get("user/service/list");
-}
-/**
- * 客服详情
- */
-export function getChatRecord(data) {
-	return request.get("v2/user/service/record", data);
-}
-//获取聊天记录
-export function getRecord(data) {
-	return request.post("store/getChatList", data);
-}
-/**
- * 静默绑定推广人
- * @param {Object} puid
- */
-export function spread(puid) {
-	return request.post("user/spread", puid);
-}
-
-/**
- * 会员详情
- */
-export function getlevelInfo() {
-	return request.get("user/level/info");
-}
-
-/**
- * 会员经验列表
- */
-export function getlevelExpList(data) {
-	return request.get("user/level/expList", data);
-}
-
-/**
- * 修改用户信息
- * @param {Object} data
- */
-export function updateUserInfo(data) {
-	return request.post('v2/user/user_update', data);
-}
-
-/**
- * 微信直接手机号登录
- */
-export function phoneWxSilenceAuth(data) {
-	return request.post('v2/phone_wx_silence_auth', data, {
-		noAuth: true
+//我的推广
+export function spread(data) {
+	return request({
+		url: '/api/spread/people',
+		method: 'POST',
+		data
 	});
 }
 
-/**
- * 小程序直接手机号登录
- */
-export function phoneSilenceAuth(data) {
-	return request.post('v2/phone_silence_auth', data, {
-		noAuth: true
+// 我的推广卖货
+export function link(data) {
+	return request({
+		url: '/api/link/people',
+		method: 'POST',
+		data
 	});
 }
 
-/**
- * 用户发票列表
- * @param {Object} data
- */
-export function invoiceList(data) {
-	return request.get('v2/invoice', data, {
-		noAuth: true
+// 获取我的粉丝
+export function getMyfans(data) {
+	return request({
+		url: '/api/auction/lower',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * 用户添加|修改发票
- * @param {Object} data
- */
-export function invoiceSave(data) {
-	return request.post('v2/invoice/save', data, {
-		noAuth: true
+// 转账预约券
+export function transfer_accounts(data) {
+	return request({
+		url: '/api/auction/transfer_accounts',
+		method: 'post',
+		data
 	});
 }
 
-/**
- * 用户删除发票
- * @param {Object} data
- */
-export function invoiceDelete(id) {
-	return request.get('v2/invoice/del/' + id);
-}
-
-/**
- * 获取用户默认发票
- * @param {Object} type
- */
-export function invoiceDefault(type) {
-	return request.get('v2/invoice/get_default/' + type);
-}
-
-/**
- * 用户单个发票详情
- * @param {Object} id
- */
-export function invoiceDetail(id) {
-	return request.get('v2/invoice/detail/' + id);
-}
-
-/**
- * 订单申请开票
- * @param {Object} id
- */
-export function invoiceOrder(data) {
-	return request.post('v2/order/make_up_invoice', data);
-}
-
-/**
- * 订单详情中申请开票
- * @param {Object} id
- */
-export function makeUpinvoice(data) {
-	return request.post('v2/order/make_up_invoice', data);
-}
-
-/**
- * 会员卡主界面
- */
-export function memberCard() {
-	return request.get('user/member/card/index');
-}
-
-/**
- * 卡密领取会员卡
- * @param {Object} data
- */
-export function memberCardDraw(data) {
-	return request.post('user/member/card/draw', data);
-}
-
-/**
- * 购买会员卡
- * @param {Object} data
- */
-export function memberCardCreate(data) {
-	return request.post('user/member/card/create', data);
-}
-
-/**
- * 会员优惠券
- */
-export function memberCouponsList() {
-	return request.get('user/member/coupons/list');
-}
-
-/**
- * svip推荐商品
- * @param {Object} id
- */
-export function groomList(id, data) {
-	return request.get(`groom/list/${id}`, data);
-}
-
-/**
- * 付费会员结束
- * @param {Object} data
- */
-export function memberOverdueTime(data) {
-	return request.get('user/member/overdue/time', data);
-}
-
-/**
- * 新版分享海报信息获取
- * 
- */
-export function spreadMsg() {
-	return request.get('user/spread_info');
-}
-
-/**
- * 已邀请/已下单好友
- * 
- */
-export function agentUserList(type, page, limit) {
-	return request.get(`v2/agent/agent_user_list/${type}?page=${page}&limit=${limit}`);
-}
-
-/**
- * 获取用户推广获得收益,佣金轮播,分销规则
-
- * 
- */
-export function agentInfo() {
-	return request.get(`v2/agent/agent_info`);
-}
-
-/**
- * 图片链接转base64
- * 
- */
-export function imgToBase(data) {
-	return request.post('image_base64', data);
-}
-
-/**
- * 获取小程序二维码
- * 
- */
-export function routineCode(data) {
-	return request.get('user/routine_code', data);
-}
-
-/**
- * 消息中心
- */
-export function serviceRecord(data) {
-	return request.get('user/record', data);
-}
-
-/**
- * 消息中心-站内信列表
- */
-export function messageSystem(data) {
-	return request.get('user/message_system/list', data);
-}
-
-/**
- * 消息中心-站内信列表详情
- */
-export function getMsgDetails(id) {
-	return request.get('user/message_system/detail/' + id);
-}
-
-/**
- * 苹果账号登录
- * @param {Object} data
- */
-export function appleLogin(data) {
-	return request.post('apple_login', data, {
-		noAuth: true
+// 用户转账趣豆
+export function trade(data) {
+	return request({
+		url: '/api/user/trade',
+		method: 'post',
+		data
 	});
 }
 
-/*
- * 获取隐私协议
- * */
-export function getUserAgreement(type) {
-	return request.get(`user_agreement/${type}`, {}, {
-		noAuth: true
+// 商家转账趣豆
+export function admintrade(data) {
+	return request({
+		url: '/api/admin/order/trade',
+		method: 'post',
+		data
 	});
 }
 
-/**
- * 获取分销等级列表
- * @param int id 任务id
- */
-export function agentLevelList() {
-	return request.get('v2/agent/level_list');
-}
-
-/**
- * 获取分销任务列表
- * @param int id 任务id
- */
-export function agentLevelTaskList(id) {
-	return request.get('v2/agent/level_task_list?id=' + id);
-}
-
-/**
- * 获取定位详细地址
- * @param int id
- * 
- */
-export function getGeocoder(data) {
-	return request.get(`geoLbscoder?location=${data.lat},${data.long}`, {}, {
-		noAuth: true
+// 申请馆长
+export function apply(data) {
+	return request({
+		url: '/api/auction/apply',
+		method: 'post',
+		data
 	});
 }
 
-/**
- * 获取当前定位选中的地址
- * @param int id
- * 
- */
-export function getCityList(address) {
-	return request.get('v2/cityList', {
-		address
-	}, {
-		noAuth: true
+// 实名认证查询
+export function rate(data) {
+	return request({
+		url: '/api/rate',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * 获取版权
- * 
- */
-export function getCopyRight() {
-	return request.get('get_copyright', {}, {
-		noAuth: true
+// 馆长申请查询
+export function apply_status(data) {
+	return request({
+		url: '/api/auction/apply_status',
+		method: 'get',
+		data
 	});
 }
 
-/**
- * 获取code码
- * @param int id
- * 
- */
-export function getRandCode() {
-	return request.get('user/rand_code');
-}
-
-/**
- * 注销用户
- * @param int id
- * 
- */
-export function cancelUser() {
-	return request.get('cancel/user');
-}
-
-/**
- * 获取激活会员卡需要的信息
- * @param int id
- * 
- */
-export function levelInfo() {
-	return request.get('user/level/activate_info');
-}
-
-/**
- * 用户激活会员卡
- * @param int id
- * 
- */
-export function levelActivate(data) {
-	return request.post('user/level/activate',data);
+//文章列表
+export function article(data, id) {
+	return request({
+		url: '/api/article/list/' + id,
+		method: 'GET',
+		data
+	});
 }
 
-
- //客服登陆
-export function keufLogin(id) {
-	return request.get('keufLogin/' + id, {},{
+//文章详情
+export function details(data, id) {
+	return request({
+		url: '/api/article/details/' + id,
+		method: 'GET',
+		data
 	});
 }
 
-
-
-
+//我的商品
+export function user_product(data) {
+	return request({
+		url: '/api/auction/user_product',
+		method: 'GET',
+		data
+	});
+}

+ 156 - 0
api/wallet.js

@@ -0,0 +1,156 @@
+import request from '@/utils/request'
+
+// 获取用户消费记录
+export function spreadCommission(data,state) {
+	return request({
+		url: '/api/spread/commission/'+state,
+		method: 'get',
+		data
+	});
+}
+
+// 获取账户余额
+export function userBalance(data) {
+	return request({
+		url: '/api/user/balance',
+		method: 'get',
+		data
+	});
+}
+
+// 提现
+export function extractCash(data) {
+	return request({
+		url: '/api/extract/cash',
+		method: 'post',
+		data
+	});
+}
+
+// 提现信息
+export function extractBank(data) {
+	return request({
+		url: '/api/extract/bank',
+		method: 'get',
+		data
+	});
+}
+// #ifdef H5
+// 公众号充值
+export function rechargeWechat(data) {
+	return request({
+		url: '/api/recharge/wechat',
+		method: 'post',
+		data
+	});
+}
+// #endif
+// #ifdef MP
+// 小程序充值
+export function rechargeRoutine(data) {
+	return request({
+		url: '/api/recharge/routine',
+		method: 'post',
+		data
+	});
+}
+// #endif
+// 获取提现支付宝账号
+export function aliInfo(data) {
+	return request({
+		url: '/api/ali/info',
+		method: 'get',
+		data
+	});
+}
+//获取默认银行卡账号
+export function bankInfo(data) {
+	return request({
+		url: '/api/bank/info',
+		method: 'get',
+		data
+	});
+}
+// 保存提现支付宝账号
+export function setAliInfo(data) {
+	return request({
+		url: '/api/ali/edit',
+		method: 'post',
+		data
+	});
+}
+//保存默认银行卡账号
+export function setBankInfo(data) {
+	return request({
+		url: '/api/bank/edit',
+		method: 'post',
+		data
+	});
+}
+
+//保存收款信息
+export function auction(data) {
+	return request({
+		url: '/api/auction/pay',
+		method: 'post',
+		data
+	});
+}
+
+//获取收款信息
+export function pay_list(data) {
+	return request({
+		url: '/api/auction/pay_list',
+		method: 'get',
+		data
+	});
+}
+
+// 账户余额
+export function balance(data) {
+	return request({
+		url: '/api/user/balance',
+		method: 'get',
+		data
+	});
+}
+
+//	积分列表
+export function integrallist(data) {
+	return request({
+		url: '/api/integral/list',
+		method: 'get',
+		data
+	});
+}
+
+//	预约券列表
+export function anticipatelist(data) {
+	return request({
+		url: '/api/anticipate/list',
+		method: 'get',
+		data
+	});
+}
+
+//	提货商品列表
+export function good_exchange(data) {
+	return request({
+		url: '/api/good_exchange/list',
+		method: 'get',
+		data
+	});
+}
+
+//	提货商品列表
+export function good_integral(data) {
+	return request({
+		url: '/api/good_integral/list',
+		method: 'get',
+		data
+	});
+}
+
+
+
+

+ 0 - 101
api/work.js

@@ -1,101 +0,0 @@
-// +----------------------------------------------------------------------
-// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-// +----------------------------------------------------------------------
-// | Author: CRMEB Team <admin@crmeb.com>
-// +----------------------------------------------------------------------
-
-import request from "@/utils/request.js";
-
-/**
- * 获取企业微信基础配置
- * 
- */
-export function getWorkConfig(url) {
-	return request.get('work/config?url=' + url,{},{
-		noAuth: true
-	});
-}
-
-/**
- * 获取企业微信配置
- * 
- */
-export function getWorkAgentConfig(url) {
-	return request.get('work/agentConfig?url=' + url,{},{
-		noAuth: true
-	});
-}
-
-/**
- * 获取客户信息详情
- * 
- */
-export function getWorkAgentInfo(data) {
-	return request.get('work/client/info',data,{
-		noAuth: true
-	});
-}
-
-/**
- * 获取客户订单列表
- * 
- */
-export function getWorkOrderList(data) {
-	return request.get('work/order/list',data,{
-		noAuth: true
-	});
-}
-
-/**
- * 获取客户订单详情
- * 
- */
-export function getWorkOrderInfo(id,data) {
-	return request.get(`work/order/info/${id}`,data,{
-		noAuth: true
-	});
-}
-
-/**
- * 购买商品记录
- * 
- */
-export function getWorkCartList(data) {
-	return request.get(`work/product/cart_list`,data,{
-		noAuth: true
-	});
-}
-
-/**
- * 浏览记录商品记录
- * 
- */
-export function getWorkVisitInfo(data) {
-	return request.get(`work/product/visit_list`,data,{
-		noAuth: true
-	});
-}
-
-/**
- * 获取客户群详情
- * 
- */
-export function getWorkGroupInfo(data) {
-	return request.get(`work/groupInfo`,data,{
-		noAuth: true
-	});
-}
-
-/**
- * 获取群成员列表
- * 
- */
-export function getWorkGroupMember(id,data) {
-	return request.get(`work/groupMember/${id}`,data,{
-		noAuth: true
-	});
-}

+ 38 - 0
api/wx.js

@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+// #ifdef H5
+// 微信分享信息
+export function share(data) {
+	return request({
+		url: '/api/share',
+		method: 'get',
+		data
+	});
+}
+//微信配置
+export function wechatConfig(data) {
+	console.log(data)
+	return request({
+		url: '/api/wechat/config',
+		method: 'get',
+		data
+	});
+}
+// 微信code地址
+export function wechatAuth(data) {
+	return request({
+		url: '/api/wechat/auth',
+		method: 'get',
+		data
+	});
+}
+// #endif
+// #ifdef MP-WEIXIN
+// 微信code地址
+export function wechatMpAuth(data) {
+	return request({
+		url: '/api/wechat/mp_auth',
+		method: 'post',
+		data
+	});
+}
+// #endif

+ 1 - 4
components/Loading/index.vue

@@ -1,14 +1,11 @@
 <template>
-	<!-- 上拉加载 -->
 	<view>
 		<view class="Loads acea-row row-center-wrapper" v-if="loading && !loaded" style="margin-top: .2rem;">
 			<view v-if="loading">
 				<view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view>
-				<slot name="loading"></slot>
 				正在加载中
 			</view>
 			<view v-else>
-				<slot name="load"></slot>
 				上拉加载更多
 			</view>
 		</view>
@@ -34,7 +31,7 @@
 	.Loads {
 	  height: 80upx;
 	  font-size: 25upx;
-	  color: #999;
+	  color: #000;
 	}
 	.Loads .iconfont {
 	  font-size: 30upx;

+ 0 - 214
components/addressWindow/index.vue

@@ -1,214 +0,0 @@
-<template>
-	<view>
-		<!-- 下拉选择地址 -->
-		<view class="address-window" :class="{ on: address.address, ons: !isFooter }">
-			<view class='title'>选择地址<text class='iconfont icon-guanbi' @tap='close'></text></view>
-			<view class='list'>
-				<view class='item acea-row row-between-wrapper' :class='active==index?"font-num":""' v-for="(item,index) in addressList"
-				 @tap='tapAddress(index,item.id,item)' :key='index'>
-					<text class='iconfont icon-ditu' :class='active==index?"font-num":""'></text>
-					<view class='address'>
-						<view class='name' :class='active==index?"font-num":""'>{{item.real_name}}<text class='phone'>{{item.phone}}</text></view>
-						<view class='line1'>{{item.province}}{{item.city}}{{item.district}}{{item.street}}{{item.detail}}</view>
-						<!-- #ifdef H5 || APP-PLUS -->
-						<slot name="bottom" :item="item"></slot>
-						<!-- #endif -->
-						<!-- #ifdef MP -->
-						<slot name="bottom{{item.id}}"></slot>
-						<!-- #endif -->
-					</view>
-					<text class='iconfont icon-complete' :class='active==index?"font-num":""'></text>
-				</view>
-			</view>
-			<!-- 无地址 -->
-			<view class='pictrue' v-if="!is_loading && !addressList.length">
-				<image :src="imgHost + '/statics/images/noAddress.png'"></image>
-			</view>
-			<view class='addressBnt bg-color' :class="fromType?'on':''" @tap='goAddressPages'>选择其它地址</view>
-		</view>
-		<view class='mask' catchtouchmove="true" :hidden='address.address==false' @tap='close'></view>
-	</view>
-</template>
-
-<script>
-	import {
-		getAddressList
-	} from '@/api/user.js';
-	import {HTTP_REQUEST_URL} from '@/config/app'; 
-	export default {
-		props: {
-			fromType:{
-				type: Number,
-				default: 0,
-			},
-			pagesUrl: {
-				type: String,
-				default: '',
-			},
-			address: {
-				type: Object,
-				default: function() {
-					return {
-						address: true,
-						addressId: 0,
-					};
-				}
-			},
-			isLog: {
-				type: Boolean,
-				default: false,
-			},
-			isFooter: {
-			  type: Boolean,
-			  default: false
-			}
-		},
-		data() {
-			return {
-				active: 0,
-				//地址列表
-				addressList: [],
-				is_loading: true,
-				imgHost:HTTP_REQUEST_URL
-			};
-		},
-		methods: {
-			tapAddress: function(e, addressid,row) {
-				this.active = e;
-				this.$emit('OnChangeAddress', addressid,row);
-			},
-			close: function() {
-				this.$emit('changeClose');
-				this.$emit('changeTextareaStatus');
-			},
-			goAddressPages: function() {
-				this.$emit('changeClose');
-				this.$emit('changeTextareaStatus');
-				if (!this.addressList.length && this.pagesUrl.indexOf('isCollage') != -1) {
-					let index = this.pagesUrl.indexOf('?')
-					return uni.navigateTo({
-						url: '/pages/users/user_address/index'+this.pagesUrl.slice(index)
-					});
-				}
-				uni.navigateTo({
-					url: this.pagesUrl
-				});
-			},
-			getAddressList: function() {
-				let that = this;
-				getAddressList({
-					page: 1,
-					limit: 5
-				}).then(res => {
-					let addressList = res.data;
-					//处理默认选中项
-					for (let i = 0, leng = addressList.length; i < leng; i++) {
-						if (addressList[i].id == that.address.addressId) {
-							that.active = i;
-						}
-					}
-					that.$set(that, 'addressList', addressList);
-					that.is_loading = false;
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.mask{
-		z-index: 100 !important;
-	}
-	.address-window {
-		background-color: #fff;
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		z-index: 101;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-	}
-
-	.address-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-
-	.address-window .title {
-		font-size: 32rpx;
-		font-weight: bold;
-		text-align: center;
-		height: 123rpx;
-		line-height: 123rpx;
-		position: relative;
-	}
-
-	.address-window .title .iconfont {
-		position: absolute;
-		right: 30rpx;
-		color: #8a8a8a;
-		font-size: 35rpx;
-	}
-
-	.address-window .list .item {
-		margin-left: 30rpx;
-		padding-right: 30rpx;
-		border-bottom: 1px solid #eee;
-		height: 129rpx;
-		font-size: 25rpx;
-		color: #333;
-	}
-
-	.address-window .list .item .iconfont {
-		font-size: 37rpx;
-		color: #2c2c2c;
-	}
-
-	.address-window .list .item .iconfont.icon-complete {
-		font-size: 30rpx;
-		color: #fff;
-	}
-
-	.address-window .list .item .address {
-		width: 560rpx;
-	}
-
-	.address-window .list .item .address .name {
-		font-size: 28rpx;
-		font-weight: bold;
-		color: #282828;
-		margin-bottom: 4rpx;
-	}
-
-	.address-window .list .item .address .name .phone {
-		margin-left: 18rpx;
-	}
-
-	.address-window .addressBnt {
-		font-size: 30rpx;
-		font-weight: bold;
-		color: #fff;
-		width: 690rpx;
-		height: 86rpx;
-		border-radius: 43rpx;
-		text-align: center;
-		line-height: 86rpx;
-		margin: 85rpx auto;
-		&.on{
-			margin-bottom: 150rpx;
-			margin-bottom: calc(150rpx + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-			margin-bottom: calc(150rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-		}
-	}
-
-	.address-window .pictrue {
-		width: 414rpx;
-		height: 336rpx;
-		margin: 0 auto;
-	}
-
-	.address-window .pictrue image {
-		width: 100%;
-		height: 100%;
-	}
-</style>

+ 0 - 266
components/areaWindow/index.vue

@@ -1,266 +0,0 @@
-<template>
-	<!-- 地址下拉框 -->
-	<view>
-		<view class="address-window" :class="display==true?'on':''">
-			<view class='title'>请选择所在地区<text class='iconfont icon-guanbi' @tap='close'></text></view>
-			<view class="address-count">
-				<view class="address-selected">
-					<view v-for="(item,index) in selectedArr" :key="index" class="selected-list" :class="{active:index === selectedIndex}" @click="change(item.pid, index)">
-						{{item.label}}
-						<text class="iconfont icon-xiangyou"></text>
-					</view>
-					<view class="selected-list" :class="{active:-1 === selectedIndex}"  v-if="showMore" @click="change(-1, -1)">
-						<text class="iconfont icon-xiangyou"></text>
-						请选择
-					</view>
-				</view>
-				<scroll-view scroll-y="true" :scroll-top="scrollTop" class="address-list" @scroll="scroll">
-					<view v-for="(item,index) in addressList" :key="index" class="list" :class="{active:item.id === activeId}" @click="selected(item)">
-						<text class="item-name">{{item.label}}</text>
-						<text v-if="item.id === activeId" class="iconfont icon-duihao2"></text>
-					</view>
-				</scroll-view>
-			</view>
-		</view>
-		<view class='mask' catchtouchmove="true" :hidden='display==false' @tap='close'></view>
-	</view>
-</template>
-
-<script>
-	// +----------------------------------------------------------------------
-	// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
-	// +----------------------------------------------------------------------
-	// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved.
-	// +----------------------------------------------------------------------
-	// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
-	// +----------------------------------------------------------------------
-	// | Author: CRMEB Team <admin@crmeb.com>
-	// +----------------------------------------------------------------------
-	import { getCityData } from '@/api/api.js';
-	
-	const CACHE_ADDRESS = {};
-	
-	export default {
-		props: {
-			display: {
-				type: Boolean,
-				default: true
-			},
-			cityShow: {
-				type: Number,
-				default: 3
-			},
-			address: {
-				type:Array | Object,
-				default:[]
-			},
-		},
-		data() {
-			return {
-				active: 0,
-				//地址列表
-				addressList: [],
-				selectedArr: [],
-				selectedIndex: -1,
-				is_loading: false,
-				old: { scrollTop: 0 },
-				scrollTop: 0
-			};
-		},
-		computed:{
-			activeId(){
-				return this.selectedIndex == -1 ? 0 : this.selectedArr[this.selectedIndex].id
-			},
-			showMore(){
-				return this.selectedArr.length ? (this.selectedArr[this.selectedArr.length - 1].hasOwnProperty('children') && ((this.cityShow==1 && this.addressList.level<2) || (this.cityShow==2 && this.addressList.level<3) || (this.cityShow==3 && this.addressList.level<4))) : true
-			}
-		},
-		watch:{
-			address(n){
-				this.selectedArr = n ? [...n] : []
-			},
-			display(n){
-				if(!n) {
-					this.addressList = [];
-					this.selectedArr =  this.address ? [...this.address] : [];
-					this.selectedIndex = -1;
-					this.is_loading = false;
-				}else{
-					this.loadAddress(0)
-				}
-			}
-		},
-		mounted() {
-			this.loadAddress(0)
-		},
-		methods: {
-			change(pid,index){
-				if(this.selectedIndex == index) return;
-				if(pid === -1){
-					pid = this.selectedArr.length ? this.selectedArr[this.selectedArr.length -1].id : 0;
-				}
-				this.selectedIndex = index;
-				this.loadAddress(pid);
-			},
-			loadAddress(pid){
-				if(CACHE_ADDRESS[pid]){
-					this.addressList = CACHE_ADDRESS[pid];
-					return ;
-				}
-				this.is_loading = true;
-				getCityData(pid).then(res=>{
-					this.is_loading = false;
-					CACHE_ADDRESS[pid] = res.data;
-					this.addressList = res.data;
-				})
-				this.goTop()
-			},
-			selected(item){
-				if(this.is_loading) return;
-				if(this.selectedIndex > -1){
-					this.selectedArr.splice(this.selectedIndex + 1,999)
-					this.selectedArr[this.selectedIndex] = item;
-					this.selectedIndex = -1;
-				}else if(!item.pid){
-					this.selectedArr = [item];
-				}else{
-					this.selectedArr.push(item);
-				}
-				if(item.hasOwnProperty('children') && ((this.cityShow==1 && this.addressList[0].level<2) || (this.cityShow==2 && this.addressList[0].level<3) || (this.cityShow==3 && this.addressList[0].level<4))){
-					this.loadAddress(item.id);
-				} else {
-					this.$emit('submit', [...this.selectedArr]);
-					this.$emit('changeClose');
-				}
-				this.goTop()
-			},
-			close: function() {
-				this.$emit('changeClose');
-			},
-			scroll : function(e) {
-				this.old.scrollTop = e.detail.scrollTop
-			},
-			goTop: function(e) {
-			    this.scrollTop = this.old.scrollTop
-			    this.$nextTick(() => {
-			        this.scrollTop = 0
-			    });
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.address-window {
-		background-color: #fff;
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		z-index: 101;
-		border-radius: 30rpx 30rpx 0 0;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-	}
-	.address-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-	.address-window .title {
-		font-size: 32rpx;
-		font-weight: bold;
-		text-align: center;
-		height: 123rpx;
-		line-height: 123rpx;
-		position: relative;
-	}
-	.address-window .title .iconfont {
-		position: absolute;
-		right: 30rpx;
-		color: #8a8a8a;
-		font-size: 35rpx;
-	}
-	.address-count{
-		.address-selected{
-			padding: 0 30rpx;
-			margin-top: 10rpx;
-			position: relative;
-			padding-bottom: 20rpx;
-			border-bottom: 2rpx solid #f7f7f7;
-		}
-		.selected-list{
-			font-size: 26rpx;
-			color: #282828;
-			line-height: 50rpx;
-			padding-bottom: 10rpx;
-			padding-left: 60rpx;
-			position: relative;
-			&.active{
-				color: var(--view-theme);
-			}
-			&:before,&:after{
-				content: '';
-				display: block;
-				position: absolute;			
-			}
-			&:before{
-				width: 4rpx;
-				height: 100%;
-				background-color: var(--view-theme);
-				top: 0;
-				left: 10rpx;
-			}
-			&:after{
-				width: 12rpx;
-				height: 12rpx;
-				background: var(--view-theme);
-				border-radius: 100%;
-				left: 6rpx;
-				top: 50%;
-				margin-top: -8rpx;
-			}
-			&:first-child,&:last-child{
-				&:before{
-					height: 50%;
-				}
-			}
-			&:first-child{
-				&:before{
-					top: auto;
-					bottom: 0;
-				}
-			}
-			.iconfont{
-				font-size: 20rpx;
-				float: right;
-				color: #dddddd;
-			}
-		}
-		scroll-view{
-			height: 550rpx;
-		}
-		.address-list{
-			padding: 0 30rpx;
-			margin-top: 20rpx;
-			box-sizing: border-box;
-			.list{
-				.iconfont{
-					float: right;
-					color: #ddd;
-					font-size: 22rpx;
-				}
-				.item-name{
-					display: inline-block;
-					line-height: 50rpx;
-					margin-bottom: 20rpx;
-					font-size: 26rpx;
-				}
-				&.active{
-					color: var(--view-theme);
-					.iconfont{
-						color: var(--view-theme);
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 428
components/authorize/index.vue

@@ -1,428 +0,0 @@
-<template>
-	<view :style="colorStyle">
-		<view class="authorize">
-			<view class="pictrue">
-				<image :src="logoUrl"></image>
-				<view class="iconfont icon-guanbi4" @click='close'></view>
-			</view>
-			<view class="title">账号登录</view>
-			<view class="info">
-				<checkbox-group @change='ChangeIsDefault' v-if="agreement">
-					<checkbox :checked="protocol ? true : false" />您已同意商城<text class="agree"
-						@click="privacy('user')">《用户协议》</text>
-					与<text class="agree" @click="privacy('privacy')">《隐私协议》</text>
-				</checkbox-group>
-				<view v-else>
-					登录注册即同意商城
-					<text class="agree" @click="privacy('user')">《用户协议》</text>与<text class="agree" @click="privacy('privacy')">《隐私协议》</text>
-				</view>
-			</view>
-			<template v-if="routineAuthType.indexOf(1) != -1">
-				<button hover-class="none" v-if="mp_is_new" @tap="userLogin"
-					class="btn1">授权登录</button>
-				<button v-else-if="canUseGetUserProfile && code" hover-class="none" @tap="getUserProfile"
-						class="btn1">授权登录</button>
-				<button v-else hover-class="none" open-type="getUserInfo" @getuserinfo="setUserInfo"
-					class="btn1">授权登录</button>
-			</template>
-			<!-- <button v-if="routineAuthType.indexOf(2) != -1"  hover-class="none" @click="isUp = true" class="btn2 acea-row row-center-wrapper">手机号登录</button> -->
-		</view>
-		<!-- <block v-if="isUp">
-			<mobileLogin :isUp="isUp" @close="maskClose" :authKey="authKey" @wechatPhone="wechatPhone"></mobileLogin>
-		</block> -->
-		<block v-if="isPhoneBox">
-			<!-- <routinePhone :logoUrl="logoUrl" :isPhoneBox="isPhoneBox" @close="bindPhoneClose" :authKey="authKey">
-			</routinePhone> -->
-		</block>
-		<block>
-			<editUserModal :isShow="isShow" @closeEdit="closeEdit" @editSuccess="editSuccess">
-			</editUserModal>
-		</block>
-		<view class="mask" @click='close'></view>
-	</view>
-</template>
-
-<script>
-	const app = getApp();
-	// import mobileLogin from '../loginMobile/index.vue';
-	import routinePhone from '../loginMobile/routine_phone.vue';
-	import editUserModal from '@/components/eidtUserModal/index.vue'
-	import {
-		getLogo,
-		silenceAuth,
-		wechatAuthV2,
-		authLogin
-	} from '@/api/public';
-	import {
-		LOGO_URL,
-		EXPIRES_TIME,
-		USER_INFO,
-		STATE_R_KEY
-	} from '@/config/cache';
-	import {
-		getUserInfo
-	} from '@/api/user.js';
-	import Routine from '@/libs/routine';
-	import wechat from '@/libs/wechat';
-	import colors from '@/mixins/color.js';
-	export default {
-		mixins:[colors],
-		props: {
-			isShowAuth: {
-				type: Boolean,
-				default: false
-			}
-		},
-		data() {
-			return {
-				isShow: false,//判断获取用户头像是否出现
-				isUp: false,
-				phone: '',
-				isPhoneBox: false,
-				logoUrl: '',
-				code: '',
-				authKey: '',
-				options: '',
-				userInfo: {},
-				codeNum: 0,
-				canUseGetUserProfile: false,
-				mp_is_new: this.$Cache.get('MP_VERSION_ISNEW') || false,
-				agreement: 0,
-				protocol: false,
-				routineAuthType: []
-			};
-		},
-		components: {
-			// mobileLogin,
-			routinePhone,
-			editUserModal
-		},
-		mounted(options) {
-			if (uni.getUserProfile) {
-				this.canUseGetUserProfile = true;
-			}
-			getLogo().then(res => {
-				this.logoUrl = res.data.logo_url;
-				this.agreement = res.data.store_user_agreement;
-				this.routineAuthType = res.data.routine_auth_type;
-			});
-			let that = this;
-			// #ifdef MP
-			Routine.getCode()
-				.then(code => {
-					this.code = code
-				})
-			// #endif
-		},
-		methods: {
-			close(){
-				this.$emit('authColse', false);
-			},
-			privacy(type) {
-				uni.navigateTo({
-					url: "/pages/users/privacy/index?type=" + type
-				})
-			},
-			ChangeIsDefault(e) {
-				this.$set(this, 'protocol', !this.protocol);
-			},
-			// 小程序 22.11.8日删除getUserProfile 接口获取用户昵称头像
-			userLogin() {
-				if (!this.protocol && this.agreement) {
-					return this.$util.Tips({
-						title: '请先阅读并同意协议'
-					});
-				}
-				Routine.getCode()
-					.then(code => {
-						uni.showLoading({
-							title: '正在登录中'
-						});
-						authLogin({
-							code,
-							spread_spid: app.globalData.spid,
-							spread_code: app.globalData.code
-						}).then(res => {
-							if (res.data.key !== undefined && res.data.key) {
-								uni.hideLoading();
-								this.authKey = res.data.key;
-								this.isPhoneBox = true;
-							} else {
-								uni.hideLoading();
-								let time = res.data.expires_time - this.$Cache.time();
-								this.$store.commit('LOGIN', {
-									token: res.data.token,
-									time: time
-								});
-								this.getUserInfo(res.data.store_user_avatar || 0)
-							}
-						}).catch(err => {
-							uni.hideLoading();
-							uni.showToast({
-								title: err,
-								icon: 'none',
-								duration: 2000
-							});
-						})
-					})
-					.catch(err => {
-						uni.hideLoading();
-						uni.showToast({
-							title: err,
-							icon: 'none',
-							duration: 2000
-						});
-					});
-			},
-			editSuccess() {
-				this.isShow = false
-				this.$emit('onLoadFun');
-			},
-			closeEdit() {
-				this.isShow = false
-				this.$emit('onLoadFun');
-				this.$util.Tips({
-					title: '登录成功',
-					icon: 'success'
-				});
-			},
-			// 弹窗关闭
-			// maskClose(store_user_avatar) {
-			// 	this.isUp = false;
-			// 	if (store_user_avatar) {
-			// 	   this.$emit('onLoadFun');
-			// 	}
-			// },
-			bindPhoneClose(data) {
-				if (data.isStatus) {
-					uni.hideLoading();
-					this.isPhoneBox = false;
-					if(data.store_user_avatar){
-						this.isShow = true
-					}else{
-						this.$emit('onLoadFun');
-						this.$util.Tips({
-							title: '登录成功',
-							icon: 'success'
-						});
-					}
-					// this.getUserInfo(data.store_user_avatar)
-					// this.$util.Tips({
-					// 	title: '登录成功',
-					// 	icon: 'success'
-					// }, {
-					// 	tab: 3
-					// });
-				} else {
-					this.isPhoneBox = false;
-				}
-			},
-			// #ifdef MP
-			/**
-			 * 获取个人用户信息
-			 */
-			getUserInfo: function(store_user_avatar) {
-				let that = this;
-				getUserInfo().then(res => {
-					uni.hideLoading();
-					that.userInfo = res.data;
-					that.$store.commit('SETUID', res.data.uid);
-					that.$store.commit('UPDATE_USERINFO', res.data);
-					if(store_user_avatar){
-						that.isShow = true
-					}else{
-						that.$emit('onLoadFun');
-						that.$util.Tips({
-							title: '登录成功',
-							icon: 'success'
-						});
-					}
-				});
-			},
-			setUserInfo(e) {
-				if (!this.protocol && this.agreement) {
-					return this.$util.Tips({
-						title: '请先阅读并同意协议'
-					});
-				}
-				this.close();
-				uni.showLoading({
-					title: '正在登录中'
-				});
-				Routine.getCode()
-					.then(code => {
-						this.getWxUser(code);
-					})
-					.catch(res => {
-						uni.hideLoading();
-					});
-			},
-			//小程序授权api替换 getUserInfo
-			getUserProfile() {
-				if (!this.protocol && this.agreement) {
-					return this.$util.Tips({
-						title: '请先阅读并同意协议'
-					});
-				}
-				this.close();
-				uni.showLoading({
-					title: '正在登录中'
-				});
-				let self = this;
-				Routine.getUserProfile()
-					.then(res => {
-						let userInfo = res.userInfo;
-						userInfo.code = this.code;
-						userInfo.spread_spid = app.globalData.spid || this.$Cache.get('spid'); //获取推广人ID
-						userInfo.spread_code = app.globalData.code; //获取推广人分享二维码ID
-						Routine.authUserInfo(userInfo)
-							.then(res => {
-								if (res.data.key !== undefined && res.data.key) {
-									uni.hideLoading();
-									self.authKey = res.data.key;
-									self.isPhoneBox = true;
-								} else {
-									uni.hideLoading();
-									let time = res.data.expires_time - self.$Cache.time();
-									self.$store.commit('LOGIN', {
-										token: res.data.token,
-										time: time
-									});
-									this.getUserInfo()
-								}
-							})
-							.catch(res => {
-								uni.hideLoading();
-								uni.showToast({
-									title: res.msg,
-									icon: 'none',
-									duration: 2000
-								});
-							});
-					})
-					.catch(res => {
-						uni.hideLoading();
-					});
-			},
-			getWxUser(code) {
-				let self = this;
-				Routine.getUserInfo()
-					.then(res => {
-						let userInfo = res.userInfo;
-						userInfo.code = code;
-						userInfo.spread_spid = app.globalData.spid; //获取推广人ID
-						userInfo.spread_code = app.globalData.code; //获取推广人分享二维码ID
-						Routine.authUserInfo(userInfo)
-							.then(res => {
-								if (res.data.key !== undefined && res.data.key) {
-									uni.hideLoading();
-									self.authKey = res.data.key;
-									self.isPhoneBox = true;
-								} else {
-									uni.hideLoading();
-									let time = res.data.expires_time - self.$Cache.time();
-									self.$store.commit('LOGIN', {
-										token: res.data.token,
-										time: time
-									});
-									self.$emit('onLoadFun');
-									self.$util.Tips({
-										title: res.msg,
-										icon: 'success'
-									});
-								}
-							})
-							.catch(res => {
-								uni.hideLoading();
-								uni.showToast({
-									title: res.msg,
-									icon: 'none',
-									duration: 2000
-								});
-							});
-					})
-					.catch(res => {
-						uni.hideLoading();
-					});
-			},
-			// #endif
-		}
-	};
-</script>
-
-<style lang="scss">
-	.mask{
-		z-index: 99;
-	}
-	.authorize{
-		width: 100%;
-		height: 560rpx;
-		background-color: #fff;
-		border-radius: 48rpx 48rpx 0 0;
-		position: fixed;
-		left: 0;
-		bottom: 0;
-		z-index: 667;
-		padding-top: 50rpx;
-		text-align: center;
-		.pictrue{
-			width: 152rpx;
-			height: 152rpx;
-			border-radius: 50%;
-			margin: 0 auto;
-			position: relative;
-			image{
-				width: 100%;
-				height: 100%;
-				border-radius: 50%;
-				border:1px solid #eee;
-			}
-			.iconfont{
-				position: absolute;
-				width: 52rpx;
-				height: 52rpx;
-				background: #EEE;
-				border-radius: 50%;
-				color: #888;
-				font-size: 30rpx;
-				text-align: center;
-				line-height: 52rpx;
-				right: -267rpx;
-				top: -20rpx;
-			}
-		}
-		.title{
-			margin-top: 28rpx;
-			font-size: 36rpx;
-			color: #333333;
-		}
-		.info{
-			color: #9E9E9E;
-			font-size: 28rpx;
-			margin-top: 14rpx;
-			.agree{
-				color: #333;
-			}
-		}
-		.btn1{
-			width: 536rpx;
-			height: 86rpx;
-			border-radius: 43rpx;
-			color: #fff;
-			text-align: center;
-			line-height: 86rpx;
-			margin: 50rpx auto 0 auto;
-			background-color: var(--view-theme);
-			font-size: 30rpx;
-		}
-		.btn2{
-			width: 536rpx;
-			height: 86rpx;
-			border-radius: 43rpx;
-			border: 2rpx solid  var(--view-theme);
-			color:  var(--view-theme);
-			font-size: 30rpx;
-			margin: 40rpx auto 0 auto;
-		}
-	}
-</style>

+ 0 - 142
components/cartDiscount/index.vue

@@ -1,142 +0,0 @@
-<template>
-	<view>
-		<!-- 购物车优惠明细 -->
-		<view class="cartDiscount" :class="discountInfo.discount === true ? 'on' : ''">
-			<view class="title">优惠明细<text class="iconfont icon-guanbi5" @click="closeDiscount"></text></view>
-			<view class="list">
-				<view class="item acea-row row-between-wrapper">
-					<view>商品总价:</view>
-					<view>¥{{discountInfo.deduction.sum_price}}</view>
-				</view>
-				<view class="item acea-row row-between-wrapper">
-					<view>优惠抵扣:</view>
-					<view class="font-color">-¥{{$util.$h.Sub(discountInfo.deduction.sum_price,discountInfo.deduction.pay_price)}}</view>
-				</view>
-				<view class="discountList">
-					<view class="coupon acea-row row-between-wrapper" v-if="discountInfo.deduction.coupon_price">
-						<view>{{discountInfo.coupon.coupon_title}}</view>
-						<view>-¥{{discountInfo.deduction.coupon_price}}</view>
-					</view>
-					<view class="coupon acea-row row-between-wrapper" v-if="discountInfo.deduction.first_order_price">
-						<view>新人首单优惠</view>
-						<view>-¥{{discountInfo.deduction.first_order_price}}</view>
-					</view>
-					<view class="coupon acea-row row-between-wrapper" v-if="discountInfo.deduction.promotions_price">
-						<view>优惠活动</view>
-						<view>-¥{{discountInfo.deduction.promotions_price}}</view>
-					</view>
-					<view class="coupon acea-row row-between-wrapper" v-if="discountInfo.deduction.vip_price">
-						<view>会员优惠</view>
-						<view>-¥{{discountInfo.deduction.vip_price}}</view>
-					</view>
-				</view>
-				<div class="item">
-					<slot name="bottom"></slot>
-				</div>
-				<view class="bottom">
-					<view class="item acea-row row-between-wrapper">
-						<view>共优惠:</view>
-						<view class="font-color">-¥{{$util.$h.Sub(discountInfo.deduction.sum_price,discountInfo.deduction.pay_price)}}</view>
-					</view>
-					<view class="item acea-row row-between-wrapper">
-						<view class="total">合计:</view>
-						<view class="money">¥{{discountInfo.deduction.pay_price}}</view>
-					</view>
-				</view>
-			</view>
-		</view>
-		<view class="mask" @touchmove.prevent :hidden="discountInfo.discount === false" @click="closeDiscount"></view>
-	</view>
-</template>
-
-<script>
-	export default {
-		props: {
-			discountInfo: {
-				type: Object,
-				default: () => {}
-			}
-		},
-		data() {
-			return {};
-		},
-		mounted() {},
-		methods: {
-			closeDiscount(){
-				this.$emit('myevent');
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.discountList{
-		background: #F5F5F5;
-	}
-	.cartDiscount{
-		position: fixed;
-		bottom: 0;
-		width: 100%;
-		left: 0;
-		background-color: #fff;
-		z-index: 9;
-		border-radius: 24rpx 24rpx 0 0;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-		padding-bottom: 200rpx;
-		padding-bottom: calc(200rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		padding-bottom: calc(200rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-		.title{
-			font-size: 32rpx;
-			color: #282828;
-			text-align: center;
-			position: relative;
-			background-color: #F5F5F5;
-			height: 120rpx;
-			line-height: 120rpx;
-			border-radius: 24rpx 24rpx 0 0;
-			.iconfont{
-				position: absolute;
-				right: 30rpx;
-				top:0;
-				font-size: 36rpx;
-			}
-		}
-		.list{
-			max-height: 600rpx;
-			overflow-x: hidden;
-			overflow-y: auto;
-			padding-top: 40rpx;
-			.discountList{
-				width: 692rpx;
-				background: #F5F5F5;
-				margin: 0 auto;
-				border-radius: 12rpx;
-				padding: 0 24rpx;
-			}
-			.coupon{
-				height: 70rpx;
-				font-size: 24rpx;
-			}
-			.bottom{
-				border-top: 2rpx dotted #EEEEEE;
-				margin-top: 30rpx;
-				padding-top: 30rpx;
-				.total{
-					font-size: 30rpx;
-					font-weight: 600;
-				}
-				.money{
-					font-size: 36rpx;
-					font-weight: 600;
-				}
-			}
-			.item{
-				margin: 0 30rpx 30rpx 30rpx;
-			}
-		}
-	}
-	.cartDiscount.on{
-		transform: translate3d(0, 0, 0);
-	}
-</style>

+ 0 - 232
components/cartList/index.vue

@@ -1,232 +0,0 @@
-<template>
-	<view>
-		<!-- 分类购物车下拉列表 -->
-		<view class="cartList" :class="{on:cartData.iScart,ons:!isFooter}">
-			<view class="title acea-row row-between-wrapper">
-				<view class="name">已选商品</view>
-				<view class="del acea-row row-middle" @click="subDel"><view class="iconfont icon-shanchu1"></view>清空</view>
-			</view>
-			<view class="list">
-				<view class="item acea-row row-between-wrapper" v-for="(item,index) in cartData.cartList" :key="index">
-					<view class="pictrue">
-						<image v-if="item.productInfo.attrInfo" :src='item.productInfo.attrInfo.image'></image>
-						<image v-else :src='item.productInfo.image'></image>
-						<view class="mantle" v-if="!item.status || !item.attrStatus"></view>
-					</view>
-					<view class="txtPic">
-						<view class="name line2" :class="(item.attrStatus && item.status)?'':'on'">{{item.productInfo.store_name}}</view>
-						<view v-if="item.attrStatus && item.status">
-							<view class="info" v-if="item.productInfo.attrInfo">{{item.productInfo.attrInfo.suk}}</view>
-							<!-- #ifdef H5 || APP-PLUS -->
-							<slot name="center" :item="item"></slot>
-							<!-- #endif -->
-							<!-- #ifdef MP -->
-							<slot name="center{{index}}"></slot>
-							<!-- #endif -->
-							<view class="bottom acea-row row-between-wrapper">
-								<view class="money">¥<text class="num">{{item.truePrice}}</text></view>
-								<view class="cartNum acea-row row-middle">
-									<view class="reduce iconfont icon-jianhao1" @click="leaveCart(index)"></view>
-									<view class="num">{{item.cart_num}}</view>
-									<view class="plus iconfont icon-jiahao1" @click="joinCart(index)"></view>
-								</view>
-							</view>
-						</view>
-						<view class="noBnt" v-else-if="!item.attrStatus">已售罄</view>
-						<view class="noBnt" v-else-if="!item.status">已下架</view>
-						<view class="delTxt acea-row row-right" v-if="!item.status || !item.attrStatus"><text @click="oneDel(item.id,index)">删除</text></view>
-					</view>
-				</view>
-			</view>
-		</view>
-		<view class="mask" v-if="cartData.iScart" @click="closeList" @touchmove.stop.prevent="moveHandle"></view>
-	</view>
-</template>
-
-<script>
-	export default {
-		props:{
-			cartData: {
-				type: Object,
-				default: () => {}
-			},
-			isFooter: {
-			  type: Boolean,
-			  default: false
-			}
-		},
-		data() {
-			return {};
-		},
-		mounted(){
-		},
-		methods: {
-			moveHandle(){
-				
-			},
-			closeList(){
-				this.$emit('closeList', false);
-			},
-			leaveCart(index){
-				this.$emit('ChangeCartNumDan', false,index);
-			},
-			joinCart(index){
-				this.$emit('ChangeCartNumDan', true,index);
-			},
-			subDel(){
-				this.$emit('ChangeSubDel');
-			},
-			oneDel(id,index){
-				this.$emit('ChangeOneDel',id,index);
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.mask{
-		z-index: 99;
-	}
-	.cartList{
-		position: fixed;
-		left:0;
-		bottom: 0;
-		width: 100%;
-		background-color: #fff;
-		z-index:100;
-		padding: 0 30rpx 110rpx 30rpx;
-		padding-bottom: calc(110rpx + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		padding-bottom: calc(110rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-		box-sizing: border-box;
-		border-radius:16rpx 16rpx 0 0;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-		&.on{
-			transform: translate3d(0, 0, 0);
-		}
-		&.ons{
-			// #ifndef H5
-			padding-bottom: 0;
-			padding-bottom: calc(0 + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-			padding-bottom: calc(0 + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-			// #endif
-		}
-		.title{
-			height: 108rpx;
-			.name{
-				font-size:28rpx;
-				color: #282828;
-				font-weight:bold;
-			}
-			.del{
-				font-size: 26rpx;
-				color: var(--view-theme);
-				.iconfont{
-					margin-right: 5rpx;
-					font-size: 34rpx;
-				}
-			}
-		}
-		.list{
-			max-height: 720rpx;
-			overflow-x: hidden;
-			overflow-y: auto;
-			.item{
-				margin-bottom: 40rpx;
-				.pictrue{
-					width: 176rpx;
-					height: 176rpx;
-					border-radius: 16rpx;
-					position: relative;
-					image{
-						width: 100%;
-						height: 100%;
-						border-radius: 16rpx;
-					}
-					.mantle{
-						position: absolute;
-						top:0;
-						left:0;
-						width: 100%;
-						height: 100%;
-						background:rgba(255,255,255,0.65);
-						border-radius:16rpx;
-					}
-				}
-				.txtPic{
-					width: 486rpx;
-					.name{
-						font-size:28rpx;
-						color: #282828;
-						&.on{
-							color: #A3A3A3;
-						}
-					}
-					.noBnt{
-						width:126rpx;
-						height:44rpx;
-						background:rgba(242,242,242,1);
-						border-radius:22rpx;
-						text-align: center;
-						line-height: 44rpx;
-						font-size: 24rpx;
-						color: #A3A3A3;
-						margin-top: 10rpx;
-					}
-					.delTxt{
-						margin-top: 48rpx;
-						font-size: 24rpx;
-						color: #E93323;
-						text{
-							width: 70rpx;
-							height: 50rpx;
-							text-align: center;
-							line-height: 50rpx;
-						}
-					}
-					.info{
-						font-size: 23rpx;
-						color: #989898;
-						margin-top: 5rpx;
-					}
-					.bottom{
-						margin-top: 11rpx;
-						.money{
-							font-weight:bold;
-							font-size: 26rpx;
-							color: var(--view-priceColor);
-							.num{
-								font-size: 34rpx;
-							}
-						}
-						.cartNum{
-							font-weight:bold;
-						    .num{
-								font-size: 34rpx;
-								color: #282828;
-								width: 120rpx;
-								text-align: center;
-							}
-							.reduce{
-								color: #282828;
-								font-size: 24rpx;
-								width: 60rpx;
-								height: 60rpx;
-								text-align: center;
-								line-height: 60rpx;
-							}
-							.plus{
-								color: #282828;
-								font-size: 24rpx;
-								width: 60rpx;
-								height: 60rpx;
-								text-align: center;
-								line-height: 60rpx;
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-</style>

+ 152 - 0
components/codeImage.vue

@@ -0,0 +1,152 @@
+<template>
+	<u-popup v-model="show" mode="center" closeable @close='close' border-radius='20'>
+		<view class="content">
+			<view class="title">
+				图片验证
+			</view>
+			<view class="loading" v-show="loadImage=='ok'" @click="getImage()">
+				<image class="codeImg" @load="loadImage='ok'" @error="loadImage='err'" :src="image" mode="scaleToFill">
+				</image>
+			</view>
+			<view class="loading" v-if="loadImage=='loading'">
+				加载中...
+			</view>
+			<view class="loading" v-if="loadImage=='err'" @click="getImage()">
+				加载失败点击刷新
+			</view>
+			<input class="codeInput" type="text" v-model="code" placeholder="请输入图片中的验证内容" />
+			<view class="flex">
+				<u-button class="buttom" size='medium' @click="getImage()">刷新</u-button>
+				<u-button class="buttom" size='medium' type="primary" @click="openVerify">确定</u-button>
+			</view>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	import {
+		verify_code,
+		verify
+	} from '@/api/login.js';
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
+	export default {
+		props: {
+			show: {
+				type: Boolean,
+				default: false,
+			},
+			phone: {
+				type: Number|String,
+				default: '',
+			},
+			loginType: {
+				type: String,
+				default: '',
+			}
+		},
+
+		data() {
+			return {
+				code: '',
+				image: '',
+				loadImage: "loading",
+				key: '',
+			}
+		},
+		computed: {
+			...mapState(['baseURL'])
+		},
+		methods: {
+			close() {
+				this.$emit("close")
+			},
+			async getImage() {
+				try {
+					this.loadImage = "loading";
+					let {
+						data: {
+							key
+						}
+					} = await verify_code();
+					this.key = key;
+					this.image = `${this.baseURL}/api/sms_captcha?key=${key}&time=${(new Date()).getTime()}`;
+
+				} catch (e) {
+					console.log(e, "err")
+					//TODO handle the exception
+				}
+			},
+			openVerify() {
+				const obj = this;
+				if(!obj.code){
+					uni.showToast({
+						title:"请输入图片中的内容"
+					})
+				}
+				verify({
+						key: obj.key,
+						phone: obj.phone,
+						type: obj.loginType,
+						code:obj.code
+					})
+					.then(({
+						data
+					}) => {
+						console.log(data, 'data')
+						uni.showToast({
+							title: '验证码已发送',
+							duration: 2000,
+							position: 'top',
+							icon: 'none'
+						});
+						obj.close();
+						obj.$emit("openCode")
+					})
+					.catch(err => {
+						obj.code="";
+						uni.showToast({
+							title: err.msg,
+							icon:"error"
+						});
+						obj.getImage();
+						console.log(err, 'err');
+					});
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		padding: 30rpx;
+
+		.codeImg {
+			width: 100%;
+			height: 130rpx;
+		}
+
+		.loading {
+			margin-top: 30rpx;
+			background-color: #e3e3e3;
+			border-radius: 10rpx;
+			overflow: hidden;
+			text-align: center;
+			line-height: 130rpx;
+			width: 660rpx;
+			height: 130rpx;
+			color: #999999;
+		}
+	}
+
+	.codeInput {
+		width: 100%;
+		height: 60rpx;
+		padding-bottom: 30rpx;
+		border-bottom: 1px solid #e3e3e3;
+		margin-top: 50rpx;
+		margin-bottom: 50rpx;
+	}
+</style>

+ 10 - 24
components/countDown/index.vue

@@ -1,16 +1,14 @@
 <template>
 	<view class="time" :style="justifyLeft">
-		<!-- 倒计时 -->
-		<text class="red" v-if="tipText.trim()">{{ tipText }}</text>
-		<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'" v-if="isDay === true">{{ day }}</text>
-		<text class="timeTxt red" :style="'color:'+colors" v-if="dayText">{{ dayText }}</text>
-		<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ hour }}</text>
-		<text class="timeTxt red" :style="'color:'+colors" v-if="hourText">{{ hourText }}</text>
-		<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'">{{ minute }}</text>
-		<text class="timeTxt red" :style="'color:'+colors" v-if="minuteText">{{ minuteText }}</text>
-		<text class="styleAll" :style="'background-color:'+ bgColor +';color:'+ colors +';'" v-if="isSecond === true">{{ second }}</text>
-		<text class="timeTxt red" :style="'color:'+colors" v-if="secondText">{{ secondText }}</text>
-		<slot name="bottom"></slot>
+		<text class="red" v-if="tipText">{{ tipText }}</text>
+		<text class="styleAll" v-if="isDay === true">{{ day }}</text>
+		<text class="timeTxt red" v-if="dayText">{{ dayText }}</text>
+		<text class="styleAll">{{ hour }}</text>
+		<text class="timeTxt red" v-if="hourText">{{ hourText }}</text>
+		<text class="styleAll">{{ minute }}</text>
+		<text class="timeTxt red" v-if="minuteText">{{ minuteText }}</text>
+		<text class="styleAll">{{ second }}</text>
+		<text class="timeTxt red" v-if="secondText">{{ secondText }}</text>
 	</view>
 </template>
 
@@ -50,18 +48,6 @@
 			isDay: {
 				type: Boolean,
 				default: true
-			},
-			isSecond: {
-				type: Boolean,
-				default: true
-			},
-			bgColor:{
-				type: String,
-				default: ""
-			},
-			colors:{
-				type: String,
-				default: ""
 			}
 		},
 		data: function() {
@@ -128,7 +114,7 @@
 		justify-content: center;
 	} 
 	.red{
-		color: var(--view-theme);
+		color: #fc4141;
 		margin: 0 4rpx;
 	}
 </style>

+ 0 - 292
components/couponListWindow/index.vue

@@ -1,292 +0,0 @@
-<template>
-	<view>
-		<!-- 优惠券下拉列表 -->
-		<view class='coupon-list-window' :class='[coupon.coupon==true?"on":"",coupon.goFrom==1?"cart":""]'>
-			<view v-if="coupon.count" class="nav acea-row row-around">
-				<view v-if="coupon.count[0]" :class="['acea-row', 'row-middle', coupon.type === 0 ? 'on' : '']" @click="setType(0)">通用券</view>
-				<view v-if="coupon.count[1]" :class="['acea-row', 'row-middle', coupon.type === 1 ? 'on' : '']" @click="setType(1)">品类券</view>
-				<view v-if="coupon.count[2]" :class="['acea-row', 'row-middle', coupon.type === 2 ? 'on' : '']" @click="setType(2)">商品券</view>
-				<view v-if="coupon.count[3]" :class="['acea-row', 'row-middle', coupon.type === 3 ? 'on' : '']" @click="setType(3)">品牌券</view>
-			</view>
-			<view class='title' v-else>优惠券<text class='iconfont icon-guanbi' @click='close'></text></view>
-			<view v-if="coupon.count" class="occupy"></view>
-			<scroll-view class="coupon-list" scroll-y="true">
-				<view class="coupon-list-inner" v-if="coupon.list.length">
-					<view class='item acea-row row-center-wrapper' v-for="(item,index) in coupon.list" @click="getCouponUser(index,item.id)"
-					 :key='index' :class="{svip: item.receive_type === 4}">
-					  <view class="moneyCon acea-row row-center-wrapper">
-							<view class='money acea-row row-column row-center-wrapper' :class='item.is_use && coupon.count?"moneyGray":""'>
-								<view><text v-if="item.coupon_type==1">¥</text><text class='num'>{{item.coupon_type==1?item.coupon_price:parseFloat(item.coupon_price)/10}}</text><text v-if="item.coupon_type==2">折</text></view>
-								<view class="pic-num" v-if="item.use_min_price > 0">满{{item.use_min_price}}元可用</view>
-								<view class="pic-num" v-else>无门槛券</view>
-							</view>
-						</view>
-						<view class='text'>
-							<view class='condition line2' :class="coupon.count?'':'order'">
-								<span class='line-title' :class='item.is_use && coupon.count?"gray":""' v-if='item.type===0'>通用劵</span>
-								<span class='line-title' :class='item.is_use && coupon.count?"gray":""' v-else-if='item.type===1'>品类券</span>
-								<span class='line-title' :class='item.is_use && coupon.count?"gray":""' v-else-if='item.type===2'>商品券</span>
-								<span class='line-title' :class='item.is_use && coupon.count?"gray":""' v-else>品牌券</span>
-								<image src='../../static/images/fvip.png' class="pic" v-if="item.receive_type===4"></image>
-								<span class='name'>{{item.title}}</span>
-							</view>
-							<!-- #ifdef H5 || APP-PLUS -->
-							<slot name="center" :item="item"></slot>
-							<!-- #endif -->
-							<!-- #ifdef MP -->
-							<slot name="center{{index}}"></slot>
-							<!-- #endif -->
-							<view class='data acea-row row-between-wrapper'>
-								<view v-if="item.coupon_time && !openType">领取后{{item.coupon_time}}天内可用</view>
-								<view v-else>{{ item.start_time ? item.start_time + "-" : ""}}{{ item.end_time }}</view>
-								<view v-if="coupon.count">
-									<view class='bnt gray' v-if="item.is_use">{{item.use_title || '已领取'}}</view>
-									<view class='bnt bg-color' v-else>{{coupon.statusTile || '立即领取'}}</view>
-								</view>
-								<view v-else class="orderCou">
-									<view class="iconfont icon-xuanzhong11" :class="item.receive_type === 4?'svip':'font-num'" v-if="item.is_use"></view>
-									<view class="iconfont icon-weixuan" v-else></view>
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-				<!-- 无优惠券 -->
-				<view class='pictrue' v-else>
-					<image :src="imgHost + '/statics/images/noCoupon.png'"></image>
-				</view>
-			</scroll-view>
-		</view>
-		<view class='mask' catchtouchmove="true" :hidden='coupon.coupon==false' @click='close'></view>
-	</view>
-</template>
-
-<script>
-	import {
-		setCouponReceive
-	} from '@/api/api.js';
-	import {HTTP_REQUEST_URL} from '@/config/app';
-	export default {
-		props: {
-			//打开状态 0=领取优惠券,1=使用优惠券
-			openType: {
-				type: Number,
-				default: 0,
-			},
-			coupon: {
-				type: Object,
-				default: function() {
-					return {};
-				}
-			}
-		},
-		data() {
-			return {
-				type: 0,
-				imgHost:HTTP_REQUEST_URL
-			};
-		},
-		methods: {
-			close: function() {
-				this.$emit('ChangCouponsClone');
-				this.type = 0;
-			},
-			getCouponUser: function(index, id) {
-				let that = this;
-				let list = that.coupon.list;
-				if (list[index].is_use == true && this.openType == 0) return true;
-				switch (this.openType) {
-					case 0:
-						//领取优惠券
-						setCouponReceive(id).then(res => {
-							that.$emit('ChangCouponsUseState', index);
-							that.$util.Tips({
-								title: "领取成功"
-							});
-							// that.$emit('ChangCoupons', list[index]);
-						}).catch(err => {
-							uni.showToast({
-								title: err,
-								icon: 'none'
-							});
-						})
-						break;
-					case 1:
-						that.$emit('ChangCoupons', index);
-						break;
-				}
-			},
-			setType: function(type) {
-				this.type = type;
-				this.$emit('tabCouponType', type);
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.orderCou{
-		position: absolute;
-		right: 20rpx;
-		top:50%;
-		margin-top: -20rpx;
-	}
-	.orderCou .iconfont{
-		font-size: 40rpx;
-	}
-	.orderCou .svip{
-		color:#EDBB75;
-	}
-	.coupon-list .item .text{
-		position: relative;
-	}
-	.coupon-list .item .text .condition.order{
-		width: 350rpx;
-	}
-	.coupon-list-window .coupon-list .text .condition .pic {
-		width: 30rpx;
-		height: 30rpx;
-		margin-right: 10rpx;
-		vertical-align: middle;
-	}
-
-	.coupon-list-window .coupon-list .text .condition .name {
-		vertical-align: middle;
-		font-size: 26rpx;
-		font-weight: 500;
-	}
-
-	.coupon-list-window {
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		background-color: #FFFFFF;
-		border-radius: 16rpx 16rpx 0 0;
-		z-index: 555;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-	}
-
-	.coupon-list-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-	
-	.coupon-list-window.cart{
-		padding-bottom: 150rpx;
-		padding-bottom: calc(150rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		padding-bottom: calc(150rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-	}
-
-	.coupon-list-window .title {
-		height: 124rpx;
-		width: 100%;
-		text-align: center;
-		line-height: 124rpx;
-		font-size: 32rpx;
-		font-weight: bold;
-		position: relative;
-	}
-
-	.coupon-list-window .title .iconfont {
-		position: absolute;
-		right: 30rpx;
-		top: 50%;
-		transform: translateY(-50%);
-		font-size: 35rpx;
-		color: #8a8a8a;
-		font-weight: normal;
-	}
-
-	.coupon-list-window .coupon-list {
-		height: 721rpx;
-		padding: 0;
-		margin: 0;
-		padding-bottom: constant(safe-area-inset-bottom); ///兼容 IOS<11.2/
-		padding-bottom: env(safe-area-inset-bottom); ///兼容 IOS>11.2/
-	}
-	
-	.coupon-list-window .coupon-list-inner {
-		padding: 18rpx 30rpx 0 30rpx;
-		overflow: hidden;
-	}
-
-	.coupon-list-window .pictrue {
-		width: 414rpx;
-		height: 336rpx;
-		margin: 192rpx auto 243rpx auto;
-	}
-
-	.coupon-list-window .pictrue image {
-		width: 100%;
-		height: 100%;
-	}
-
-	.pic-num {
-		color: #fff;
-		font-size: 24rpx;
-	}
-
-	.line-title {
-		width: 70rpx;
-		height: 32rpx !important;
-		padding: 0 10rpx;
-		line-height: 30rpx;
-		text-align: center;
-		background: var(--view-minorColorT);
-		border: 1px solid var(--view-theme);
-		opacity: 1;
-		border-radius: 20rpx;
-		font-size: 18rpx;
-		color: var(--view-theme);
-		margin-right: 12rpx;
-		box-sizing: border-box;
-	}
-
-	.line-title.gray {
-		border-color: #C1C1C1!important;
-		color: #C1C1C1!important;
-		background-color: #F7F7F7!important;
-	}
-
-	.nav {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 106rpx;
-		border-bottom: 2rpx solid #F5F5F5;
-		border-top-left-radius: 16rpx;
-		border-top-right-radius: 16rpx;
-		background-color: #FFFFFF;
-		font-size: 30rpx;
-		color: #999999;
-	}
-
-	.nav .acea-row {
-		border-top: 5rpx solid transparent;
-		border-bottom: 5rpx solid transparent;
-	}
-
-	.nav .acea-row.on {
-		border-bottom-color: var(--view-theme);
-		color: #282828;
-	}
-
-	.nav .acea-row:only-child {
-		border-bottom-color: transparent;
-	}
-
-	.occupy {
-		height: 106rpx;
-	}
-
-	.coupon-list .item {
-		margin-bottom: 18rpx;
-		box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
-	}
-
-	.coupon-list .item .money {
-		font-weight: normal;
-	}
-</style>

+ 0 - 248
components/couponWindow/index.vue

@@ -1,248 +0,0 @@
-<template>
-	<view :style="colorStyle">
-		<!-- 优惠券弹窗 -->
-		<view class='coupon-window' :class='window==true?"on":""'>
-			<image class="co-bag" :src="imgHost + '/statics/images/co-bag.png'" mode=""></image>
-			<view class='couponWinList'>
-				<view class='item acea-row row-between-wrapper' v-for="(item,index) in couponList" :key="index">
-					<view class='money font-color'><text v-if="item.coupon_type==1">¥</text><text class='num'>{{item.coupon_type==1?item.coupon_price:parseFloat(item.coupon_price)/10}}</text><text v-if="item.coupon_type==2">折</text></view>
-					<view class='text'>
-						<view v-if="item.coupon_type==1" class='name'>购物满{{item.use_min_price}}元减{{item.coupon_price}}元</view>
-						<view v-else class='name'>购物满{{item.use_min_price}}元打{{parseFloat(item.coupon_price)/10}}折</view>
-						<view v-if="item.coupon_time">领取后{{item.coupon_time}}天内可用</view>
-						<view v-else>{{item.start_time ? item.start_time+'-' : ''}}{{item.end_time === 0 ? '不限时': item.end_time}}</view>
-						<!-- #ifdef H5 || APP-PLUS -->
-						<slot name="bottom" :item="item"></slot>
-						<!-- #endif -->
-						<!-- #ifdef MP -->
-						<slot name="bottom{{index}}"></slot>
-						<!-- #endif -->
-					</view>
-				</view>
-			</view>
-			<view class='lid'>
-				<navigator hover-class='none' url='/pages/users/user_get_coupon/index' class='bnt'>立即领取</navigator>
-				<view class='iconfont icon-guanbi3' @click="close"></view>
-			</view>
-		</view>
-		<view class='mask' catchtouchmove="true" :hidden="window==false"></view>
-	</view>
-</template>
-
-<script>
-	import colors from "@/mixins/color";
-	import {HTTP_REQUEST_URL} from '@/config/app';
-	export default {
-		props: {
-			window: {
-				type: Boolean | String | Number,
-				default: false,
-			},
-			couponList: {
-				type: Array,
-				default: function() {
-					return []
-				},
-			},
-			couponImage: {
-				type: String,
-				default: '',
-			},
-		},
-		mixins: [colors],
-		data() {
-			return {
-				imgHost:HTTP_REQUEST_URL
-			};
-		},
-		methods: {
-			close:function(){
-			      this.$emit('onColse');
-			    }
-		}
-	}
-</script>
-
-
-<style scoped lang="scss">
-	.mask {
-		z-index: 9999;
-	}
-
-	.coupon-window {
-		width: 572rpx;
-		height: 760rpx;
-		position: fixed;
-		top: 20%;
-		z-index: 10000;
-		left: 50%;
-		margin-left: -286rpx;
-		transform: translate3d(0, -200%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-		border-radius: 30rpx 30rpx 0 0;
-		overflow-x: hidden;
-	}
-
-	.co-bag {
-		width: 100%;
-		height: 250rpx;
-		z-index: 33333;
-		top: -40rpx;
-		position: absolute;
-	}
-
-	.coupon-window:after {
-		width: 900rpx;
-		height: 650rpx;
-		position: absolute;
-		top: 0%;
-		left: 50%;
-		z-index: 11111;
-		margin-left: -450rpx;
-		content: '';
-		border-radius: 50% 50% 0 0;
-		background: var(--view-theme);
-	}
-
-	.coupon-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-
-	.coupon-window .couponWinList {
-		width: 480rpx;
-		margin: 157rpx 0 0 50rpx;
-		height: 340rpx;
-		overflow: auto;
-	}
-
-	.coupon-window .couponWinList .item {
-		width: 100%;
-		height: 120rpx;
-		background-color: #fff;
-		position: relative;
-		margin-bottom: 17rpx;
-		position: relative;
-		z-index: 99999;
-	}
-
-	.coupon-window .couponWinList .item .left {
-		border-right: 1px dashed #ccc;
-	}
-
-	.coupon-window .couponWinList .label {
-		width: 28rpx;
-		height: 64rpx;
-		display: block;
-		position: absolute;
-		top: 0;
-		right: 12rpx;
-	}
-
-	.coupon-window .couponWinList .item::after {
-		content: '';
-		position: absolute;
-		width: 18rpx;
-		height: 18rpx;
-		border-radius: 50%;
-		background-color: var(--view-theme);
-		left: 25.5%;
-		bottom: 0;
-		margin-bottom: -9rpx;
-	}
-
-	.coupon-window .couponWinList .item::before {
-		content: '';
-		position: absolute;
-		width: 18rpx;
-		height: 18rpx;
-		border-radius: 50%;
-		background-color: var(--view-theme);
-		left: 25.5%;
-		top: 0;
-		margin-top: -9rpx;
-	}
-
-	.coupon-window .couponWinList .item .money {
-		width: 130rpx;
-		text-align: center;
-		font-size: 26rpx;
-		font-weight: bold;
-	}
-
-	.coupon-window .couponWinList .item .min_money {
-		color: #ccc;
-		font-size: 18rpx;
-		text-align: center;
-	}
-
-	.coupon-window .couponWinList .item .money .num {
-		font-size: 40rpx;
-	}
-
-	.coupon-window .couponWinList .item .text {
-		width: 349rpx;
-		font-size: 22rpx;
-		color: #ccc;
-		padding: 0 29rpx;
-		box-sizing: border-box;
-	}
-
-	.coupon-window .couponWinList .item .text .image {
-		width: 32rpx;
-		height: 32rpx;
-		display: inline-block;
-		vertical-align: bottom;
-		margin-right: 10rpx;
-	}
-
-	.coupon-window .couponWinList .item .text .name {
-		font-size: 26rpx;
-		color: var(--view-priceColor);
-		font-weight: bold;
-		margin-bottom: 9rpx;
-		width: 250rpx;
-	}
-	.coupon-window .lid {
-		background: rgba(255,255,255,0.2);
-		width: 582rpx;
-		height: 224rpx;
-		position: fixed;
-		z-index: 22222;
-		left: 50%;
-		top: 0%;
-		margin: 424rpx 0 0 -296rpx;
-	}
-	
-	.coupon-window .lid:after {
-		width: 920rpx;
-		height: 280rpx;
-		position: absolute;
-		top: -100%;
-		left: 50%;
-		z-index: 22222;
-		margin-left: -460rpx;
-		content: '';
-		border-radius: 0 0 50% 50%;
-		background: var(--view-theme);
-	}
-	
-	.coupon-window .lid .bnt {
-		font-size: 29rpx;
-		width: 440rpx;
-		height: 80rpx;
-		border-radius: 40rpx;
-		background: linear-gradient(90deg, #FFCA52 0%, #FE960F 100%);
-		text-align: center;
-		line-height: 80rpx;
-		font-weight: bold;
-		margin: 98rpx auto 0 auto;
-		color: #fff;
-	}
-	
-	.coupon-window .lid .iconfont {
-		color: #fff;
-		font-size: 60rpx;
-		text-align: center;
-		margin-top: 87rpx;
-	}
-</style>

+ 0 - 150
components/cusPreviewImg/index.vue

@@ -1,150 +0,0 @@
-<template>
-	<!-- 属性规格放大图轮播 -->
-	<view class="previewImg" v-if="showBox" @touchmove.stop.prevent>
-		<view class="mask" @click="close">
-			<swiper @change="changeSwiper" class="mask-swiper" :current="currentIndex" :circular="circular" :duration="duration">
-				<swiper-item v-for="(src, i) in list" :key="i" class="flex flex-column justify-center align-center">
-					<image class="mask-swiper-img" :src="src.image" mode="widthFix" />
-					<view class="mask_sku">
-						<text class="sku_name">{{src.suk}}</text>
-						<text class="sku_price">¥{{src.price}}</text>
-						<!-- #ifdef H5 || APP-PLUS -->
-						<slot name="info" :item="src"></slot>
-						<!-- #endif -->
-						<!-- #ifdef MP -->
-						<slot name="info{{i}}"></slot>
-						<!-- #endif -->
-					</view>
-				</swiper-item>
-			</swiper>
-		</view>
-		<view class="pagebox" v-if="list.length>0">{{ Number(currentIndex) + 1 }} / {{ list.length }}</view>
-		<!-- #ifndef MP -->
-		<!-- <text class="iconfont icon-fenxiang share_btn" @click="shareFriend()"></text> -->
-		<!-- #endif -->
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'cus-previewImg',
-		props: {
-			list: {
-				type: Array,
-				required: true,
-				default: () => {
-					return [];
-				}
-			},
-			circular: {
-				type: Boolean,
-				default: true
-			},
-			duration: {
-				type: Number,
-				default: 500
-			}
-		},
-		data() {
-			return {
-				currentIndex: 0,
-				showBox: false
-			};
-		},
-		watch: {
-			list(val) {
-				// console.log('图片预览', val)
-			}
-		},
-		methods: {
-			// 左右切换
-			changeSwiper(e) {
-				this.currentIndex = e.target.current;
-				this.$emit('changeSwitch',e.target.current)
-			},
-			open(current) {
-				if (!current || !this.list.length) return;
-				this.currentIndex = this.list.map((item)=>item.suk).indexOf(current);
-				this.showBox = true;
-			},
-			close() {
-				this.showBox = false;
-			}
-			// shareFriend(){
-			// 	this.$emit('shareFriend')
-			// }
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-@mixin full {
-	width: 100%;
-	height: 100%;
-}
-
-.previewImg {
-	position: fixed;
-	top: 0;
-	left: 0;
-	z-index: 300;
-	@include full;
-	.mask {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		background-color: #000;
-		opacity: 1;
-		z-index: 8;
-		@include full;
-		&-swiper {
-			@include full;
-			&-img {
-				width: 100%;
-			}
-		}
-	}
-	.pagebox{
-		position: absolute;
-		width: 100%;
-		bottom: 20rpx;
-		z-index: 300;
-		color: #fff;
-		text-align: center;
-	}
-}
-.mask_sku{
-	color: #fff;
-	max-width: 80%;
-	z-index: 300;
-	text-align: center;
-	display: flex;
-	flex-direction: column;
-	align-items: center;
-	margin-top: 30rpx;
-	.sku_name{
-		font-size: 12px;
-		border: 1px solid #fff;
-		padding: 10rpx 30rpx 10rpx;
-		border-radius: 40px;
-		box-sizing: border-box;
-	}
-	.sku_price{
-		padding-top: 10px;
-	}
-}
-.font12{
-	font-size: 24rpx;
-}
-.share_btn{
-	position: absolute;
-	top:70rpx;
-	right:50rpx;
-	font-size: 40rpx;
-	color:#fff;
-	z-index: 300;
-}
-.flex-column{flex-direction: column;}
-.justify-center {justify-content: center;}
-.align-center {align-items: center;}
-</style>

+ 0 - 98
components/customForm/index.vue

@@ -1,98 +0,0 @@
-<template>
-	<!-- 自定义组件 -->
-	<view class='wrapper card' v-if="customForm && customForm.length && isShow">
-		<view class='item acea-row row-between' v-for="(item,index) in customForm" :key="index" v-if="(item.value && ['uploadPicture','dateranges'].indexOf(item.name) == -1) || (item.value.length && ['uploadPicture','dateranges'].indexOf(item.name) != -1)">
-			<view class="title">{{item.titleConfig.value}}:</view>
-			<view v-if="item.name == 'uploadPicture'" class='conter'>
-				<view class='pictrue' v-for="(img,indexn) in item.value" :key="indexn">
-					<image :src='img' mode="aspectFill" @click='getCustomForm(index,indexn)'></image>
-				</view>
-			</view>
-			<view v-else-if="item.name == 'dateranges'" class="conter">
-			   <text v-if="item.value.length">{{item.value[0]+'/'+item.value[1]}}</text>
-			</view>
-			<view v-else class='conter'>{{item.value}}</view>
-		</view>
-		<slot name="bottom"></slot>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'customForm',
-		props: {
-			customForm:{
-				type: Array,
-				default: () => []
-			}
-		},
-		data() {
-			return {
-				isShow:0
-			};
-		},
-		watch: {
-			customForm (value) {
-				if(value && value.length){
-					value.forEach((item)=>{
-						if(item.value){
-							return this.isShow = 1
-						}
-					})
-				}
-			}
-		},
-		created() {},
-		mounted() {},
-		methods: {
-			getCustomForm: function(index,indexn) {
-				uni.previewImage({
-					urls: this.customForm[index].value,
-					current: this.customForm[index].value[indexn]
-				});
-			},
-		}
-	};
-</script>
-
-<style lang="scss">
-	.wrapper{
-		    background-color: #fff;
-		    margin-top: 6px;
-		    padding: 15px;
-	}
-	.wrapper .item {
-		font-size: 28rpx;
-		color: #282828;
-	}
-	
-	.wrapper .item .title{
-		width: 200rpx;
-	}
-	
-	.wrapper .item~.item {
-		margin-top: 20rpx;
-		white-space: normal;
-		word-break: break-all;
-		word-wrap: break-word;
-	}
-	
-	.wrapper .item .conter {
-		color: #868686;
-		width: 460rpx;
-		display: flex;
-		flex-wrap: nowrap;
-		justify-content: flex-end;
-		text-align: right;
-		.pictrue{
-			width: 80rpx;
-			height: 80rpx;
-			margin-left: 6rpx;
-			image{
-				width: 100%;
-				height: 100%;
-				border-radius: 6rpx;
-			}
-		}
-	}
-</style>

+ 0 - 193
components/d_goodList/index.vue

@@ -1,193 +0,0 @@
-<template>
-	<!-- 分类二商品列表 -->
-	<view class="goodsList">
-		<view class="item" v-for="(item,index) in tempArr" :key='index' @click="goDetail(item)">
-			<view class="pictrue">
-				<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
-				<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
-				<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
-				<image :src="item.recommend_image" mode="aspectFill" v-if="item.recommend_image"></image>
-				<image :src="item.image" mode="aspectFill" v-else></image>
-			</view>
-			<view class="text line2">{{item.store_name}}</view>
-			<!-- #ifdef H5 || APP-PLUS -->
-			<slot name="center" :item="item"></slot>
-			<!-- #endif -->
-			<!-- #ifdef MP -->
-			<slot name="center{{index}}"></slot>
-			<!-- #endif -->
-			<view class="bottom acea-row row-between-wrapper">
-				<view class="sales acea-row row-middle">
-					<view class="money font-color"><text>¥</text>{{item.price}}</view>
-					<view>已售 {{item.sales}}</view>
-				</view>
-				<view v-if="item.stock>0">
-				    <view class="bnt acea-row row-center-wrapper" v-if="(item.activity && (item.activity.type === '1' || item.activity.type === '2' || item.activity.type === '3')) || item.product_type!=0 || item.custom_form.length">立即购买</view>
-					<view v-else>
-						<!-- 多规格 -->
-						<!-- <view class="bnt acea-row row-center-wrapper" @click.stop="goCartDuo(item)" v-if="item.spec_type">
-							加入购物车
-							<text class="num" v-if="isLogin && item.cart_num">{{item.cart_num}}</text>
-						</view> -->
-						<uni-badge class="uni-badge-left-margin" :text="item.cart_num" absolute="rightTop" v-if="item.spec_type">
-						  <!-- 多规格 -->
-						  <view class="bnt acea-row row-center-wrapper" @click.stop="goCartDuo(item)">
-						  	选规格
-						  </view>
-						</uni-badge>
-						<!-- 单规格 -->
-						<view v-if="!item.spec_type && !item.cart_num">
-							<view v-if="item.cart_button">
-								<view class="bnt acea-row row-center-wrapper end" v-if="item.is_presale_product && (item.presale_pay_status == 1 || item.presale_pay_status == 3)">>
-									{{item.presale_pay_status === 1?'未开始':'已结束'}}
-								</view>
-								<view v-else class="bnt acea-row row-center-wrapper" @click.stop="goCartDan(item,index)">加入购物车</view>
-							</view>
-							<view v-else class="bnt acea-row row-center-wrapper">立即购买</view>
-						</view>
-						<view class="cart acea-row row-middle" v-if="!item.spec_type && item.cart_num">
-							<view class="pictrue iconfont icon-jianhao" @click.stop="CartNumDes(index,item)"></view>
-							<view class="num">{{item.cart_num}}</view>
-							<view class="pictrue iconfont icon-jiahao" @click.stop="CartNumAdd(index,item)"></view>
-						</view>
-					</view>
-				</view>
-				<view class="bnt end acea-row row-center-wrapper" v-else>已售罄</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'd_goodList',
-		props: {
-			dataConfig: {
-				type: Object,
-				default: () => {}
-			},
-			tempArr:{
-				type: Array,
-				default: () => []
-			},
-			isLogin:{
-				type: Boolean,
-				default:false
-			}
-		},
-		data() {
-			return {
-			};
-		},
-		created() {},
-		mounted() {},
-		methods: {
-			goDetail(item){
-				this.$emit('detail',item);
-			},
-			goCartDuo(item){
-				this.$emit('gocartduo',item);
-			},
-			goCartDan(item,index){
-				this.$emit('gocartdan',item,index);
-			},
-			CartNumDes(index,item){
-				this.$emit('ChangeCartNumDan', false,index,item);
-			},
-			CartNumAdd(index,item){
-				if(item.is_limit && item.cart_num>=item.limit_num){
-					this.$util.Tips({
-					  title: "购买最多不能超过"+item.limit_num
-					});
-				}else{
-					this.$emit('ChangeCartNumDan', true,index,item);
-				}
-			}
-		}
-	};
-</script>
-
-<style lang="scss">
-	.goodsList{
-		padding: 0 30rpx;
-		.item{
-			width: 100%;
-			box-sizing: border-box;
-			margin-bottom: 63rpx;
-			.pictrue{
-				width: 100%;
-				height: 290rpx;
-				border-radius: 16rpx;
-				position: relative;
-				image{
-					width: 100%;
-					height: 100%;
-					border-radius: 16rpx;
-				}
-			}
-			.text{
-				font-size:30rpx;
-				font-family:PingFang SC;
-				font-weight:bold;
-				color: #282828;
-				margin: 20rpx 0;
-			}
-			.bottom{
-				.sales{
-					font-size: 22rpx;
-					color: #8E8E8E;
-					.money{
-						font-size: 42rpx;
-						font-weight: bold;
-						margin-right: 16rpx;
-						text{
-							font-size: 28rpx;
-						}
-					}
-				}
-				.cart{
-					height: 56rpx;
-					.pictrue{
-						color: var(--view-theme);
-						font-size:46rpx;
-						width: 50rpx;
-						height: 50rpx;
-						text-align: center;
-						line-height: 50rpx;
-					}
-					.num{
-						font-size: 30rpx;
-						color: #282828;
-						font-weight: bold;
-						width: 80rpx;
-						text-align: center;
-					}
-				}
-				.bnt{
-					padding: 0 30rpx;
-					height: 55rpx;
-					background:var(--view-theme);
-					border-radius:42rpx;
-					font-size: 26rpx;
-					color: #fff;
-					position: relative;
-					&.end{
-						background:rgba(203,203,203,1);
-					}
-					.num{
-						min-width: 14rpx;
-						background-color: #fff;
-						color: var(--view-theme);
-						border-radius: 15px;
-						position: absolute;
-						right: -14rpx;
-						top: -15rpx;
-						font-size: 20rpx;
-						padding: 0 10rpx;
-						border: 1px solid var(--view-theme);
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 340
components/eidtUserModal/index.vue

@@ -1,340 +0,0 @@
-<template>
-	<view :style="colorStyle">
-		<view class="product-window" :class="{'on':isShow}">
-			<view class="iconfont icon-guanbi" @click="closeAttr"></view>
-			<view class="mp-data">
-				<image :src="mpData.site_logo" mode=""></image>
-				<text class="mp-name">{{mpData.site_name || ''}} 申请</text>
-			</view>
-			<view class="trip-msg">
-				<view class="title">
-					获取您的昵称、头像
-				</view>
-				<view class="trip">
-					提供具有辨识度的用户中心界面
-				</view>
-			</view>
-			<form @submit="formSubmit">
-				<view class="edit">
-					<view class="avatar edit-box">
-						<view class="left">
-							<view class="head">头像</view>
-							<!-- <image :src="userInfo.avatar || defaultAvatar" mode=""></image> -->
-							<view class="avatar-box" v-if="!mp_is_new" @click.stop='uploadpic'>
-								<image :src="userInfo.avatar || defHead"></image>
-							</view>
-							<button v-else class="avatar-box" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
-								<image :src="userInfo.avatar || defHead"></image>
-							</button>
-						</view>
-						<!-- <view class="iconfont icon-xiangyou"></view> -->
-					</view>
-					<view class="nickname edit-box">
-						<view class="left">
-							<view class="head">昵称</view>
-							<view class='input'><input type='nickname' :always-embed="true" :adjust-position="true" cursor-spacing="30" placeholder-class="pl-sty"
-									placeholder="请输入昵称" name='nickname' :maxlength="16"
-									:value='userInfo.nickname'></input>
-							</view>
-						</view>
-						<!-- <view class="iconfont icon-xiangyou"></view> -->
-					</view>
-
-				</view>
-
-				<view class="bottom">
-					<button class="save" formType="submit" :class="{'open': userInfo.avatar}">
-						保存
-					</button>
-				</view>
-			</form>
-		</view>
-		<canvas canvas-id="canvas" v-if="canvasStatus"
-			:style="{width: canvasWidth + 'px', height: canvasHeight + 'px',position: 'absolute',left:'-100000px',top:'-100000px'}"></canvas>
-		<view class="mask" @touchmove.prevent v-if="isShow" @click="closeAttr"></view>
-	</view>
-	</uni-popup>
-
-</template>
-
-<script>
-	import colors from "@/mixins/color";
-	import Cache from '@/utils/cache';
-	import {
-		userEdit,
-	} from '@/api/user.js';
-	import {
-		copyRight
-	} from '@/api/api.js';
-	export default {
-		mixins: [colors],
-		props: {
-			isShow: {
-				type: Boolean,
-				value: false
-			}
-		},
-		data() {
-			return {
-				defHead: require('@/static/images/def_avatar.png'),
-				mp_is_new: this.$Cache.get('MP_VERSION_ISNEW') || false,
-				userInfo: {
-					avatar: '',
-					nickname: '',
-				},
-				mpData: {
-					site_logo: '',
-					site_name: ''
-				},
-				canvasStatus: false,
-				configData: this.$Cache.get('BASIC_CONFIG')
-			};
-		},
-		mounted() {
-			try{
-				let MPSiteData = uni.getStorageSync('MPSiteData');
-				if (MPSiteData) {
-					this.mpData = JSON.parse(MPSiteData);
-				} else{
-					this.getCopyRight();
-				}
-			}catch(e){
-				//TODO handle the exception
-			}
-		},
-		methods: {
-			getCopyRight(){
-				copyRight().then(res => {
-					let { site_logo, site_name } = res.data;
-					this.mpData.site_logo = site_logo;
-					this.mpData.site_name = site_name;
-					uni.setStorageSync('MPSiteData', JSON.stringify(this.mpData));
-				}).catch(err => {
-					return this.$util.Tips({
-						title: err.msg
-					});
-				});
-			},
-			/**
-			 * 上传文件
-			 * 
-			 */
-			uploadpic: function() {
-				let that = this;
-				this.canvasStatus = true
-				that.$util.uploadImageChange('upload/image', (res) => {
-					let userInfo = that.userInfo;
-					if (userInfo !== undefined) {
-						that.userInfo.avatar = res.data.url;
-					}
-					this.canvasStatus = false
-				}, (res) => {
-					this.canvasStatus = false
-				}, (res) => {
-					this.canvasWidth = res.w
-					this.canvasHeight = res.h
-				});
-			},
-			// 微信头像获取
-			onChooseAvatar(e) {
-				const {
-					avatarUrl
-				} = e.detail
-				this.$util.uploadImgs('upload/image', avatarUrl, (res) => {
-					this.userInfo.avatar = res.data.url
-				}, (err) => {
-					console.log(err)
-				})
-			},
-			closeAttr: function() {
-				this.$emit('closeEdit');
-			},
-			/**
-			 * 提交修改
-			 */
-			formSubmit(e) {
-				let that = this
-				if (!this.userInfo.avatar) return that.$util.Tips({
-					title: '请上传头像'
-				});
-				if (!e.detail.value.nickname) return that.$util.Tips({
-					title: '请输入昵称'
-				});
-				this.userInfo.nickname = e.detail.value.nickname
-				userEdit(this.userInfo).then(res => {
-					this.$emit('editSuccess')
-					return that.$util.Tips({
-						title: res.msg,
-						icon: 'success'
-					}, {
-						tab: 3,
-						url: this.configData.wechat_auth_switch ? 2 : 1
-					});
-				}).catch(msg => {
-					return that.$util.Tips({
-						title: msg || '保存失败'
-					});
-				});
-			}
-		}
-	}
-</script>
-<style>
-	.pl-sty {
-		color: #999999;
-		font-size: 30rpx;
-	}
-</style>
-<style scoped lang="scss">
-	.product-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-
-	.mask {
-		z-index: 100;
-	}
-
-	.product-window {
-		position: fixed;
-		bottom: 0;
-		width: 100%;
-		left: 0;
-		background-color: #fff;
-		z-index: 1000;
-		border-radius: 20rpx 20rpx 0 0;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-		padding: 38rpx 40rpx;
-		padding-bottom: 80rpx;
-		padding-bottom: calc(80rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		padding-bottom: calc(80rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-
-		.icon-guanbi {
-			position: absolute;
-			top: 30rpx;
-			right: 30rpx;
-			font-size: 24rpx;
-			font-weight: bold;
-			color: #999;
-			padding: 10rpx;
-		}
-
-		.mp-data {
-			display: flex;
-			align-items: center;
-			margin-bottom: 30rpx;
-
-			.mp-name {
-				font-size: 28rpx;
-				font-weight: bold;
-				color: #000000;
-			}
-
-			image {
-				width: 48rpx;
-				height: 48rpx;
-				border-radius: 50%;
-				margin-right: 16rpx;
-			}
-		}
-
-		.trip-msg {
-			padding-bottom: 32rpx;
-			border-bottom: 1px solid #F5F5F5;
-
-			.title {
-				font-size: 30rpx;
-				font-weight: bold;
-				color: #000;
-				margin-bottom: 6rpx;
-			}
-
-			.trip {
-				font-size: 26rpx;
-				color: #777777;
-			}
-		}
-
-		.edit {
-			border-bottom: 1px solid #F5F5F5;
-
-			.avatar {
-				border-bottom: 1px solid #F5F5F5;
-			}
-
-			.nickname {
-				.input {
-					width: 100%;
-
-				}
-
-				input {
-					height: 80rpx;
-				}
-			}
-
-			.edit-box {
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-				font-size: 30rpx;
-				padding: 22rpx 0;
-
-				.left {
-					display: flex;
-					align-items: center;
-					flex: 1;
-
-					.head {
-						color: rgba(0, 0, 0, 0.9);
-						white-space: nowrap;
-						margin-right: 60rpx;
-					}
-
-					button {
-						flex: 1;
-						display: flex;
-						align-items: center;
-					}
-				}
-
-				image {
-					width: 80rpx;
-					height: 80rpx;
-					border-radius: 6rpx;
-				}
-			}
-
-			.icon-xiangyou {
-				color: #cfcfcf;
-			}
-		}
-
-		.bottom {
-			display: flex;
-			align-items: center;
-			justify-content: center;
-
-			.save {
-				border: 1px solid #F5F5F5;
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				width: 368rpx;
-				height: 80rpx;
-				border-radius: 12rpx;
-				margin-top: 52rpx;
-				background-color: #F5F5F5;
-				color: #ccc;
-				font-size: 30rpx;
-				font-weight: bold;
-			}
-
-			.save.open {
-				border: 1px solid #fff;
-				background-color: var(--view-theme);
-				color: #fff;
-			}
-		}
-	}
-</style>

File diff suppressed because it is too large
+ 18 - 0
components/empty.vue


+ 2 - 15
components/emptyPage.vue

@@ -1,14 +1,11 @@
 <template>
-	<!-- 无数据时显示 -->
 	<view class="empty-box">
-		<image :src="imgHost + '/statics/images/empty-box.png'"></image>
+		<image src="/static/images/empty-box.png"></image>
 		<view class="txt">{{title}}</view>
-		<slot name="bottom"></slot>
 	</view>
 </template>
 
 <script>
-	import {HTTP_REQUEST_URL} from '@/config/app';
 	export default{
 		props: {
 			title: {
@@ -16,11 +13,6 @@
 				default: '暂无记录',
 			},
 		},
-		data(){
-			return{
-				imgHost:HTTP_REQUEST_URL
-			}
-		}
 	}
 	
 </script>
@@ -31,12 +23,7 @@
 		flex-direction: column;
 		justify-content: center;
 		align-items: center;
-		width: 690rpx;
-		height: 760rpx;
-		margin: 30rpx auto;
-		background: #FFFFFF;
-		border-radius: 14rpx;
-		background: #fff;
+		margin-top: 200rpx;
 		image{
 			width: 414rpx;
 			height: 240rpx;

+ 0 - 185
components/ewcomerPop/index.vue

@@ -1,185 +0,0 @@
-<template>
-	<view :style="colorStyle">
-		<image :src="imgHost+'/statics/images/header.png'" mode="" class="img"></image>
-		<view class="tipaddress">
-			<view class="title">{{fromActive == 1?'激活送好礼':'新人大礼包'}}</view>
-			<view class="list">
-				<view class="list-img acea-row row-between-wrapper" :style="{backgroundImage:'url('+imgHost+'/statics/images/box1.png'+')'}" v-if="comerGift.product_count>0 && fromActive == 0">
-				  <view class="left acea-row row-center-wrapper">
-						<image :src="imgHost+'/statics/images/vip.png'" mode=""></image>
-					</view>
-					<view class="right">新人专享价商品</view>
-				</view>
-				<view class="list-img acea-row row-between-wrapper" :style="{backgroundImage:'url('+imgHost+'/statics/images/box1.png'+')'}" v-if="comerGift.first_order_discount>0 && fromActive == 0">
-          <view class="left">
-            {{parseFloat(comerGift.first_order_discount)/10 || 10}}<text class="text">折</text>
-          </view>
-          <view class="right">新人首单优惠</view>
-        </view>
-				<view class="list-img acea-row row-between-wrapper" :style="{backgroundImage:'url('+imgHost+'/statics/images/box1.png'+')'}" v-if="comerGift.register_give_integral>0">
-				  <view class="left">{{comerGift.register_give_integral}}</view>
-				  <view class="right">新人赠送积分</view>
-				</view>
-				<view class="list-img acea-row row-between-wrapper" :style="{backgroundImage:'url('+imgHost+'/statics/images/box1.png'+')'}" v-if="comerGift.register_give_money>0">
-				  <view class="left">{{comerGift.register_give_money}}<text class="text">元</text></view>
-				  <view class="right">新人赠送余额</view>
-				</view>
-				<view class="list-img acea-row row-between-wrapper" :style="{backgroundImage:'url('+imgHost+'/statics/images/box1.png'+')'}" v-if="comerGift.coupon_count>0" v-for="(item,index) in comerGift.register_give_coupon" :key="index">
-				   <view class="left">
-						 <text v-if="item.coupon_type==1">{{item.coupon_price.toString().split(".")[0]}}</text>
-						 <text class="nums"
-						 	v-if="item.coupon_price.toString().split('.').length>1 && item.coupon_type==1">.{{item.coupon_price.toString().split(".")[1]}}</text>
-						 <text v-if="item.coupon_type==2">{{parseFloat(item.coupon_price)/10}}</text>
-						 <text class="text">{{item.coupon_type==1?'元':'折'}}</text>
-				   </view>
-				   <view class="right">优惠券</view>
-				</view>
-			</view>
-			<view class="btn" @click="accept">
-				立即收下
-			</view>
-		</view>
-		<view class="mark"></view>
-	</view>
-</template>
-
-<script>
-	import {
-		HTTP_REQUEST_URL
-	} from '@/config/app';
-	import colors from '@/mixins/color';
-	export default {
-		mixins: [colors],
-		props:{
-			comerGift: {
-				type: Object,
-				default: function() {
-					return {}
-				},
-			},
-			fromActive: {
-				type: Number,
-				default: 0
-			}
-		},
-		data() {
-			return {
-				imgHost: HTTP_REQUEST_URL,
-			};
-		},
-		methods:{
-			accept(){
-				this.$emit('comerPop')
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.img {
-		position: fixed;
-		top: 162rpx;
-		left: 9%;
-		width: 590rpx;
-		height: 294rpx;
-		z-index: 100;
-
-	}
-
-	.tipaddress {
-		position: fixed;
-		left: 13%;
-		top: 25%;
-		width: 538rpx;
-		height: 650rpx;
-		background-color: var(--view-theme);
-		border-radius: 10rpx;
-		z-index: 100;
-		text-align: center;
-		
-		.title{
-			color: #fff;
-			font-size: 50rpx;
-			margin-top: 32rpx;
-			margin-bottom: 18rpx;
-		}
-
-		.goods-img {
-			width: 258rpx;
-			height: 52rpx;
-			margin-top: 50rpx;
-
-		}
-
-		.list {
-			height: 370rpx;
-			overflow-x: hidden;
-			overflow-y: auto;
-
-			.list-img {
-				margin-top: 14rpx;
-				margin-left: 32rpx;
-				width: 474rpx;
-				height: 124rpx;
-				background-repeat: no-repeat;
-				background-size: 100% 100%;
-
-				.left {
-					width: 144rpx;
-					font-size: 48rpx;
-					font-weight: 500;
-					color: var(--view-theme);
-					
-					image{
-						width: 72rpx;
-						height: 72rpx;
-						display: block;
-					}
-
-					.text {
-						font-size: 24rpx;
-					}
-					
-					.nums{
-						font-size: 30rpx;
-					}
-				}
-
-				.right {
-					width: 328rpx;
-					font-size: 28rpx;
-					font-weight: 500;
-					color: var(--view-theme);
-					text-align: left;
-					padding-left: 50rpx;
-				}
-			}
-		}
-
-
-		.btn {
-			width: 474rpx;
-			height: 78rpx;
-			background: linear-gradient(90deg, #FFCA52 0%, #FE960F 100%);
-			border-radius: 39rpx;
-			font-size: 30rpx;
-			font-weight: 500;
-			color: #FFFFFF;
-			line-height: 78rpx;
-			text-align: center;
-			margin-left: 32rpx;
-			margin-top: 48rpx;
-		}
-
-	}
-
-	.mark {
-		position: fixed;
-		top: 0;
-		left: 0;
-		bottom: 0;
-		right: 0;
-		background: rgba(0, 0, 0, 0.5);
-		z-index: 99;
-	}
-</style>

+ 0 - 310
components/filterPopup/index.vue

@@ -1,310 +0,0 @@
-<template>
-  <view :style="colorStyle">
-    <tui-drawer :mode="mode" :visible="visible" @close="closeDrawer">
-			<!-- #ifdef MP  -->
-			<view :style="'height:'+(statusBarHeight+43)+'px'"></view>
-      <scroll-view scroll-y="true" class="scroll-Y" :style="'height: calc(100vh - '+(statusBarHeight+214)+'rpx)'">
-			<!-- #endif -->
-			<!-- #ifndef MP  -->
-			<scroll-view scroll-y="true" class="scroll-Y" :style="'height: calc(100vh - 128rpx)'">
-			<!-- #endif -->	
-      <view class="d-container">
-        <!-- 品牌 -->
-        <view class="box">
-          <view class="title">
-            <view class="font">品牌</view>
-            <view class="font-right" @click="openFn(1)" v-if="open==1">展开 <text
-                class="iconfont icon-xialazhankai"></text>
-            </view>
-            <view class="font-right" v-if="open==2" @click="openFn(2)">收起 <text class="iconfont icon-xiangshang"></text>
-            </view>
-          </view>
-          <!-- 品牌显示十个 -->
-          <view class="box-list">
-            <view class="list acea-row row-center-wrapper" :class="{'bgcolor':spanIndex.indexOf(index)>-1}" v-for="(item,index) in list"
-              :key="index" @click="changeSpan(index,item)">
-              {{item.brand_name}}
-            </view>
-          </view>
-
-        </view>
-
-        <!-- 分类 -->
-        <view class="box">
-          <view class="font">分类</view>
-          <template v-for="(item,indexw) in storeArr">
-            <tui-collapse :index="indexw" :current="item.current" :disabled="item.disabled" @click="change">
-              <template v-slot:title>
-                <view class="title" :key="item.id">
-                  <view class="font-live">
-
-                    <tui-list-cell :hover="!item.disabled">{{item.cate_name}}</tui-list-cell>
-
-                  </view>
-
-                </view>
-              </template>
-              <template v-slot:content>
-                <view class="box-list">
-                  <view class="list acea-row row-center-wrapper" v-for="(data,indexn) in item.children" :key="indexn"
-                    @click="categoryFn(data,item)">
-                    <view class="acea-row row-center-wrapper" :class="{bgcolor:sortIndex===data.id}">
-                      {{data.cate_name}}
-                    </view>
-
-                  </view>
-                </view>
-              </template>
-            </tui-collapse>
-          </template>
-        </view>
-      </view>
-      </scroll-view>
-      <!-- 底部按钮 -->
-      <view class="footer">
-        <view class="btn" @click="submit(2)">
-          重置
-        </view>
-        <view class="btn btnColor" @click="submit(1)">
-          确认
-        </view>
-      </view>
-    </tui-drawer>
-    <!-- 确认 -->
-  </view>
-</template>
-
-<script>
-  import colors from "@/mixins/color";
-  import tuiDrawer from "@/components/thorui/tui-drawer"
-  import tuiCollapse from "@/components/thorui/tui-collapse"
-  import tuiListCell from "@/components/thorui/tui-list-cell"
-	let statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
-
-  export default {
-    components: {
-      tuiDrawer,
-      tuiCollapse,
-      tuiListCell
-    },
-    props: {
-      storeCategory: {
-        type: Array, // 分类数据
-        default: []
-      },
-      storeBrand: {
-        type: Array, //品牌数据
-     
-      }
-    },
-    mixins: [colors],
-    data() {
-      return {
-				statusBarHeight:statusBarHeight,
-        visible: false,
-        mode: "right",
-        sortIndex: 0,
-        spanIndex: [],
-        newList: [],
-        open: 1,
-        forArr: [],
-        serchData: {
-          sort: '', //new 最新, sales价值
-          sort_type: '', // DESC 倒序 ASC 正序
-          send: '',
-          cate_id: [],
-        }
-      }
-    },
-    computed: {
-      storeArr() {
-        return this.storeCategory
-      },
-      list() {
-        if(this.open===1) {
-           return this.storeBrand.slice(0, 10)
-        } else if( this.open===2) {
-          return this.storeBrand
-        }
-      }
-    },
-    onLoad() {
-    },
-    mounted() {
-          console.log(2,'父组件传过来的值')
-          // this.newListArr()
-      // this.openFn()
-    },
-
-    methods: {
-      // newListArr() {
-      //      // this.forArr = this.list
-      //   if (this.open == 1) {
-      //  console.log('进入')
-      //     this.$set(this.forArr,this.forArr.length,...this.list.slice(0, 10))
-      //      console.log(this.forArr)
-        
-      //   } else {
-      //     console.log('全部')
-      //     this.forArr = this.list
-      //   }
-      // },
-      closeDrawer() {
-        this.visible = false
-      },
-      // 点击展开
-      openFn(num) {
-        switch (num) {
-          case 1:
-            this.open = 2
-       
-            break;
-          case 2:
-            this.open = 1
-
-            break;
-        }
-             // this.newListArr()
-      },
-      // 单选
-      categoryFn(row,item) {
-        console.log(row,item)
-        this.sortIndex = row.id
-        let data ={
-          cid:item.id,
-          sid:row.id
-        }
-        console.log(data)
-        this.$emit('categoryChange',data)
-      },
-      change(e) {
-        let index = e.index;
-        let item = this.storeArr[index];
-        item.current = item.current == index ? -1 : index
-
-      },
-      // 多选
-      changeSpan(index, row) {
-        let arrIndex = this.spanIndex.indexOf(index);
-        if (arrIndex > -1) {
-          this.spanIndex.splice(arrIndex, 1);
-					this.newList.splice(arrIndex, 1);
-        } else {
-          this.spanIndex.push(index);
-					this.newList.push(row.id);
-        }
-        let result = this.newList.join(",")
-        this.$emit('brandChange', result)
-      },
-      // 确认提交
-      submit(val) {
-        if(val==2) {
-           this.sortIndex =0
-           this.spanIndex=[]
-        }
-         this.$emit('submitFn',val)
-      }
-    }
-  }
-</script>
-
-<style lang="scss">
-  .bgcolor {
-    background: var(--view-minorColorT) !important;
-    border: 1px solid var(--view-theme);
-    border-radius: 34rpx;
-    color: var(--view-theme) !important;
-		height: 100%;
-		width: 100%;
-  }
-
-  .font {
-    margin-top: 30rpx;
-    font-size: 28rpx;
-    font-weight: 500;
-    color: #333333;
-  }
-
-  .font-live {
-    font-size: 24rpx;
-    font-weight: 400;
-    color: #666666;
-  }
-
-  .font-right {
-    margin-top: 30rpx;
-    font-size: 20rpx;
-    font-weight: 400;
-    color: #666666;
-  }
-
-  .icon-xialazhankai {
-    font-size: 20rpx;
-    color: #666666;
-		margin-left: 6rpx;
-  }
-
-  .icon-xiangshang {
-    font-size: 20rpx;
-    color: #666666;
-		margin-left: 6rpx;
-  }
-
-  .d-container {
-    width:600rpx;
-    padding: 0 34rpx 20rpx 34rpx;
-
-    .box {
-      .title {
-				/* #ifndef MP */
-				margin-top: 30rpx;
-				/* #endif */
-        display: flex;
-        justify-content: space-between;
-      }
-
-      .box-list {
-        display: flex;
-        flex-wrap: wrap;
-        justify-content: space-between;
-        margin-bottom: 20rpx;
-
-        .list {
-          width: 240rpx;
-          height: 68rpx;
-          background: #F5F5F5;
-          border-radius: 34rpx;
-          font-size: 24rpx;
-          font-weight: 400;
-          color: #666666;
-          margin-top: 30rpx;
-        }
-      }
-    }
-  }
-
-  .footer {
-   
-    // position: fixed;
-    // bottom: 10rpx;
-    margin: 20rpx 30rpx 38rpx 30rpx;
-    display: flex;
-    justify-content: space-between;
-
-    .btn {
-      width: 240rpx;
-      height: 68rpx;
-      background: #F5F5F5;
-      border-radius: 34rpx;
-      font-size: 24rpx;
-      font-weight: 400;
-      text-align: center;
-      line-height: 68rpx;
-    }
-
-    .btnColor {
-      background: var(--view-theme);
-      color: #fff;
-    }
-  }
-</style>

+ 0 - 226
components/goodClass/index.vue

@@ -1,226 +0,0 @@
-<template>
-	<!-- 分类三商品列表 -->
-	<view class="goodsList">
-		<view class="item acea-row row-between-wrapper" v-for="(item,index) in tempArr" :key='index' @click="goDetail(item)">
-			<view class="pictrue">
-				<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
-				<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
-				<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
-				<image :src="item.image" mode="aspectFill"></image>
-			</view>
-			<view class="pictxt">
-				<view class="text line2">{{item.store_name}}</view>
-				<!-- #ifdef H5 || APP-PLUS -->
-				<slot name="center" :item="item"></slot>
-				<!-- #endif -->
-				<!-- #ifdef MP -->
-				<slot name="center{{index}}"></slot>
-				<!-- #endif -->
-				<view class="bottom acea-row row-between-wrapper">
-					<view class="money font-color">
-						<text class="sign">¥</text>{{item.price}}
-						<!-- <span class="vip" v-if="item.vip_price">
-							<image src="../../static/images/vip01.png"></image>
-							¥{{item.vip_price}}
-						</span>
-						<text class="y_money" v-else>¥{{item.ot_price}}</text> -->
-					</view>
-					<view v-if="item.stock>0">
-					    <view class="iconfont icon-gouwuche6 acea-row row-center-wrapper" v-if="(item.activity && (item.activity.type === '1' || item.activity.type === '2' || item.activity.type === '3')) || item.product_type!=0 || item.custom_form.length"></view>
-						<view v-else>
-							<uni-badge class="uni-badge-left-margin" :text="item.cart_num" absolute="rightTop" v-if="item.spec_type">
-							  <!-- 多规格 -->
-							  <view class="bnt acea-row row-center-wrapper" @click.stop="goCartDuo(item)">
-							  	选规格
-							  	<!-- <text class="num" v-if="isLogin && item.cart_num">{{item.cart_num}}</text> -->
-							  </view>
-							</uni-badge>
-							<!-- 单规格 -->
-							<view v-if="!item.spec_type && !item.cart_num">
-								<view v-if="item.cart_button">
-									<view class="bnt acea-row row-center-wrapper end" v-if="item.is_presale_product && (item.presale_pay_status == 1 || item.presale_pay_status == 3)">
-										{{item.presale_pay_status === 1?'未开始':'已结束'}}
-									</view>
-									<view v-else class="iconfont icon-gouwuche6 acea-row row-center-wrapper" @click.stop="goCartDan(item,index)"></view>
-								</view>
-								<view v-else class="bnt acea-row row-center-wrapper">立即购买</view>
-							</view>
-							<view class="cart acea-row row-middle" v-if="!item.spec_type && item.cart_num">
-								<view class="pictrue iconfont icon-jianhao acea-row row-center-wrapper" @click.stop="CartNumDes(index,item)"></view>
-								<view class="num">{{item.cart_num}}</view>
-								<view class="pictrue iconfont icon-jiahao acea-row row-center-wrapper" @click.stop="CartNumAdd(index,item)"></view>
-							</view>
-						</view>
-					</view>
-					<view class="bnt acea-row row-center-wrapper end" v-else>已售罄</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'd_goodList',
-		props: {
-			dataConfig: {
-				type: Object,
-				default: () => {}
-			},
-			tempArr:{
-				type: Array,
-				default: () => []
-			},
-			isLogin:{
-				type: Boolean,
-				default:false
-			}
-		},
-		data() {
-			return {
-			};
-		},
-		created() {},
-		mounted() {},
-		methods: {
-			goDetail(item){
-				this.$emit('detail',item);
-			},
-			goCartDuo(item){
-				this.$emit('gocartduo',item);
-			},
-			goCartDan(item,index){
-				this.$emit('gocartdan',item,index);
-			},
-			CartNumDes(index,item){
-				this.$emit('ChangeCartNumDan', false,index,item);
-			},
-			CartNumAdd(index,item){
-				if(item.is_limit && item.cart_num>=item.limit_num){
-					this.$util.Tips({
-					  title: "购买最多不能超过"+item.limit_num
-					});
-				}else{
-					this.$emit('ChangeCartNumDan', true,index,item);
-				}
-			}
-		}
-	};
-</script>
-
-<style lang="scss">
-	.goodsList{
-		padding: 0 30rpx;
-		.item{
-			width: 100%;
-			box-sizing: border-box;
-			margin-bottom: 63rpx;
-			.pictrue{
-				width: 140rpx;
-				height: 140rpx;
-				border-radius: 10rpx;
-				position: relative;
-				border-radius: 22rpx;
-				image{
-					width: 100%;
-					height: 100%;
-					border-radius: 22rpx;
-				}
-			}
-			.pictxt{
-				width: 372rpx;
-				.text{
-					font-size:26rpx;
-					font-family:PingFang SC;
-					font-weight:500;
-					color: #333333;
-				}
-				.bottom{
-					margin-top: 22rpx;
-					.money{
-						font-size: 34rpx;
-						font-weight: 800;
-						width: 212rpx;
-						.sign{
-							font-size: 24rpx;
-						}
-						.y_money{
-							font-size: 20rpx;
-							color: #999999;
-							margin-left: 14rpx;
-							font-weight: normal;
-							text-decoration: line-through;
-						}
-						.vip{
-							font-size: 22rpx;
-							color: #333333;
-							font-weight: normal;
-							margin-left: 14rpx;
-							image{
-								width: 38rpx;
-								height: 18rpx;
-								margin-right: 6rpx;
-							}
-						}
-					}
-					.cart{
-						height: 46rpx;
-						.pictrue{
-							color: var(--view-theme);
-							font-size:46rpx;
-							width: 46rpx;
-							height: 46rpx;
-							text-align: center;
-							line-height: 46rpx;
-							&.icon-jiahao{
-								 color: var(--view-theme);
-							}
-						}
-						.num{
-							font-size: 30rpx;
-							color: #333333;
-							font-weight: bold;
-							width: 60rpx;
-							text-align: center;
-						}
-					}
-					.icon-gouwuche6{
-						width: 46rpx;
-						height: 46rpx;
-						background-color: var(--view-theme);
-						border-radius: 50%;
-						color: #fff;
-						font-size: 30rpx;
-					}
-					.bnt{
-						padding: 0 20rpx;
-						height: 45rpx;
-						background:var(--view-theme);
-						border-radius:23rpx;
-						font-size: 22rpx;
-						color: #fff;
-						position: relative;
-						&.end{
-							background:#cccccc;
-						}
-						.num{
-							min-width: 14rpx;
-							height: 24rpx;
-							text-align: center;
-							line-height: 24rpx;
-							background-color: #fff;
-							color: var(--view-theme);
-							border-radius: 15px;
-							position: absolute;
-							right: -13rpx;
-							top: -11rpx;
-							font-size: 16rpx;
-							padding: 0 5rpx;
-							border: 1px solid var(--view-theme);
-						}
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 169
components/goodList/index.vue

@@ -1,169 +0,0 @@
-<template>
-	<!-- 商品列表 -->
-	<view class='goodList'>
-		<block v-for="(item,index) in bastList" :key="index">
-			<view @click="goDetail(item)" class='item acea-row row-between-wrapper' hover-class="none">
-				<view class='pictrue'>
-					<image :src='item.image' mode="aspectFill"></image>
-					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
-					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
-					<span class="pictrue_log pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
-					<view class="activityFrame" v-if="item.activity_frame.image" :style="'background-image: url('+item.activity_frame.image+');'"></view>
-				</view>
-				<view class='underline'>
-					<view class='text'>
-						<view class="nameCon">
-							<view class='line2'>{{item.store_name}}</view>
-						</view>
-						<!-- #ifdef H5 || APP-PLUS -->
-						<slot name="center" :item="item"></slot>
-						<!-- #endif -->
-						<!-- #ifdef MP -->
-						<slot name="center{{index}}"></slot>
-						<!-- #endif -->
-						<view class='money font-color'>¥<text class='num'>{{item.price}}</text></view>
-						<view class='vip-money acea-row row-middle' v-if="item.is_vip && item.vip_price && item.vip_price > 0">¥{{item.vip_price || 0}}
-							<image src='../../static/images/vip.png'></image><text class='num'>已售{{item.sales}}{{item.unit_name}}</text>
-						</view>
-						<view class='vip-money acea-row row-middle' v-else><text class='num'>已售{{item.sales}}{{item.unit_name}}</text></view>
-					</view>
-				</view>
-				<!-- <view class='iconfont icon-gouwuche cart-color acea-row row-center-wrapper'></view> -->
-			</view>
-		</block>
-	</view>
-</template>
-
-<script>
-	import {mapGetters} from "vuex";
-	import { goShopDetail,goPage } from '@/libs/order.js'
-	export default {
-		computed: mapGetters(['uid']),
-		props: {
-			status: {
-				type: Number,
-				default: 0,
-			},
-			bastList: {
-				type: Array,
-				default: function() {
-					return [];
-				}
-			}
-		},
-		data() {
-			return {
-
-			};
-		},
-		methods: {
-			goDetail(item){
-				goPage().then(res=>{
-					goShopDetail(item,this.uid).then(res=>{
-						uni.navigateTo({
-							url:`/pages/goods_details/index?id=${item.id}`
-						})
-					})
-				})
-				
-			}
-			
-		}
-	}
-</script>
-
-<style scoped lang='scss'>
-	.activityFrame{
-		border-radius: 20rpx;
-	}
-	.goodList{
-		padding-top: 30rpx;
-	}
-	.goodList .item {
-		position: relative;
-		padding-left: 20rpx;
-		margin-bottom: 30rpx;
-	}
-
-	.goodList .item .pictrue {
-		width: 240rpx;
-		height: 240rpx;
-		position: relative;
-	}
-
-	.goodList .item .pictrue image {
-		width: 100%;
-		height: 100%;
-		border-radius: 12rpx;
-	}
-
-	.goodList .item .pictrue .numPic {
-		position: absolute;
-		left: 7rpx;
-		top: 7rpx;
-		width: 50rpx;
-		height: 50rpx;
-		border-radius: 50%;
-	}
-
-	.goodList .item .underline {
-		padding-right: 30rpx;
-	}
-
-	.goodList .item:nth-last-child(1) .underline {
-		border-bottom: 0;
-	}
-
-	.goodList .item .text {
-		font-size: 30rpx;
-		color: #222;
-		width: 440rpx;
-		.nameCon{
-			height: 136rpx;
-		}
-	}
-
-	.goodList .item .text .money {
-		font-size: 26rpx;
-		font-weight: bold;
-	}
-
-	.goodList .item .text .money .num {
-		font-size: 34rpx;
-	}
-
-	.goodList .item .text .vip-money {
-		font-size: 24rpx;
-		color: #282828;
-		font-weight: bold;
-		margin-top: 15rpx;
-	}
-
-	.goodList .item .text .vip-money image {
-		width: 56rpx;
-		height: 20rpx;
-		margin-right: 8rpx;
-		margin-left: 8rpx;
-	}
-
-	.goodList .item .text .vip-money .num {
-		font-size: 22rpx;
-		color: #aaa;
-		font-weight: normal;
-		margin-top: -2rpx;
-		
-		~.num {
-			margin-left: 22rpx;
-		}
-	}
-
-	.goodList .item .iconfont {
-		position: absolute;
-		right: 30rpx;
-		width: 50rpx;
-		height: 50rpx;
-		border-radius: 50%;
-		font-size: 30rpx;
-		bottom: 38rpx;
-	}
-</style>

+ 0 - 144
components/groupGoodsList/index.vue

@@ -1,144 +0,0 @@
-<template>
-	<view v-if="goodsList.length" class="goods-list">
-		<view v-for="item in goodsList" class="item">
-			<view class="head">
-				<image class="avatar" :src="item.userInfo.avatar || '/static/images/f.png'" mode="aspectFill"></image>
-				<view class="name-wrap">
-					<view class="name-inner">
-						<view class="name">{{ item.userInfo.nickname }}</view>
-						<view v-if="item.userInfo.uid == uid">(我)</view>
-					</view>
-				</view>
-			</view>
-			<view class="body">
-				<view v-for="cell in item.goods" :key="cell.id" class="cell">
-					<image class="image" :src="cell.productInfo.attrInfo.image" mode="aspectFill"></image>
-					<view class="name-wrap">
-						<view class="name">{{ cell.productInfo.store_name }}</view>
-						<view class="attr">{{ cell.productInfo.attrInfo.suk }}</view>
-						<view class="money">¥{{ cell.truePrice }}</view>
-					</view>
-					<view class="">x {{ cell.cart_num }}</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapGetters
-	} from 'vuex';
-
-	export default {
-		props: {
-			goodsList: {
-				type: Array,
-				default: () => {
-					return [];
-				}
-			},
-		},
-		computed: mapGetters(['uid']),
-	};
-</script>
-
-<style lang="scss" scoped>
-	.goods-list {
-		.item {
-			border-radius: 14rpx;
-			background-color: #FFFFFF;
-
-			+.item {
-				margin-top: 20rpx;
-			}
-
-			.head {
-				display: flex;
-				align-items: center;
-				height: 86rpx;
-				padding: 0 26rpx;
-				border-bottom: 1rpx solid #F0F0F0;
-				font-size: 26rpx;
-				color: #333333;
-
-				.name-wrap {
-					flex: 1;
-					min-width: 0;
-					margin-left: 20rpx;
-				}
-
-				.name-inner {
-					display: inline-flex;
-					align-items: center;
-					max-width: 100%;
-				}
-
-				.name {
-					flex: 1;
-					min-width: 0;
-					overflow: hidden;
-					white-space: nowrap;
-					text-overflow: ellipsis;
-				}
-			}
-
-			.avatar {
-				display: block;
-				width: 40rpx;
-				height: 40rpx;
-				border-radius: 50%;
-			}
-
-			.body {
-				padding-left: 24rpx;
-
-				.cell {
-					display: flex;
-					padding: 24rpx 26rpx 26rpx 0;
-					font-size: 26rpx;
-					line-height: 40rpx;
-					color: #999999;
-
-					+.cell {
-						border-top: 1rpx solid #EEEEEE;
-					}
-
-					.name-wrap {
-						flex: 1;
-						min-width: 0;
-						margin: 0 20rpx;
-					}
-
-					.name {
-						overflow: hidden;
-						white-space: nowrap;
-						text-overflow: ellipsis;
-						font-size: 28rpx;
-						line-height: 40rpx;
-						color: #333333;
-					}
-
-					.attr {
-						margin-top: 8rpx;
-						font-size: 20rpx;
-						line-height: 28rpx;
-					}
-
-					.money {
-						margin-top: 14rpx;
-						line-height: 36rpx;
-						color: #E93323;
-					}
-				}
-
-				.image {
-					display: block;
-					width: 130rpx;
-					height: 130rpx;
-					border-radius: 6rpx;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 159
components/guide/index.vue

@@ -1,159 +0,0 @@
-<template>
-	<!-- 开屏广告 -->
-	<view class="content">
-		<swiper class="swiper" :class="advData.value.length==1?'on':''" :autoplay="autoplay" :duration="duration" @change="stopChange"
-			v-if="advData.type == 'pic' && advData.value.length">
-			<swiper-item v-for="(item,index) in advData.value" :key="index" @click="jump(item.link)">
-				<view class="swiper-item">
-					<view class="swiper-item-img">
-						<image :src="item.img" mode="aspectFill"></image>
-					</view>
-				</view>
-			</swiper-item>
-		</swiper>
-		<view class="video-box" v-else-if="advData.type == 'video' && advData.video_link">
-			<video class="vid" :src="advData.video_link" :autoplay="true" :loop="true" :muted="true"
-				:controls="false"></video>
-		</view>
-		<view class="jump-over"  :style="{ top: navH + 'rpx' }" @tap="launchFlag()">跳过<text v-if="closeType == 1">{{time}}</text><slot name="bottom"></slot></view>
-	</view>
-</template>
-
-<script>
-	let app = getApp();
-	export default {
-		data() {
-			return {
-				autoplay: false,
-				duration: 500,
-				jumpover: '跳过',
-				experience: '立即体验',
-				time: this.advData.time,
-				timecount: undefined,
-				navH: 0
-			}
-		},
-		props: {
-			advData: {
-				type: Object,
-				default: () => {}
-			},
-			// 1 倒计时 2 手动关闭(预留)
-			closeType: {
-				type: Number,
-				default: 1
-			}
-		},
-		mounted() {
-			this.timer()
-			// #ifdef MP
-			this.navH = app.globalData.navHeight;
-			// #endif
-			// #ifndef MP
-			this.navH = 80;
-			// #endif
-		},
-		methods: {
-			stopChange(){
-				if(this.advData.value.length == 1){
-					return false
-				}
-			},
-			timer() {
-				var t = this.advData.time || 5
-				this.timecount = setInterval(() => {
-					t--
-					this.time = t
-					if (t <= 0) {
-						clearInterval(this.timecount)
-						this.launchFlag()
-					}
-				}, 1000)
-			},
-			launchFlag() {
-				clearInterval(this.timecount)
-				uni.switchTab({
-					url: '/pages/index/index'
-				});
-			},
-			jump(url) {
-				if(url){
-					clearInterval(this.timecount)
-					this.$util.JumpPath(url);
-				}
-			},
-		}
-	}
-</script>
-<style lang="scss" scoped>
-	page,
-	.content {
-		width: 100%;
-		height: 100%;
-		background-size: 100% auto;
-		padding: 0;
-	}
-
-	.swiper {
-		width: 100%;
-		height: 100vh;
-		background: #FFFFFF;
-		&.on{
-			position: relative;
-			&:after {
-			 content: '';
-			 position: absolute;
-			 top: 0;
-			 left: 0;
-			 right: 0;
-			 bottom: 0;
-			 z-index: 2;
-			}
-		}
-	}
-
-	.swiper-item {
-		width: 100%;
-		height: 100%;
-		text-align: center;
-		position: relative;
-		display: flex;
-		/* justify-content: center; */
-		align-items: flex-end;
-		flex-direction: column-reverse
-	}
-
-	.swiper-item-img {
-		width: 100vw;
-		height: 100vh;
-		margin: 0 auto;
-	}
-
-	.swiper-item-img image {
-		width: 100%;
-		height: 100%;
-	}
-
-	.jump-over {
-		position: absolute;
-		height: 45rpx;
-		line-height: 45rpx;
-		padding: 0 15rpx;
-		border-radius: 30rpx;
-		font-size: 24rpx;
-		color: #b09e9a;
-		border: 1px solid #b09e9a;
-		z-index: 999;
-		right: 30rpx;
-	}
-
-	.video-box {
-		width: 100vw;
-		height: 100vh;
-
-		.vid {
-			width: 100%;
-			height: 100%;
-		}
-	}
-</style>

+ 22 - 36
components/home/index.vue

@@ -1,27 +1,19 @@
 <template>
-	<!-- 悬浮导航按钮 -->
-	<view :style="colorStyle">
-		<view style="touch-action: none;">
-			<view class="home" style="position:fixed;" :style="{ top: top + 'px'}" id="right-nav"
-				@touchmove.stop.prevent="setTouchMove">
-				<view class="homeCon bg-color" :class="homeActive === true ? 'on' : ''" v-if="homeActive">
-					<navigator hover-class='none' open-type="navigate" url='/pages/index/index'
-						class='iconfont icon-shouye-xianxing'>
-					</navigator>
-					<navigator hover-class='none' open-type="navigate" url='/pages/mall/mall'
-						class='iconfont icon-jifenshangcheng'></navigator>
-					<navigator hover-class='none' open-type="navigate" url='/pages/user/index'
-						class='iconfont icon-yonghu1'></navigator>
-					<slot name="bottom"></slot>
-				</view>
-				<view @click="open" class="pictrueBox">
-					<view class="pictrue">
-						<image :src="
-		          homeActive === true
-		            ? imgHost + '/statics/images/close.gif'
-		            : imgHost + '/statics/images/open.gif'
-		        " class="image" />
-					</view>
+	<view style="touch-action: none;">
+		<view class="home" style="position:fixed;" :style="{ top: top + 'px', bottom: bottom }" id="right-nav" @touchmove.stop.prevent="setTouchMove">
+			<view class="homeCon bg-color-red" :class="homeActive === true ? 'on' : ''" v-if="homeActive">
+				<navigator hover-class='none' url='/pages/index/index' open-type='switchTab' class='iconfont icon-shouye-xianxing'></navigator>
+				<navigator hover-class='none' url='/pages/order_addcart/order_addcart' open-type='switchTab' class='iconfont icon-caigou-xianxing'></navigator>
+				<navigator hover-class='none' url='/pages/user/index' open-type='switchTab' class='iconfont icon-yonghu1'></navigator>
+			</view>
+			<view @click="open" class="pictrueBox">
+				<view class="pictrue">
+					<image :src="
+              homeActive === true
+                ? '/static/images/close.gif'
+                : '/static/images/open.gif'
+            "
+					 class="image" />
 				</view>
 			</view>
 		</view>
@@ -31,23 +23,20 @@
 	import {
 		mapGetters
 	} from "vuex";
-	import colors from '@/mixins/color.js';
-	import {HTTP_REQUEST_URL} from '@/config/app';
 	export default {
 		name: "Home",
 		props: {},
-		mixins:[colors],
 		data: function() {
 			return {
-				top: "545",
-				imgHost:HTTP_REQUEST_URL
+				top: "",
+				bottom: ""
 			};
 		},
 		computed: mapGetters(["homeActive"]),
 		methods: {
 			setTouchMove(e) {
 				var that = this;
-				if (e.touches[0].clientY < 750 && e.touches[0].clientY > 66) {
+				if (e.touches[0].clientY < 545 && e.touches[0].clientY > 66) {
 					that.top = e.touches[0].clientY
 					// that.setData({
 					// 	top: e.touches[0].clientY
@@ -60,9 +49,8 @@
 					this.$store.commit("OPEN_HOME");
 			}
 		},
-		created() {},
-		beforeDestroy() {
-			this.$store.commit("CLOSE_HOME")
+		created() {
+			this.bottom = "50px";
 		}
 	};
 </script>
@@ -87,6 +75,7 @@
 		border-radius: 50rpx;
 		opacity: 0;
 		height: 0;
+		color: #e93323;
 		width: 0;
 	}
 
@@ -99,8 +88,7 @@
 		display: flex;
 		justify-content: center;
 		align-items: center;
-		background: var(--view-theme) !important;
-		border: 1px solid #fff;
+		background: #f44939 !important;
 	}
 
 	.home .homeCon .iconfont {
@@ -115,8 +103,6 @@
 		height: 86rpx;
 		border-radius: 50%;
 		margin: 0 auto;
-		background-color: var(--view-theme);
-    border: 1px solid #fff;
 	}
 
 	.home .pictrue .image {

+ 0 - 160
components/homeList/index.vue

@@ -1,160 +0,0 @@
-<template>
-	<!-- 顶部下拉导航 -->
-	<!-- #ifdef APP-PLUS -->
-	<view class="animated dialog_nav" :style="{ top: (navH+15) + 'rpx', marginTop: sysHeight + 'px'}" :class="[goodList?'dialogIndex':'',currentPage?'':'']" v-show="currentPage">
-	<!-- #endif -->
-	<!-- #ifndef APP-PLUS -->
-	<view class="animated dialog_nav" :style="{ top: (navH+15) + 'rpx' }" :class="[goodList?'dialogIndex':'',goodsShow?'dialogGoods':'',currentPage?'':'']" v-show="currentPage">
-	<!-- #endif -->
-		<view class="dialog_nav_item" :class="item.after" v-for="(item,index) in selectNavList" :key="index" @click="linkPage(item.url)">
-			<text class="iconfont" :class="item.icon"></text>
-			<text class="pl-20">{{item.name}}</text>
-			<!-- #ifdef H5 || APP-PLUS -->
-			<slot name="bottom" :item="item"></slot>
-			<!-- #endif -->
-			<!-- #ifdef MP -->
-			<slot name="bottom{{index}}"></slot>
-			<!-- #endif -->
-		</view>
-	</view>
-</template>
-<script>
-	export default {
-		name: "homeIdex",
-		props: {
-			navH: {
-				type: String|Number,
-				default: ""
-			},
-			returnShow: {
-				type: Boolean,
-				default: true
-			},
-			goodList: {
-				type: Boolean,
-				default: false
-			},
-			currentPage: {
-				type: Boolean,
-				default: false
-			},
-			goodsShow: {
-				type: Boolean,
-				default: false
-			},
-			sysHeight: {
-				type: String|Number,
-				default: ""
-			}
-		},
-		data: function() {
-			return {
-				selectNavList:[
-					{name:'首页',icon:'icon-shouye8',url:'/pages/index/index',after:'dialog_after'},
-					{name:'搜索',icon:'icon-sousuo6',url:'/pages/goods/goods_search/index',after:'dialog_after'},
-					{name:'购物车',icon:'icon-gouwuche7',url:'/pages/order_addcart/order_addcart',after:'dialog_after'},
-					{name:'我的收藏',icon:'icon-shoucang3',url:'/pages/users/user_goods_collection/index',after:'dialog_after'},
-					{name:'个人中心',icon:'icon-gerenzhongxin1',url:'/pages/user/index'},
-				]
-			};
-		},
-		methods: {
-			linkPage(url){
-				if (['/pages/goods_cate/goods_cate', '/pages/order_addcart/order_addcart', '/pages/user/index', '/pages/index/index']
-					.indexOf(url) == -1) {
-					uni.navigateTo({
-						url: url
-					})
-				} else {
-					uni.switchTab({
-						url: url
-					})
-				}
-			}
-		},
-		created() {},
-		beforeDestroy() {
-		}
-	};
-</script>
-
-<style scoped lang="scss">
-	.dialog_nav{
-		position: absolute;
-		/* #ifdef MP */
-		left: 14rpx;
-		/* #endif */
-		/* #ifndef MP */
-		right: 14rpx;
-		/* #endif */
-		width: 240rpx;
-		background: #FFFFFF;
-		box-shadow: 0px 0px 16rpx rgba(0, 0, 0, 0.08);
-		z-index: 310;
-		border-radius: 14rpx;
-		&::before{
-			content: '';
-			width: 0;
-			height: 0;
-			position: absolute;
-			/* #ifdef MP */
-			left: -26rpx;
-			/* #endif */
-			/* #ifndef MP */
-			left: 150rpx;
-			/* #endif */
-			right: 0;
-			margin:auto;
-			top:-9px;
-			border-bottom: 10px solid #F5F5F5;
-			border-left: 10px solid transparent;    /*transparent 表示透明*/
-			border-right: 10px solid transparent;
-		}
-		&.dialogIndex{
-			left: 14rpx;
-			/* #ifndef H5 */
-			top:-30px !important;
-			/* #endif */
-			&::before{
-				/* #ifndef MP */
-				left: -160rpx!important;
-				/* #endif */
-				/* #ifdef MP */
-				left: 0rpx !important;
-				/* #endif */
-			}
-		}
-		&.dialogGoods{
-			&::before{
-				left: -170rpx;
-			}
-		}
-	}
-	.dialog_nav_item{
-		width: 100%;
-		height: 84rpx;
-		line-height: 84rpx;
-		padding: 0 20rpx 0;
-		box-sizing: border-box;
-		border-bottom: #eee;
-		font-size: 28rpx;
-		color: #333;
-		position: relative;
-		display: flex;
-		.iconfont{
-			font-size: 32rpx;
-			margin-right: 26rpx;
-		}
-	}
-	.dialog_after{
-		::after{
-			content: '';
-			position: absolute;
-			width:90px;
-			height: 1px;
-			background-color: #EEEEEE;
-			bottom: 0;
-			right: 0;
-		}
-	}
-</style>

+ 33 - 0
components/js_sdk/xb-copy/uni-copy.js

@@ -0,0 +1,33 @@
+export default function uniCopy(content) {
+	/**
+	 * 小程序端 和 app端的复制逻辑
+	 */
+	//#ifndef H5
+	uni.setClipboardData({
+		data: content,
+		success: function() {
+			console.log('success');
+			return true
+		}
+	});
+	//#endif
+	
+	/**
+	 * H5端的复制逻辑
+	 */
+	// #ifdef H5
+	if (!document.queryCommandSupported('copy')) { //为了兼容有些浏览器 queryCommandSupported 的判断
+		// 不支持
+		return false
+	}
+	let textarea = document.createElement("textarea")
+	textarea.value = content
+	textarea.readOnly = "readOnly"
+	document.body.appendChild(textarea)
+	textarea.select() // 选择对象
+	textarea.setSelectionRange(0, content.length) //核心
+	let result = document.execCommand("copy") // 执行浏览器复制命令
+	textarea.remove()
+	return result
+	// #endif
+}

+ 268 - 452
components/jyf-parser/jyf-parser.vue

@@ -1,26 +1,16 @@
-<!--
-  parser 主模块组件
-  github:https://github.com/jin-yufeng/Parser 
-  docs:https://jin-yufeng.github.io/Parser
-  插件市场:https://ext.dcloud.net.cn/plugin?id=805
-  author:JinYufeng
-  update:2020/04/14
--->
 <template>
 	<view>
 		<slot v-if="!nodes.length" />
 		<!--#ifdef APP-PLUS-NVUE-->
-		<web-view id="top" ref="web" :src="src" :style="'margin-top:-2px;height:'+height+'px'" @onPostMessage="_message" />
+		<web-view id="_top" ref="web" :style="'margin-top:-2px;height:'+height+'px'" @onPostMessage="_message" />
 		<!--#endif-->
 		<!--#ifndef APP-PLUS-NVUE-->
-		<view id="top" :style="showAm+(selectable?';user-select:text;-webkit-user-select:text':'')" :animation="scaleAm" @tap="_tap"
-		 @touchstart="_touchstart" @touchmove="_touchmove">
-			<!--#ifdef H5-->
+		<view id="_top" :style="showAm+(selectable?';user-select:text;-webkit-user-select:text':'')">
+			<!--#ifdef H5 || MP-360-->
 			<div :id="'rtf'+uid"></div>
 			<!--#endif-->
-			<!--#ifndef H5-->
-			<trees :nodes="nodes" :lazy-load="lazyLoad" :loadVideo="loadVideo" />
-			<image v-for="(item, index) in imgs" v-bind:key="index" :id="index" :src="item" hidden @load="_load" />
+			<!--#ifndef H5 || MP-360-->
+			<trees :nodes="nodes" :lazyLoad="lazyLoad" :loading="loadingImg" />
 			<!--#endif-->
 		</view>
 		<!--#endif-->
@@ -28,14 +18,14 @@
 </template>
 
 <script>
-	// #ifndef H5 || APP-PLUS-NVUE
+	// #ifndef H5 || APP-PLUS-NVUE || MP-360
 	import trees from './libs/trees';
 	var cache = {},
 		// #ifdef MP-WEIXIN || MP-TOUTIAO
 		fs = uni.getFileSystemManager ? uni.getFileSystemManager() : null,
 		// #endif
 		Parser = require('./libs/MpHtmlParser.js');
-	var document; // document 补丁包 https://jin-yufeng.github.io/Parser/#/instructions?id=document
+	var dom;
 	// 计算 cache 的 key
 	function hash(str) {
 		for (var i = str.length, val = 5381; i--;)
@@ -43,75 +33,89 @@
 		return val;
 	}
 	// #endif
-	// #ifdef H5 || APP-PLUS-NVUE
-	var rpx = uni.getSystemInfoSync().screenWidth / 750,
+	// #ifdef H5 || APP-PLUS-NVUE || MP-360
+	var windowWidth = uni.getSystemInfoSync().windowWidth,
 		cfg = require('./libs/config.js');
 	// #endif
 	// #ifdef APP-PLUS-NVUE
-	var dom = weex.requireModule('dom');
+	var weexDom = weex.requireModule('dom');
 	// #endif
+	/**
+	 * Parser 富文本组件
+	 * @tutorial https://github.com/jin-yufeng/Parser
+	 * @property {String} html 富文本数据
+	 * @property {Boolean} autopause 是否在播放一个视频时自动暂停其他视频
+	 * @property {Boolean} autoscroll 是否自动给所有表格添加一个滚动层
+	 * @property {Boolean} autosetTitle 是否自动将 title 标签中的内容设置到页面标题
+	 * @property {Number} compress 压缩等级
+	 * @property {String} domain 图片、视频等链接的主域名
+	 * @property {Boolean} lazyLoad 是否开启图片懒加载
+	 * @property {String} loadingImg 图片加载完成前的占位图
+	 * @property {Boolean} selectable 是否开启长按复制
+	 * @property {Object} tagStyle 标签的默认样式
+	 * @property {Boolean} showWithAnimation 是否使用渐显动画
+	 * @property {Boolean} useAnchor 是否使用锚点
+	 * @property {Boolean} useCache 是否缓存解析结果
+	 * @event {Function} parse 解析完成事件
+	 * @event {Function} load dom 加载完成事件
+	 * @event {Function} ready 所有图片加载完毕事件
+	 * @event {Function} error 错误事件
+	 * @event {Function} imgtap 图片点击事件
+	 * @event {Function} linkpress 链接点击事件
+	 * @author JinYufeng
+	 * @version 20200728
+	 * @listens MIT
+	 */
 	export default {
 		name: 'parser',
 		data() {
 			return {
-				// #ifdef APP-PLUS
-				loadVideo: false,
-				// #endif
-				// #ifdef H5
+				// #ifdef H5 || MP-360
 				uid: this._uid,
 				// #endif
 				// #ifdef APP-PLUS-NVUE
-				src: '',
 				height: 1,
 				// #endif
 				// #ifndef APP-PLUS-NVUE
-				scaleAm: '',
 				showAm: '',
-				imgs: [],
 				// #endif
 				nodes: []
 			}
 		},
-		// #ifndef H5 || APP-PLUS-NVUE
+		// #ifndef H5 || APP-PLUS-NVUE || MP-360
 		components: {
 			trees
 		},
 		// #endif
 		props: {
-			'html': null,
-			// #ifndef MP-ALIPAY
-			'autopause': {
+			html: String,
+			autopause: {
 				type: Boolean,
 				default: true
 			},
-			// #endif
-			'autosetTitle': {
+			autoscroll: Boolean,
+			autosetTitle: {
 				type: Boolean,
 				default: true
 			},
-			// #ifndef H5 || APP-PLUS-NVUE
-			'compress': Number,
-			'useCache': Boolean,
-			'xml': Boolean,
-			// #endif
-			'domain': String,
-			// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
-			'gestureZoom': Boolean,
-			// #endif
-			// #ifdef MP-WEIXIN || MP-QQ || H5 || APP-PLUS
-			'lazyLoad': Boolean,
+			// #ifndef H5 || APP-PLUS-NVUE || MP-360
+			compress: Number,
+			loadingImg: String,
+			useCache: Boolean,
 			// #endif
-			'selectable': Boolean,
-			'tagStyle': Object,
-			'showWithAnimation': Boolean,
-			'useAnchor': Boolean
+			domain: String,
+			lazyLoad: Boolean,
+			selectable: Boolean,
+			tagStyle: Object,
+			showWithAnimation: Boolean,
+			useAnchor: Boolean
 		},
 		watch: {
 			html(html) {
 				this.setContent(html);
 			}
 		},
-		mounted() {
+		created() {
 			// 图片数组
 			this.imgList = [];
 			this.imgList.each = function(f) {
@@ -123,8 +127,8 @@
 				// #ifndef MP-ALIPAY || APP-PLUS
 				// 去重
 				if (src.indexOf('http') == 0 && this.includes(src)) {
-					var newSrc = '';
-					for (var j = 0, c; c = src[j]; j++) {
+					var newSrc = src.split('://')[0];
+					for (var j = newSrc.length, c; c = src[j]; j++) {
 						if (c == '/' && src[j - 1] != '/' && src[j + 1] != '/') break;
 						newSrc += Math.random() > 0.5 ? c.toUpperCase() : c;
 					}
@@ -158,10 +162,25 @@
 					// #endif
 				}
 			}
-			if (this.html) this.setContent(this.html);
+		},
+		mounted() {
+			// #ifdef H5 || MP-360
+			this.document = document.getElementById('rtf' + this._uid);
+			// #endif
+			// #ifndef H5 || APP-PLUS-NVUE || MP-360
+			if (dom) this.document = new dom(this);
+			// #endif
+			// #ifdef APP-PLUS-NVUE
+			this.document = this.$refs.web;
+			setTimeout(() => {
+				// #endif
+				if (this.html) this.setContent(this.html);
+				// #ifdef APP-PLUS-NVUE
+			}, 30)
+			// #endif
 		},
 		beforeDestroy() {
-			// #ifdef H5
+			// #ifdef H5 || MP-360
 			if (this._observer) this._observer.disconnect();
 			// #endif
 			this.imgList.each(src => {
@@ -173,7 +192,7 @@
 				}
 				// #endif
 				// #ifdef MP-WEIXIN || MP-TOUTIAO
-				if (src && uni.env && src.includes(uni.env.USER_DATA_PATH))
+				if (src && src.includes(uni.env.USER_DATA_PATH))
 					fs && fs.unlink({
 						filePath: src
 					})
@@ -182,82 +201,35 @@
 			clearInterval(this._timer);
 		},
 		methods: {
-			// #ifdef H5 || APP-PLUS-NVUE
-			_Dom2Str(nodes) {
-				var str = '';
-				for (var node of nodes) {
-					if (node.type == 'text')
-						str += node.text;
-					else {
-						str += ('<' + node.name);
-						for (var attr in node.attrs || {})
-							str += (' ' + attr + '="' + node.attrs[attr] + '"');
-						if (!node.children || !node.children.length) str += '>';
-						else str += ('>' + this._Dom2Str(node.children) + '</' + node.name + '>');
-					}
-				}
-				return str;
-			},
-			_handleHtml(html, append) {
-				if (typeof html != 'string') html = this._Dom2Str(html.nodes || html);
-				// 处理 rpx
-				if (html.includes('rpx'))
-					html = html.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * rpx + 'px');
-				if (!append) {
-					// 处理 tag-style 和 userAgentStyles
-					var style = '<style>@keyframes show{0%{opacity:0}100%{opacity:1}}';
-					for (var item in cfg.userAgentStyles)
-						style += `${item}{${cfg.userAgentStyles[item]}}`;
-					for (item in this.tagStyle)
-						style += `${item}{${this.tagStyle[item]}}`;
-					style += '</style>';
-					html = style + html;
-				}
-				return html;
-			},
-			// #endif
+			// 设置富文本内容
 			setContent(html, append) {
 				// #ifdef APP-PLUS-NVUE
-				if (!html) {
-					this.src = '';
-					this.height = 1;
-					return;
+				if (!html)
+					return this.height = 1;
+				if (append)
+					this.$refs.web.evalJs("var b=document.createElement('div');b.innerHTML='" + html.replace(/'/g, "\\'") +
+						"';document.getElementById('parser').appendChild(b)");
+				else {
+					html =
+						'<meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><style>html,body{width:100%;height:100%;overflow:hidden}body{margin:0}</style><base href="' +
+						this.domain + '"><div id="parser"' + (this.selectable ? '>' : ' style="user-select:none">') + this._handleHtml(html).replace(/\n/g, '\\n') +
+						'</div><script>"use strict";function e(e){if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){var t={data:[e]};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(t):window.__dcloud_weex_.postMessage(JSON.stringify(t))}}document.body.onclick=function(){e({action:"click"})},' +
+						(this.showWithAnimation ? 'document.body.style.animation="_show .5s",' : '') +
+						'setTimeout(function(){e({action:"load",text:document.body.innerText,height:document.getElementById("parser").scrollHeight})},50);\x3c/script>';
+					this.$refs.web.evalJs("document.write('" + html.replace(/'/g, "\\'") + "');document.close()");
 				}
-				if (append) return;
-				plus.io.resolveLocalFileSystemURL('_doc', entry => {
-					entry.getDirectory('parser_tmp', {
-						create: true
-					}, entry => {
-						var fileName = Date.now() + '.html';
-						entry.getFile(fileName, {
-							create: true
-						}, entry => {
-							entry.createWriter(writer => {
-								writer.onwriteend = () => {
-									this.nodes = [1];
-									this.src = '_doc/parser_tmp/' + fileName;
-									this.$nextTick(function() {
-										entry.remove();
-									})
-								}
-								html =
-									'<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1' +
-									(this.selectable ? '' : ',user-scalable=no') +
-									'"><script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></' +
-									'script><base href="' + this.domain + '">' + this._handleHtml(html) +
-									'<script>"use strict";function post(t){uni.postMessage({data:t})}' +
-									(this.showWithAnimation ? 'document.body.style.animation="show .5s",' : '') +
-									'document.addEventListener("UniAppJSBridgeReady",function(){post({action:"load",text:document.body.innerText});var t=document.getElementsByTagName("title");t.length&&post({action:"getTitle",title:t[0].innerText});for(var e,o=document.getElementsByTagName("img"),n=[],i=0,r=0;e=o[i];i++)e.onerror=function(){post({action:"error",source:"img",target:this})},e.hasAttribute("ignore")||"A"==e.parentElement.nodeName||(e.i=r++,n.push(e.src),e.onclick=function(){post({action:"preview",img:{i:this.i,src:this.src}})});post({action:"getImgList",imgList:n});for(var a,s=document.getElementsByTagName("a"),c=0;a=s[c];c++)a.onclick=function(){var t,e=this.getAttribute("href");if("#"==e[0]){var r=document.getElementById(e.substr(1));r&&(t=r.offsetTop)}return post({action:"linkpress",href:e,offset:t}),!1};;for(var u,m=document.getElementsByTagName("video"),d=0;u=m[d];d++)u.style.maxWidth="100%",u.onerror=function(){post({action:"error",source:"video",target:this})}' +
-									(this.autopause ? ',u.onplay=function(){for(var t,e=0;t=m[e];e++)t!=this&&t.pause()}' : '') +
-									';for(var g,l=document.getElementsByTagName("audio"),p=0;g=l[p];p++)g.onerror=function(){post({action:"error",source:"audio",target:this})};window.onload=function(){post({action:"ready",height:document.body.scrollHeight})}});</' +
-									'script>';
-								writer.write(html);
-							});
-						})
-					})
-				})
+				this.$refs.web.evalJs(
+					'var t=document.getElementsByTagName("title");t.length&&e({action:"getTitle",title:t[0].innerText});for(var o,n=document.getElementsByTagName("style"),r=1;o=n[r++];)o.innerHTML=o.innerHTML.replace(/body/g,"#parser");for(var a,c=document.getElementsByTagName("img"),s=[],i=0==c.length,d=0,l=0,g=0;a=c[l];l++)parseInt(a.style.width||a.getAttribute("width"))>' +
+					windowWidth + '&&(a.style.height="auto"),a.onload=function(){++d==c.length&&(i=!0)},a.onerror=function(){++d==c.length&&(i=!0),' + (cfg.errorImg ? 'this.src="' + cfg.errorImg + '",' : '') +
+					'e({action:"error",source:"img",target:this})},a.hasAttribute("ignore")||"A"==a.parentElement.nodeName||(a.i=g++,s.push(a.src),a.onclick=function(){e({action:"preview",img:{i:this.i,src:this.src}})});e({action:"getImgList",imgList:s});for(var u,m=document.getElementsByTagName("a"),f=0;u=m[f];f++)u.onclick=function(){var t,o=this.getAttribute("href");if("#"==o[0]){var n=document.getElementById(o.substr(1));n&&(t=n.offsetTop)}return e({action:"linkpress",href:o,offset:t}),!1};for(var h,y=document.getElementsByTagName("video"),v=0;h=y[v];v++)h.style.maxWidth="100%",h.onerror=function(){e({action:"error",source:"video",target:this})}' +
+					(this.autopause ? ',h.onplay=function(){for(var e,t=0;e=y[t];t++)e!=this&&e.pause()}' : '') +
+					';for(var _,p=document.getElementsByTagName("audio"),w=0;_=p[w];w++)_.onerror=function(){e({action:"error",source:"audio",target:this})};' +
+					(this.autoscroll ? 'for(var T,E=document.getElementsByTagName("table"),B=0;T=E[B];B++){var N=document.createElement("div");N.style.overflow="scroll",T.parentNode.replaceChild(N,T),N.appendChild(T)}' : '') +
+					'var x=document.getElementById("parser");clearInterval(window.timer),window.timer=setInterval(function(){i&&clearInterval(window.timer),e({action:"ready",ready:i,height:x.scrollHeight})},350)'
+				)
+				this.nodes = [1];
 				// #endif
-				// #ifdef H5
+				// #ifdef H5 || MP-360
 				if (!html) {
 					if (this.rtf && !append) this.rtf.parentNode.removeChild(this.rtf);
 					return;
@@ -286,7 +258,7 @@
 							}
 						}
 					}, {
-						rootMargin: '900px 0px 900px 0px'
+						rootMargin: '500px 0px 500px 0px'
 					})
 				}
 				var _ts = this;
@@ -300,7 +272,8 @@
 				this.imgList.length = 0;
 				var imgs = this.rtf.getElementsByTagName('img');
 				for (let i = 0, j = 0, img; img = imgs[i]; i++) {
-					img.style.maxWidth = '100%';
+					if (parseInt(img.style.width || img.getAttribute('width')) > windowWidth)
+						img.style.height = 'auto';
 					var src = img.getAttribute('src');
 					if (this.domain && src) {
 						if (src[0] == '/') {
@@ -325,6 +298,8 @@
 						}
 					}
 					img.onerror = function() {
+						if (cfg.errorImg)
+							_ts.imgList[this.i] = this.src = cfg.errorImg;
 						_ts.$emit('error', {
 							source: 'img',
 							target: this
@@ -355,11 +330,10 @@
 								}
 							} else if (href.indexOf('http') == 0 || href.indexOf('//') == 0)
 								return true;
-							else {
+							else
 								uni.navigateTo({
 									url: href
 								})
-							}
 						}
 						return false;
 					}
@@ -382,7 +356,7 @@
 					}
 				}
 				// 音频处理
-				var audios = this.rtf.getElementsByTagName('audios');
+				var audios = this.rtf.getElementsByTagName('audio');
 				for (var audio of audios)
 					audio.onerror = function() {
 						_ts.$emit('error', {
@@ -390,167 +364,94 @@
 							target: this
 						});
 					}
-				this.document = this.rtf;
-				if (!append) document.getElementById('rtf' + this._uid).appendChild(this.rtf);
+				// 表格处理
+				if (this.autoscroll) {
+					var tables = this.rtf.getElementsByTagName('table');
+					for (var table of tables) {
+						let div = document.createElement('div');
+						div.style.overflow = 'scroll';
+						table.parentNode.replaceChild(div, table);
+						div.appendChild(table);
+					}
+				}
+				if (!append) this.document.appendChild(this.rtf);
 				this.$nextTick(() => {
 					this.nodes = [1];
 					this.$emit('load');
-				})
+				});
 				setTimeout(() => this.showAm = '', 500);
 				// #endif
-				// #ifndef H5 || APP-PLUS-NVUE
+				// #ifndef APP-PLUS-NVUE
+				// #ifndef H5 || MP-360
 				var nodes;
-				if (!html)
-					return this.nodes = [];
-				else if (typeof html == 'string') {
-					let parser = new Parser(html, this);
-					// 缓存读取
-					if (this.useCache) {
-						var hashVal = hash(html);
-						if (cache[hashVal])
-							nodes = cache[hashVal];
-						else {
-							nodes = parser.parse();
-							cache[hashVal] = nodes;
-						}
-					} else nodes = parser.parse();
-					this.$emit('parse', nodes);
-				} else if (Object.prototype.toString.call(html) == '[object Array]') {
-					// 非本插件产生的 array 需要进行一些转换
-					if (html.length && html[0].PoweredBy != 'Parser') {
-						let parser = new Parser(html, this);
-						(function f(ns) {
-							for (var i = 0, n; n = ns[i]; i++) {
-								if (n.type == 'text') continue;
-								n.attrs = n.attrs || {};
-								for (var item in n.attrs)
-									if (typeof n.attrs[item] != 'string') n.attrs[item] = n.attrs[item].toString();
-								parser.matchAttr(n, parser);
-								if (n.children && n.children.length) {
-									parser.STACK.push(n);
-									f(n.children);
-									parser.popNode(parser.STACK.pop());
-								} else n.children = void 0;
-							}
-						})(html);
+				if (!html) return this.nodes = [];
+				var parser = new Parser(html, this);
+				// 缓存读取
+				if (this.useCache) {
+					var hashVal = hash(html);
+					if (cache[hashVal])
+						nodes = cache[hashVal];
+					else {
+						nodes = parser.parse();
+						cache[hashVal] = nodes;
 					}
-					nodes = html;
-				} else if (typeof html == 'object' && html.nodes) {
-					nodes = html.nodes;
-					console.warn('错误的 html 类型:object 类型已废弃');
-				} else
-					return console.warn('错误的 html 类型:' + typeof html);
-				// #ifdef APP-PLUS
-				this.loadVideo = false;
-				// #endif
-				if (document) this.document = new document(this.nodes, 'nodes', this);
+				} else nodes = parser.parse();
+				this.$emit('parse', nodes);
 				if (append) this.nodes = this.nodes.concat(nodes);
 				else this.nodes = nodes;
-				if (nodes.length && nodes[0].title && this.autosetTitle)
+				if (nodes.length && nodes.title && this.autosetTitle)
 					uni.setNavigationBarTitle({
-						title: nodes[0].title
+						title: nodes.title
 					})
+				if (this.imgList) this.imgList.length = 0;
+				this.videoContexts = [];
 				this.$nextTick(() => {
-					this.imgList.length = 0;
-					this.videoContexts = [];
-					// #ifdef MP-TOUTIAO
-					setTimeout(() => {
-						// #endif
-						var f = (cs) => {
-							for (let i = 0, c; c = cs[i++];) {
-								if (c.$options.name == 'trees') {
-									for (var j = c.nodes.length, item; item = c.nodes[--j];) {
-										if (item.c) continue;
-										if (item.name == 'img') {
-											this.imgList.setItem(item.attrs.i, item.attrs.src);
-											// #ifndef MP-ALIPAY
-											if (!c.observer && !c.imgLoad && item.attrs.i != '0') {
-												if (this.lazyLoad && uni.createIntersectionObserver) {
-													c.observer = uni.createIntersectionObserver(c);
-													c.observer.relativeToViewport({
-														top: 900,
-														bottom: 900
-													}).observe('._img', () => {
-														c.imgLoad = true;
-														c.observer.disconnect();
-													})
-												} else
-													c.imgLoad = true;
-											}
-											// #endif
-										}
-										// #ifndef MP-ALIPAY
-										else if (item.name == 'video') {
-											var ctx = uni.createVideoContext(item.attrs.id, c);
-											ctx.id = item.attrs.id;
-											this.videoContexts.push(ctx);
-										}
-										// #endif
-										// #ifdef MP-BAIDU || MP-ALIPAY || APP-PLUS
-										if (item.attrs && item.attrs.id) {
-											this.anchors = this.anchors || [];
-											this.anchors.push({
-												id: item.attrs.id,
-												node: c
-											})
-										}
-										// #endif
-									}
-								}
-								if (c.$children.length)
-									f(c.$children)
+					(function f(cs) {
+						for (var i = cs.length; i--;) {
+							if (cs[i].top) {
+								cs[i].controls = [];
+								cs[i].init();
+								f(cs[i].$children);
 							}
 						}
-						f(this.$children);
-						// #ifdef MP-TOUTIAO
-					}, 200)
+					})(this.$children)
 					this.$emit('load');
-					// #endif
-					// #ifdef APP-PLUS
-					setTimeout(() => {
-						this.loadVideo = true;
-					}, 3000);
-					// #endif
 				})
 				// #endif
-				// #ifndef APP-PLUS-NVUE
 				var height;
 				clearInterval(this._timer);
 				this._timer = setInterval(() => {
-					// #ifdef H5
-					var res = [this.rtf.getBoundingClientRect()];
+					// #ifdef H5 || MP-360
+					this.rect = this.rtf.getBoundingClientRect();
 					// #endif
-					// #ifndef H5
-					// #ifdef APP-PLUS
+					// #ifndef H5 || MP-360
 					uni.createSelectorQuery().in(this)
-					// #endif
-					// #ifndef APP-PLUS
-					this.createSelectorQuery()
-						// #endif
-						.select('#top').boundingClientRect().exec(res => {
+						.select('#_top').boundingClientRect().exec(res => {
+							if (!res) return;
+							this.rect = res[0];
 							// #endif
-							this.width = res[0].width;
-							if (res[0].height == height) {
-								this.$emit('ready', res[0])
+							if (this.rect.height == height) {
+								this.$emit('ready', this.rect)
 								clearInterval(this._timer);
 							}
-							height = res[0].height;
-							// #ifndef H5
+							height = this.rect.height;
+							// #ifndef H5 || MP-360
 						});
 					// #endif
-				}, 350)
-				if (this.showWithAnimation && !append) this.showAm = 'animation:show .5s';
+				}, 350);
+				if (this.showWithAnimation && !append) this.showAm = 'animation:_show .5s';
 				// #endif
 			},
+			// 获取文本内容
 			getText(ns = this.nodes) {
+				var txt = '';
 				// #ifdef APP-PLUS-NVUE
-				return this._text;
+				txt = this._text;
 				// #endif
-				// #ifdef H5
-				return this.rtf.innerText;
+				// #ifdef H5 || MP-360
+				txt = this.rtf.innerText;
 				// #endif
-				// #ifndef H5 || APP-PLUS-NVUE
-				var txt = '';
+				// #ifndef H5 || APP-PLUS-NVUE || MP-360
 				for (var i = 0, n; n = ns[i++];) {
 					if (n.type == 'text') txt += n.text.replace(/&nbsp;/g, '\u00A0').replace(/&lt;/g, '<').replace(/&gt;/g, '>')
 						.replace(/&amp;/g, '&');
@@ -565,64 +466,45 @@
 						else if (n.name == 'td' || n.name == 'th') txt += '\t';
 					}
 				}
-				return txt;
 				// #endif
+				return txt;
+			},
+			// 锚点跳转
+			in (obj) {
+				if (obj.page && obj.selector && obj.scrollTop) this._in = obj;
 			},
 			navigateTo(obj) {
-				if (!this.useAnchor)
-					return obj.fail && obj.fail({
-						errMsg: 'Anchor is disabled'
-					})
+				if (!this.useAnchor) return obj.fail && obj.fail('Anchor is disabled');
 				// #ifdef APP-PLUS-NVUE
 				if (!obj.id)
-					dom.scrollToElement(this.$refs.web);
+					weexDom.scrollToElement(this.$refs.web);
 				else
 					this.$refs.web.evalJs('var pos=document.getElementById("' + obj.id +
-						'");if(pos)post({action:"linkpress",href:"#",offset:pos.offsetTop})');
-				return obj.success && obj.success({
-					errMsg: 'pageScrollTo:ok'
-				});
+						'");if(pos)post({action:"linkpress",href:"#",offset:pos.offsetTop+' + (obj.offset || 0) + '})');
+				obj.success && obj.success();
 				// #endif
-				// #ifdef H5
-				if (!obj.id) {
-					window.scrollTo(0, this.rtf.offsetTop);
-					return obj.success && obj.success({
-						errMsg: 'pageScrollTo:ok'
-					});
-				}
-				var target = document.getElementById(obj.id);
-				if (!target) return obj.fail && obj.fail({
-					errMsg: 'Label not found'
-				});
-				obj.scrollTop = this.rtf.offsetTop + target.offsetTop;
-				uni.pageScrollTo(obj);
+				// #ifndef APP-PLUS-NVUE
+				var d = ' ';
+				// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
+				d = '>>>';
 				// #endif
-				// #ifndef H5
-				var Scroll = (selector, component) => {
-					uni.createSelectorQuery().in(component ? component : this).select(selector).boundingClientRect().selectViewport()
-						.scrollOffset()
-						.exec(res => {
-							if (!res || !res[0])
-								return obj.fail && obj.fail({
-									errMsg: 'Label not found'
-								});
-							obj.scrollTop = res[1].scrollTop + res[0].top;
-							uni.pageScrollTo(obj);
-						})
-				}
-				if (!obj.id) Scroll('#top');
-				else {
-					// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
-					Scroll('#top >>> #' + obj.id + ', #top >>> .' + obj.id);
-					// #endif
-					// #ifdef MP-BAIDU || MP-ALIPAY || APP-PLUS
-					for (var anchor of this.anchors)
-						if (anchor.id == obj.id)
-							Scroll('#' + obj.id + ', .' + obj.id, anchor.node);
-					// #endif
-				}
+				var selector = uni.createSelectorQuery().in(this._in ? this._in.page : this).select((this._in ? this._in.selector :
+					'#_top') + (obj.id ? `${d}#${obj.id},${this._in?this._in.selector:'#_top'}${d}.${obj.id}` : '')).boundingClientRect();
+				if (this._in) selector.select(this._in.selector).scrollOffset().select(this._in.selector).boundingClientRect();
+				else selector.selectViewport().scrollOffset();
+				selector.exec(res => {
+					if (!res[0]) return obj.fail && obj.fail('Label not found')
+					var scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + (obj.offset || 0);
+					if (this._in) this._in.page[this._in.scrollTop] = scrollTop;
+					else uni.pageScrollTo({
+						scrollTop,
+						duration: 300
+					})
+					obj.success && obj.success();
+				})
 				// #endif
 			},
+			// 获取视频对象
 			getVideoContext(id) {
 				// #ifndef APP-PLUS-NVUE
 				if (!id) return this.videoContexts;
@@ -631,171 +513,105 @@
 						if (this.videoContexts[i].id == id) return this.videoContexts[i];
 				// #endif
 			},
-			// 预加载
-			preLoad(html, num) {
-				// #ifdef H5 || APP-PLUS-NVUE
-				if (html.constructor == Array)
-					html = this._Dom2Str(html);
-				var script = "var contain=document.createElement('div');contain.innerHTML='" + html.replace(/'/g, "\\'") +
-					"';for(var imgs=contain.querySelectorAll('img'),i=imgs.length-1;i>=" + num +
-					";i--)imgs[i].removeAttribute('src');";
-				// #endif
-				// #ifdef APP-PLUS-NVUE
-				this.$refs.web.evalJs(script);
-				// #endif
-				// #ifdef H5
-				eval(script);
-				// #endif
-				// #ifndef H5 || APP-PLUS-NVUE
-				if (typeof html == 'string') {
-					var id = hash(html);
-					html = new Parser(html, this).parse();
-					cache[id] = html;
+			// #ifdef H5 || APP-PLUS-NVUE || MP-360
+			_handleHtml(html, append) {
+				if (!append) {
+					// 处理 tag-style 和 userAgentStyles
+					var style = '<style>@keyframes _show{0%{opacity:0}100%{opacity:1}}img{max-width:100%}';
+					for (var item in cfg.userAgentStyles)
+						style += `${item}{${cfg.userAgentStyles[item]}}`;
+					for (item in this.tagStyle)
+						style += `${item}{${this.tagStyle[item]}}`;
+					style += '</style>';
+					html = style + html;
 				}
-				var wait = [];
-				(function f(ns) {
-					for (var i = 0, n; n = ns[i++];) {
-						if (n.name == 'img' && n.attrs.src && !wait.includes(n.attrs.src))
-							wait.push(n.attrs.src);
-						f(n.children || []);
-					}
-				})(html);
-				if (num) wait = wait.slice(0, num);
-				this._wait = (this._wait || []).concat(wait);
-				if (!this.imgs) this.imgs = this._wait.splice(0, 15);
-				else if (this.imgs.length < 15)
-					this.imgs = this.imgs.concat(this._wait.splice(0, 15 - this.imgs.length));
-				// #endif
+				// 处理 rpx
+				if (html.includes('rpx'))
+					html = html.replace(/[0-9.]+\s*rpx/g, $ => (parseFloat($) * windowWidth / 750) + 'px');
+				return html;
 			},
+			// #endif
 			// #ifdef APP-PLUS-NVUE
 			_message(e) {
 				// 接收 web-view 消息
-				var data = e.detail.data[0];
-				if (data.action == 'load') {
-					this.$emit('load');
-					this._text = data.text;
-				} else if (data.action == 'getTitle') {
-					if (this.autosetTitle)
-						uni.setNavigationBarTitle({
-							title: data.title
-						})
-				} else if (data.action == 'getImgList') {
-					this.imgList.length = 0;
-					for (var i = data.imgList.length; i--;)
-						this.imgList.setItem(i, data.imgList[i]);
-				} else if (data.action == 'preview') {
-					var preview = true;
-					data.img.ignore = () => preview = false;
-					this.$emit('imgtap', data.img);
-					if (preview)
-						uni.previewImage({
-							current: data.img.i,
-							urls: this.imgList
+				var d = e.detail.data[0];
+				switch (d.action) {
+					case 'load':
+						this.$emit('load');
+						this.height = d.height;
+						this._text = d.text;
+						break;
+					case 'getTitle':
+						if (this.autosetTitle)
+							uni.setNavigationBarTitle({
+								title: d.title
+							})
+						break;
+					case 'getImgList':
+						this.imgList.length = 0;
+						for (var i = d.imgList.length; i--;)
+							this.imgList.setItem(i, d.imgList[i]);
+						break;
+					case 'preview':
+						var preview = true;
+						d.img.ignore = () => preview = false;
+						this.$emit('imgtap', d.img);
+						if (preview)
+							uni.previewImage({
+								current: d.img.i,
+								urls: this.imgList
+							})
+						break;
+					case 'linkpress':
+						var jump = true,
+							href = d.href;
+						this.$emit('linkpress', {
+							href,
+							ignore: () => jump = false
 						})
-				} else if (data.action == 'linkpress') {
-					var jump = true,
-						href = data.href;
-					this.$emit('linkpress', {
-						href,
-						ignore: () => jump = false
-					})
-					if (jump && href) {
-						if (href[0] == '#') {
-							if (this.useAnchor)
-								dom.scrollToElement(this.$refs.web, {
-									offset: data.offset
+						if (jump && href) {
+							if (href[0] == '#') {
+								if (this.useAnchor)
+									weexDom.scrollToElement(this.$refs.web, {
+										offset: d.offset
+									})
+							} else if (href.includes('://'))
+								plus.runtime.openWeb(href);
+							else
+								uni.navigateTo({
+									url: href
 								})
-						} else if (href.includes('://'))
-							plus.runtime.openWeb(href);
-						else
-							uni.navigateTo({
-								url: href
-							})
-					}
-				} else if (data.action == 'error')
-					this.$emit('error', {
-						source: data.source,
-						target: data.target
-					})
-				else if (data.action == 'ready') {
-					this.height = data.height;
-					this.$nextTick(() => {
-						uni.createSelectorQuery().in(this).select('#top').boundingClientRect().exec(res => {
+						}
+						break;
+					case 'error':
+						if (d.source == 'img' && cfg.errorImg)
+							this.imgList.setItem(d.target.i, cfg.errorImg);
+						this.$emit('error', {
+							source: d.source,
+							target: d.target
+						})
+						break;
+					case 'ready':
+						this.height = d.height;
+						if (d.ready) uni.createSelectorQuery().in(this).select('#_top').boundingClientRect().exec(res => {
 							this.rect = res[0];
 							this.$emit('ready', res[0]);
 						})
-					})
-				}
-			},
-			// #endif
-			// #ifndef APP-PLUS-NVUE
-			// #ifndef H5
-			_load(e) {
-				if (this._wait.length)
-					this.$set(this.imgs, e.target.id, this._wait.shift());
-			},
-			// #endif
-			_tap(e) {
-				// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
-				if (this.gestureZoom && e.timeStamp - this._lastT < 300) {
-					var initY = e.touches[0].pageY - e.currentTarget.offsetTop;
-					if (this._zoom) {
-						this._scaleAm.translateX(0).scale(1).step();
-						uni.pageScrollTo({
-							scrollTop: (initY + this._initY) / 2 - e.touches[0].clientY,
-							duration: 400
-						})
-					} else {
-						var initX = e.touches[0].pageX - e.currentTarget.offsetLeft;
-						this._initY = initY;
-						this._scaleAm = uni.createAnimation({
-							transformOrigin: `${initX}px ${this._initY}px 0`,
-							timingFunction: 'ease-in-out'
-						});
-						// #ifdef MP-TOUTIAO
-						this._scaleAm.opacity(1);
-						// #endif
-						this._scaleAm.scale(2).step();
-						this._tMax = initX / 2;
-						this._tMin = (initX - this.width) / 2;
-						this._tX = 0;
-					}
-					this._zoom = !this._zoom;
-					this.scaleAm = this._scaleAm.export();
+						break;
+					case 'click':
+						this.$emit('click');
+						this.$emit('tap');
 				}
-				this._lastT = e.timeStamp;
-				// #endif
-			},
-			_touchstart(e) {
-				// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
-				if (e.touches.length == 1)
-					this._initX = this._lastX = e.touches[0].pageX;
-				// #endif
 			},
-			_touchmove(e) {
-				// #ifndef MP-BAIDU || MP-ALIPAY || APP-PLUS
-				var diff = e.touches[0].pageX - this._lastX;
-				if (this._zoom && e.touches.length == 1 && Math.abs(diff) > 20) {
-					this._lastX = e.touches[0].pageX;
-					if ((this._tX <= this._tMin && diff < 0) || (this._tX >= this._tMax && diff > 0))
-						return;
-					this._tX += (diff * Math.abs(this._lastX - this._initX) * 0.05);
-					if (this._tX < this._tMin) this._tX = this._tMin;
-					if (this._tX > this._tMax) this._tX = this._tMax;
-					this._scaleAm.translateX(this._tX).step();
-					this.scaleAm = this._scaleAm.export();
-				}
-				// #endif
-			}
 			// #endif
 		}
 	}
 </script>
 
 <style>
-	@keyframes show {
+	@keyframes _show {
 		0% {
-			opacity: 0
+			opacity: 0;
 		}
 
 		100% {

+ 92 - 97
components/jyf-parser/libs/CssHandler.js

@@ -1,102 +1,97 @@
-/*
-  解析和匹配 Css 的选择器
-  github:https://github.com/jin-yufeng/Parser
-  docs:https://jin-yufeng.github.io/Parser
-  author:JinYufeng
-  update:2020/03/15
-*/
-var cfg = require('./config.js');
-class CssHandler {
-	constructor(tagStyle) {
-		var styles = Object.assign({}, cfg.userAgentStyles);
-		for (var item in tagStyle)
-			styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];
-		this.styles = styles;
-	}
-	getStyle = data => this.styles = new CssParser(data, this.styles).parse();
-	match(name, attrs) {
-		var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';
-		if (attrs.class) {
-			var items = attrs.class.split(' ');
-			for (var i = 0, item; item = items[i]; i++)
-				if (tmp = this.styles['.' + item])
-					matched += tmp + ';';
-		}
-		if (tmp = this.styles['#' + attrs.id])
-			matched += tmp + ';';
-		return matched;
+const cfg = require('./config.js'),
+	isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+
+function CssHandler(tagStyle) {
+	var styles = Object.assign(Object.create(null), cfg.userAgentStyles);
+	for (var item in tagStyle)
+		styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];
+	this.styles = styles;
+}
+CssHandler.prototype.getStyle = function(data) {
+	this.styles = new parser(data, this.styles).parse();
+}
+CssHandler.prototype.match = function(name, attrs) {
+	var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';
+	if (attrs.class) {
+		var items = attrs.class.split(' ');
+		for (var i = 0, item; item = items[i]; i++)
+			if (tmp = this.styles['.' + item])
+				matched += tmp + ';';
 	}
+	if (tmp = this.styles['#' + attrs.id])
+		matched += tmp + ';';
+	return matched;
 }
 module.exports = CssHandler;
-class CssParser {
-	constructor(data, init) {
-		this.data = data;
-		this.floor = 0;
-		this.i = 0;
-		this.list = [];
-		this.res = init;
-		this.state = this.Space;
-	}
-	parse() {
-		for (var c; c = this.data[this.i]; this.i++)
-			this.state(c);
-		return this.res;
-	}
-	section = () => this.data.substring(this.start, this.i);
-	isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
-	// 状态机
-	Space(c) {
-		if (c == '.' || c == '#' || this.isLetter(c)) {
-			this.start = this.i;
-			this.state = this.Name;
-		} else if (c == '/' && this.data[this.i + 1] == '*')
-			this.Comment();
-		else if (!cfg.blankChar[c] && c != ';')
-			this.state = this.Ignore;
-	}
-	Comment() {
-		this.i = this.data.indexOf('*/', this.i) + 1;
-		if (!this.i) this.i = this.data.length;
-		this.state = this.Space;
-	}
-	Ignore(c) {
-		if (c == '{') this.floor++;
-		else if (c == '}' && !--this.floor) this.state = this.Space;
-	}
-	Name(c) {
-		if (cfg.blankChar[c]) {
-			this.list.push(this.section());
-			this.state = this.NameSpace;
-		} else if (c == '{') {
-			this.list.push(this.section());
-			this.Content();
-		} else if (c == ',') {
-			this.list.push(this.section());
-			this.Comma();
-		} else if (!this.isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')
-			this.state = this.Ignore;
-	}
-	NameSpace(c) {
-		if (c == '{') this.Content();
-		else if (c == ',') this.Comma();
-		else if (!cfg.blankChar[c]) this.state = this.Ignore;
-	}
-	Comma() {
-		while (cfg.blankChar[this.data[++this.i]]);
-		if (this.data[this.i] == '{') this.Content();
-		else {
-			this.start = this.i--;
-			this.state = this.Name;
-		}
-	}
-	Content() {
-		this.start = ++this.i;
-		if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;
-		var content = this.section();
-		for (var i = 0, item; item = this.list[i++];)
-			if (this.res[item]) this.res[item] += ';' + content;
-			else this.res[item] = content;
-		this.list = [];
-		this.state = this.Space;
+
+function parser(data, init) {
+	this.data = data;
+	this.floor = 0;
+	this.i = 0;
+	this.list = [];
+	this.res = init;
+	this.state = this.Space;
+}
+parser.prototype.parse = function() {
+	for (var c; c = this.data[this.i]; this.i++)
+		this.state(c);
+	return this.res;
+}
+parser.prototype.section = function() {
+	return this.data.substring(this.start, this.i);
+}
+// 状态机
+parser.prototype.Space = function(c) {
+	if (c == '.' || c == '#' || isLetter(c)) {
+		this.start = this.i;
+		this.state = this.Name;
+	} else if (c == '/' && this.data[this.i + 1] == '*')
+		this.Comment();
+	else if (!cfg.blankChar[c] && c != ';')
+		this.state = this.Ignore;
+}
+parser.prototype.Comment = function() {
+	this.i = this.data.indexOf('*/', this.i) + 1;
+	if (!this.i) this.i = this.data.length;
+	this.state = this.Space;
+}
+parser.prototype.Ignore = function(c) {
+	if (c == '{') this.floor++;
+	else if (c == '}' && !--this.floor) this.state = this.Space;
+}
+parser.prototype.Name = function(c) {
+	if (cfg.blankChar[c]) {
+		this.list.push(this.section());
+		this.state = this.NameSpace;
+	} else if (c == '{') {
+		this.list.push(this.section());
+		this.Content();
+	} else if (c == ',') {
+		this.list.push(this.section());
+		this.Comma();
+	} else if (!isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')
+		this.state = this.Ignore;
+}
+parser.prototype.NameSpace = function(c) {
+	if (c == '{') this.Content();
+	else if (c == ',') this.Comma();
+	else if (!cfg.blankChar[c]) this.state = this.Ignore;
+}
+parser.prototype.Comma = function() {
+	while (cfg.blankChar[this.data[++this.i]]);
+	if (this.data[this.i] == '{') this.Content();
+	else {
+		this.start = this.i--;
+		this.state = this.Name;
 	}
 }
+parser.prototype.Content = function() {
+	this.start = ++this.i;
+	if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;
+	var content = this.section();
+	for (var i = 0, item; item = this.list[i++];)
+		if (this.res[item]) this.res[item] += ';' + content;
+		else this.res[item] = content;
+	this.list = [];
+	this.state = this.Space;
+}

+ 414 - 456
components/jyf-parser/libs/MpHtmlParser.js

@@ -1,286 +1,148 @@
-/*
-  将 html 解析为适用于小程序 rich-text 的 DOM 结构
-  github:https://github.com/jin-yufeng/Parser
-  docs:https://jin-yufeng.github.io/Parser
-  author:JinYufeng
-  update:2020/04/13
-*/
-var cfg = require('./config.js'),
+/**
+ * html 解析器
+ * @tutorial https://github.com/jin-yufeng/Parser
+ * @version 20200728
+ * @author JinYufeng
+ * @listens MIT
+ */
+const cfg = require('./config.js'),
 	blankChar = cfg.blankChar,
 	CssHandler = require('./CssHandler.js'),
-	{
-		screenWidth,
-		system
-	} = wx.getSystemInfoSync();
-// #ifdef MP-BAIDU || MP-ALIPAY || MP-TOUTIAO
-var entities = {
-	lt: '<',
-	gt: '>',
-	amp: '&',
-	quot: '"',
-	apos: "'",
-	nbsp: '\xA0',
-	ensp: '\u2002',
-	emsp: '\u2003',
-	ndash: '–',
-	mdash: '—',
-	middot: '·',
-	lsquo: '‘',
-	rsquo: '’',
-	ldquo: '“',
-	rdquo: '”',
-	bull: '•',
-	hellip: '…',
-	permil: '‰',
-	copy: '©',
-	reg: '®',
-	trade: '™',
-	times: '×',
-	divide: '÷',
-	cent: '¢',
-	pound: '£',
-	yen: '¥',
-	euro: '€',
-	sect: '§'
-};
-// #endif
-var emoji; // emoji 补丁包 https://jin-yufeng.github.io/Parser/#/instructions?id=emoji
-class MpHtmlParser {
-	constructor(data, options = {}) {
-		this.attrs = {};
-		this.compress = options.compress;
-		this.CssHandler = new CssHandler(options.tagStyle, screenWidth);
-		this.data = data;
-		this.domain = options.domain;
-		this.DOM = [];
-		this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;
-		this.protocol = this.domain && this.domain.includes('://') ? this.domain.split('://')[0] : '';
-		this.state = this.Text;
-		this.STACK = [];
-		this.useAnchor = options.useAnchor;
-		this.xml = options.xml;
-	}
-	parse() {
-		if (emoji) this.data = emoji.parseEmoji(this.data);
-		for (var c; c = this.data[this.i]; this.i++)
-			this.state(c);
-		if (this.state == this.Text) this.setText();
-		while (this.STACK.length) this.popNode(this.STACK.pop());
-		// #ifdef MP-BAIDU || MP-TOUTIAO
-		// 将顶层标签的一些样式提取出来给 rich-text
-		(function f(ns) {
-			for (var i = ns.length, n; n = ns[--i];) {
-				if (n.type == 'text') continue;
-				if (!n.c) {
-					var style = n.attrs.style;
-					if (style) {
-						var j, k, res;
-						if ((j = style.indexOf('display')) != -1)
-							res = style.substring(j, (k = style.indexOf(';', j)) == -1 ? style.length : k);
-						if ((j = style.indexOf('float')) != -1)
-							res += ';' + style.substring(j, (k = style.indexOf(';', j)) == -1 ? style.length : k);
-						n.attrs.contain = res;
-					}
-				} else f(n.children);
+	windowWidth = uni.getSystemInfoSync().windowWidth;
+var emoji;
+
+function MpHtmlParser(data, options = {}) {
+	this.attrs = {};
+	this.CssHandler = new CssHandler(options.tagStyle, windowWidth);
+	this.data = data;
+	this.domain = options.domain;
+	this.DOM = [];
+	this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;
+	options.prot = (this.domain || '').includes('://') ? this.domain.split('://')[0] : 'http';
+	this.options = options;
+	this.state = this.Text;
+	this.STACK = [];
+	// 工具函数
+	this.bubble = () => {
+		for (var i = this.STACK.length, item; item = this.STACK[--i];) {
+			if (cfg.richOnlyTags[item.name]) {
+				if (item.name == 'table' && !Object.hasOwnProperty.call(item, 'c')) item.c = 1;
+				return false;
 			}
-		})(this.DOM);
-		// #endif
-		if (this.DOM.length) {
-			this.DOM[0].PoweredBy = 'Parser';
-			if (this.title) this.DOM[0].title = this.title;
-		}
-		return this.DOM;
-	}
-	// 设置属性
-	setAttr() {
-		var name = this.getName(this.attrName);
-		if (cfg.trustAttrs[name]) {
-			if (!this.attrVal) {
-				if (cfg.boolAttrs[name]) this.attrs[name] = 'T';
-			} else if (name == 'src') this.attrs[name] = this.getUrl(this.attrVal.replace(/&amp;/g, '&'));
-			else this.attrs[name] = this.attrVal;
-		}
-		this.attrVal = '';
-		while (blankChar[this.data[this.i]]) this.i++;
-		if (this.isClose()) this.setNode();
-		else {
-			this.start = this.i;
-			this.state = this.AttrName;
+			item.c = 1;
 		}
+		return true;
 	}
-	// 设置文本节点
-	setText() {
-		var back, text = this.section();
-		if (!text) return;
-		text = (cfg.onText && cfg.onText(text, () => back = true)) || text;
-		if (back) {
-			this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);
-			let j = this.start + text.length;
-			for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);
-			return;
-		}
-		if (!this.pre) {
-			// 合并空白符
-			var tmp = [];
-			for (let i = text.length, c; c = text[--i];)
-				if (!blankChar[c] || (!blankChar[tmp[0]] && (c = ' '))) tmp.unshift(c);
-			text = tmp.join('');
-			if (text == ' ') return;
-		}
-		// 处理实体
-		var siblings = this.siblings(),
-			i = -1,
+	this.decode = (val, amp) => {
+		var i = -1,
 			j, en;
 		while (1) {
-			if ((i = text.indexOf('&', i + 1)) == -1) break;
-			if ((j = text.indexOf(';', i + 2)) == -1) break;
-			if (text[i + 1] == '#') {
-				en = parseInt((text[i + 2] == 'x' ? '0' : '') + text.substring(i + 2, j));
-				if (!isNaN(en)) text = text.substr(0, i) + String.fromCharCode(en) + text.substring(j + 1);
+			if ((i = val.indexOf('&', i + 1)) == -1) break;
+			if ((j = val.indexOf(';', i + 2)) == -1) break;
+			if (val[i + 1] == '#') {
+				en = parseInt((val[i + 2] == 'x' ? '0' : '') + val.substring(i + 2, j));
+				if (!isNaN(en)) val = val.substr(0, i) + String.fromCharCode(en) + val.substr(j + 1);
 			} else {
-				en = text.substring(i + 1, j);
-				// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
-				if (en == 'nbsp') text = text.substr(0, i) + '\xA0' + text.substr(j + 1); // 解决 &nbsp; 失效
-				else if (en != 'lt' && en != 'gt' && en != 'amp' && en != 'ensp' && en != 'emsp' && en != 'quot' && en != 'apos') {
-					i && siblings.push({
-						type: 'text',
-						text: text.substr(0, i)
-					})
-					siblings.push({
-						type: 'text',
-						text: `&${en};`,
-						en: 1
-					})
-					text = text.substr(j + 1);
-					i = -1;
-				}
-				// #endif
-				// #ifdef MP-BAIDU || MP-ALIPAY || MP-TOUTIAO
-				if (entities[en]) text = text.substr(0, i) + entities[en] + text.substr(j + 1);
-				// #endif
+				en = val.substring(i + 1, j);
+				if (cfg.entities[en] || en == amp)
+					val = val.substr(0, i) + (cfg.entities[en] || '&') + val.substr(j + 1);
 			}
 		}
-		text && siblings.push({
-			type: 'text',
-			text
-		})
+		return val;
 	}
-	// 设置元素节点
-	setNode() {
-		var node = {
-				name: this.tagName.toLowerCase(),
-				attrs: this.attrs
-			},
-			close = cfg.selfClosingTags[node.name] || (this.xml && this.data[this.i] == '/');
-		this.attrs = {};
-		if (!cfg.ignoreTags[node.name]) {
-			this.matchAttr(node);
-			if (!close) {
-				node.children = [];
-				if (node.name == 'pre' && cfg.highlight) {
-					this.remove(node);
-					this.pre = node.pre = true;
-				}
-				this.siblings().push(node);
-				this.STACK.push(node);
-			} else if (!cfg.filter || cfg.filter(node, this) != false)
-				this.siblings().push(node);
-		} else {
-			if (!close) this.remove(node);
-			else if (node.name == 'source') {
-				var parent = this.STACK[this.STACK.length - 1],
-					attrs = node.attrs;
-				if (parent && attrs.src)
-					if (parent.name == 'video' || parent.name == 'audio')
-						parent.attrs.source.push(attrs.src);
-					else {
-						var i, media = attrs.media;
-						if (parent.name == 'picture' && !parent.attrs.src && !(attrs.src.indexOf('.webp') && system.includes('iOS')) &&
-							(!media || (media.includes('px') &&
-								(((i = media.indexOf('min-width')) != -1 && (i = media.indexOf(':', i + 8)) != -1 && screenWidth > parseInt(
-										media.substr(i + 1))) ||
-									((i = media.indexOf('max-width')) != -1 && (i = media.indexOf(':', i + 8)) != -1 && screenWidth < parseInt(
-										media.substr(i + 1)))))))
-							parent.attrs.src = attrs.src;
-					}
-			} else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;
-		}
-		if (this.data[this.i] == '/') this.i++;
-		this.start = this.i + 1;
-		this.state = this.Text;
+	this.getUrl = url => {
+		if (url[0] == '/') {
+			if (url[1] == '/') url = this.options.prot + ':' + url;
+			else if (this.domain) url = this.domain + url;
+		} else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))
+			url = this.domain + '/' + url;
+		return url;
 	}
-	// 移除标签
-	remove(node) {
-		var name = node.name,
-			j = this.i;
-		while (1) {
-			if ((this.i = this.data.indexOf('</', this.i + 1)) == -1) {
-				if (name == 'pre' || name == 'svg') this.i = j;
-				else this.i = this.data.length;
-				return;
-			}
-			this.start = (this.i += 2);
-			while (!blankChar[this.data[this.i]] && !this.isClose()) this.i++;
-			if (this.getName(this.section()) == name) {
-				// 代码块高亮
-				if (name == 'pre') {
-					this.data = this.data.substr(0, j + 1) + cfg.highlight(this.data.substring(j + 1, this.i - 5), node.attrs) +
-						this.data.substr(this.i - 5);
-					return this.i = j;
-				} else if (name == 'style')
-					this.CssHandler.getStyle(this.data.substring(j + 1, this.i - 7));
-				else if (name == 'title')
-					this.title = this.data.substring(j + 1, this.i - 7);
-				if ((this.i = this.data.indexOf('>', this.i)) == -1) this.i = this.data.length;
-				// 处理 svg
-				if (name == 'svg') {
-					var src = this.data.substring(j, this.i + 1);
-					if (!node.attrs.xmlns) src = ' xmlns="http://www.w3.org/2000/svg"' + src;
-					var i = j;
-					while (this.data[j] != '<') j--;
-					src = this.data.substring(j, i) + src;
-					var parent = this.STACK[this.STACK.length - 1];
-					if (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline'))
-						parent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style;
-					this.siblings().push({
-						name: 'img',
-						attrs: {
-							src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
-							ignore: 'T'
-						}
-					})
-				}
-				return;
+	this.isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');
+	this.section = () => this.data.substring(this.start, this.i);
+	this.parent = () => this.STACK[this.STACK.length - 1];
+	this.siblings = () => this.STACK.length ? this.parent().children : this.DOM;
+}
+MpHtmlParser.prototype.parse = function() {
+	if (emoji) this.data = emoji.parseEmoji(this.data);
+	for (var c; c = this.data[this.i]; this.i++)
+		this.state(c);
+	if (this.state == this.Text) this.setText();
+	while (this.STACK.length) this.popNode(this.STACK.pop());
+	return this.DOM;
+}
+// 设置属性
+MpHtmlParser.prototype.setAttr = function() {
+	var name = this.attrName.toLowerCase(),
+		val = this.attrVal;
+	if (cfg.boolAttrs[name]) this.attrs[name] = 'T';
+	else if (val) {
+		if (name == 'src' || (name == 'data-src' && !this.attrs.src)) this.attrs.src = this.getUrl(this.decode(val, 'amp'));
+		else if (name == 'href' || name == 'style') this.attrs[name] = this.decode(val, 'amp');
+		else if (name.substr(0, 5) != 'data-') this.attrs[name] = val;
+	}
+	this.attrVal = '';
+	while (blankChar[this.data[this.i]]) this.i++;
+	if (this.isClose()) this.setNode();
+	else {
+		this.start = this.i;
+		this.state = this.AttrName;
+	}
+}
+// 设置文本节点
+MpHtmlParser.prototype.setText = function() {
+	var back, text = this.section();
+	if (!text) return;
+	text = (cfg.onText && cfg.onText(text, () => back = true)) || text;
+	if (back) {
+		this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);
+		let j = this.start + text.length;
+		for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);
+		return;
+	}
+	if (!this.pre) {
+		// 合并空白符
+		var flag, tmp = [];
+		for (let i = text.length, c; c = text[--i];)
+			if (!blankChar[c]) {
+				tmp.unshift(c);
+				if (!flag) flag = 1;
+			} else {
+				if (tmp[0] != ' ') tmp.unshift(' ');
+				if (c == '\n' && flag == void 0) flag = 0;
 			}
-		}
+		if (flag == 0) return;
+		text = tmp.join('');
 	}
-	// 处理属性
-	matchAttr(node) {
+	this.siblings().push({
+		type: 'text',
+		text: this.decode(text)
+	});
+}
+// 设置元素节点
+MpHtmlParser.prototype.setNode = function() {
+	var node = {
+			name: this.tagName.toLowerCase(),
+			attrs: this.attrs
+		},
+		close = cfg.selfClosingTags[node.name];
+	if (this.options.nodes.length) node.type = 'node';
+	this.attrs = {};
+	if (!cfg.ignoreTags[node.name]) {
+		// 处理属性
 		var attrs = node.attrs,
 			style = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''),
 			styleObj = {};
 		if (attrs.id) {
-			if (this.compress & 1) attrs.id = void 0;
-			else if (this.useAnchor) this.bubble();
+			if (this.options.compress & 1) attrs.id = void 0;
+			else if (this.options.useAnchor) this.bubble();
 		}
-		if ((this.compress & 2) && attrs.class) attrs.class = void 0;
+		if ((this.options.compress & 2) && attrs.class) attrs.class = void 0;
 		switch (node.name) {
-			case 'img':
-				if (attrs['data-src']) {
-					attrs.src = attrs.src || attrs['data-src'];
-					attrs['data-src'] = void 0;
-				}
-				if (attrs.src && !attrs.ignore) {
-					if (this.bubble()) attrs.i = (this.imgNum++).toString();
-					else attrs.ignore = 'T';
-				}
-				break;
 			case 'a':
-			case 'ad':
-			// #ifdef APP-PLUS
+			case 'ad': // #ifdef APP-PLUS
 			case 'iframe':
-			case 'embed':
-			// #endif
+				// #endif
 				this.bubble();
 				break;
 			case 'font':
@@ -301,25 +163,46 @@ class MpHtmlParser {
 					attrs.size = void 0;
 				}
 				break;
+			case 'embed':
+				// #ifndef APP-PLUS
+				var src = node.attrs.src || '',
+					type = node.attrs.type || '';
+				if (type.includes('video') || src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8'))
+					node.name = 'video';
+				else if (type.includes('audio') || src.includes('.m4a') || src.includes('.wav') || src.includes('.mp3') || src.includes(
+						'.aac'))
+					node.name = 'audio';
+				else break;
+				if (node.attrs.autostart)
+					node.attrs.autoplay = 'T';
+				node.attrs.controls = 'T';
+				// #endif
+				// #ifdef APP-PLUS
+				this.bubble();
+				break;
+				// #endif
 			case 'video':
 			case 'audio':
 				if (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]);
 				else this[`${node.name}Num`]++;
 				if (node.name == 'video') {
+					if (this.videoNum > 3)
+						node.lazyLoad = 1;
 					if (attrs.width) {
-						style = `width:${parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')};${style}`;
+						styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px');
 						attrs.width = void 0;
 					}
 					if (attrs.height) {
-						style = `height:${parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')};${style}`;
+						styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px');
 						attrs.height = void 0;
 					}
-					if (this.videoNum > 3) node.lazyLoad = true;
 				}
+				if (!attrs.controls && !attrs.autoplay) attrs.controls = 'T';
 				attrs.source = [];
-				if (attrs.src) attrs.source.push(attrs.src);
-				if (!attrs.controls && !attrs.autoplay)
-					console.warn(`存在没有 controls 属性的 ${node.name} 标签,可能导致无法播放`, node);
+				if (attrs.src) {
+					attrs.source.push(attrs.src);
+					attrs.src = void 0;
+				}
 				this.bubble();
 				break;
 			case 'td':
@@ -336,24 +219,48 @@ class MpHtmlParser {
 			attrs.align = void 0;
 		}
 		// 压缩 style
-		var styles = style.replace(/&quot;/g, '"').replace(/&amp;/g, '&').split(';');
+		var styles = style.split(';');
 		style = '';
 		for (var i = 0, len = styles.length; i < len; i++) {
 			var info = styles[i].split(':');
 			if (info.length < 2) continue;
 			let key = info[0].trim().toLowerCase(),
 				value = info.slice(1).join(':').trim();
-			if (value.includes('-webkit') || value.includes('-moz') || value.includes('-ms') || value.includes('-o') || value
-				.includes(
-					'safe'))
+			if (value[0] == '-' || value.includes('safe'))
 				style += `;${key}:${value}`;
 			else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import'))
 				styleObj[key] = value;
 		}
-		if (node.name == 'img' && parseInt(styleObj.width || attrs.width) > screenWidth)
-			styleObj.height = 'auto';
+		if (node.name == 'img') {
+			if (attrs.src && !attrs.ignore) {
+				if (this.bubble())
+					attrs.i = (this.imgNum++).toString();
+				else attrs.ignore = 'T';
+			}
+			if (attrs.ignore) {
+				style += ';-webkit-touch-callout:none';
+				styleObj['max-width'] = '100%';
+			}
+			var width;
+			if (styleObj.width) width = styleObj.width;
+			else if (attrs.width) width = attrs.width.includes('%') ? attrs.width : attrs.width + 'px';
+			if (width) {
+				styleObj.width = width;
+				attrs.width = '100%';
+				if (parseInt(width) > windowWidth) {
+					styleObj.height = '';
+					if (attrs.height) attrs.height = void 0;
+				}
+			}
+			if (styleObj.height) {
+				attrs.height = styleObj.height;
+				styleObj.height = '';
+			} else if (attrs.height && !attrs.height.includes('%'))
+				attrs.height += 'px';
+		}
 		for (var key in styleObj) {
 			var value = styleObj[key];
+			if (!value) continue;
 			if (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1;
 			// 填充链接
 			if (value.includes('url')) {
@@ -365,213 +272,264 @@ class MpHtmlParser {
 			}
 			// 转换 rpx
 			else if (value.includes('rpx'))
-				value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * screenWidth / 750 + 'px');
-			else if (key == 'white-space' && value.includes('pre'))
+				value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px');
+			else if (key == 'white-space' && value.includes('pre') && !close)
 				this.pre = node.pre = true;
 			style += `;${key}:${value}`;
 		}
 		style = style.substr(1);
 		if (style) attrs.style = style;
+		if (!close) {
+			node.children = [];
+			if (node.name == 'pre' && cfg.highlight) {
+				this.remove(node);
+				this.pre = node.pre = true;
+			}
+			this.siblings().push(node);
+			this.STACK.push(node);
+		} else if (!cfg.filter || cfg.filter(node, this) != false)
+			this.siblings().push(node);
+	} else {
+		if (!close) this.remove(node);
+		else if (node.name == 'source') {
+			var parent = this.parent();
+			if (parent && (parent.name == 'video' || parent.name == 'audio') && node.attrs.src)
+				parent.attrs.source.push(node.attrs.src);
+		} else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;
 	}
-	// 节点出栈处理
-	popNode(node) {
-		// 空白符处理
-		if (node.pre) {
-			node.pre = this.pre = void 0;
-			for (let i = this.STACK.length; i--;)
-				if (this.STACK[i].pre)
-					this.pre = true;
-		}
-		if (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false))
-			return this.siblings().pop();
-		var attrs = node.attrs;
-		// 替换一些标签名
-		if (node.name == 'picture') {
-			node.name = 'img';
-			if (!attrs.src && (node.children[0] || '').name == 'img')
-				attrs.src = node.children[0].attrs.src;
-			if (attrs.src && !attrs.ignore)
-				attrs.i = (this.imgNum++).toString();
-			return node.children = void 0;
-		}
-		if (cfg.blockTags[node.name]) node.name = 'div';
-		else if (!cfg.trustTags[node.name]) node.name = 'span';
-		// 处理列表
-		if (node.c) {
-			if (node.name == 'ul') {
-				var floor = 1;
-				for (let i = this.STACK.length; i--;)
-					if (this.STACK[i].name == 'ul') floor++;
-				if (floor != 1)
-					for (let i = node.children.length; i--;)
-						node.children[i].floor = floor;
-			} else if (node.name == 'ol') {
-				for (let i = 0, num = 1, child; child = node.children[i++];)
-					if (child.name == 'li') {
-						child.type = 'ol';
-						child.num = ((num, type) => {
-							if (type == 'a') return String.fromCharCode(97 + (num - 1) % 26);
-							if (type == 'A') return String.fromCharCode(65 + (num - 1) % 26);
-							if (type == 'i' || type == 'I') {
-								num = (num - 1) % 99 + 1;
-								var one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
-									ten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
-									res = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || '');
-								if (type == 'i') return res.toLowerCase();
-								return res;
-							}
-							return num;
-						})(num++, attrs.type) + '.';
-					}
+	if (this.data[this.i] == '/') this.i++;
+	this.start = this.i + 1;
+	this.state = this.Text;
+}
+// 移除标签
+MpHtmlParser.prototype.remove = function(node) {
+	var name = node.name,
+		j = this.i;
+	// 处理 svg
+	var handleSvg = () => {
+		var src = this.data.substring(j, this.i + 1);
+		if (!node.attrs.xmlns) src = ' xmlns="http://www.w3.org/2000/svg"' + src;
+		var i = j;
+		while (this.data[j] != '<') j--;
+		src = this.data.substring(j, i).replace("viewbox", "viewBox") + src;
+		var parent = this.parent();
+		if (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline'))
+			parent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style;
+		this.siblings().push({
+			name: 'img',
+			attrs: {
+				src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+				style: (/vertical[^;]+/.exec(node.attrs.style) || []).shift(),
+				ignore: 'T'
 			}
+		})
+	}
+	if (node.name == 'svg' && this.data[j] == '/') return handleSvg(this.i++);
+	while (1) {
+		if ((this.i = this.data.indexOf('</', this.i + 1)) == -1) {
+			if (name == 'pre' || name == 'svg') this.i = j;
+			else this.i = this.data.length;
+			return;
 		}
-		// 处理表格的边框
-		if (node.name == 'table') {
-			var padding = attrs.cellpadding,
-				spacing = attrs.cellspacing,
-				border = attrs.border;
-			if (node.c) {
-				this.bubble();
-				if (!padding) padding = 2;
-				if (!spacing) spacing = 2;
-			}
-			if (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`;
-			if (spacing) attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`;
-			if (border || padding)
-				(function f(ns) {
-					for (var i = 0, n; n = ns[i]; i++) {
-						if (n.name == 'th' || n.name == 'td') {
-							if (border) n.attrs.style = `border:${border}px solid gray;${n.attrs.style}`;
-							if (padding) n.attrs.style = `padding:${padding}px;${n.attrs.style}`;
-						} else f(n.children || []);
-					}
-				})(node.children)
+		this.start = (this.i += 2);
+		while (!blankChar[this.data[this.i]] && !this.isClose()) this.i++;
+		if (this.section().toLowerCase() == name) {
+			// 代码块高亮
+			if (name == 'pre') {
+				this.data = this.data.substr(0, j + 1) + cfg.highlight(this.data.substring(j + 1, this.i - 5), node.attrs) + this.data
+					.substr(this.i - 5);
+				return this.i = j;
+			} else if (name == 'style')
+				this.CssHandler.getStyle(this.data.substring(j + 1, this.i - 7));
+			else if (name == 'title')
+				this.DOM.title = this.data.substring(j + 1, this.i - 7);
+			if ((this.i = this.data.indexOf('>', this.i)) == -1) this.i = this.data.length;
+			if (name == 'svg') handleSvg();
+			return;
 		}
-		this.CssHandler.pop && this.CssHandler.pop(node);
-		// 自动压缩
-		if (node.name == 'div' && !Object.keys(attrs).length) {
-			var siblings = this.siblings();
-			if (node.children.length == 1 && node.children[0].name == 'div')
-				siblings[siblings.length - 1] = node.children[0];
+	}
+}
+// 节点出栈处理
+MpHtmlParser.prototype.popNode = function(node) {
+	// 空白符处理
+	if (node.pre) {
+		node.pre = this.pre = void 0;
+		for (let i = this.STACK.length; i--;)
+			if (this.STACK[i].pre)
+				this.pre = true;
+	}
+	var siblings = this.siblings(),
+		len = siblings.length,
+		childs = node.children;
+	if (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false))
+		return siblings.pop();
+	var attrs = node.attrs;
+	// 替换一些标签名
+	if (cfg.blockTags[node.name]) node.name = 'div';
+	else if (!cfg.trustTags[node.name]) node.name = 'span';
+	// 处理列表
+	if (node.c && (node.name == 'ul' || node.name == 'ol')) {
+		if ((node.attrs.style || '').includes('list-style:none')) {
+			for (let i = 0, child; child = childs[i++];)
+				if (child.name == 'li')
+					child.name = 'div';
+		} else if (node.name == 'ul') {
+			var floor = 1;
+			for (let i = this.STACK.length; i--;)
+				if (this.STACK[i].name == 'ul') floor++;
+			if (floor != 1)
+				for (let i = childs.length; i--;)
+					childs[i].floor = floor;
+		} else {
+			for (let i = 0, num = 1, child; child = childs[i++];)
+				if (child.name == 'li') {
+					child.type = 'ol';
+					child.num = ((num, type) => {
+						if (type == 'a') return String.fromCharCode(97 + (num - 1) % 26);
+						if (type == 'A') return String.fromCharCode(65 + (num - 1) % 26);
+						if (type == 'i' || type == 'I') {
+							num = (num - 1) % 99 + 1;
+							var one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
+								ten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
+								res = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || '');
+							if (type == 'i') return res.toLowerCase();
+							return res;
+						}
+						return num;
+					})(num++, attrs.type) + '.';
+				}
 		}
 	}
-	// 工具函数
-	bubble() {
-		for (var i = this.STACK.length, item; item = this.STACK[--i];) {
-			if (cfg.richOnlyTags[item.name]) {
-				if (item.name == 'table' && !Object.hasOwnProperty.call(item, 'c')) item.c = 1;
-				return false;
+	// 处理表格的边框
+	if (node.name == 'table') {
+		var padding = attrs.cellpadding,
+			spacing = attrs.cellspacing,
+			border = attrs.border;
+		if (node.c) {
+			this.bubble();
+			attrs.style = (attrs.style || '') + ';display:table';
+			if (!padding) padding = 2;
+			if (!spacing) spacing = 2;
+		}
+		if (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`;
+		if (spacing) attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`;
+		if (border || padding || node.c)
+			(function f(ns) {
+				for (var i = 0, n; n = ns[i]; i++) {
+					if (n.type == 'text') continue;
+					var style = n.attrs.style || '';
+					if (node.c && n.name[0] == 't') {
+						n.c = 1;
+						style += ';display:table-' + (n.name == 'th' || n.name == 'td' ? 'cell' : (n.name == 'tr' ? 'row' : 'row-group'));
+					}
+					if (n.name == 'th' || n.name == 'td') {
+						if (border) style = `border:${border}px solid gray;${style}`;
+						if (padding) style = `padding:${padding}px;${style}`;
+					} else f(n.children || []);
+					if (style) n.attrs.style = style;
+				}
+			})(childs)
+		if (this.options.autoscroll) {
+			var table = Object.assign({}, node);
+			node.name = 'div';
+			node.attrs = {
+				style: 'overflow:scroll'
 			}
-			item.c = 1;
+			node.children = [table];
 		}
-		return true;
-	}
-	getName = val => this.xml ? val : val.toLowerCase();
-	getUrl(url) {
-		if (url[0] == '/') {
-			if (url[1] == '/') url = this.protocol + ':' + url;
-			else if (this.domain) url = this.domain + url;
-		} else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))
-			url = this.domain + '/' + url;
-		return url;
 	}
-	isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');
-	section = () => this.data.substring(this.start, this.i);
-	siblings = () => this.STACK.length ? this.STACK[this.STACK.length - 1].children : this.DOM;
-	// 状态机
-	Text(c) {
-		if (c == '<') {
-			var next = this.data[this.i + 1],
-				isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
-			if (isLetter(next)) {
-				this.setText();
+	this.CssHandler.pop && this.CssHandler.pop(node);
+	// 自动压缩
+	if (node.name == 'div' && !Object.keys(attrs).length && childs.length == 1 && childs[0].name == 'div')
+		siblings[len - 1] = childs[0];
+}
+// 状态机
+MpHtmlParser.prototype.Text = function(c) {
+	if (c == '<') {
+		var next = this.data[this.i + 1],
+			isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+		if (isLetter(next)) {
+			this.setText();
+			this.start = this.i + 1;
+			this.state = this.TagName;
+		} else if (next == '/') {
+			this.setText();
+			if (isLetter(this.data[++this.i + 1])) {
 				this.start = this.i + 1;
-				this.state = this.TagName;
-			} else if (next == '/') {
-				this.setText();
-				if (isLetter(this.data[++this.i + 1])) {
-					this.start = this.i + 1;
-					this.state = this.EndTag;
-				} else
-					this.Comment();
-			} else if (next == '!') {
-				this.setText();
-				this.Comment();
-			}
+				this.state = this.EndTag;
+			} else this.Comment();
+		} else if (next == '!' || next == '?') {
+			this.setText();
+			this.Comment();
 		}
 	}
-	Comment() {
-		var key;
-		if (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->';
-		else if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>';
-		else key = '>';
-		if ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length;
-		else this.i += key.length - 1;
-		this.start = this.i + 1;
-		this.state = this.Text;
-	}
-	TagName(c) {
-		if (blankChar[c]) {
-			this.tagName = this.section();
-			while (blankChar[this.data[this.i]]) this.i++;
-			if (this.isClose()) this.setNode();
-			else {
-				this.start = this.i;
-				this.state = this.AttrName;
-			}
-		} else if (this.isClose()) {
-			this.tagName = this.section();
-			this.setNode();
+}
+MpHtmlParser.prototype.Comment = function() {
+	var key;
+	if (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->';
+	else if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>';
+	else key = '>';
+	if ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length;
+	else this.i += key.length - 1;
+	this.start = this.i + 1;
+	this.state = this.Text;
+}
+MpHtmlParser.prototype.TagName = function(c) {
+	if (blankChar[c]) {
+		this.tagName = this.section();
+		while (blankChar[this.data[this.i]]) this.i++;
+		if (this.isClose()) this.setNode();
+		else {
+			this.start = this.i;
+			this.state = this.AttrName;
 		}
+	} else if (this.isClose()) {
+		this.tagName = this.section();
+		this.setNode();
 	}
-	AttrName(c) {
-		var blank = blankChar[c];
-		if (blank) {
-			this.attrName = this.section();
-			c = this.data[this.i];
-		}
-		if (c == '=') {
-			if (!blank) this.attrName = this.section();
+}
+MpHtmlParser.prototype.AttrName = function(c) {
+	if (c == '=' || blankChar[c] || this.isClose()) {
+		this.attrName = this.section();
+		if (blankChar[c])
+			while (blankChar[this.data[++this.i]]);
+		if (this.data[this.i] == '=') {
 			while (blankChar[this.data[++this.i]]);
 			this.start = this.i--;
 			this.state = this.AttrValue;
-		} else if (blank) this.setAttr();
-		else if (this.isClose()) {
-			this.attrName = this.section();
-			this.setAttr();
-		}
+		} else this.setAttr();
 	}
-	AttrValue(c) {
-		if (c == '"' || c == "'") {
-			this.start++;
-			if ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length;
-			this.attrVal = this.section();
-			this.i++;
-		} else {
-			for (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++);
-			this.attrVal = this.section();
-		}
-		this.setAttr();
+}
+MpHtmlParser.prototype.AttrValue = function(c) {
+	if (c == '"' || c == "'") {
+		this.start++;
+		if ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length;
+		this.attrVal = this.section();
+		this.i++;
+	} else {
+		for (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++);
+		this.attrVal = this.section();
 	}
-	EndTag(c) {
-		if (blankChar[c] || c == '>' || c == '/') {
-			var name = this.getName(this.section());
-			for (var i = this.STACK.length; i--;)
-				if (this.STACK[i].name == name) break;
-			if (i != -1) {
-				var node;
-				while ((node = this.STACK.pop()).name != name);
-				this.popNode(node);
-			} else if (name == 'p' || name == 'br')
-				this.siblings().push({
-					name,
-					attrs: {}
-				});
-			this.i = this.data.indexOf('>', this.i);
-			this.start = this.i + 1;
-			if (this.i == -1) this.i = this.data.length;
-			else this.state = this.Text;
-		}
+	this.setAttr();
+}
+MpHtmlParser.prototype.EndTag = function(c) {
+	if (blankChar[c] || c == '>' || c == '/') {
+		var name = this.section().toLowerCase();
+		for (var i = this.STACK.length; i--;)
+			if (this.STACK[i].name == name) break;
+		if (i != -1) {
+			var node;
+			while ((node = this.STACK.pop()).name != name) this.popNode(node);
+			this.popNode(node);
+		} else if (name == 'p' || name == 'br')
+			this.siblings().push({
+				name,
+				attrs: {}
+			});
+		this.i = this.data.indexOf('>', this.i);
+		this.start = this.i + 1;
+		if (this.i == -1) this.i = this.data.length;
+		else this.state = this.Text;
 	}
 }
 module.exports = MpHtmlParser;

+ 46 - 46
components/jyf-parser/libs/config.js

@@ -1,57 +1,43 @@
 /* 配置文件 */
-// #ifdef MP-WEIXIN
-const canIUse = wx.canIUse('editor'); // 高基础库标识,用于兼容
-// #endif
-module.exports = {
+var cfg = {
+	// 出错占位图
+	errorImg: null,
 	// 过滤器函数
 	filter: null,
 	// 代码高亮函数
 	highlight: null,
 	// 文本处理函数
 	onText: null,
+	// 实体编码列表
+	entities: {
+		quot: '"',
+		apos: "'",
+		semi: ';',
+		nbsp: '\xA0',
+		ensp: '\u2002',
+		emsp: '\u2003',
+		ndash: '–',
+		mdash: '—',
+		middot: '·',
+		lsquo: '‘',
+		rsquo: '’',
+		ldquo: '“',
+		rdquo: '”',
+		bull: '•',
+		hellip: '…'
+	},
 	blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'),
+	boolAttrs: makeMap('allowfullscreen,autoplay,autostart,controls,ignore,loop,muted'),
 	// 块级标签,将被转为 div
-	blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,section' + (
-		// #ifdef MP-WEIXIN
-		canIUse ? '' :
-		// #endif
-		',pre')),
+	blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
 	// 将被移除的标签
-	ignoreTags: makeMap(
-		'area,base,basefont,canvas,command,frame,input,isindex,keygen,link,map,meta,param,script,source,style,svg,textarea,title,track,use,wbr'
-		// #ifdef MP-WEIXIN
-		+ (canIUse ? ',rp' : '')
-		// #endif
-		// #ifndef APP-PLUS
-		+ ',embed,iframe'
-		// #endif
-	),
+	ignoreTags: makeMap('area,base,canvas,frame,iframe,input,link,map,meta,param,script,source,style,svg,textarea,title,track,wbr'),
 	// 只能被 rich-text 显示的标签
-	richOnlyTags: makeMap('a,colgroup,fieldset,legend,picture,table'
-		// #ifdef MP-WEIXIN
-		+ (canIUse ? ',bdi,bdo,caption,rt,ruby' : '')
-		// #endif
-	),
+	richOnlyTags: makeMap('a,colgroup,fieldset,legend,table'),
 	// 自闭合的标签
-	selfClosingTags: makeMap(
-		'area,base,basefont,br,col,circle,ellipse,embed,frame,hr,img,input,isindex,keygen,line,link,meta,param,path,polygon,rect,source,track,use,wbr'
-	),
-	// 信任的属性
-	trustAttrs: makeMap(
-		'align,alt,app-id,author,autoplay,border,cellpadding,cellspacing,class,color,colspan,controls,data-src,dir,face,height,href,id,ignore,loop,media,muted,name,path,poster,rowspan,size,span,src,start,style,type,unit-id,width,xmlns'
-	),
-	// bool 型的属性
-	boolAttrs: makeMap('autoplay,controls,ignore,loop,muted'),
+	selfClosingTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
 	// 信任的标签
-	trustTags: makeMap(
-		'a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'
-		// #ifdef MP-WEIXIN
-		+ (canIUse ? ',bdi,bdo,caption,pre,rt,ruby' : '')
-		// #endif
-		// #ifdef APP-PLUS
-		+ ',embed,iframe'
-		// #endif
-	),
+	trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
 	// 默认的标签样式
 	userAgentStyles: {
 		address: 'font-style:italic',
@@ -61,9 +47,7 @@ module.exports = {
 		center: 'text-align:center',
 		cite: 'font-style:italic',
 		dd: 'margin-left:40px',
-		img: 'max-width:100%',
 		mark: 'background-color:yellow',
-		picture: 'max-width:100%',
 		pre: 'font-family:monospace;white-space:pre;overflow:scroll',
 		s: 'text-decoration:line-through',
 		small: 'display:inline;font-size:0.8em',
@@ -71,10 +55,26 @@ module.exports = {
 	}
 }
 
-function makeMap(maprichee55text9oppplugin) {
-	var map = {},
-		list = maprichee55text9oppplugin.split(',');
+function makeMap(str) {
+	var map = Object.create(null),
+		list = str.split(',');
 	for (var i = list.length; i--;)
 		map[list[i]] = true;
 	return map;
 }
+
+// #ifdef MP-WEIXIN
+if (wx.canIUse('editor')) {
+	cfg.blockTags.pre = void 0;
+	cfg.ignoreTags.rp = true;
+	Object.assign(cfg.richOnlyTags, makeMap('bdi,bdo,caption,rt,ruby'));
+	Object.assign(cfg.trustTags, makeMap('bdi,bdo,caption,pre,rt,ruby'));
+}
+// #endif
+
+// #ifdef APP-PLUS
+cfg.ignoreTags.iframe = void 0;
+Object.assign(cfg.trustTags, makeMap('embed,iframe'));
+// #endif
+
+module.exports = cfg;

+ 0 - 35
components/jyf-parser/libs/handler.sjs

@@ -1,35 +0,0 @@
-var inlineTags = {
-	abbr: 1,
-	b: 1,
-	big: 1,
-	code: 1,
-	del: 1,
-	em: 1,
-	i: 1,
-	ins: 1,
-	label: 1,
-	q: 1,
-	small: 1,
-	span: 1,
-	strong: 1
-}
-export default {
-	// 从顶层标签的样式中取出一些给 rich-text
-	getStyle: function(style) {
-		if (style) {
-			var i, j, res = '';
-			if ((i = style.indexOf('display')) != -1)
-				res = style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
-			if ((i = style.indexOf('float')) != -1)
-				res += ';' + style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
-			return res;
-		}
-	},
-	getNode: function(item) {
-		return [item];
-	},
-	// 是否通过 rich-text 显示
-	useRichText: function(item) {
-		return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1;
-	}
-}

+ 6 - 28
components/jyf-parser/libs/handler.wxs

@@ -1,4 +1,4 @@
-var inlineTags = {
+var inline = {
 	abbr: 1,
 	b: 1,
 	big: 1,
@@ -11,34 +11,12 @@ var inlineTags = {
 	q: 1,
 	small: 1,
 	span: 1,
-	strong: 1
+	strong: 1,
+	sub: 1,
+	sup: 1
 }
 module.exports = {
-	// 从顶层标签的样式中取出一些给 rich-text
-	getStyle: function(style) {
-		if (style) {
-			var i, j, res = '';
-			if ((i = style.indexOf('display')) != -1)
-				res = style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
-			if ((i = style.indexOf('float')) != -1)
-				res += ';' + style.substring(i, (j = style.indexOf(';', i)) == -1 ? style.length : j);
-			return res;
-		}
-	},
-	// 处理懒加载
-	getNode: function(item, imgLoad) {
-		if (!imgLoad && item.attrs.i != '0') {
-			var img = {
-				name: 'img',
-				attrs: JSON.parse(JSON.stringify(item.attrs))
-			}
-			delete img.attrs.src;
-			img.attrs.style += ';width:20px;height:20px';
-			return [img];
-		} else return [item];
-	},
-	// 是否通过 rich-text 显示
-	useRichText: function(item) {
-		return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1;
+	use: function(item) {
+		return !item.c && !inline[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1
 	}
 }

+ 187 - 162
components/jyf-parser/libs/trees.vue

@@ -1,92 +1,53 @@
-<!--
-  trees 递归显示组件
-  github:https://github.com/jin-yufeng/Parser 
-  docs:https://jin-yufeng.github.io/Parser
-  插件市场:https://ext.dcloud.net.cn/plugin?id=805
-  author:JinYufeng
-  update:2020/04/13
--->
 <template>
-	<view class="interlayer">
-		<block v-for="(n, index) in nodes" v-bind:key="index">
+	<view :class="'interlayer '+(c||'')" :style="s">
+		<block v-for="(n, i) in nodes" v-bind:key="i">
 			<!--图片-->
-			<!--#ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY || APP-PLUS-->
-			<rich-text v-if="n.name=='img'" :id="n.attrs.id" class="_img" :style="''+handler.getStyle(n.attrs.style)" :nodes="handler.getNode(n,!lazyLoad||imgLoad)"
-			 :data-attrs="n.attrs" @tap="imgtap" @longpress="imglongtap" />
-			<!--#endif-->
-			<!--#ifdef MP-BAIDU || MP-TOUTIAO-->
-			<rich-text v-if="n.name=='img'" :id="n.attrs.id" class="_img" :style="n.attrs.contain" :nodes='[n]' :data-attrs="n.attrs"
-			 @tap="imgtap" @longpress="imglongtap" />
-			<!--#endif-->
+			<view v-if="n.name=='img'" :class="'_img '+n.attrs.class" :style="n.attrs.style" :data-attrs="n.attrs" @tap="imgtap">
+				<rich-text v-if="ctrl[i]!=0" :nodes="[{attrs:{src:loading&&(ctrl[i]||0)<2?loading:(lazyLoad&&!ctrl[i]?placeholder:(ctrl[i]==3?errorImg:n.attrs.src||'')),alt:n.attrs.alt||'',width:n.attrs.width||'',style:'-webkit-touch-callout:none;max-width:100%;display:block'+(n.attrs.height?';height:'+n.attrs.height:'')},name:'img'}]" />
+				<image class="_image" :src="lazyLoad&&!ctrl[i]?placeholder:n.attrs.src" :lazy-load="lazyLoad"
+				 :show-menu-by-longpress="!n.attrs.ignore" :data-i="i" :data-index="n.attrs.i" data-source="img" @load="loadImg"
+				 @error="error" />
+			</view>
 			<!--文本-->
-			<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->
-			<rich-text v-else-if="n.decode" class="_entity" :nodes="[n]"></rich-text>
-			<!--#endif-->
 			<text v-else-if="n.type=='text'" decode>{{n.text}}</text>
+			<!--#ifndef MP-BAIDU-->
 			<text v-else-if="n.name=='br'">\n</text>
+			<!--#endif-->
 			<!--视频-->
-			<view v-else-if="n.name=='video'">
-				<view v-if="(!loadVideo||n.lazyLoad)&&!(controls[n.attrs.id]&&controls[n.attrs.id].play)" :id="n.attrs.id" :class="'_video '+(n.attrs.class||'')"
-				 :style="n.attrs.style" @tap="_loadVideo" />
-				<video v-else :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay||(controls[n.attrs.id]&&controls[n.attrs.id].play)"
-				 :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :poster="n.attrs.poster" :src="n.attrs.source[(controls[n.attrs.id]&&controls[n.attrs.id].index)||0]"
-				 :unit-id="n.attrs['unit-id']" :data-id="n.attrs.id" data-from="video" data-source="source" @error="error" @play="play" />
-			</view>
+			<view v-else-if="((n.lazyLoad&&!n.attrs.autoplay)||(n.name=='video'&&!loadVideo))&&ctrl[i]==undefined" :id="n.attrs.id" :class="'_video '+(n.attrs.class||'')"
+			 :style="n.attrs.style" :data-i="i" @tap="_loadVideo" />
+			<video v-else-if="n.name=='video'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay||ctrl[i]==0"
+			 :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :poster="n.attrs.poster" :src="n.attrs.source[ctrl[i]||0]"
+			 :unit-id="n.attrs['unit-id']" :data-id="n.attrs.id" :data-i="i" data-source="video" @error="error" @play="play" />
 			<!--音频-->
-			<audio v-else-if="n.name=='audio'" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author" :autoplay="n.attrs.autoplay"
-			 :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster" :src="n.attrs.source[(controls[n.attrs.id]&&controls[n.attrs.id].index)||0]"
-			 :data-id="n.attrs.id" data-from="audio" data-source="source" @error="error" @play="play" />
+			<audio v-else-if="n.name=='audio'" :ref="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author"
+			 :autoplay="n.attrs.autoplay" :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster"
+			 :src="n.attrs.source[ctrl[i]||0]" :data-i="i" :data-id="n.attrs.id" data-source="audio"
+			 @error.native="error" @play.native="play" />
 			<!--链接-->
-			<view v-else-if="n.name=='a'" :class="'_a '+(n.attrs.class||'')" hover-class="_hover" :style="n.attrs.style"
+			<view v-else-if="n.name=='a'" :id="n.attrs.id" :class="'_a '+(n.attrs.class||'')" hover-class="_hover" :style="n.attrs.style"
 			 :data-attrs="n.attrs" @tap="linkpress">
-				<trees class="_span" :nodes="n.children" />
+				<trees class="_span" c="_span" :nodes="n.children" />
 			</view>
-			<!--广告(按需打开注释)-->
-			<!--#ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO-->
-			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :unit-id="n.attrs['unit-id']"
-			 data-from="ad" @error="error" />-->
-			<!--#endif-->
-			<!--#ifdef MP-BAIDU-->
-			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :appid="n.attrs.appid"
-			 :apid="n.attrs.apid" :type="n.attrs.type" data-from="ad" @error="error" />-->
-			<!--#endif-->
-			<!--#ifdef APP-PLUS-->
-			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :adpid="n.attrs.adpid"
-			 data-from="ad" @error="error" />-->
-			<!--#endif-->
+			<!--广告-->
+			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :unit-id="n.attrs['unit-id']" :appid="n.attrs.appid" :apid="n.attrs.apid" :type="n.attrs.type" :adpid="n.attrs.adpid" data-source="ad" @error="error" />-->
 			<!--列表-->
-			<view v-else-if="n.name=='li'" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:flex'">
+			<view v-else-if="n.name=='li'" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:flex;flex-direction:row'">
 				<view v-if="n.type=='ol'" class="_ol-bef">{{n.num}}</view>
 				<view v-else class="_ul-bef">
 					<view v-if="n.floor%3==0" class="_ul-p1">█</view>
 					<view v-else-if="n.floor%3==2" class="_ul-p2" />
 					<view v-else class="_ul-p1" style="border-radius:50%">█</view>
 				</view>
-				<!--#ifdef MP-ALIPAY-->
-				<view class="_li">
-					<trees :nodes="n.children" />
-				</view>
-				<!--#endif-->
-				<!--#ifndef MP-ALIPAY-->
-				<trees class="_li" :nodes="n.children" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
-				<!--#endif-->
+				<trees class="_li" c="_li" :nodes="n.children" :lazyLoad="lazyLoad" :loading="loading" />
 			</view>
 			<!--表格-->
 			<view v-else-if="n.name=='table'&&n.c" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:table'">
-				<view v-for="(tbody, i) in n.children" v-bind:key="i" :class="tbody.attrs.class" :style="(tbody.attrs.style||'')+(tbody.name[0]=='t'?';display:table-'+(tbody.name=='tr'?'row':'row-group'):'')">
-					<view v-for="(tr, j) in tbody.children" v-bind:key="j" :class="tr.attrs.class" :style="(tr.attrs.style||'')+(tr.name[0]=='t'?';display:table-'+(tr.name=='tr'?'row':'cell'):'')">
-						<trees v-if="tr.name=='td'" :nodes="tr.children" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
-						<block v-else>
-							<!--#ifdef MP-ALIPAY-->
-							<view v-for="(td, k) in tr.children" v-bind:key="k" :class="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')">
-								<trees :nodes="td.children" />
-							</view>
-							<!--#endif-->
-							<!--#ifndef MP-ALIPAY-->
-							<trees v-for="(td, k) in tr.children" v-bind:key="k" :class="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')"
-							 :nodes="td.children" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
-							<!--#endif-->
-						</block>
+				<view v-for="(tbody, o) in n.children" v-bind:key="o" :class="tbody.attrs.class" :style="(tbody.attrs.style||'')+(tbody.name[0]=='t'?';display:table-'+(tbody.name=='tr'?'row':'row-group'):'')">
+					<view v-for="(tr, p) in tbody.children" v-bind:key="p" :class="tr.attrs.class" :style="(tr.attrs.style||'')+(tr.name[0]=='t'?';display:table-'+(tr.name=='tr'?'row':'cell'):'')">
+						<trees v-if="tr.name=='td'" :nodes="tr.children" />
+						<trees v-else v-for="(td, q) in tr.children" v-bind:key="q" :class="td.attrs.class" :c="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')"
+						 :s="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')" :nodes="td.children" />
 					</view>
 				</view>
 			</view>
@@ -96,29 +57,22 @@
 			<embed v-else-if="n.name=='embed'" :style="n.attrs.style" :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
 			<!--#endif-->
 			<!--富文本-->
-			<!--#ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY || APP-PLUS-->
-			<rich-text v-else-if="handler.useRichText(n)" :id="n.attrs.id" :class="'_p __'+n.name" :nodes="[n]" />
-			<!--#endif-->
-			<!--#ifdef MP-BAIDU || MP-TOUTIAO-->
-			<rich-text v-else-if="!(n.c||n.continue)" :id="n.attrs.id" :class="_p" :style="n.attrs.contain" :nodes="[n]" />
-			<!--#endif-->
-			<!--#ifdef MP-ALIPAY-->
-			<view v-else :id="n.attrs.id" :class="'_'+n.name+' '+(n.attrs.class||'')" :style="n.attrs.style">
-				<trees :nodes="n.children" />
-			</view>
+			<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="handler.use(n)" :id="n.attrs.id" :class="'_p __'+n.name" :nodes="[n]" />
 			<!--#endif-->
-			<!--#ifndef MP-ALIPAY-->
-			<trees v-else :class="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')" :style="n.attrs.style" :nodes="n.children"
-			 :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+			<!--#ifndef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="!n.c" :id="n.attrs.id" :nodes="[n]" style="display:inline" />
 			<!--#endif-->
+			<trees v-else :class="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')" :c="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')"
+			 :style="n.attrs.style" :s="n.attrs.style" :nodes="n.children" :lazyLoad="lazyLoad" :loading="loading" />
 		</block>
 	</view>
 </template>
 <script module="handler" lang="wxs" src="./handler.wxs"></script>
-<script module="handler" lang="sjs" src="./handler.sjs"></script>
 <script>
 	global.Parser = {};
 	import trees from './trees'
+	const errorImg = require('../libs/config.js').errorImg;
 	export default {
 		components: {
 			trees
@@ -126,58 +80,96 @@
 		name: 'trees',
 		data() {
 			return {
-				controls: {},
-				// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
-				imgLoad: false,
-				// #endif
-				// #ifndef APP-PLUS
-				loadVideo: true
+				ctrl: [],
+				placeholder: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="300" height="225"/>',
+				errorImg,
+				loadVideo: typeof plus == 'undefined',
+				// #ifndef MP-ALIPAY
+				c: '',
+				s: ''
 				// #endif
 			}
 		},
 		props: {
 			nodes: Array,
-			// #ifdef MP-WEIXIN || MP-QQ || H5 || APP-PLUS
 			lazyLoad: Boolean,
-			// #endif
-			// #ifdef APP-PLUS
-			loadVideo: Boolean
+			loading: String,
+			// #ifdef MP-ALIPAY
+			c: String,
+			s: String
 			// #endif
 		},
 		mounted() {
-			// 获取顶层组件
-			this.top = this.$parent;
-			while (this.top.$options.name != 'parser') {
-				if (this.top.top) {
-					this.top = this.top.top;
-					break;
-				}
-				this.top = this.top.$parent;
-			}
+			for (this.top = this.$parent; this.top.$options.name != 'parser'; this.top = this.top.$parent);
+			this.init();
 		},
-		// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+		// #ifdef APP-PLUS
 		beforeDestroy() {
-			if (this.observer)
-				this.observer.disconnect();
+			this.observer && this.observer.disconnect();
 		},
 		// #endif
 		methods: {
-			// #ifndef MP-ALIPAY
+			init() {
+				for (var i = this.nodes.length, n; n = this.nodes[--i];) {
+					if (n.name == 'img') {
+						this.top.imgList.setItem(n.attrs.i, n.attrs.src);
+						// #ifdef APP-PLUS
+						if (this.lazyLoad && !this.observer) {
+							this.observer = uni.createIntersectionObserver(this).relativeToViewport({
+								top: 500,
+								bottom: 500
+							});
+							setTimeout(() => {
+								this.observer.observe('._img', res => {
+									if (res.intersectionRatio) {
+										for (var j = this.nodes.length; j--;)
+											if (this.nodes[j].name == 'img')
+												this.$set(this.ctrl, j, 1);
+										this.observer.disconnect();
+									}
+								})
+							}, 0)
+						}
+						// #endif
+					} else if (n.name == 'video' || n.name == 'audio') {
+						var ctx;
+						if (n.name == 'video') {
+							ctx = uni.createVideoContext(n.attrs.id
+								// #ifndef MP-BAIDU
+								, this
+								// #endif
+							);
+						} else if (this.$refs[n.attrs.id])
+							ctx = this.$refs[n.attrs.id][0];
+						if (ctx) {
+							ctx.id = n.attrs.id;
+							this.top.videoContexts.push(ctx);
+						}
+					}
+				}
+				// #ifdef APP-PLUS
+				// APP 上避免 video 错位需要延时渲染
+				setTimeout(() => {
+					this.loadVideo = true;
+				}, 1000)
+				// #endif
+			},
 			play(e) {
-				if (this.top.videoContexts.length > 1 && this.top.autopause)
-					for (var i = this.top.videoContexts.length; i--;)
-						if (this.top.videoContexts[i].id != e.currentTarget.dataset.id)
-							this.top.videoContexts[i].pause();
+				var contexts = this.top.videoContexts;
+				if (contexts.length > 1 && this.top.autopause)
+					for (var i = contexts.length; i--;)
+						if (contexts[i].id != e.currentTarget.dataset.id)
+							contexts[i].pause();
 			},
-			// #endif
 			imgtap(e) {
 				var attrs = e.currentTarget.dataset.attrs;
 				if (!attrs.ignore) {
-					var preview = true, data = {
-						id: e.target.id,
-						src: attrs.src,
-						ignore: () => preview = false
-					};
+					var preview = true,
+						data = {
+							id: e.target.id,
+							src: attrs.src,
+							ignore: () => preview = false
+						};
 					global.Parser.onImgtap && global.Parser.onImgtap(data);
 					this.top.$emit('imgtap', data);
 					if (preview) {
@@ -190,13 +182,29 @@
 					}
 				}
 			},
-			imglongtap(e) {
-				var attrs = e.item.dataset.attrs;
-				if (!attrs.ignore)
-					this.top.$emit('imglongtap', {
-						id: e.target.id,
-						src: attrs.src
+			loadImg(e) {
+				var i = e.currentTarget.dataset.i;
+				if (this.lazyLoad && !this.ctrl[i]) {
+					// #ifdef QUICKAPP-WEBVIEW
+					this.$set(this.ctrl, i, 0);
+					this.$nextTick(function() {
+						// #endif
+						// #ifndef APP-PLUS
+						this.$set(this.ctrl, i, 1);
+						// #endif
+						// #ifdef QUICKAPP-WEBVIEW
+					})
+					// #endif
+				} else if (this.loading && this.ctrl[i] != 2) {
+					// #ifdef QUICKAPP-WEBVIEW
+					this.$set(this.ctrl, i, 0);
+					this.$nextTick(function() {
+						// #endif
+						this.$set(this.ctrl, i, 2);
+						// #ifdef QUICKAPP-WEBVIEW
 					})
+					// #endif
+				}
 			},
 			linkpress(e) {
 				var jump = true,
@@ -234,34 +242,39 @@
 							// #endif
 						} else
 							uni.navigateTo({
-								url: attrs.href
+								url: attrs.href,
+								fail() {
+									uni.switchTab({
+										url: attrs.href,
+									})
+								}
 							})
 					}
 				}
 			},
 			error(e) {
-				var context, target = e.currentTarget,
-					source = target.dataset.from;
+				var target = e.currentTarget,
+					source = target.dataset.source,
+					i = target.dataset.i;
 				if (source == 'video' || source == 'audio') {
 					// 加载其他 source
-					var index = this.controls[target.id] ? this.controls[target.id].index + 1 : 1;
-					if (index < target.dataset.source.length)
-						this.$set(this.controls, target.id + '.index', index);
-					if (source == 'video') context = uni.createVideoContext(target.id, this);
+					var index = this.ctrl[i] ? this.ctrl[i].i + 1 : 1;
+					if (index < this.nodes[i].attrs.source.length)
+						this.$set(this.ctrl, i, index);
+					if (e.detail.__args__)
+						e.detail = e.detail.__args__[0];
+				} else if (errorImg && source == 'img') {
+					this.top.imgList.setItem(target.dataset.index, errorImg);
+					this.$set(this.ctrl, i, 3);
 				}
 				this.top && this.top.$emit('error', {
 					source,
 					target,
-					errMsg: e.detail.errMsg,
-					errCode: e.detail.errCode,
-					context
+					errMsg: e.detail.errMsg
 				});
 			},
 			_loadVideo(e) {
-				this.$set(this.controls, e.currentTarget.id, {
-					play: true,
-					index: 0
-				})
+				this.$set(this.ctrl, e.target.dataset.i, 0);
 			}
 		}
 	}
@@ -273,19 +286,20 @@
 	/* 链接和图片效果 */
 	._a {
 		display: inline;
+		padding: 1.5px 0 1.5px 0;
 		color: #366092;
 		word-break: break-all;
-		padding: 1.5px 0 1.5px 0;
 	}
 
 	._hover {
-		opacity: 0.7;
 		text-decoration: underline;
+		opacity: 0.7;
 	}
 
 	._img {
 		display: inline-block;
-		text-indent: 0;
+		max-width: 100%;
+		overflow: hidden;
 	}
 
 	/* #ifdef MP-WEIXIN */
@@ -295,13 +309,13 @@
 
 	/* #endif */
 
-	/* #ifdef MP */
+	/* #ifndef MP-ALIPAY || APP-PLUS */
 	.interlayer {
-		align-content: inherit;
-		align-items: inherit;
 		display: inherit;
 		flex-direction: inherit;
 		flex-wrap: inherit;
+		align-content: inherit;
+		align-items: inherit;
 		justify-content: inherit;
 		width: 100%;
 		white-space: inherit;
@@ -314,6 +328,7 @@
 		font-weight: bold;
 	}
 
+	/* #ifndef MP-ALIPAY */
 	._blockquote,
 	._div,
 	._p,
@@ -322,6 +337,8 @@
 	._li {
 		display: block;
 	}
+	
+	/* #endif */
 
 	._code {
 		font-family: monospace;
@@ -366,6 +383,14 @@
 		font-weight: bold;
 	}
 
+	._image {
+		display: block;
+		width: 100%;
+		height: 360px;
+		margin-top: -360px;
+		opacity: 0;
+	}
+
 	._ins {
 		text-decoration: underline;
 	}
@@ -376,36 +401,37 @@
 	}
 
 	._ol-bef {
+		width: 36px;
 		margin-right: 5px;
 		text-align: right;
-		width: 36px;
 	}
 
 	._ul-bef {
-		line-height: normal;
+		display: block;
 		margin: 0 12px 0 23px;
+		line-height: normal;
 	}
 
 	._ol-bef,
-	._ul_bef {
+	._ul-bef {
 		flex: none;
 		user-select: none;
 	}
 
 	._ul-p1 {
 		display: inline-block;
+		width: 0.3em;
 		height: 0.3em;
-		line-height: 0.3em;
 		overflow: hidden;
-		width: 0.3em;
+		line-height: 0.3em;
 	}
 
 	._ul-p2 {
-		border: 0.05em solid black;
-		border-radius: 50%;
 		display: inline-block;
-		height: 0.23em;
 		width: 0.23em;
+		height: 0.23em;
+		border: 0.05em solid black;
+		border-radius: 50%;
 	}
 
 	._q::before {
@@ -426,7 +452,7 @@
 		vertical-align: super;
 	}
 
-	/* #ifndef MP-WEIXIN */
+	/* #ifdef MP-ALIPAY || APP-PLUS || QUICKAPP-WEBVIEW */
 	._abbr,
 	._b,
 	._code,
@@ -445,32 +471,31 @@
 
 	/* #endif */
 
-	/* #ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY */
+	/* #ifdef MP-WEIXIN || MP-QQ */
 	.__bdo,
 	.__bdi,
 	.__ruby,
-	.__rt,
-	._entity {
+	.__rt {
 		display: inline-block;
 	}
 
 	/* #endif */
 	._video {
-		background-color: black;
-		display: inline-block;
-		height: 225px;
 		position: relative;
+		display: inline-block;
 		width: 300px;
+		height: 225px;
+		background-color: black;
 	}
 
 	._video::after {
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		margin: -15px 0 0 -15px;
+		content: '';
 		border-color: transparent transparent transparent white;
 		border-style: solid;
 		border-width: 15px 0 15px 30px;
-		content: '';
-		left: 50%;
-		margin: -15px 0 0 -15px;
-		position: absolute;
-		top: 50%;
 	}
 </style>

+ 0 - 144
components/kefu/index.vue

@@ -1,144 +0,0 @@
-<template>
-  <!-- 客服列表 -->
-  <view v-if="show" :style="colorStyle">
-    <view class="discountInfo on">
-      <view class="title">客服列表<text class="iconfont icon-guanbi5" @click="closeDiscount"></text></view>
-      <view class="list">
-        <view class="item" v-for="(item,index) in customerList" :key="index">
-          <image :src="item.avatar" mode="" class="img"></image>
-          <view class="text">{{item.staff_name}}</view>
-          <view class="contact" @click="callPhone(item)">
-            联系客服
-          </view>
-        </view>
-      </view>
-      <slot name="bottom"></slot>
-    </view>
-    <view class="mask" @touchmove.prevent :hidden="false" @click="closeDiscount"></view>
-  </view>
-</template>
-
-<script>
-   import colors from "@/mixins/color";
-  export default {
-    props: {
-      customerList: {
-        type: Array,
-        default: []
-      },
-			customerType:{
-				type:Number,
-				default:1
-			}
-    },
-    mixins:[colors],
-    data() {
-      return {
-        show: false,
-      };
-    },
-    mounted() {},
-    methods: {
-		
-      closeDiscount() {
-        this.$emit('closeKefu')
-      },
-      callPhone(item) {
-				if(this.customerType == 1){
-					uni.makePhoneCall({
-						phoneNumber: item.customer_phone //仅为示例
-					});
-				}else{
-					uni.navigateTo({
-					  url: '/pages/store/service/index?id='+item.id
-					})
-				}
-      }
-    }
-  }
-</script>
-
-<style scoped lang="scss">
-  .discountInfo {
-    position: fixed;
-    bottom: 0;
-    width: 100%;
-    left: 0;
-    background-color: #fff;
-    z-index: 300;
-    border-radius: 16rpx 16rpx 0 0;
-    transform: translate3d(0, 100%, 0);
-    transition: all .3s cubic-bezier(.25, .5, .5, .9);
-    padding-bottom: 22rpx;
-    padding-bottom: calc(22rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-    padding-bottom: calc(22rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-
-    .title {
-      font-size: 32rpx;
-      color: #282828;
-      text-align: center;
-      margin: 38rpx 0 36rpx 0;
-      position: relative;
-
-      .iconfont {
-        position: absolute;
-        right: 30rpx;
-        top: 0;
-        font-size: 36rpx;
-      }
-    }
-
-    .list {
-
-      height: 750rpx;
-      margin: 30rpx 30rpx 0 30rpx;
-      overflow-x: hidden;
-      overflow-y: auto;
-
-      .item {
-        height: 120rpx;
-        width: 100%;
-        border-bottom: 1px solid #eee;
-        background-color: #fff;
-        padding: 30rpx 30rpx;
-        position: relative;
-        display: flex;
-        align-items: center;
-
-        .img {
-          margin-left: 6rpx;
-          width: 80rpx;
-          height: 80rpx;
-          border-radius: 50%;
-          border: 1px solid #EEEEEE;
-        }
-
-        .text {
-          margin-left: 20rpx;
-          font-size: 28rpx;
-          font-weight: 400;
-          color: #333333;
-
-        }
-
-        .contact {
-          position: absolute;
-          right: 30rpx;
-          width: 140rpx;
-          height: 48rpx;
-          text-align: center;
-          line-height: 48rpx;
-          background-color: var(--view-minorColorT);
-          font-size: 24rpx;
-          font-weight: 400;
-          border-radius: 24rpx;
-          color: var(--view-theme);
-        }
-      }
-    }
-  }
-
-  .on {
-    transform: translate3d(0, 0, 0);
-  }
-</style>

+ 0 - 94
components/kefuIcon/index.vue

@@ -1,94 +0,0 @@
-<template>
-	<!-- 客服跳转 -->
-	<!-- #ifdef APP-PLUS || H5 -->
-	<view class="acea-row row-center-wrapper cartf iconfont icon-kefu3" :style="{ top: top + 'px'}" @touchmove.stop.prevent="setTouchMove" @click="licks"></view>
-	<!-- #endif -->
-	<!-- #ifdef MP -->
-	<view v-if="routineContact == 0">
-		<view class="acea-row row-center-wrapper cartf iconfont icon-kefu3" :style="{ top: top + 'px'}" @touchmove.stop.prevent="setTouchMove" @click="licks"></view>
-	</view>
-	<button class="acea-row row-center-wrapper cartf iconfont icon-kefu3" open-type='contact' :style="{ top: top + 'px'}" @touchmove.stop.prevent="setTouchMove" v-else-if="routineContact==1 && !goodsCon"></button>
-	<button class="acea-row row-center-wrapper cartf iconfont icon-kefu3" open-type='contact' :send-message-title="storeInfo.store_name" :send-message-img="storeInfo.image" :send-message-path="`/pages/goods_details/index?id=${storeInfo.id}`" show-message-card :style="{ top: top + 'px'}" @touchmove.stop.prevent="setTouchMove" v-else-if="routineContact==1 && goodsCon"></button>
-	<!-- #endif -->
-</template>
-
-<script>
-	let app = getApp();
-	import {
-		mapGetters
-	} from "vuex";
-	export default {
-		name: "kefuIcon", 
-		props: {
-			ids: {
-				type: Number,
-				default: 0
-			},
-			routineContact: {
-				type: Number,
-				default: 0
-			},
-			storeInfo: {
-				type: Object,
-				default () {
-					return {};
-				}
-			},
-			goodsCon: {
-				type: Number,
-				default: 0
-			}
-		},
-		computed: mapGetters(['userInfo']),
-		data: function() {
-			return {
-				top: "480"
-			};
-		},
-		mounted() {
-			// #ifdef H5
-			this.top =  parseFloat(window.innerHeight) -200
-			// #endif
-		},
-		methods: {
-			setTouchMove(e) {
-				let that = this;
-				if (e.touches[0].clientY < 480 && e.touches[0].clientY > 66) {
-					that.top = e.touches[0].clientY
-				}
-			},
-			licks(){
-				let userInfo = {}
-				if(typeof this.userInfo === 'string'){
-					userInfo = JSON.parse(this.userInfo)
-				}else{
-					userInfo = this.userInfo
-				}
-				let url = `/pages/extension/customer_list/chat?productId=${this.ids}`
-				let obj = {
-					store_name: this.storeInfo.store_name,
-					path: `/pages/goods_details/index?id=${this.storeInfo.id}`,
-					image:this.storeInfo.image
-				}
-				this.$util.getCustomer(userInfo,url,obj,1)
-			}
-		},
-		created() {
-		}
-	};
-</script>
-
-<style lang="scss">
-	.cartf{
-		width: 96rpx;
-		height: 96rpx;
-		background: #FFFFFF;
-		box-shadow: 0 3rpx 16rpx rgba(0, 0, 0, 0.08);
-		border-radius: 50%;
-		font-size: 47rpx;
-		color: #666;
-		position: fixed;
-		right: 15rpx;
-		z-index: 9;
-	}
-</style>

+ 545 - 0
components/lb-picker/README.md

@@ -0,0 +1,545 @@
+<p align="center">
+  <a href="https://github.com/liub1934/uni-lb-picker">
+    <img src="https://img.shields.io/github/stars/liub1934/uni-lb-picker">
+  </a>
+  <a href="https://github.com/liub1934/uni-lb-picker/fork">
+    <img src="https://img.shields.io/github/forks/liub1934/uni-lb-picker">
+  </a>
+  <a href="https://github.com/liub1934/uni-lb-picker/issues">
+    <img src="https://img.shields.io/github/issues/liub1934/uni-lb-picker">
+  </a>
+  <a href="https://www.npmjs.com/package/uni-lb-picker">
+    <img src="https://img.shields.io/npm/v/uni-lb-picker">
+  </a>
+  <a href="https://npmcharts.com/compare/uni-lb-picker?minimal=true">
+    <img src="https://img.shields.io/npm/dm/uni-lb-picker">
+  </a>
+  <a href="https://standardjs.com">
+    <img src="https://img.shields.io/badge/code%20style-standard-brightgreen">
+  </a>
+  <a href="https://github.com/liub1934/uni-lb-picker/blob/master/LICENSE">
+    <img src="https://img.shields.io/github/license/liub1934/uni-lb-picker">
+  </a>
+</p>
+
+插件市场里面的 picker 选择器不满足自己的需求,所以自己写了一个简单的 picker 选择器,可扩展、可自定义,一般满足日常需要。  
+Github:[点击前往](https://github.com/liub1934/uni-lb-picker)  
+插件市场:[点击前往](https://ext.dcloud.net.cn/plugin?id=1111)  
+H5 Demo:[点击预览](https://github.liubing.me/uni-lb-picker)
+
+> 如果问题最好去 github 反馈,插件市场评论区留下五星好评即可, [点我去反馈](https://github.com/liub1934/uni-lb-picker/issues/new)  
+> 最好提供一下使用的什么端,数据结构及大概的代码,我好复现找问题,不要直接提`怎么xxx报错了`等没意义的问题,神仙也不知道你为啥报错了。
+
+> **由于之前`cancel`拼写失误,写成了`cancle`,`v1.08`现已修正,如果之前版本有使用`cancel`事件的,更新后请及时修正。**
+
+## 兼容性
+
+App + Nvue + H5 + 各平台小程序(快应用及 360 未测试)
+
+## 功能
+
+- 单选
+- 多级联动,非多级联动,理论支持任意级数
+- 省市区选择,基于多级联动
+- 日期选择器,年月日时分秒可自由组合选择(引入了`dayjs`方便处理日期)
+- 自定义选择器头部确定取消按钮颜色及插槽支持
+- 选择器可视区自定义滚动个数
+- 自定义数据字段,满足不同人的需求
+- 自定义选择器样式
+- formatter 格式化自定义显示
+- 单选及非联动选择支持扁平化的简单数据,如下形式:
+
+```javascript
+// 单选列表
+list1: ['选项1', '选项2', '选项2'],
+// 非联动选择列表
+list2: [
+  ['选项1', '选项2', '选项3'],
+  ['选项11', '选项22', '选项33'],
+  ['选项111', '选项222', '选项333']
+]
+```
+
+## 引入插件
+
+单独引入,在需要使用的页面上 import 引入即可
+
+```html
+<template>
+  <view>
+    <lb-picker></lb-picker>
+  </view>
+</template>
+
+<script>
+  import LbPicker from '@/components/lb-picker'
+  export default {
+    components: {
+      LbPicker
+    }
+  }
+</script>
+```
+
+全局引入,`main.js`中 import 引入并注册即可全局使用
+
+```jsvascript
+import LbPicker from '@/components/lb-picker'
+Vue.component("lb-picker", LbPicker)
+```
+
+easycom 引入(推荐使用此方式)
+
+`pages.json`加上如下配置:
+
+```json
+"easycom": {
+  "autoscan": true,
+  "custom": {
+    "lb-picker": "@/components/lb-picker/index.vue"
+  }
+}
+```
+
+npm 安装引入:
+
+```shell
+npm install uni-lb-picker
+```
+
+```jsvascript
+import LbPicker from 'uni-lb-picker'
+```
+
+## 选择器数据格式
+
+### 单选
+
+常规数据
+
+```javascript
+list: [
+  {
+    label: '选项1',
+    value: '1'
+  },
+  {
+    label: '选项2',
+    value: '2'
+  }
+]
+```
+
+扁平化简单数据
+
+```javascript
+list: ['选项1', '选项2']
+```
+
+### 多级联动
+
+```javascript
+list: [
+  {
+    label: '选项1',
+    value: '1',
+    children: [
+      {
+        label: '选项1-1',
+        value: '1-1',
+        children: [
+          {
+            label: '选项1-1-1',
+            value: '1-1-1'
+          }
+        ]
+      }
+    ]
+  }
+]
+```
+
+### 非联动选择
+
+常规数据
+
+```javascript
+list: [
+  [
+    { label: '选项1', value: '1' },
+    { label: '选项2', value: '2' },
+    { label: '选项3', value: '3' }
+  ],
+  [
+    { label: '选项11', value: '11' },
+    { label: '选项22', value: '22' },
+    { label: '选项33', value: '33' }
+  ],
+  [
+    { label: '选项111', value: '111' },
+    { label: '选项222', value: '222' },
+    { label: '选项333', value: '333' }
+  ]
+]
+```
+
+扁平化简单数据
+
+```javascript
+list: [
+  ['选项1', '选项2', '选项3'],
+  ['选项11', '选项22', '选项33'],
+  ['选项111', '选项222', '选项333']
+]
+```
+
+## 调用显示选择器
+
+通过`ref`形式手动调用`show`方法显示,隐藏同理调用`hide`
+
+```html
+<lb-picker ref="picker"></lb-picker>
+```
+
+```javascript
+this.$refs.picker.show() // 显示
+this.$refs.picker.hide() // 隐藏
+```
+
+`v1.1.3`新增,将需要点击的元素包裹在`lb-picker`中即可。
+
+```html
+<lb-picker>
+  <button>点我直接打开选择器</button>
+</lb-picker>
+```
+
+## 绑定值及设置默认值
+
+支持 vue 中`v-model`写法绑定值,无需自己维护选中值的索引。
+
+```javascript
+<lb-picker v-model="value1"></lb-picker>
+<lb-picker v-model="value2"></lb-picker>
+<lb-picker v-model="value3"></lb-picker>
+
+data () {
+  return {
+    value1: '', // 单选
+    value2: [], // 多列联动选择
+    value2: '2021-01-05', // 日期,设置一个具体的日期,留空则默认选中当前日期
+  }
+}
+```
+
+## 多个选择器
+
+通过设置不同的`ref`,然后调用即可
+
+```javascript
+<lb-picker ref="picker1"></lb-picker>
+<lb-picker ref="picker2"></lb-picker>
+
+this.$refs.picker1.show() // picker1显示
+this.$refs.picker2.show() // picker2显示
+```
+
+## 省市区选择
+
+省市区选择是基于多列联动选择,数据来源:[https://github.com/modood/Administrative-divisions-of-China](https://github.com/modood/Administrative-divisions-of-China),  
+省市区文件位于`/pages/demos/area-data-min.js`,自行引入即可,可参考`demo3省市区选择`,  
+也可使用自己已有的省市区数据,如果数据字段不一样,也可以自定义,参考下方自定义数据字段。
+
+## 自定义数据字段
+
+为了满足不同人的需求,插件支持自定义数据字段名称, 插件默认的数据字段如下形式:
+
+```javascript
+list: [
+  {
+    label: '选择1',
+    value: 1,
+    children: []
+  },
+  {
+    label: '选择1',
+    value: 1,
+    children: []
+  }
+]
+```
+
+如果你的数据字段和上面不一样,如下形式:
+
+```javascript
+list: [
+  {
+    text: '选择1',
+    id: 1,
+    child: []
+  },
+  {
+    text: '选择1',
+    id: 1,
+    child: []
+  }
+]
+```
+
+通过设置参数中的`props`即可,如下所示:
+
+```javascript
+<lb-picker :props="myProps"></lb-picker>
+
+data () {
+  return {
+    myProps: {
+      label: 'text',
+      value: 'id',
+      children: 'child'
+    }
+  }
+}
+```
+
+## 插槽使用
+
+选择器支持一些可自定义化的插槽,如选择器的取消和确定文字按钮,如果需要对其自定义处理的话,比如加个 icon 图标之类的,可使用插槽,使用方法如下:
+
+```html
+<lb-picker>
+  <view slot="cancel-text">我是自定义取消</view>
+  <view slot="confirm-text">我是自定义确定</view>
+</lb-picker>
+```
+
+也可参考示例中的`demo5`,自定义插槽元素样式交给开发者自由调整,插槽仅提供预留位置。
+
+其他插槽见下。
+
+## 参数及事件
+
+### Props
+
+#### 通用 Props
+
+| 参数                   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 类型                                      | 可选值                                                                                                | 默认值             |
+| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------- | :---------------------------------------------------------------------------------------------------- | :----------------- |
+| value/v-model          | 绑定值,联动选择为 Array 类型                                                                                                                                                                                                                                                                                                                                                                                                                                             | String/Number/Array                       | -                                                                                                     | 日期类型为当前日期 |
+| mode                   | 选择器类型                                                                                                                                                                                                                                                                                                                                                                                                                                                                | String                                    | selector 单选/multiSelector 多级联动/unlinkedSelector 多级非联动/dateSelector 日期选择`(v1.1.9 新增)` | selector           |
+| cancel-text            | 取消文字                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | String                                    | -                                                                                                     | 取消               |
+| cancel-color           | 取消文字颜色                                                                                                                                                                                                                                                                                                                                                                                                                                                              | String                                    | -                                                                                                     | #999               |
+| confirm-text           | 确定文字                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | String                                    | -                                                                                                     | 确定               |
+| confirm-color          | 确定文字颜色                                                                                                                                                                                                                                                                                                                                                                                                                                                              | String                                    | -                                                                                                     | #007aff            |
+| empty-text             | `(v1.0.7 新增)`选择器列表为空的时候显示的文字                                                                                                                                                                                                                                                                                                                                                                                                                             | String                                    | -                                                                                                     | 暂无数据           |
+| empty-color            | `(v1.0.7 新增)`暂无数据文字颜色                                                                                                                                                                                                                                                                                                                                                                                                                                           | String                                    | -                                                                                                     | #999               |
+| column-num             | 可视滚动区域内滚动个数,最好设置奇数值                                                                                                                                                                                                                                                                                                                                                                                                                                    | Number                                    | -                                                                                                     | 5                  |
+| radius                 | 选择器顶部圆角,支持 rpx,如 radius="10rpx"                                                                                                                                                                                                                                                                                                                                                                                                                               | String                                    | -                                                                                                     | -                  |
+| column-style           | `(v1.1.6 重新新增)`选择器默认样式,仅`nvue`支持,其他端见下`选择器自定义样式`说明                                                                                                                                                                                                                                                                                                                                                                                         | Object                                    | -                                                                                                     | -                  |
+| active-column-style    | `(v1.1.6 重新新增)`选择器选中样式,仅`nvue`支持,其他端见下`选择器自定义样式`说明                                                                                                                                                                                                                                                                                                                                                                                         | Object                                    | -                                                                                                     | -                  |
+| loading                | 选择器是否显示加载中,可使用 loading 插槽自定义加载效果                                                                                                                                                                                                                                                                                                                                                                                                                   | Boolean                                   | -                                                                                                     | -                  |
+| mask-color             | 遮罩层颜色                                                                                                                                                                                                                                                                                                                                                                                                                                                                | String                                    | -                                                                                                     | rgba(0, 0, 0, 0.4) |
+| show-mask              | `(v1.1.0 新增)`是否显示遮罩层                                                                                                                                                                                                                                                                                                                                                                                                                                             | Boolean                                   | true/false                                                                                            | true               |
+| close-on-click-mask    | 点击遮罩层是否关闭选择器                                                                                                                                                                                                                                                                                                                                                                                                                                                  | Boolean                                   | true/false                                                                                            | true               |
+| ~~change-on-init~~     | ~~(v1.0.7 已弃用)初始化时是否触发 change 事件~~                                                                                                                                                                                                                                                                                                                                                                                                                           | Boolean                                   | true/false                                                                                            | -                  |
+| dataset                | `(v1.0.7 新增)`可以向组件中传递任意的自定义的数据(对象形式数据),如`:dataset="{name:'test'}"`,在`confirm`或`change`事件中可以取到                                                                                                                                                                                                                                                                                                                                      | Object                                    | -                                                                                                     | -                  |
+| show-header            | `(v1.0.8 新增)`是否显示选择器头部                                                                                                                                                                                                                                                                                                                                                                                                                                         | Boolean                                   | -                                                                                                     | true               |
+| inline                 | `(v1.0.8 新增)`inline 模式,开启后默认显示选择器,无需点击弹出,可以配合`show-header`一起使用                                                                                                                                                                                                                                                                                                                                                                             | Boolean                                   | -                                                                                                     | -                  |
+| z-index                | `(v1.0.9 新增)`选择器层级,遮罩层默认-1                                                                                                                                                                                                                                                                                                                                                                                                                                   | Number                                    | -                                                                                                     | 999                |
+| safe-area-inset-bottom | `(v1.1.4 新增)`是否留出底部安全距离(nvue 无效)                                                                                                                                                                                                                                                                                                                                                                                                                          | Boolean                                   | true/false                                                                                            | true               |
+| disabled               | `(v1.1.4 新增)`是否禁用选择器,禁用后无法弹出选择器                                                                                                                                                                                                                                                                                                                                                                                                                       | Boolean                                   | -                                                                                                     | -                  |
+| align                  | `(v1.1.6 新增)`选择器中文字对齐方式,默认居中                                                                                                                                                                                                                                                                                                                                                                                                                             | String                                    | left/center/right                                                                                     | center             |
+| press-enable           | `(v1.1.6 新增)`是否开启长按选择器数据`showtoast`弹出`label`提示,部分情况下选择器数据文字过长会显示省略号,如需查看完整的文字内容,可开启此选项,长按后会`showtoast`弹出完整的文字内容,默认不开启(支付宝小程序暂不支持[详情](https://ask.dcloud.net.cn/question/106237))                                                                                                                                                                                               | Boolean                                   | -                                                                                                     | -                  |
+| press-time             | `(v1.1.6 新增)`长按触发时间,单位毫秒 ms                                                                                                                                                                                                                                                                                                                                                                                                                                  | Number                                    | -                                                                                                     | 500                |
+| formatter              | `(v1.1.7 新增)`格式化自定义选择器文字内容,`Function`类型,`return`一个字符串(日期选择器`百度、支付宝、头条小程序`不支持,其他选择器仅`app` `nvue` `h5`支持),`item`当前项信息,`rowIndex`当前数据所在行数,`columnIndex`当前数据所在列数,写法参考[demo14](https://github.com/liub1934/uni-lb-picker/blob/master/pages/demos/demo14/demo14.vue#L206),日期选择器可参考[demo16](https://github.com/liub1934/uni-lb-picker/blob/master/pages/demos/demo16/demo16.vue#L245) | Function({ item, rowIndex, columnIndex }) | -                                                                                                     |
+
+#### 单选、多级联动、非联动选择 Props
+
+| 参数  | 说明                                                                  | 类型   | 可选值 | 默认值                                            |
+| :---- | :-------------------------------------------------------------------- | :----- | :----- | :------------------------------------------------ |
+| list  | 选择器数据(v1.0.7 单选及非联动多选支持扁平数据:['选项 1', '选项 2']) | Array  | -      | -                                                 |
+| level | 多列联动层级,仅 mode 为 multiSelector 有效                           | Number | -      | 1                                                 |
+| props | 自定义数据字段                                                        | Object | -      | {label:'label',value:'value',children:'children'} |
+
+#### 日期选择 Props
+
+| 参数               | 说明                                                                                                                                                                                                                | 类型    | 可选值     | 默认值                                                                       |
+| :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------ | :--------- | :--------------------------------------------------------------------------- |
+| display-format     | 日期选择显示的颗粒格式,见下方`displayFormat、format说明`,可自由组合,如`YYYY-MM-DD`,显示的就是选择`年月日`。`重要说明:始终是以-为分隔符,始终是以-为分隔符, 始终是以-为分隔符`                                 | String  | -          | YYYY-MM-DD                                                                   |
+| format             | 选择器返回的日期格式,见下方`displayFormat、format说明`,如配置`YYYY年MM月DD日`选择器确定后返回显示的值为`2021年01月05号`或者`YYYY-MM-DD`返回的就是`2021-01-05`,可以自由组合,需要和`display-format`参数配合使用。 | String  | -          | YYYY-MM-DD                                                                   |
+| start-date         | 开始日期,可精确到秒,如`2018-08-08 08:08:08`                                                                                                                                                                       | String  | -          | -                                                                            |
+| end-date           | 结束日期,可精确到秒,如`2021-08-08 08:08:08`                                                                                                                                                                       | String  | -          | -                                                                            |
+| default-time-limit | 默认显示的日期选择范围,默认当前日期前 20 年和后 20 年,配置`start-date`或`end-date`后失效                                                                                                                          | Number  | -          | 20                                                                           |
+| is-show-chinese    | 是否显示日期选择器年月日时分秒中文文字,默认显示                                                                                                                                                                    | Boolean | true/false | true                                                                         |
+| ch-config          | 显示的日期选择器年月日时分秒文字配置                                                                                                                                                                                | Object  | -          | {year: '年', month: '月', day: '日', hour: '时', minute: '分', second: '秒'} |
+
+### displayFormat、format 说明
+
+| 标识 | 示例  | 描述            |
+| :--- | :---- | :-------------- |
+| YY   | 18    | 年,两位数      |
+| YYYY | 2018  | 年,四位数      |
+| M    | 1-12  | 月,从 1 开始   |
+| MM   | 01-12 | 月,两位数字    |
+| D    | 1-31  | 日              |
+| DD   | 01-31 | 日,两位数      |
+| H    | 0-23  | 24 小时         |
+| HH   | 00-23 | 24 小时,两位数 |
+| h    | 1-12  | 12 小时         |
+| hh   | 01-12 | 12 小时,两位数 |
+| m    | 0-59  | 分钟            |
+| mm   | 00-59 | 分钟,两位数    |
+| s    | 0-59  | 秒              |
+| ss   | 00-59 | 秒,两位数      |
+
+### 方法
+
+| 方法名         | 说明                                   | 参数            | 返回值                                                                                                       |
+| :------------- | :------------------------------------- | :-------------- | :----------------------------------------------------------------------------------------------------------- |
+| show           | 打开选择器                             | -               |                                                                                                              |
+| hide           | 关闭选择器                             | -               |                                                                                                              |
+| getColumnsInfo | (v1.1.0 新增)根据 value 获取选择器信息 | 绑定值的`value` | 同`change` `confirm`回调参数,如果传入的`value`获取不到信息则只返回一个含有`dataset`的对象,具体自行打印查看 |
+
+`getColumnsInfo`注意事项:
+
+- 需要组件加载完成后调用才有效,即`console.log(this.$refs.picker)`打印有内容,否则会报错,可在`onReady`中进行调用。
+- 如果动态设置`list`后马上调用`getColumnsInfo`会无法取到相关信息,可以加个`setTimeout`解决,如下形式:
+
+```javascript
+onReady () {
+  this.list = [{ label: '测试', value: 1 }] // 动态设置一个list
+  setTimeout(() => {
+    const info = that.$refs.picker.getColumnsInfo(xx)
+    console.log(info)
+  }, 0)
+}
+```
+
+### Events
+
+| 事件名称 | 说明                                     | 回调参数                                                                                                                                                                                                                                                                                                                                                         |
+| :------- | :--------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| show     | 选择器打开时触发                         | -                                                                                                                                                                                                                                                                                                                                                                |
+| hide     | 选择器隐藏时触发                         | -                                                                                                                                                                                                                                                                                                                                                                |
+| change   | 选择器滚动时触发,此时不会改变绑定的值   | `{ index, item, value, change }` `index`触发滚动后新的索引,单选时是具体的索引值,多列联动选择时为数组。`item`触发滚动后新的的完整内容,包括`label`、`value`等,日期选择器则为日期相关内容,单选时为对象,多列选择时为数组对象。`value`触发滚动后新的 value 值,单列选择时为具体值,多列联动选择时为数组。`change`触发事件的类型,详情参考下面的 change 事件备注 |
+| confirm  | 点击选择器确定时触发,此时会改变绑定的值 | 同上`change`事件说明                                                                                                                                                                                                                                                                                                                                             |
+| cancel   | 点击选择器取消时触发                     | 同上`change`事件说明                                                                                                                                                                                                                                                                                                                                             |
+
+### `change` 事件备注
+
+如果绑定的值是空的,`change`触发后里面的内容都是列表的第一项。  
+`change`事件会在以下情况触发:
+
+- 初始化
+- 绑定值 value 变化
+- 选择器 list 列表变化
+- 滚动选择器
+
+以上情况会在回调函数中都可以取到`change`变化的类型,对应上面的情况包括以下:
+
+- `init`
+- `value`
+- `list`
+- `scroll`
+
+根据这些类型大家可以在`change`的时候按需处理自己的业务逻辑,`init`现在指挥在调用选择器弹出的时候触发。  
+下面的说明情况已失效,如需要在页面显示的时候根据`value`的值显示相应的中文,调用`v1.10`新增的方法`getColumnsInfo`,传入绑定的值即可获取到你想要的所有信息。  
+~~比如一种常见的情况,有默认值的时候需要显示默认值的文字,此时可以`change`事件中判断`change`的类型是否是`init`,如果是的话可以取事件回调中的`item`进行显示绑定值对应的文字信息。~~
+
+```javascript
+handleChange (e) {
+  if (e.change === 'init') {
+    console.log(e.item.label) // 单选 选项1
+    console.log(e.item.map(item => item.label).join('-')) // 多选 选项1-选项11
+  }
+}
+```
+
+### 插槽
+
+| 插槽名        | 说明                   |
+| :------------ | :--------------------- |
+| cancel-text   | 选择器取消文字插槽     |
+| action-center | 选择器顶部中间插槽     |
+| confirm-text  | 选择器确定文字插槽     |
+| loading       | 选择器 loading 插槽    |
+| empty         | 选择器 空数据 插槽     |
+| header-top    | 选择器头部顶部插槽     |
+| header-bottom | 选择器头部底部插槽     |
+| picker-top    | 选择器滚动部分顶部插槽 |
+| picker-bottom | 选择器滚动部分底部插槽 |
+
+### 选择器自定义样式
+
+> nvue 专属写法,需要定义`column-style`和`active-column-style`,写法如下:
+
+```html
+<lb-picker
+  :column-style="columnStyle"
+  :active-column-style="activeColumnStyle"
+></lb-picker>
+```
+
+```javascript
+data () {
+  return {
+    // 默认样式
+    columnStyle: {
+      color: '#f0ad4e'
+    },
+    // 选择样式
+    activeColumnStyle: {
+      color: '#007aff',
+      fontWeight: 700
+    }
+  }
+}
+```
+
+> 其他端写法,覆盖默认样式即可。
+
+```css
+<style lang="scss" scoped>
+/deep/ .lb-picker {
+  .lb-picker-column-label {
+    color: #f0ad4e;
+  }
+  .lb-picker-column-active {
+    .lb-picker-column-label {
+      color: #007aff;
+      font-weight: 700;
+    }
+  }
+}
+</style>
+```
+
+完整代码可以参考`demo9`。
+
+### 获取选中值的文字
+
+`@confirm`事件中可以拿到:
+
+单选:
+
+```javascript
+handleConfirm (e) {
+  console.log(e.item.label) // 选项1
+}
+```
+
+联动选择:
+
+```javascript
+handleConfirm (e) {
+  console.log(e.item.map(item => item.label).join('-')) // 选项1-选项11
+}
+```
+
+## Tips
+
+微信小程序端,滚动时在 iOS 自带振动反馈,可在系统设置 -> 声音与触感 -> 系统触感反馈中关闭
+
+## 其他
+
+其他功能参考示例 Demo 代码。

File diff suppressed because it is too large
+ 87 - 0
components/lb-picker/index.vue


File diff suppressed because it is too large
+ 0 - 0
components/lb-picker/lib/custom-parse-format.min.js


File diff suppressed because it is too large
+ 0 - 0
components/lb-picker/lib/dayjs.min.js


+ 1 - 0
components/lb-picker/lib/object-support.min.js

@@ -0,0 +1 @@
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):t.dayjs_plugin_objectSupport=n()}(this,function(){"use strict";return function(t,n,e){var i=n.prototype,r=function(t){var n,r=t.date,o=t.utc,a={};if(!((n=r)instanceof Date)&&!(n instanceof Array)&&n instanceof Object){if(!Object.keys(r).length)return new Date;var u=o?e.utc():e();Object.keys(r).forEach(function(t){var n,e;a[(n=t,e=i.$utils().p(n),"date"===e?"day":e)]=r[t]});var c=a.day||(a.year||a.month>=0?1:u.date()),d=a.year||u.year(),f=a.month>=0?a.month:a.year||a.day?0:u.month(),s=a.hour||0,h=a.minute||0,b=a.second||0,y=a.millisecond||0;return o?new Date(Date.UTC(d,f,c,s,h,b,y)):new Date(d,f,c,s,h,b,y)}return r},o=i.parse;i.parse=function(t){t.date=r.bind(this)(t),o.bind(this)(t)};var a=i.set,u=i.add,c=function(t,n,e,i){if(void 0===i&&(i=1),n instanceof Object){var r=this;return Object.keys(n).forEach(function(e){r=t.bind(r)(n[e]*i,e)}),r}return t.bind(this)(n*i,e)};i.set=function(t,n){return n=void 0===n?t:n,c.bind(this)(function(t,n){return a.bind(this)(n,t)},n,t)},i.add=function(t,n){return c.bind(this)(u,t,n)},i.subtract=function(t,n){return c.bind(this)(u,t,n,-1)}}});

+ 93 - 0
components/lb-picker/mixins/index.js

@@ -0,0 +1,93 @@
+import { getColumns, isObject, isFunction } from '../utils'
+export const commonMixin = {
+  data () {
+    return {
+      isConfirmChange: false,
+      indicatorStyle: `height: 34px`,
+      pressTimeout: null
+    }
+  },
+  created () {
+    this.init('init')
+  },
+  methods: {
+    init (changeType) {
+      if (this.list && this.list.length) {
+        const column = getColumns({
+          value: this.value,
+          list: this.list,
+          mode: this.mode,
+          props: this.props,
+          level: this.level
+        })
+        const { columns, value, item, index } = column
+        this.selectValue = value
+        this.selectItem = item
+        this.pickerColumns = columns
+        this.pickerValue = index
+        this.$emit('change', {
+          value: this.selectValue,
+          item: this.selectItem,
+          index: this.pickerValue,
+          change: changeType
+        })
+      }
+    },
+    touchstart (e) {
+      if (!this.pressEnable) return
+      clearTimeout(this.pressTimeout)
+      this.pressTimeout = setTimeout(() => {
+        let item = {}
+        let toastTitle = ''
+        // #ifdef APP-NVUE
+        item = e.target.dataset.item
+        // #endif
+
+        // #ifdef H5
+        item = JSON.parse(e.currentTarget.dataset.item)
+        // #endif
+
+        // #ifndef APP-NVUE || H5
+        item = e.currentTarget.dataset.item
+        // #endif
+
+        // #ifdef APP-PLUS || H5
+        toastTitle = this.getLabel(item)
+        // #endif
+
+        // #ifndef APP-PLUS || H5
+        toastTitle = item[this.props.label] || item
+        // #endif
+        uni.showToast({
+          title: toastTitle,
+          icon: 'none'
+        })
+      }, this.pressTime)
+    },
+    touchmove () {
+      if (!this.pressEnable) return
+      clearTimeout(this.pressTimeout)
+    },
+    touchend () {
+      if (!this.pressEnable) return
+      clearTimeout(this.pressTimeout)
+    },
+    getLabel (item, rowIndex, columnIndex) {
+      if (this.formatter && isFunction(this.formatter)) {
+        return this.formatter({ item, rowIndex, columnIndex })
+      } else {
+        return item[this.props.label] || item
+      }
+    }
+  },
+  watch: {
+    value () {
+      if (!this.isConfirmChange) {
+        this.init('value')
+      }
+    },
+    list () {
+      this.init('list')
+    }
+  }
+}

+ 378 - 0
components/lb-picker/pickers/date-selector-picker.vue

@@ -0,0 +1,378 @@
+<template>
+  <view class="lb-selector-picker lb-picker-item"
+    :style="{ height: height }">
+    <picker-view :value="pickerValue"
+      :style="{ height: height }"
+      :indicator-style="indicatorStyle"
+      @change="handleChange">
+      <picker-view-column v-for="(column, index) in pickerColumns"
+        :key="column.name">
+        <view v-for="item in column.list || []"
+          :class="[
+            'lb-picker-column',
+            item.value === selectValue[index]
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+          :key="item.value">
+          <!-- #ifdef APP-PLUS || H5 -->
+          <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]"
+            :style="[
+              item.value === selectValue[index]
+                ? activeColumnStyle
+                : columnStyle
+            ]">{{ item.label }}</text>
+          <!-- #endif -->
+
+          <!-- #ifndef APP-PLUS || H5 -->
+          <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]">{{ item.label }}</text>
+          <!-- #endif -->
+        </view>
+      </picker-view-column>
+    </picker-view>
+  </view>
+</template>
+
+<script>
+import { isFunction } from '../utils'
+const INVALID_DATE = 'Invalid Date'
+const dayjs = require('../lib/dayjs.min.js')
+const objectSupport = require('../lib/object-support.min.js')
+const customParseFormat = require('../lib/custom-parse-format.min.js')
+dayjs.extend(objectSupport)
+dayjs.extend(customParseFormat)
+export default {
+  props: {
+    value: String,
+    mode: String,
+    visible: Boolean,
+    height: String,
+    columnStyle: Object,
+    activeColumnStyle: Object,
+    align: String,
+    formatter: Function,
+    format: String,
+    displayFormat: String,
+    startDate: String,
+    endDate: String,
+    defaultTimeLimit: Number,
+    isShowChinese: Boolean,
+    chConfig: Object,
+    filter: Function
+  },
+  data () {
+    return {
+      pickerValue: [],
+      pickerColumns: [],
+      selectValue: [],
+      selectItem: null,
+      isConfirmChange: false,
+      indicatorStyle: `height: 34px`,
+      dayjs: dayjs,
+      startInfo: {},
+      endInfo: {}
+    }
+  },
+  created () {
+    this.init('init')
+  },
+  methods: {
+    init (changeType) {
+      this.startInfo = this.toObject(
+        this.startDate
+          ? this.startDate
+          : this.dayjs().subtract(this.defaultTimeLimit, 'year').$d
+      )
+      this.endInfo = this.toObject(
+        this.endDate
+          ? this.endDate
+          : this.dayjs().add(this.defaultTimeLimit, 'year').$d
+      )
+      this.selectDate = this.value
+        ? this.dayjs(this.value, this.format)
+        : new Date()
+      if (!this.validate('date')) {
+        throw new Error('日期格式不合法')
+      }
+      if (!this.validate('displayFormat')) {
+        throw new Error('display-format参数异常')
+      }
+      if (this.startInfo.timestamp > this.endInfo.timestamp) {
+        throw new Error('开始结束日期异常,startDate不得大于endDate')
+      }
+      this.selectItem = this.toObject(this.selectDate)
+      this.setColumnData()
+      const value = this.getValueDate()
+      this.$emit('change', {
+        value: value.format(this.format),
+        valueArr: this.selectValue,
+        item: this.selectItem,
+        index: this.pickerValue,
+        change: changeType
+      })
+    },
+    handleChange (item) {
+      const pickerValue = item.detail.value
+      const columnIndex = pickerValue.findIndex(
+        (item, i) => item !== this.pickerValue[i]
+      )
+      if (columnIndex > -1) {
+        const valueIndex = pickerValue[columnIndex]
+        const columnItem = this.pickerColumns[columnIndex]
+        const columnName = columnItem.name
+        const valueItem = columnItem.list[valueIndex]
+        this.pickerValue = pickerValue
+        this.$set(this.selectValue, columnIndex, valueItem.value)
+        this.$set(this.selectItem, columnName, valueItem.value)
+        this.setColumnData(columnIndex)
+        const value = this.getValueDate()
+        this.$emit('change', {
+          value: value.format(this.format),
+          valueArr: this.selectValue,
+          item: this.selectItem,
+          index: this.pickerValue,
+          change: 'scroll'
+        })
+      }
+    },
+    getLabel (value, name, format, $d, rowIndex, columnIndex) {
+      const ch = this.isShowChinese ? this.chConfig[name] || '' : ''
+      let label =
+        value < 10 && format.length > 1 ? `0${value}${ch}` : value + ch
+      if (this.formatter && isFunction(this.formatter)) {
+        const item = { name, format, value, $d }
+        label = this.formatter({ item, rowIndex, columnIndex }) || label
+      }
+      return label
+    },
+    getValueDate (dateObj = {}) {
+      let selectItem = {
+        ...this.selectItem,
+        ...dateObj
+      }
+      selectItem.month = selectItem.month - 1
+      return this.dayjs(selectItem)
+    },
+    setColumnData (n = 0) {
+      const formatArr = this.displayFormat.split('-')
+      const formatObj = {
+        YY: 'year',
+        YYYY: 'year',
+        M: 'month',
+        MM: 'month',
+        D: 'day',
+        DD: 'day',
+        h: 'hour',
+        HH: 'hour',
+        h: 'hour',
+        hh: 'hour',
+        m: 'minute',
+        mm: 'minute',
+        s: 'second',
+        ss: 'second'
+      }
+      formatArr.forEach((item, index) => {
+        if (index >= n) {
+          const name = formatObj[item]
+          const obj = {
+            name: name,
+            list: this.getColumnData(name, item, index)
+          }
+          let value = this.selectItem[name]
+          if (index !== n) {
+            this.$set(this.pickerColumns, index, obj)
+          }
+          let n = obj.list.findIndex(l => l.value === value)
+          if (n < 0) {
+            const l = obj.list.length - 1
+            const firstValue = obj.list[0].value
+            const lastValue = obj.list[l].value
+            if (value < firstValue) {
+              n = 0
+              value = firstValue
+            }
+            if (value > lastValue) {
+              n = l
+              value = lastValue
+            }
+            if (n < 0) {
+              n = 0
+              value = firstValue
+            }
+          }
+          this.$set(this.pickerValue, index, n)
+          this.$set(this.selectValue, index, value)
+          this.$set(this.selectItem, name, value)
+        }
+      })
+    },
+    isSame (name, type = 'startInfo') {
+      let same = true
+      const arr = ['year', 'month', 'day', 'hour', 'minute', 'second']
+      const index = arr.findIndex(item => item === name)
+      if (index > -1) {
+        const slice = arr.slice(0, index + 1)
+        for (let i = 0; i < slice.length; i++) {
+          same = same && this.selectItem[slice[i]] === this[type][slice[i]]
+        }
+      }
+      return same
+    },
+    getColumnData (name, format, index) {
+      let list = []
+      let start = 0
+      let end = 0
+      let n = 0
+      const obj = {
+        month: 'year',
+        day: 'month',
+        hour: 'day',
+        minute: 'hour',
+        second: 'minute'
+      }
+      switch (name) {
+        case 'year':
+          start = this.startInfo[name]
+          end = this.endInfo[name]
+          break
+        case 'month':
+          start = 1
+          end = 12
+          break
+        case 'day':
+          start = 1
+          end = new Date(
+            this.selectItem.year,
+            this.selectItem.month,
+            0
+          ).getDate()
+          break
+        case 'hour':
+          start = 0
+          end = 23
+          break
+        case 'minute':
+          start = 0
+          end = 59
+          break
+        case 'second':
+          start = 0
+          end = 59
+          break
+      }
+      if (this.isSame(obj[name], 'startInfo')) {
+        start = this.startInfo[name]
+      }
+      if (this.isSame(obj[name], 'endInfo')) {
+        end = this.endInfo[name]
+      }
+      for (let i = start; i <= end; i++) {
+        n++
+        list.push({
+          label: this.getLabel(
+            i,
+            name,
+            format,
+            this.getValueDate({ [name]: i }),
+            n,
+            index
+          ),
+          value: i
+        })
+      }
+      if (this.filter && isFunction(this.filter)) {
+        list = this.filter(name, list) || list
+      }
+      return list
+    },
+    validate (type) {
+      let valid = true
+      switch (type) {
+        case 'date':
+          valid = this.dayjs(this.selectDate).isValid()
+          break
+        case 'displayFormat':
+          if (this[type]) {
+            const arr = [
+              'YY',
+              'YYYY',
+              'M',
+              'MM',
+              'D',
+              'DD',
+              'H',
+              'HH',
+              'h',
+              'hh',
+              'm',
+              'mm',
+              's',
+              'ss'
+            ]
+            const formatArr = this.displayFormat.split('-')
+            for (let i = 0; i < formatArr.length; i++) {
+              const val = formatArr[i]
+              const isIn = arr.includes(val)
+              if (!isIn) {
+                valid = false
+                break
+              }
+            }
+          } else {
+            valid = false
+          }
+          break
+      }
+      return valid
+    },
+    toObject (val) {
+      const d = this.dayjs(val)
+      return {
+        year: d.$y,
+        month: d.$M + 1,
+        day: d.$D,
+        hour: d.$H,
+        minute: d.$m,
+        second: d.$s,
+        timestamp: d.valueOf(),
+        $d: d
+      }
+    }
+  },
+  watch: {
+    value () {
+      if (!this.isConfirmChange) {
+        this.init('value')
+      }
+    },
+    displayFormat () {
+      this.init('displayFormat')
+    },
+    startDate () {
+      this.init('startDate')
+    },
+    endDate () {
+      this.init('endDate')
+    },
+    defaultTimeLimit () {
+      this.init('defaultTimeLimit')
+    },
+    isShowChinese () {
+      this.init('isShowChinese')
+    },
+    chConfig () {
+      this.init('chConfig')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "../style/picker-item.scss";
+</style>

+ 135 - 0
components/lb-picker/pickers/multi-selector-picker.vue

@@ -0,0 +1,135 @@
+<template>
+  <view class="lb-multi-selector lb-picker-item"
+    :style="{ height: height }">
+    <picker-view :value="pickerValue"
+      :indicator-style="indicatorStyle"
+      :style="{ height: height }"
+      @change="handleChange">
+      <picker-view-column v-for="(column, index) in pickerColumns"
+        :key="index">
+        <!-- #ifdef H5 -->
+        <view v-for="(item, i) in column || []"
+          :class="[
+            'lb-picker-column',
+            item[props.value] === selectValue[index]
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+          :key="i"
+          :data-item="pressEnable ? JSON.stringify(item) : ''"
+          @touchstart="touchstart"
+          @touchmove="touchmove"
+          @touchend="touchend">
+          <!-- #endif -->
+          <!-- #ifndef H5 -->
+          <view v-for="(item, i) in column || []"
+            :class="[
+            'lb-picker-column',
+            item[props.value] === selectValue[index]
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+            :key="i"
+            :data-item="item"
+            @touchstart="touchstart"
+            @touchmove="touchmove"
+            @touchend="touchend">
+            <!-- #endif -->
+            <!-- #ifdef APP-PLUS || H5 -->
+            <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]"
+              :style="[
+              item[props.value] === selectValue[index]
+              ? activeColumnStyle
+              : columnStyle
+            ]">{{ getLabel(item, i, index) }}</text>
+            <!-- #endif -->
+
+            <!-- #ifndef APP-PLUS || H5 -->
+            <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]">{{ item[props.label] || item }}</text>
+            <!-- #endif -->
+          </view>
+      </picker-view-column>
+    </picker-view>
+  </view>
+</template>
+
+<script>
+import { commonMixin } from '../mixins'
+export default {
+  props: {
+    value: Array,
+    list: Array,
+    mode: String,
+    props: Object,
+    level: Number,
+    visible: Boolean,
+    height: String,
+    columnStyle: Object,
+    activeColumnStyle: Object,
+    align: String,
+    pressEnable: Boolean,
+    pressTime: Number,
+    formatter: Function
+  },
+  mixins: [commonMixin],
+  data () {
+    return {
+      pickerValue: [],
+      pickerColumns: [],
+      selectValue: [],
+      selectItem: []
+    }
+  },
+  methods: {
+    handleChange (item) {
+      const pickerValue = item.detail.value
+      const columnIndex = pickerValue.findIndex(
+        (item, i) => item !== this.pickerValue[i]
+      )
+      const valueIndex = pickerValue[columnIndex]
+      this.setPickerChange(pickerValue, valueIndex, columnIndex)
+    },
+    setPickerChange (pickerValue, valueIndex, columnIndex) {
+      for (let i = 0; i < this.level; i++) {
+        if (i > columnIndex) {
+          pickerValue[i] = 0
+          const column =
+            this.pickerColumns[i - 1][valueIndex] ||
+            this.pickerColumns[i - 1][0]
+          this.$set(this.pickerColumns, i, column[this.props.children] || [])
+          valueIndex = 0
+        }
+        this.$set(this.pickerValue, i, pickerValue[i])
+        const selectItem = this.pickerColumns[i][pickerValue[i]]
+        if (selectItem) {
+          this.selectItem[i] = selectItem
+          this.selectValue[i] = selectItem[this.props.value]
+        } else {
+          const spliceNum = this.level - i
+          this.pickerValue.splice(i, spliceNum)
+          this.selectValue.splice(i, spliceNum)
+          this.selectItem.splice(i, spliceNum)
+          this.pickerColumns.splice(i, spliceNum)
+          break
+        }
+      }
+      this.$emit('change', {
+        value: this.selectValue,
+        item: this.selectItem,
+        index: this.pickerValue,
+        change: 'scroll'
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "../style/picker-item.scss";
+</style>

+ 108 - 0
components/lb-picker/pickers/selector-picker.vue

@@ -0,0 +1,108 @@
+<template>
+  <view class="lb-selector-picker lb-picker-item"
+    :style="{ height: height }">
+    <picker-view :value="pickerValue"
+      :style="{ height: height }"
+      :indicator-style="indicatorStyle"
+      @change="handleChange">
+      <picker-view-column>
+        <!-- #ifdef H5 -->
+        <view v-for="(item, i) in list"
+          :class="[
+            'lb-picker-column',
+            (item[props.value] || item) === selectValue
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+          :key="i"
+          :data-item="pressEnable ? JSON.stringify(item) : ''"
+          @touchstart="touchstart"
+          @touchmove="touchmove"
+          @touchend="touchend">
+          <!-- #endif -->
+          <!-- #ifndef H5 -->
+          <view v-for="(item, i) in list"
+            :class="[
+            'lb-picker-column',
+            (item[props.value] || item) === selectValue
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+            :key="i"
+            :data-item="item"
+            @touchstart="touchstart"
+            @touchmove="touchmove"
+            @touchend="touchend">
+            <!-- #endif -->
+            <!-- #ifdef APP-PLUS || H5 -->
+            <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]"
+              :style="[
+              (item[props.value] || item) === selectValue
+                ? activeColumnStyle
+                : columnStyle
+            ]">{{ getLabel(item.title, i, 0) }}</text>
+            <!-- #endif -->
+
+            <!-- #ifndef APP-PLUS || H5 -->
+            <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]">{{ item[props.label] || item }}</text>
+            <!-- #endif -->
+          </view>
+      </picker-view-column>
+    </picker-view>
+  </view>
+</template>
+
+<script>
+import { isObject } from '../utils'
+import { commonMixin } from '../mixins'
+export default {
+  props: {
+    value: [String, Number],
+    list: Array,
+    mode: String,
+    props: Object,
+    visible: Boolean,
+    height: String,
+    columnStyle: Object,
+    activeColumnStyle: Object,
+    align: String,
+    pressEnable: Boolean,
+    pressTime: Number,
+    formatter: Function
+  },
+  mixins: [commonMixin],
+  data () {
+    return {
+      pickerValue: [],
+      selectValue: '',
+      selectItem: null
+    }
+  },
+  methods: {
+    handleChange (item) {
+      const index = item.detail.value[0] || 0
+      this.selectItem = this.list[index]
+      this.selectValue = isObject(this.selectItem)
+        ? this.selectItem[this.props.value]
+        : this.selectItem
+      this.pickerValue = item.detail.value
+      this.$emit('change', {
+        value: this.selectValue,
+        item: this.selectItem,
+        index: index,
+        change: 'scroll'
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "../style/picker-item.scss";
+</style>

+ 116 - 0
components/lb-picker/pickers/unlinked-selector-picker.vue

@@ -0,0 +1,116 @@
+<template>
+  <view class="lb-selector-picker lb-picker-item"
+    :style="{ height: height }">
+    <picker-view :value="pickerValue"
+      :indicator-style="indicatorStyle"
+      :style="{ height: height }"
+      @change="handleChange">
+      <picker-view-column v-for="(column, index) in pickerColumns"
+        :key="index">
+        <!-- #ifdef H5 -->
+        <view v-for="(item, i) in column || []"
+          :class="[
+            'lb-picker-column',
+            (item[props.value] || item) === selectValue[index]
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+          :key="i"
+          :data-item="pressEnable ? JSON.stringify(item) : ''"
+          @touchstart="touchstart"
+          @touchmove="touchmove"
+          @touchend="touchend">
+          <!-- #endif -->
+          <!-- #ifndef H5 -->
+          <view v-for="(item, i) in column || []"
+            :class="[
+            'lb-picker-column',
+            (item[props.value] || item) === selectValue[index]
+              ? 'lb-picker-column-active'
+              : ''
+          ]"
+            :key="i"
+            :data-item="item"
+            @touchstart="touchstart"
+            @touchmove="touchmove"
+            @touchend="touchend">
+            <!-- #endif -->
+            <!-- #ifdef APP-PLUS || H5 -->
+            <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]"
+              :style="[
+              (item[props.value] || item) === selectValue[index]
+              ? activeColumnStyle
+              : columnStyle
+            ]">{{ getLabel(item, i, index) }}</text>
+            <!-- #endif -->
+
+            <!-- #ifndef APP-PLUS || H5 -->
+            <text :class="[
+              'lb-picker-column-label',
+              `lb-picker-column-label-${align}`
+            ]">{{ item[props.label] || item }}</text>
+            <!-- #endif -->
+          </view>
+      </picker-view-column>
+    </picker-view>
+  </view>
+</template>
+
+<script>
+import { isObject } from '../utils'
+import { commonMixin } from '../mixins'
+export default {
+  props: {
+    value: Array,
+    list: Array,
+    mode: String,
+    props: Object,
+    visible: Boolean,
+    height: String,
+    columnStyle: Object,
+    activeColumnStyle: Object,
+    align: String,
+    pressEnable: Boolean,
+    pressTime: Number,
+    formatter: Function
+  },
+  mixins: [commonMixin],
+  data () {
+    return {
+      pickerValue: [],
+      pickerColumns: [],
+      selectValue: [],
+      selectItem: []
+    }
+  },
+  methods: {
+    handleChange (item) {
+      const pickerValue = item.detail.value
+      const columnIndex = pickerValue.findIndex((item, i) => item !== this.pickerValue[i])
+      if (columnIndex > -1) {
+        const valueIndex = pickerValue[columnIndex]
+        const columnItem = this.list[columnIndex][valueIndex]
+        const valueItem = isObject(columnItem)
+          ? columnItem[this.props.value]
+          : columnItem
+        this.pickerValue = pickerValue
+        this.$set(this.selectValue, columnIndex, valueItem)
+        this.$set(this.selectItem, columnIndex, columnItem)
+        this.$emit('change', {
+          value: this.selectValue,
+          item: this.selectItem,
+          index: this.pickerValue,
+          change: 'scroll'
+        })
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "../style/picker-item.scss";
+</style>

+ 40 - 0
components/lb-picker/style/picker-item.scss

@@ -0,0 +1,40 @@
+.lb-picker-column {
+  height: 34px;
+  padding: 0 10px;
+  /* #ifndef APP-NVUE */
+  display: flex;
+  box-sizing: border-box;
+  white-space: nowrap;
+  overflow: hidden;
+  /* #endif */
+  flex-direction: row;
+  align-items: center;
+}
+
+.lb-picker-column-label {
+  font-size: 16px;
+  text-align: center;
+  flex: 1;
+  /* #ifdef APP-NVUE */
+  lines: 1;
+  /* #endif */
+  text-overflow: ellipsis;
+  transition-property: color;
+  transition-duration: 0.3s;
+  /* #ifndef APP-NVUE */
+  overflow: hidden;
+  white-space: nowrap;
+  /* #endif */
+}
+
+.lb-picker-column-label-left {
+  text-align: left;
+}
+
+.lb-picker-column-label-center {
+  text-align: center;
+}
+
+.lb-picker-column-label-right {
+  text-align: right;
+}

+ 166 - 0
components/lb-picker/style/picker.scss

@@ -0,0 +1,166 @@
+.lb-picker {
+	position: relative;
+}
+
+.lb-picker-mask {
+	background-color: rgba(0, 0, 0, 0.0);
+	position: fixed;
+	top: 0;
+	right: 0;
+	left: 0;
+	bottom: 0;
+}
+
+.lb-picker-mask-animation {
+	transition-property: background-color;
+	transition-duration: 0.3s;
+}
+
+.lb-picker-container {
+	position: relative;
+}
+
+.lb-picker-container-fixed {
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	transform: translateY(100%);
+	/* #ifndef APP-NVUE */
+	overflow: hidden;
+	/* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.lb-picker-container-animation {
+	transition-property: transform;
+	transition-duration: 0.3s;
+}
+
+.lb-picker-container-show {
+	transform: translateY(0);
+}
+
+/* #endif */
+
+.lb-picker-header {
+	position: relative;
+	background-color: #fff;
+	/* #ifdef APP-NVUE */
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+	border-bottom-color: #e5e5e5;
+	border-top-width: 1px;
+	border-top-style: solid;
+	border-top-color: #e5e5e5;
+	/* #endif */
+	/* #ifndef APP-NVUE */
+	box-sizing: border-box;
+	/* #endif */
+
+}
+
+/* #ifndef APP-NVUE */
+
+.lb-picker-header::after {
+	content: "";
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	right: 0;
+	height: 1px;
+	clear: both;
+	border-bottom: 1px solid #e5e5e5;
+	color: #e5e5e5;
+	transform-origin: 0 100%;
+	transform: scaleY(0.5);
+}
+
+/* #endif */
+
+.lb-picker-header-actions {
+	height: 45px;
+	/* #ifndef APP-NVUE */
+	box-sizing: border-box;
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	justify-content: space-between;
+	flex-wrap: nowrap;
+}
+
+.lb-picker-action {
+	padding-left: 10px;
+	padding-right: 10px;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+	justify-content: center;
+}
+
+.lb-picker-action-cancel-text {
+	font-size: 16px;
+}
+
+.lb-picker-action-confirm-text {
+	font-size: 16px;
+}
+
+.lb-picker-content {
+	position: relative;
+	background-color: #fff;
+}
+
+/* #ifndef APP-NVUE */
+.lb-picker-content-safe-buttom {
+	padding-bottom: 0;
+	padding-bottom: constant(safe-area-inset-bottom);
+	padding-bottom: env(safe-area-inset-bottom);
+}
+
+/* #endif */
+
+.lb-picker-content-main {
+	position: relative;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	justify-content: center;
+	flex-direction: column;
+}
+
+.lb-picker-loading,
+.lb-picker-empty {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	justify-content: center;
+	align-items: center;
+}
+
+.lb-picker-empty-text {
+	font-size: 16px;
+}
+
+.lb-picker-loading-img {
+	width: 25px;
+	height: 25px;
+	/* #ifndef APP-NVUE */
+	animation: rotating 2s linear infinite;
+	/* #endif */
+}
+
+/* #ifndef APP-NVUE */
+@keyframes rotating {
+	0% {
+		transform: rotate(0deg)
+	}
+
+	100% {
+		transform: rotate(1turn)
+	}
+}
+
+/* #endif */

+ 121 - 0
components/lb-picker/utils.js

@@ -0,0 +1,121 @@
+/**
+ * 判断是否是对象
+ *
+ * @export
+ * @param {*} val
+ * @returns true/false
+ */
+export function isObject (val) {
+  return Object.prototype.toString.call(val) === '[object Object]'
+}
+
+/**
+ * 判断是否是Function
+ *
+ * @export
+ * @param {*} val
+ * @returns true/false
+ */
+export function isFunction (val) {
+  return Object.prototype.toString.call(val) === '[object Function]'
+}
+
+/**
+ * 根据value获取columns信息
+ *
+ * @export
+ * @param {*} { value, list, mode, props, level }
+ * @param {number} [type=2] 查询不到value数据返回数据类型 1空值null 2默认第一个选项
+ * @returns
+ */
+export function getColumns ({ value, list, mode, props, level }, type = 2) {
+  let pickerValue = []
+  let pickerColumns = []
+  let selectValue = []
+  let selectItem = []
+  let columnsInfo = null
+  switch (mode) {
+    case 'selector':
+      let index = list.findIndex(item => {
+        return isObject(item) ? item[props.value] === value : item === value
+      })
+      if (index === -1 && type === 1) {
+        columnsInfo = null
+      } else {
+        index = index > -1 ? index : 0
+        selectItem = list[index]
+        selectValue = isObject(selectItem)
+          ? selectItem[props.value]
+          : selectItem
+        pickerColumns = list
+        pickerValue = [index]
+        columnsInfo = {
+          index: pickerValue,
+          value: selectValue,
+          item: selectItem,
+          columns: pickerColumns
+        }
+      }
+      break
+    case 'multiSelector':
+      const setPickerItems = (data = [], index = 0) => {
+        if (!data.length) return
+        const defaultValue = value || []
+        if (index < level) {
+          const value = defaultValue[index] || ''
+          let i = data.findIndex(item => item[props.value] === value)
+          if (i === -1 && type === 1) return
+          i = i > -1 ? i : 0
+          pickerValue[index] = i
+          pickerColumns[index] = data
+          if (data[i]) {
+            selectValue[index] = data[i][props.value]
+            selectItem[index] = data[i]
+            setPickerItems(data[i][props.children] || [], index + 1)
+          }
+        }
+      }
+      setPickerItems(list)
+      if (!selectValue.length && type === 1) {
+        columnsInfo = null
+      } else {
+        columnsInfo = {
+          index: pickerValue,
+          value: selectValue,
+          item: selectItem,
+          columns: pickerColumns
+        }
+      }
+      break
+    case 'unlinkedSelector':
+      list.forEach((item, i) => {
+        let index = item.findIndex(item => {
+          return isObject(item)
+            ? item[props.value] === value[i]
+            : item === value[i]
+        })
+        if (index === -1 && type === 1) return
+        index = index > -1 ? index : 0
+        const columnItem = list[i][index]
+        const valueItem = isObject(columnItem)
+          ? columnItem[props.value]
+          : columnItem
+        pickerValue[i] = index
+        selectValue[i] = valueItem
+        selectItem[i] = columnItem
+      })
+      pickerColumns = list
+      if (!selectValue.length && type === 1) {
+        columnsInfo = null
+      } else {
+        columnsInfo = {
+          index: pickerValue,
+          value: selectValue,
+          item: selectItem,
+          columns: pickerColumns
+        }
+      }
+      break
+  }
+  return columnsInfo
+}

+ 14402 - 0
components/lee-select-city/city.json

@@ -0,0 +1,14402 @@
+[{
+		"name": "北京市",
+		"latter": "B",
+		"children": [{
+			"name": "北京市",
+			"children": [{
+					"name": "东城区",
+					"latter": "D"
+				},
+				{
+					"name": "西城区",
+					"latter": "X"
+				},
+				{
+					"name": "朝阳区",
+					"latter": "Z"
+				},
+				{
+					"name": "丰台区",
+					"latter": "F"
+				},
+				{
+					"name": "石景山区",
+					"latter": "S"
+				},
+				{
+					"name": "海淀区",
+					"latter": "H"
+				},
+				{
+					"name": "门头沟区",
+					"latter": "M"
+				},
+				{
+					"name": "房山区",
+					"latter": "F"
+				},
+				{
+					"name": "通州区",
+					"latter": "T"
+				},
+				{
+					"name": "顺义区",
+					"latter": "S"
+				},
+				{
+					"name": "昌平区",
+					"latter": "C"
+				},
+				{
+					"name": "大兴区",
+					"latter": "D"
+				},
+				{
+					"name": "怀柔区",
+					"latter": "H"
+				},
+				{
+					"name": "平谷区",
+					"latter": "P"
+				},
+				{
+					"name": "密云县",
+					"latter": "M"
+				},
+				{
+					"name": "延庆县",
+					"latter": "Y"
+				}
+			],
+			"latter": "B"
+		}]
+	},
+	{
+		"name": "天津市",
+		"latter": "T",
+		"children":[
+			{
+				"name": "天津市",
+				"children": [{
+						"name": "和平区",
+						"latter": "H"
+					},
+					{
+						"name": "河东区",
+						"latter": "H"
+					},
+					{
+						"name": "河西区",
+						"latter": "H"
+					},
+					{
+						"name": "南开区",
+						"latter": "N"
+					},
+					{
+						"name": "河北区",
+						"latter": "H"
+					},
+					{
+						"name": "红桥区",
+						"latter": "H"
+					},
+					{
+						"name": "东丽区",
+						"latter": "D"
+					},
+					{
+						"name": "西青区",
+						"latter": "X"
+					},
+					{
+						"name": "津南区",
+						"latter": "J"
+					},
+					{
+						"name": "北辰区",
+						"latter": "B"
+					},
+					{
+						"name": "武清区",
+						"latter": "W"
+					},
+					{
+						"name": "宝坻区",
+						"latter": "B"
+					},
+					{
+						"name": "滨海新区",
+						"latter": "B"
+					},
+					{
+						"name": "宁河县",
+						"latter": "N"
+					},
+					{
+						"name": "静海县",
+						"latter": "J"
+					},
+					{
+						"name": "蓟县",
+						"latter": "J"
+					}
+				],
+				"latter": "T"
+			}
+		]
+	},
+	{
+		"name": "河北省",
+		"children": [{
+				"name": "石家庄市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "长安区",
+						"latter": "C"
+					},
+					{
+						"name": "桥东区",
+						"latter": "Q"
+					},
+					{
+						"name": "桥西区",
+						"latter": "Q"
+					},
+					{
+						"name": "新华区",
+						"latter": "X"
+					},
+					{
+						"name": "井陉矿区",
+						"latter": "J"
+					},
+					{
+						"name": "裕华区",
+						"latter": "Y"
+					},
+					{
+						"name": "井陉县",
+						"latter": "J"
+					},
+					{
+						"name": "正定县",
+						"latter": "Z"
+					},
+					{
+						"name": "栾城县",
+						"latter": "L"
+					},
+					{
+						"name": "行唐县",
+						"latter": "H"
+					},
+					{
+						"name": "灵寿县",
+						"latter": "L"
+					},
+					{
+						"name": "高邑县",
+						"latter": "G"
+					},
+					{
+						"name": "深泽县",
+						"latter": "S"
+					},
+					{
+						"name": "赞皇县",
+						"latter": "Z"
+					},
+					{
+						"name": "无极县",
+						"latter": "W"
+					},
+					{
+						"name": "平山县",
+						"latter": "P"
+					},
+					{
+						"name": "元氏县",
+						"latter": "Y"
+					},
+					{
+						"name": "赵县",
+						"latter": "Z"
+					},
+					{
+						"name": "辛集市",
+						"latter": "X"
+					},
+					{
+						"name": "藁城市",
+						"latter": "G"
+					},
+					{
+						"name": "晋州市",
+						"latter": "J"
+					},
+					{
+						"name": "新乐市",
+						"latter": "X"
+					},
+					{
+						"name": "鹿泉市",
+						"latter": "L"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "唐山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "路南区",
+						"latter": "L"
+					},
+					{
+						"name": "路北区",
+						"latter": "L"
+					},
+					{
+						"name": "古冶区",
+						"latter": "G"
+					},
+					{
+						"name": "开平区",
+						"latter": "K"
+					},
+					{
+						"name": "丰南区",
+						"latter": "F"
+					},
+					{
+						"name": "丰润区",
+						"latter": "F"
+					},
+					{
+						"name": "曹妃甸区",
+						"latter": "C"
+					},
+					{
+						"name": "滦县",
+						"latter": "L"
+					},
+					{
+						"name": "滦南县",
+						"latter": "L"
+					},
+					{
+						"name": "乐亭县",
+						"latter": "L"
+					},
+					{
+						"name": "迁西县",
+						"latter": "Q"
+					},
+					{
+						"name": "玉田县",
+						"latter": "Y"
+					},
+					{
+						"name": "遵化市",
+						"latter": "Z"
+					},
+					{
+						"name": "迁安市",
+						"latter": "Q"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "秦皇岛市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海港区",
+						"latter": "H"
+					},
+					{
+						"name": "山海关区",
+						"latter": "S"
+					},
+					{
+						"name": "北戴河区",
+						"latter": "B"
+					},
+					{
+						"name": "青龙满族自治县",
+						"latter": "Q"
+					},
+					{
+						"name": "昌黎县",
+						"latter": "C"
+					},
+					{
+						"name": "抚宁县",
+						"latter": "F"
+					},
+					{
+						"name": "卢龙县",
+						"latter": "L"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "邯郸市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "邯山区",
+						"latter": "H"
+					},
+					{
+						"name": "丛台区",
+						"latter": "C"
+					},
+					{
+						"name": "复兴区",
+						"latter": "F"
+					},
+					{
+						"name": "峰峰矿区",
+						"latter": "F"
+					},
+					{
+						"name": "邯郸县",
+						"latter": "H"
+					},
+					{
+						"name": "临漳县",
+						"latter": "L"
+					},
+					{
+						"name": "成安县",
+						"latter": "C"
+					},
+					{
+						"name": "大名县",
+						"latter": "D"
+					},
+					{
+						"name": "涉县",
+						"latter": "S"
+					},
+					{
+						"name": "磁县",
+						"latter": "C"
+					},
+					{
+						"name": "肥乡县",
+						"latter": "F"
+					},
+					{
+						"name": "永年县",
+						"latter": "Y"
+					},
+					{
+						"name": "邱县",
+						"latter": "Q"
+					},
+					{
+						"name": "鸡泽县",
+						"latter": "J"
+					},
+					{
+						"name": "广平县",
+						"latter": "G"
+					},
+					{
+						"name": "馆陶县",
+						"latter": "G"
+					},
+					{
+						"name": "魏县",
+						"latter": "W"
+					},
+					{
+						"name": "曲周县",
+						"latter": "Q"
+					},
+					{
+						"name": "武安市",
+						"latter": "W"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "邢台市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "桥东区",
+						"latter": "Q"
+					},
+					{
+						"name": "桥西区",
+						"latter": "Q"
+					},
+					{
+						"name": "邢台县",
+						"latter": "X"
+					},
+					{
+						"name": "临城县",
+						"latter": "L"
+					},
+					{
+						"name": "内丘县",
+						"latter": "N"
+					},
+					{
+						"name": "柏乡县",
+						"latter": "B"
+					},
+					{
+						"name": "隆尧县",
+						"latter": "L"
+					},
+					{
+						"name": "任县",
+						"latter": "R"
+					},
+					{
+						"name": "南和县",
+						"latter": "N"
+					},
+					{
+						"name": "宁晋县",
+						"latter": "N"
+					},
+					{
+						"name": "巨鹿县",
+						"latter": "J"
+					},
+					{
+						"name": "新河县",
+						"latter": "X"
+					},
+					{
+						"name": "广宗县",
+						"latter": "G"
+					},
+					{
+						"name": "平乡县",
+						"latter": "P"
+					},
+					{
+						"name": "威县",
+						"latter": "W"
+					},
+					{
+						"name": "清河县",
+						"latter": "Q"
+					},
+					{
+						"name": "临西县",
+						"latter": "L"
+					},
+					{
+						"name": "南宫市",
+						"latter": "N"
+					},
+					{
+						"name": "沙河市",
+						"latter": "S"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "保定市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新市区",
+						"latter": "X"
+					},
+					{
+						"name": "北市区",
+						"latter": "B"
+					},
+					{
+						"name": "南市区",
+						"latter": "N"
+					},
+					{
+						"name": "满城县",
+						"latter": "M"
+					},
+					{
+						"name": "清苑县",
+						"latter": "Q"
+					},
+					{
+						"name": "涞水县",
+						"latter": "L"
+					},
+					{
+						"name": "阜平县",
+						"latter": "F"
+					},
+					{
+						"name": "徐水县",
+						"latter": "X"
+					},
+					{
+						"name": "定兴县",
+						"latter": "D"
+					},
+					{
+						"name": "唐县",
+						"latter": "T"
+					},
+					{
+						"name": "高阳县",
+						"latter": "G"
+					},
+					{
+						"name": "容城县",
+						"latter": "R"
+					},
+					{
+						"name": "涞源县",
+						"latter": "L"
+					},
+					{
+						"name": "望都县",
+						"latter": "W"
+					},
+					{
+						"name": "安新县",
+						"latter": "A"
+					},
+					{
+						"name": "易县",
+						"latter": "Y"
+					},
+					{
+						"name": "曲阳县",
+						"latter": "Q"
+					},
+					{
+						"name": "蠡县",
+						"latter": "L"
+					},
+					{
+						"name": "顺平县",
+						"latter": "S"
+					},
+					{
+						"name": "博野县",
+						"latter": "B"
+					},
+					{
+						"name": "雄县",
+						"latter": "X"
+					},
+					{
+						"name": "涿州市",
+						"latter": "Z"
+					},
+					{
+						"name": "定州市",
+						"latter": "D"
+					},
+					{
+						"name": "安国市",
+						"latter": "A"
+					},
+					{
+						"name": "高碑店市",
+						"latter": "G"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "张家口市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "桥东区",
+						"latter": "Q"
+					},
+					{
+						"name": "桥西区",
+						"latter": "Q"
+					},
+					{
+						"name": "宣化区",
+						"latter": "X"
+					},
+					{
+						"name": "下花园区",
+						"latter": "X"
+					},
+					{
+						"name": "宣化县",
+						"latter": "X"
+					},
+					{
+						"name": "张北县",
+						"latter": "Z"
+					},
+					{
+						"name": "康保县",
+						"latter": "K"
+					},
+					{
+						"name": "沽源县",
+						"latter": "G"
+					},
+					{
+						"name": "尚义县",
+						"latter": "S"
+					},
+					{
+						"name": "蔚县",
+						"latter": "W"
+					},
+					{
+						"name": "阳原县",
+						"latter": "Y"
+					},
+					{
+						"name": "怀安县",
+						"latter": "H"
+					},
+					{
+						"name": "万全县",
+						"latter": "W"
+					},
+					{
+						"name": "怀来县",
+						"latter": "H"
+					},
+					{
+						"name": "涿鹿县",
+						"latter": "Z"
+					},
+					{
+						"name": "赤城县",
+						"latter": "C"
+					},
+					{
+						"name": "崇礼县",
+						"latter": "C"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "承德市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "双桥区",
+						"latter": "S"
+					},
+					{
+						"name": "双滦区",
+						"latter": "S"
+					},
+					{
+						"name": "鹰手营子矿区",
+						"latter": "Y"
+					},
+					{
+						"name": "承德县",
+						"latter": "C"
+					},
+					{
+						"name": "兴隆县",
+						"latter": "X"
+					},
+					{
+						"name": "平泉县",
+						"latter": "P"
+					},
+					{
+						"name": "滦平县",
+						"latter": "L"
+					},
+					{
+						"name": "隆化县",
+						"latter": "L"
+					},
+					{
+						"name": "丰宁满族自治县",
+						"latter": "F"
+					},
+					{
+						"name": "宽城满族自治县",
+						"latter": "K"
+					},
+					{
+						"name": "围场满族蒙古族自治县",
+						"latter": "W"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "沧州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新华区",
+						"latter": "X"
+					},
+					{
+						"name": "运河区",
+						"latter": "Y"
+					},
+					{
+						"name": "沧县",
+						"latter": "C"
+					},
+					{
+						"name": "青县",
+						"latter": "Q"
+					},
+					{
+						"name": "东光县",
+						"latter": "D"
+					},
+					{
+						"name": "海兴县",
+						"latter": "H"
+					},
+					{
+						"name": "盐山县",
+						"latter": "Y"
+					},
+					{
+						"name": "肃宁县",
+						"latter": "S"
+					},
+					{
+						"name": "南皮县",
+						"latter": "N"
+					},
+					{
+						"name": "吴桥县",
+						"latter": "W"
+					},
+					{
+						"name": "献县",
+						"latter": "X"
+					},
+					{
+						"name": "孟村回族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "泊头市",
+						"latter": "B"
+					},
+					{
+						"name": "任丘市",
+						"latter": "R"
+					},
+					{
+						"name": "黄骅市",
+						"latter": "H"
+					},
+					{
+						"name": "河间市",
+						"latter": "H"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "廊坊市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "安次区",
+						"latter": "A"
+					},
+					{
+						"name": "广阳区",
+						"latter": "G"
+					},
+					{
+						"name": "固安县",
+						"latter": "G"
+					},
+					{
+						"name": "永清县",
+						"latter": "Y"
+					},
+					{
+						"name": "香河县",
+						"latter": "X"
+					},
+					{
+						"name": "大城县",
+						"latter": "D"
+					},
+					{
+						"name": "文安县",
+						"latter": "W"
+					},
+					{
+						"name": "大厂回族自治县",
+						"latter": "D"
+					},
+					{
+						"name": "霸州市",
+						"latter": "B"
+					},
+					{
+						"name": "三河市",
+						"latter": "S"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "衡水市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "桃城区",
+						"latter": "T"
+					},
+					{
+						"name": "枣强县",
+						"latter": "Z"
+					},
+					{
+						"name": "武邑县",
+						"latter": "W"
+					},
+					{
+						"name": "武强县",
+						"latter": "W"
+					},
+					{
+						"name": "饶阳县",
+						"latter": "R"
+					},
+					{
+						"name": "安平县",
+						"latter": "A"
+					},
+					{
+						"name": "故城县",
+						"latter": "G"
+					},
+					{
+						"name": "景县",
+						"latter": "J"
+					},
+					{
+						"name": "阜城县",
+						"latter": "F"
+					},
+					{
+						"name": "冀州市",
+						"latter": "J"
+					},
+					{
+						"name": "深州市",
+						"latter": "S"
+					}
+				],
+				"latter": "H"
+			}
+		],
+		"latter": "H"
+	},
+	{
+		"name": "山西省",
+		"children": [{
+				"name": "太原市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "小店区",
+						"latter": "X"
+					},
+					{
+						"name": "迎泽区",
+						"latter": "Y"
+					},
+					{
+						"name": "杏花岭区",
+						"latter": "X"
+					},
+					{
+						"name": "尖草坪区",
+						"latter": "J"
+					},
+					{
+						"name": "万柏林区",
+						"latter": "W"
+					},
+					{
+						"name": "晋源区",
+						"latter": "J"
+					},
+					{
+						"name": "清徐县",
+						"latter": "Q"
+					},
+					{
+						"name": "阳曲县",
+						"latter": "Y"
+					},
+					{
+						"name": "娄烦县",
+						"latter": "L"
+					},
+					{
+						"name": "古交市",
+						"latter": "G"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "大同市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城区",
+						"latter": "C"
+					},
+					{
+						"name": "矿区",
+						"latter": "K"
+					},
+					{
+						"name": "南郊区",
+						"latter": "N"
+					},
+					{
+						"name": "新荣区",
+						"latter": "X"
+					},
+					{
+						"name": "阳高县",
+						"latter": "Y"
+					},
+					{
+						"name": "天镇县",
+						"latter": "T"
+					},
+					{
+						"name": "广灵县",
+						"latter": "G"
+					},
+					{
+						"name": "灵丘县",
+						"latter": "L"
+					},
+					{
+						"name": "浑源县",
+						"latter": "H"
+					},
+					{
+						"name": "左云县",
+						"latter": "Z"
+					},
+					{
+						"name": "大同县",
+						"latter": "D"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "阳泉市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城区",
+						"latter": "C"
+					},
+					{
+						"name": "矿区",
+						"latter": "K"
+					},
+					{
+						"name": "郊区",
+						"latter": "J"
+					},
+					{
+						"name": "平定县",
+						"latter": "P"
+					},
+					{
+						"name": "盂县",
+						"latter": "Y"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "长治市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城区",
+						"latter": "C"
+					},
+					{
+						"name": "郊区",
+						"latter": "J"
+					},
+					{
+						"name": "长治县",
+						"latter": "C"
+					},
+					{
+						"name": "襄垣县",
+						"latter": "X"
+					},
+					{
+						"name": "屯留县",
+						"latter": "T"
+					},
+					{
+						"name": "平顺县",
+						"latter": "P"
+					},
+					{
+						"name": "黎城县",
+						"latter": "L"
+					},
+					{
+						"name": "壶关县",
+						"latter": "H"
+					},
+					{
+						"name": "长子县",
+						"latter": "C"
+					},
+					{
+						"name": "武乡县",
+						"latter": "W"
+					},
+					{
+						"name": "沁县",
+						"latter": "Q"
+					},
+					{
+						"name": "沁源县",
+						"latter": "Q"
+					},
+					{
+						"name": "潞城市",
+						"latter": "L"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "晋城市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城区",
+						"latter": "C"
+					},
+					{
+						"name": "沁水县",
+						"latter": "Q"
+					},
+					{
+						"name": "阳城县",
+						"latter": "Y"
+					},
+					{
+						"name": "陵川县",
+						"latter": "L"
+					},
+					{
+						"name": "泽州县",
+						"latter": "Z"
+					},
+					{
+						"name": "高平市",
+						"latter": "G"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "朔州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "朔城区",
+						"latter": "S"
+					},
+					{
+						"name": "平鲁区",
+						"latter": "P"
+					},
+					{
+						"name": "山阴县",
+						"latter": "S"
+					},
+					{
+						"name": "应县",
+						"latter": "Y"
+					},
+					{
+						"name": "右玉县",
+						"latter": "Y"
+					},
+					{
+						"name": "怀仁县",
+						"latter": "H"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "晋中市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "榆次区",
+						"latter": "Y"
+					},
+					{
+						"name": "榆社县",
+						"latter": "Y"
+					},
+					{
+						"name": "左权县",
+						"latter": "Z"
+					},
+					{
+						"name": "和顺县",
+						"latter": "H"
+					},
+					{
+						"name": "昔阳县",
+						"latter": "X"
+					},
+					{
+						"name": "寿阳县",
+						"latter": "S"
+					},
+					{
+						"name": "太谷县",
+						"latter": "T"
+					},
+					{
+						"name": "祁县",
+						"latter": "Q"
+					},
+					{
+						"name": "平遥县",
+						"latter": "P"
+					},
+					{
+						"name": "灵石县",
+						"latter": "L"
+					},
+					{
+						"name": "介休市",
+						"latter": "J"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "运城市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "盐湖区",
+						"latter": "Y"
+					},
+					{
+						"name": "临猗县",
+						"latter": "L"
+					},
+					{
+						"name": "万荣县",
+						"latter": "W"
+					},
+					{
+						"name": "闻喜县",
+						"latter": "W"
+					},
+					{
+						"name": "稷山县",
+						"latter": "J"
+					},
+					{
+						"name": "新绛县",
+						"latter": "X"
+					},
+					{
+						"name": "绛县",
+						"latter": "J"
+					},
+					{
+						"name": "垣曲县",
+						"latter": "Y"
+					},
+					{
+						"name": "夏县",
+						"latter": "X"
+					},
+					{
+						"name": "平陆县",
+						"latter": "P"
+					},
+					{
+						"name": "芮城县",
+						"latter": "R"
+					},
+					{
+						"name": "永济市",
+						"latter": "Y"
+					},
+					{
+						"name": "河津市",
+						"latter": "H"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "忻州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "忻府区",
+						"latter": "X"
+					},
+					{
+						"name": "定襄县",
+						"latter": "D"
+					},
+					{
+						"name": "五台县",
+						"latter": "W"
+					},
+					{
+						"name": "代县",
+						"latter": "D"
+					},
+					{
+						"name": "繁峙县",
+						"latter": "F"
+					},
+					{
+						"name": "宁武县",
+						"latter": "N"
+					},
+					{
+						"name": "静乐县",
+						"latter": "J"
+					},
+					{
+						"name": "神池县",
+						"latter": "S"
+					},
+					{
+						"name": "五寨县",
+						"latter": "W"
+					},
+					{
+						"name": "岢岚县",
+						"latter": "K"
+					},
+					{
+						"name": "河曲县",
+						"latter": "H"
+					},
+					{
+						"name": "保德县",
+						"latter": "B"
+					},
+					{
+						"name": "偏关县",
+						"latter": "P"
+					},
+					{
+						"name": "原平市",
+						"latter": "Y"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "临汾市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "尧都区",
+						"latter": "Y"
+					},
+					{
+						"name": "曲沃县",
+						"latter": "Q"
+					},
+					{
+						"name": "翼城县",
+						"latter": "Y"
+					},
+					{
+						"name": "襄汾县",
+						"latter": "X"
+					},
+					{
+						"name": "洪洞县",
+						"latter": "H"
+					},
+					{
+						"name": "古县",
+						"latter": "G"
+					},
+					{
+						"name": "安泽县",
+						"latter": "A"
+					},
+					{
+						"name": "浮山县",
+						"latter": "F"
+					},
+					{
+						"name": "吉县",
+						"latter": "J"
+					},
+					{
+						"name": "乡宁县",
+						"latter": "X"
+					},
+					{
+						"name": "大宁县",
+						"latter": "D"
+					},
+					{
+						"name": "隰县",
+						"latter": "X"
+					},
+					{
+						"name": "永和县",
+						"latter": "Y"
+					},
+					{
+						"name": "蒲县",
+						"latter": "P"
+					},
+					{
+						"name": "汾西县",
+						"latter": "F"
+					},
+					{
+						"name": "侯马市",
+						"latter": "H"
+					},
+					{
+						"name": "霍州市",
+						"latter": "H"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "吕梁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "离石区",
+						"latter": "L"
+					},
+					{
+						"name": "文水县",
+						"latter": "W"
+					},
+					{
+						"name": "交城县",
+						"latter": "J"
+					},
+					{
+						"name": "兴县",
+						"latter": "X"
+					},
+					{
+						"name": "临县",
+						"latter": "L"
+					},
+					{
+						"name": "柳林县",
+						"latter": "L"
+					},
+					{
+						"name": "石楼县",
+						"latter": "S"
+					},
+					{
+						"name": "岚县",
+						"latter": "L"
+					},
+					{
+						"name": "方山县",
+						"latter": "F"
+					},
+					{
+						"name": "中阳县",
+						"latter": "Z"
+					},
+					{
+						"name": "交口县",
+						"latter": "J"
+					},
+					{
+						"name": "孝义市",
+						"latter": "X"
+					},
+					{
+						"name": "汾阳市",
+						"latter": "F"
+					}
+				],
+				"latter": "L"
+			}
+		],
+		"latter": "S"
+	},
+	{
+		"name": "内蒙古自治区",
+		"children": [{
+				"name": "呼和浩特市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新城区",
+						"latter": "X"
+					},
+					{
+						"name": "回民区",
+						"latter": "H"
+					},
+					{
+						"name": "玉泉区",
+						"latter": "Y"
+					},
+					{
+						"name": "赛罕区",
+						"latter": "S"
+					},
+					{
+						"name": "土默特左旗",
+						"latter": "T"
+					},
+					{
+						"name": "托克托县",
+						"latter": "T"
+					},
+					{
+						"name": "和林格尔县",
+						"latter": "H"
+					},
+					{
+						"name": "清水河县",
+						"latter": "Q"
+					},
+					{
+						"name": "武川县",
+						"latter": "W"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "包头市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东河区",
+						"latter": "D"
+					},
+					{
+						"name": "昆都仑区",
+						"latter": "K"
+					},
+					{
+						"name": "青山区",
+						"latter": "Q"
+					},
+					{
+						"name": "石拐区",
+						"latter": "S"
+					},
+					{
+						"name": "白云鄂博矿区",
+						"latter": "B"
+					},
+					{
+						"name": "九原区",
+						"latter": "J"
+					},
+					{
+						"name": "土默特右旗",
+						"latter": "T"
+					},
+					{
+						"name": "固阳县",
+						"latter": "G"
+					},
+					{
+						"name": "达尔罕茂明安联合旗",
+						"latter": "D"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "乌海市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海勃湾区",
+						"latter": "H"
+					},
+					{
+						"name": "海南区",
+						"latter": "H"
+					},
+					{
+						"name": "乌达区",
+						"latter": "W"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "赤峰市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "红山区",
+						"latter": "H"
+					},
+					{
+						"name": "元宝山区",
+						"latter": "Y"
+					},
+					{
+						"name": "松山区",
+						"latter": "S"
+					},
+					{
+						"name": "阿鲁科尔沁旗",
+						"latter": "A"
+					},
+					{
+						"name": "巴林左旗",
+						"latter": "B"
+					},
+					{
+						"name": "巴林右旗",
+						"latter": "B"
+					},
+					{
+						"name": "林西县",
+						"latter": "L"
+					},
+					{
+						"name": "克什克腾旗",
+						"latter": "K"
+					},
+					{
+						"name": "翁牛特旗",
+						"latter": "W"
+					},
+					{
+						"name": "喀喇沁旗",
+						"latter": "K"
+					},
+					{
+						"name": "宁城县",
+						"latter": "N"
+					},
+					{
+						"name": "敖汉旗",
+						"latter": "A"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "通辽市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "科尔沁区",
+						"latter": "K"
+					},
+					{
+						"name": "科尔沁左翼中旗",
+						"latter": "K"
+					},
+					{
+						"name": "科尔沁左翼后旗",
+						"latter": "K"
+					},
+					{
+						"name": "开鲁县",
+						"latter": "K"
+					},
+					{
+						"name": "库伦旗",
+						"latter": "K"
+					},
+					{
+						"name": "奈曼旗",
+						"latter": "N"
+					},
+					{
+						"name": "扎鲁特旗",
+						"latter": "Z"
+					},
+					{
+						"name": "霍林郭勒市",
+						"latter": "H"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "鄂尔多斯市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东胜区",
+						"latter": "D"
+					},
+					{
+						"name": "达拉特旗",
+						"latter": "D"
+					},
+					{
+						"name": "准格尔旗",
+						"latter": "Z"
+					},
+					{
+						"name": "鄂托克前旗",
+						"latter": "E"
+					},
+					{
+						"name": "鄂托克旗",
+						"latter": "E"
+					},
+					{
+						"name": "杭锦旗",
+						"latter": "H"
+					},
+					{
+						"name": "乌审旗",
+						"latter": "W"
+					},
+					{
+						"name": "伊金霍洛旗",
+						"latter": "Y"
+					}
+				],
+				"latter": "E"
+			},
+			{
+				"name": "呼伦贝尔市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海拉尔区",
+						"latter": "H"
+					},
+					{
+						"name": "扎赉诺尔区",
+						"latter": "Z"
+					},
+					{
+						"name": "阿荣旗",
+						"latter": "A"
+					},
+					{
+						"name": "莫力达瓦达斡尔族自治旗",
+						"latter": "M"
+					},
+					{
+						"name": "鄂伦春自治旗",
+						"latter": "E"
+					},
+					{
+						"name": "鄂温克族自治旗",
+						"latter": "E"
+					},
+					{
+						"name": "陈巴尔虎旗",
+						"latter": "C"
+					},
+					{
+						"name": "新巴尔虎左旗",
+						"latter": "X"
+					},
+					{
+						"name": "新巴尔虎右旗",
+						"latter": "X"
+					},
+					{
+						"name": "满洲里市",
+						"latter": "M"
+					},
+					{
+						"name": "牙克石市",
+						"latter": "Y"
+					},
+					{
+						"name": "扎兰屯市",
+						"latter": "Z"
+					},
+					{
+						"name": "额尔古纳市",
+						"latter": "E"
+					},
+					{
+						"name": "根河市",
+						"latter": "G"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "巴彦淖尔市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "临河区",
+						"latter": "L"
+					},
+					{
+						"name": "五原县",
+						"latter": "W"
+					},
+					{
+						"name": "磴口县",
+						"latter": "D"
+					},
+					{
+						"name": "乌拉特前旗",
+						"latter": "W"
+					},
+					{
+						"name": "乌拉特中旗",
+						"latter": "W"
+					},
+					{
+						"name": "乌拉特后旗",
+						"latter": "W"
+					},
+					{
+						"name": "杭锦后旗",
+						"latter": "H"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "乌兰察布市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "集宁区",
+						"latter": "J"
+					},
+					{
+						"name": "卓资县",
+						"latter": "Z"
+					},
+					{
+						"name": "化德县",
+						"latter": "H"
+					},
+					{
+						"name": "商都县",
+						"latter": "S"
+					},
+					{
+						"name": "兴和县",
+						"latter": "X"
+					},
+					{
+						"name": "凉城县",
+						"latter": "L"
+					},
+					{
+						"name": "察哈尔右翼前旗",
+						"latter": "C"
+					},
+					{
+						"name": "察哈尔右翼中旗",
+						"latter": "C"
+					},
+					{
+						"name": "察哈尔右翼后旗",
+						"latter": "C"
+					},
+					{
+						"name": "四子王旗",
+						"latter": "S"
+					},
+					{
+						"name": "丰镇市",
+						"latter": "F"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "兴安盟",
+				"children": [{
+						"name": "乌兰浩特市",
+						"latter": "W"
+					},
+					{
+						"name": "阿尔山市",
+						"latter": "A"
+					},
+					{
+						"name": "科尔沁右翼前旗",
+						"latter": "K"
+					},
+					{
+						"name": "科尔沁右翼中旗",
+						"latter": "K"
+					},
+					{
+						"name": "扎赉特旗",
+						"latter": "Z"
+					},
+					{
+						"name": "突泉县",
+						"latter": "T"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "锡林郭勒盟",
+				"children": [{
+						"name": "二连浩特市",
+						"latter": "E"
+					},
+					{
+						"name": "锡林浩特市",
+						"latter": "X"
+					},
+					{
+						"name": "阿巴嘎旗",
+						"latter": "A"
+					},
+					{
+						"name": "苏尼特左旗",
+						"latter": "S"
+					},
+					{
+						"name": "苏尼特右旗",
+						"latter": "S"
+					},
+					{
+						"name": "东乌珠穆沁旗",
+						"latter": "D"
+					},
+					{
+						"name": "西乌珠穆沁旗",
+						"latter": "X"
+					},
+					{
+						"name": "太仆寺旗",
+						"latter": "T"
+					},
+					{
+						"name": "镶黄旗",
+						"latter": "X"
+					},
+					{
+						"name": "正镶白旗",
+						"latter": "Z"
+					},
+					{
+						"name": "正蓝旗",
+						"latter": "Z"
+					},
+					{
+						"name": "多伦县",
+						"latter": "D"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "阿拉善盟",
+				"children": [{
+						"name": "阿拉善左旗",
+						"latter": "A"
+					},
+					{
+						"name": "阿拉善右旗",
+						"latter": "A"
+					},
+					{
+						"name": "额济纳旗",
+						"latter": "E"
+					}
+				],
+				"latter": "A"
+			}
+		],
+		"latter": "N"
+	},
+	{
+		"name": "辽宁省",
+		"children": [{
+				"name": "沈阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "和平区",
+						"latter": "H"
+					},
+					{
+						"name": "沈河区",
+						"latter": "S"
+					},
+					{
+						"name": "大东区",
+						"latter": "D"
+					},
+					{
+						"name": "皇姑区",
+						"latter": "H"
+					},
+					{
+						"name": "铁西区",
+						"latter": "T"
+					},
+					{
+						"name": "苏家屯区",
+						"latter": "S"
+					},
+					{
+						"name": "东陵区",
+						"latter": "D"
+					},
+					{
+						"name": "沈北新区",
+						"latter": "S"
+					},
+					{
+						"name": "于洪区",
+						"latter": "Y"
+					},
+					{
+						"name": "辽中县",
+						"latter": "L"
+					},
+					{
+						"name": "康平县",
+						"latter": "K"
+					},
+					{
+						"name": "法库县",
+						"latter": "F"
+					},
+					{
+						"name": "新民市",
+						"latter": "X"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "大连市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "中山区",
+						"latter": "Z"
+					},
+					{
+						"name": "西岗区",
+						"latter": "X"
+					},
+					{
+						"name": "沙河口区",
+						"latter": "S"
+					},
+					{
+						"name": "甘井子区",
+						"latter": "G"
+					},
+					{
+						"name": "旅顺口区",
+						"latter": "L"
+					},
+					{
+						"name": "金州区",
+						"latter": "J"
+					},
+					{
+						"name": "长海县",
+						"latter": "C"
+					},
+					{
+						"name": "瓦房店市",
+						"latter": "W"
+					},
+					{
+						"name": "普兰店市",
+						"latter": "P"
+					},
+					{
+						"name": "庄河市",
+						"latter": "Z"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "鞍山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "铁东区",
+						"latter": "T"
+					},
+					{
+						"name": "铁西区",
+						"latter": "T"
+					},
+					{
+						"name": "立山区",
+						"latter": "L"
+					},
+					{
+						"name": "千山区",
+						"latter": "Q"
+					},
+					{
+						"name": "台安县",
+						"latter": "T"
+					},
+					{
+						"name": "岫岩满族自治县",
+						"latter": "X"
+					},
+					{
+						"name": "海城市",
+						"latter": "H"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "抚顺市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新抚区",
+						"latter": "X"
+					},
+					{
+						"name": "东洲区",
+						"latter": "D"
+					},
+					{
+						"name": "望花区",
+						"latter": "W"
+					},
+					{
+						"name": "顺城区",
+						"latter": "S"
+					},
+					{
+						"name": "抚顺县",
+						"latter": "F"
+					},
+					{
+						"name": "新宾满族自治县",
+						"latter": "X"
+					},
+					{
+						"name": "清原满族自治县",
+						"latter": "Q"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "本溪市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "平山区",
+						"latter": "P"
+					},
+					{
+						"name": "溪湖区",
+						"latter": "X"
+					},
+					{
+						"name": "明山区",
+						"latter": "M"
+					},
+					{
+						"name": "南芬区",
+						"latter": "N"
+					},
+					{
+						"name": "本溪满族自治县",
+						"latter": "B"
+					},
+					{
+						"name": "桓仁满族自治县",
+						"latter": "H"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "丹东市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "元宝区",
+						"latter": "Y"
+					},
+					{
+						"name": "振兴区",
+						"latter": "Z"
+					},
+					{
+						"name": "振安区",
+						"latter": "Z"
+					},
+					{
+						"name": "宽甸满族自治县",
+						"latter": "K"
+					},
+					{
+						"name": "东港市",
+						"latter": "D"
+					},
+					{
+						"name": "凤城市",
+						"latter": "F"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "锦州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "古塔区",
+						"latter": "G"
+					},
+					{
+						"name": "凌河区",
+						"latter": "L"
+					},
+					{
+						"name": "太和区",
+						"latter": "T"
+					},
+					{
+						"name": "黑山县",
+						"latter": "H"
+					},
+					{
+						"name": "义县",
+						"latter": "Y"
+					},
+					{
+						"name": "凌海市",
+						"latter": "L"
+					},
+					{
+						"name": "北镇市",
+						"latter": "B"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "营口市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "站前区",
+						"latter": "Z"
+					},
+					{
+						"name": "西市区",
+						"latter": "X"
+					},
+					{
+						"name": "鲅鱼圈区",
+						"latter": "B"
+					},
+					{
+						"name": "老边区",
+						"latter": "L"
+					},
+					{
+						"name": "盖州市",
+						"latter": "G"
+					},
+					{
+						"name": "大石桥市",
+						"latter": "D"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "阜新市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海州区",
+						"latter": "H"
+					},
+					{
+						"name": "新邱区",
+						"latter": "X"
+					},
+					{
+						"name": "太平区",
+						"latter": "T"
+					},
+					{
+						"name": "清河门区",
+						"latter": "Q"
+					},
+					{
+						"name": "细河区",
+						"latter": "X"
+					},
+					{
+						"name": "阜新蒙古族自治县",
+						"latter": "F"
+					},
+					{
+						"name": "彰武县",
+						"latter": "Z"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "辽阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "白塔区",
+						"latter": "B"
+					},
+					{
+						"name": "文圣区",
+						"latter": "W"
+					},
+					{
+						"name": "宏伟区",
+						"latter": "H"
+					},
+					{
+						"name": "弓长岭区",
+						"latter": "G"
+					},
+					{
+						"name": "太子河区",
+						"latter": "T"
+					},
+					{
+						"name": "辽阳县",
+						"latter": "L"
+					},
+					{
+						"name": "灯塔市",
+						"latter": "D"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "盘锦市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "双台子区",
+						"latter": "S"
+					},
+					{
+						"name": "兴隆台区",
+						"latter": "X"
+					},
+					{
+						"name": "大洼县",
+						"latter": "D"
+					},
+					{
+						"name": "盘山县",
+						"latter": "P"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "铁岭市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "银州区",
+						"latter": "Y"
+					},
+					{
+						"name": "清河区",
+						"latter": "Q"
+					},
+					{
+						"name": "铁岭县",
+						"latter": "T"
+					},
+					{
+						"name": "西丰县",
+						"latter": "X"
+					},
+					{
+						"name": "昌图县",
+						"latter": "C"
+					},
+					{
+						"name": "调兵山市",
+						"latter": "T"
+					},
+					{
+						"name": "开原市",
+						"latter": "K"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "朝阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "双塔区",
+						"latter": "S"
+					},
+					{
+						"name": "龙城区",
+						"latter": "L"
+					},
+					{
+						"name": "朝阳县",
+						"latter": "Z"
+					},
+					{
+						"name": "建平县",
+						"latter": "J"
+					},
+					{
+						"name": "喀喇沁左翼蒙古族自治县",
+						"latter": "K"
+					},
+					{
+						"name": "北票市",
+						"latter": "B"
+					},
+					{
+						"name": "凌源市",
+						"latter": "L"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "葫芦岛市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "连山区",
+						"latter": "L"
+					},
+					{
+						"name": "龙港区",
+						"latter": "L"
+					},
+					{
+						"name": "南票区",
+						"latter": "N"
+					},
+					{
+						"name": "绥中县",
+						"latter": "S"
+					},
+					{
+						"name": "建昌县",
+						"latter": "J"
+					},
+					{
+						"name": "兴城市",
+						"latter": "X"
+					}
+				],
+				"latter": "H"
+			}
+		],
+		"latter": "L"
+	},
+	{
+		"name": "吉林省",
+		"children": [{
+				"name": "长春市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "南关区",
+						"latter": "N"
+					},
+					{
+						"name": "宽城区",
+						"latter": "K"
+					},
+					{
+						"name": "朝阳区",
+						"latter": "Z"
+					},
+					{
+						"name": "二道区",
+						"latter": "E"
+					},
+					{
+						"name": "绿园区",
+						"latter": "L"
+					},
+					{
+						"name": "双阳区",
+						"latter": "S"
+					},
+					{
+						"name": "农安县",
+						"latter": "N"
+					},
+					{
+						"name": "九台市",
+						"latter": "J"
+					},
+					{
+						"name": "榆树市",
+						"latter": "Y"
+					},
+					{
+						"name": "德惠市",
+						"latter": "D"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "吉林市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "昌邑区",
+						"latter": "C"
+					},
+					{
+						"name": "龙潭区",
+						"latter": "L"
+					},
+					{
+						"name": "船营区",
+						"latter": "C"
+					},
+					{
+						"name": "丰满区",
+						"latter": "F"
+					},
+					{
+						"name": "永吉县",
+						"latter": "Y"
+					},
+					{
+						"name": "蛟河市",
+						"latter": "J"
+					},
+					{
+						"name": "桦甸市",
+						"latter": "H"
+					},
+					{
+						"name": "舒兰市",
+						"latter": "S"
+					},
+					{
+						"name": "磐石市",
+						"latter": "P"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "四平市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "铁西区",
+						"latter": "T"
+					},
+					{
+						"name": "铁东区",
+						"latter": "T"
+					},
+					{
+						"name": "梨树县",
+						"latter": "L"
+					},
+					{
+						"name": "伊通满族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "公主岭市",
+						"latter": "G"
+					},
+					{
+						"name": "双辽市",
+						"latter": "S"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "辽源市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "龙山区",
+						"latter": "L"
+					},
+					{
+						"name": "西安区",
+						"latter": "X"
+					},
+					{
+						"name": "东丰县",
+						"latter": "D"
+					},
+					{
+						"name": "东辽县",
+						"latter": "D"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "通化市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东昌区",
+						"latter": "D"
+					},
+					{
+						"name": "二道江区",
+						"latter": "E"
+					},
+					{
+						"name": "通化县",
+						"latter": "T"
+					},
+					{
+						"name": "辉南县",
+						"latter": "H"
+					},
+					{
+						"name": "柳河县",
+						"latter": "L"
+					},
+					{
+						"name": "梅河口市",
+						"latter": "M"
+					},
+					{
+						"name": "集安市",
+						"latter": "J"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "白山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "浑江区",
+						"latter": "H"
+					},
+					{
+						"name": "江源区",
+						"latter": "J"
+					},
+					{
+						"name": "抚松县",
+						"latter": "F"
+					},
+					{
+						"name": "靖宇县",
+						"latter": "J"
+					},
+					{
+						"name": "长白朝鲜族自治县",
+						"latter": "C"
+					},
+					{
+						"name": "临江市",
+						"latter": "L"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "松原市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "宁江区",
+						"latter": "N"
+					},
+					{
+						"name": "前郭尔罗斯蒙古族自治县",
+						"latter": "Q"
+					},
+					{
+						"name": "长岭县",
+						"latter": "C"
+					},
+					{
+						"name": "乾安县",
+						"latter": "Q"
+					},
+					{
+						"name": "扶余市",
+						"latter": "F"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "白城市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "洮北区",
+						"latter": "T"
+					},
+					{
+						"name": "镇赉县",
+						"latter": "Z"
+					},
+					{
+						"name": "通榆县",
+						"latter": "T"
+					},
+					{
+						"name": "洮南市",
+						"latter": "T"
+					},
+					{
+						"name": "大安市",
+						"latter": "D"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "延边朝鲜族自治州",
+				"children": [{
+						"name": "延吉市",
+						"latter": "Y"
+					},
+					{
+						"name": "图们市",
+						"latter": "T"
+					},
+					{
+						"name": "敦化市",
+						"latter": "D"
+					},
+					{
+						"name": "珲春市",
+						"latter": "H"
+					},
+					{
+						"name": "龙井市",
+						"latter": "L"
+					},
+					{
+						"name": "和龙市",
+						"latter": "H"
+					},
+					{
+						"name": "汪清县",
+						"latter": "W"
+					},
+					{
+						"name": "安图县",
+						"latter": "A"
+					}
+				],
+				"latter": "Y"
+			}
+		],
+		"latter": "J"
+	},
+	{
+		"name": "黑龙江省",
+		"children": [{
+				"name": "哈尔滨市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "道里区",
+						"latter": "D"
+					},
+					{
+						"name": "南岗区",
+						"latter": "N"
+					},
+					{
+						"name": "道外区",
+						"latter": "D"
+					},
+					{
+						"name": "平房区",
+						"latter": "P"
+					},
+					{
+						"name": "松北区",
+						"latter": "S"
+					},
+					{
+						"name": "香坊区",
+						"latter": "X"
+					},
+					{
+						"name": "呼兰区",
+						"latter": "H"
+					},
+					{
+						"name": "阿城区",
+						"latter": "A"
+					},
+					{
+						"name": "依兰县",
+						"latter": "Y"
+					},
+					{
+						"name": "方正县",
+						"latter": "F"
+					},
+					{
+						"name": "宾县",
+						"latter": "B"
+					},
+					{
+						"name": "巴彦县",
+						"latter": "B"
+					},
+					{
+						"name": "木兰县",
+						"latter": "M"
+					},
+					{
+						"name": "通河县",
+						"latter": "T"
+					},
+					{
+						"name": "延寿县",
+						"latter": "Y"
+					},
+					{
+						"name": "双城市",
+						"latter": "S"
+					},
+					{
+						"name": "尚志市",
+						"latter": "S"
+					},
+					{
+						"name": "五常市",
+						"latter": "W"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "齐齐哈尔市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "龙沙区",
+						"latter": "L"
+					},
+					{
+						"name": "建华区",
+						"latter": "J"
+					},
+					{
+						"name": "铁锋区",
+						"latter": "T"
+					},
+					{
+						"name": "昂昂溪区",
+						"latter": "A"
+					},
+					{
+						"name": "富拉尔基区",
+						"latter": "F"
+					},
+					{
+						"name": "碾子山区",
+						"latter": "N"
+					},
+					{
+						"name": "梅里斯达斡尔族区",
+						"latter": "M"
+					},
+					{
+						"name": "龙江县",
+						"latter": "L"
+					},
+					{
+						"name": "依安县",
+						"latter": "Y"
+					},
+					{
+						"name": "泰来县",
+						"latter": "T"
+					},
+					{
+						"name": "甘南县",
+						"latter": "G"
+					},
+					{
+						"name": "富裕县",
+						"latter": "F"
+					},
+					{
+						"name": "克山县",
+						"latter": "K"
+					},
+					{
+						"name": "克东县",
+						"latter": "K"
+					},
+					{
+						"name": "拜泉县",
+						"latter": "B"
+					},
+					{
+						"name": "讷河市",
+						"latter": "N"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "鸡西市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鸡冠区",
+						"latter": "J"
+					},
+					{
+						"name": "恒山区",
+						"latter": "H"
+					},
+					{
+						"name": "滴道区",
+						"latter": "D"
+					},
+					{
+						"name": "梨树区",
+						"latter": "L"
+					},
+					{
+						"name": "城子河区",
+						"latter": "C"
+					},
+					{
+						"name": "麻山区",
+						"latter": "M"
+					},
+					{
+						"name": "鸡东县",
+						"latter": "J"
+					},
+					{
+						"name": "虎林市",
+						"latter": "H"
+					},
+					{
+						"name": "密山市",
+						"latter": "M"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "鹤岗市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "向阳区",
+						"latter": "X"
+					},
+					{
+						"name": "工农区",
+						"latter": "G"
+					},
+					{
+						"name": "南山区",
+						"latter": "N"
+					},
+					{
+						"name": "兴安区",
+						"latter": "X"
+					},
+					{
+						"name": "东山区",
+						"latter": "D"
+					},
+					{
+						"name": "兴山区",
+						"latter": "X"
+					},
+					{
+						"name": "萝北县",
+						"latter": "L"
+					},
+					{
+						"name": "绥滨县",
+						"latter": "S"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "双鸭山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "尖山区",
+						"latter": "J"
+					},
+					{
+						"name": "岭东区",
+						"latter": "L"
+					},
+					{
+						"name": "四方台区",
+						"latter": "S"
+					},
+					{
+						"name": "宝山区",
+						"latter": "B"
+					},
+					{
+						"name": "集贤县",
+						"latter": "J"
+					},
+					{
+						"name": "友谊县",
+						"latter": "Y"
+					},
+					{
+						"name": "宝清县",
+						"latter": "B"
+					},
+					{
+						"name": "饶河县",
+						"latter": "R"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "大庆市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "萨尔图区",
+						"latter": "S"
+					},
+					{
+						"name": "龙凤区",
+						"latter": "L"
+					},
+					{
+						"name": "让胡路区",
+						"latter": "R"
+					},
+					{
+						"name": "红岗区",
+						"latter": "H"
+					},
+					{
+						"name": "大同区",
+						"latter": "D"
+					},
+					{
+						"name": "肇州县",
+						"latter": "Z"
+					},
+					{
+						"name": "肇源县",
+						"latter": "Z"
+					},
+					{
+						"name": "林甸县",
+						"latter": "L"
+					},
+					{
+						"name": "杜尔伯特蒙古族自治县",
+						"latter": "D"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "伊春市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "伊春区",
+						"latter": "Y"
+					},
+					{
+						"name": "南岔区",
+						"latter": "N"
+					},
+					{
+						"name": "友好区",
+						"latter": "Y"
+					},
+					{
+						"name": "西林区",
+						"latter": "X"
+					},
+					{
+						"name": "翠峦区",
+						"latter": "C"
+					},
+					{
+						"name": "新青区",
+						"latter": "X"
+					},
+					{
+						"name": "美溪区",
+						"latter": "M"
+					},
+					{
+						"name": "金山屯区",
+						"latter": "J"
+					},
+					{
+						"name": "五营区",
+						"latter": "W"
+					},
+					{
+						"name": "乌马河区",
+						"latter": "W"
+					},
+					{
+						"name": "汤旺河区",
+						"latter": "T"
+					},
+					{
+						"name": "带岭区",
+						"latter": "D"
+					},
+					{
+						"name": "乌伊岭区",
+						"latter": "W"
+					},
+					{
+						"name": "红星区",
+						"latter": "H"
+					},
+					{
+						"name": "上甘岭区",
+						"latter": "S"
+					},
+					{
+						"name": "嘉荫县",
+						"latter": "J"
+					},
+					{
+						"name": "铁力市",
+						"latter": "T"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "佳木斯市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "向阳区",
+						"latter": "X"
+					},
+					{
+						"name": "前进区",
+						"latter": "Q"
+					},
+					{
+						"name": "东风区",
+						"latter": "D"
+					},
+					{
+						"name": "郊区",
+						"latter": "J"
+					},
+					{
+						"name": "桦南县",
+						"latter": "H"
+					},
+					{
+						"name": "桦川县",
+						"latter": "H"
+					},
+					{
+						"name": "汤原县",
+						"latter": "T"
+					},
+					{
+						"name": "抚远县",
+						"latter": "F"
+					},
+					{
+						"name": "同江市",
+						"latter": "T"
+					},
+					{
+						"name": "富锦市",
+						"latter": "F"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "七台河市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新兴区",
+						"latter": "X"
+					},
+					{
+						"name": "桃山区",
+						"latter": "T"
+					},
+					{
+						"name": "茄子河区",
+						"latter": "Q"
+					},
+					{
+						"name": "勃利县",
+						"latter": "B"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "牡丹江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东安区",
+						"latter": "D"
+					},
+					{
+						"name": "阳明区",
+						"latter": "Y"
+					},
+					{
+						"name": "爱民区",
+						"latter": "A"
+					},
+					{
+						"name": "西安区",
+						"latter": "X"
+					},
+					{
+						"name": "东宁县",
+						"latter": "D"
+					},
+					{
+						"name": "林口县",
+						"latter": "L"
+					},
+					{
+						"name": "绥芬河市",
+						"latter": "S"
+					},
+					{
+						"name": "海林市",
+						"latter": "H"
+					},
+					{
+						"name": "宁安市",
+						"latter": "N"
+					},
+					{
+						"name": "穆棱市",
+						"latter": "M"
+					}
+				],
+				"latter": "M"
+			},
+			{
+				"name": "黑河市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "爱辉区",
+						"latter": "A"
+					},
+					{
+						"name": "嫩江县",
+						"latter": "N"
+					},
+					{
+						"name": "逊克县",
+						"latter": "X"
+					},
+					{
+						"name": "孙吴县",
+						"latter": "S"
+					},
+					{
+						"name": "北安市",
+						"latter": "B"
+					},
+					{
+						"name": "五大连池市",
+						"latter": "W"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "绥化市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "北林区",
+						"latter": "B"
+					},
+					{
+						"name": "望奎县",
+						"latter": "W"
+					},
+					{
+						"name": "兰西县",
+						"latter": "L"
+					},
+					{
+						"name": "青冈县",
+						"latter": "Q"
+					},
+					{
+						"name": "庆安县",
+						"latter": "Q"
+					},
+					{
+						"name": "明水县",
+						"latter": "M"
+					},
+					{
+						"name": "绥棱县",
+						"latter": "S"
+					},
+					{
+						"name": "安达市",
+						"latter": "A"
+					},
+					{
+						"name": "肇东市",
+						"latter": "Z"
+					},
+					{
+						"name": "海伦市",
+						"latter": "H"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "大兴安岭地区",
+				"children": [{
+						"name": "呼玛县",
+						"latter": "H"
+					},
+					{
+						"name": "塔河县",
+						"latter": "T"
+					},
+					{
+						"name": "漠河县",
+						"latter": "M"
+					}
+				],
+				"latter": "D"
+			}
+		],
+		"latter": "H"
+	},
+	{
+		"name": "上海",
+		"latter": "S",
+		"children": [
+			{
+				"name": "上海市",
+				"children": [{
+						"name": "黄浦区",
+						"latter": "H"
+					},
+					{
+						"name": "徐汇区",
+						"latter": "X"
+					},
+					{
+						"name": "长宁区",
+						"latter": "C"
+					},
+					{
+						"name": "静安区",
+						"latter": "J"
+					},
+					{
+						"name": "普陀区",
+						"latter": "P"
+					},
+					{
+						"name": "闸北区",
+						"latter": "Z"
+					},
+					{
+						"name": "虹口区",
+						"latter": "H"
+					},
+					{
+						"name": "杨浦区",
+						"latter": "Y"
+					},
+					{
+						"name": "闵行区",
+						"latter": "M"
+					},
+					{
+						"name": "宝山区",
+						"latter": "B"
+					},
+					{
+						"name": "嘉定区",
+						"latter": "J"
+					},
+					{
+						"name": "浦东新区",
+						"latter": "P"
+					},
+					{
+						"name": "金山区",
+						"latter": "J"
+					},
+					{
+						"name": "松江区",
+						"latter": "S"
+					},
+					{
+						"name": "青浦区",
+						"latter": "Q"
+					},
+					{
+						"name": "奉贤区",
+						"latter": "F"
+					},
+					{
+						"name": "崇明县",
+						"latter": "C"
+					}
+				],
+				"latter": "S"
+			}
+		]
+	},
+	{
+		"name": "江苏省",
+		"children": [{
+				"name": "南京市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "玄武区",
+						"latter": "X"
+					},
+					{
+						"name": "秦淮区",
+						"latter": "Q"
+					},
+					{
+						"name": "建邺区",
+						"latter": "J"
+					},
+					{
+						"name": "鼓楼区",
+						"latter": "G"
+					},
+					{
+						"name": "浦口区",
+						"latter": "P"
+					},
+					{
+						"name": "栖霞区",
+						"latter": "Q"
+					},
+					{
+						"name": "雨花台区",
+						"latter": "Y"
+					},
+					{
+						"name": "江宁区",
+						"latter": "J"
+					},
+					{
+						"name": "六合区",
+						"latter": "L"
+					},
+					{
+						"name": "溧水区",
+						"latter": "L"
+					},
+					{
+						"name": "高淳区",
+						"latter": "G"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "无锡市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "崇安区",
+						"latter": "C"
+					},
+					{
+						"name": "南长区",
+						"latter": "N"
+					},
+					{
+						"name": "北塘区",
+						"latter": "B"
+					},
+					{
+						"name": "锡山区",
+						"latter": "X"
+					},
+					{
+						"name": "惠山区",
+						"latter": "H"
+					},
+					{
+						"name": "滨湖区",
+						"latter": "B"
+					},
+					{
+						"name": "江阴市",
+						"latter": "J"
+					},
+					{
+						"name": "宜兴市",
+						"latter": "Y"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "徐州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鼓楼区",
+						"latter": "G"
+					},
+					{
+						"name": "云龙区",
+						"latter": "Y"
+					},
+					{
+						"name": "贾汪区",
+						"latter": "J"
+					},
+					{
+						"name": "泉山区",
+						"latter": "Q"
+					},
+					{
+						"name": "铜山区",
+						"latter": "T"
+					},
+					{
+						"name": "丰县",
+						"latter": "F"
+					},
+					{
+						"name": "沛县",
+						"latter": "P"
+					},
+					{
+						"name": "睢宁县",
+						"latter": "H"
+					},
+					{
+						"name": "新沂市",
+						"latter": "X"
+					},
+					{
+						"name": "邳州市",
+						"latter": "P"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "常州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "天宁区",
+						"latter": "T"
+					},
+					{
+						"name": "钟楼区",
+						"latter": "Z"
+					},
+					{
+						"name": "戚墅堰区",
+						"latter": "Q"
+					},
+					{
+						"name": "新北区",
+						"latter": "X"
+					},
+					{
+						"name": "武进区",
+						"latter": "W"
+					},
+					{
+						"name": "溧阳市",
+						"latter": "L"
+					},
+					{
+						"name": "金坛市",
+						"latter": "J"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "苏州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "虎丘区",
+						"latter": "H"
+					},
+					{
+						"name": "吴中区",
+						"latter": "W"
+					},
+					{
+						"name": "相城区",
+						"latter": "X"
+					},
+					{
+						"name": "姑苏区",
+						"latter": "G"
+					},
+					{
+						"name": "吴江区",
+						"latter": "W"
+					},
+					{
+						"name": "常熟市",
+						"latter": "C"
+					},
+					{
+						"name": "张家港市",
+						"latter": "Z"
+					},
+					{
+						"name": "昆山市",
+						"latter": "K"
+					},
+					{
+						"name": "太仓市",
+						"latter": "T"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "南通市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "崇川区",
+						"latter": "C"
+					},
+					{
+						"name": "港闸区",
+						"latter": "G"
+					},
+					{
+						"name": "通州区",
+						"latter": "T"
+					},
+					{
+						"name": "海安县",
+						"latter": "H"
+					},
+					{
+						"name": "如东县",
+						"latter": "R"
+					},
+					{
+						"name": "启东市",
+						"latter": "Q"
+					},
+					{
+						"name": "如皋市",
+						"latter": "R"
+					},
+					{
+						"name": "海门市",
+						"latter": "H"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "连云港市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "连云区",
+						"latter": "L"
+					},
+					{
+						"name": "新浦区",
+						"latter": "X"
+					},
+					{
+						"name": "海州区",
+						"latter": "H"
+					},
+					{
+						"name": "赣榆县",
+						"latter": "G"
+					},
+					{
+						"name": "东海县",
+						"latter": "D"
+					},
+					{
+						"name": "灌云县",
+						"latter": "G"
+					},
+					{
+						"name": "灌南县",
+						"latter": "G"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "淮安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "清河区",
+						"latter": "Q"
+					},
+					{
+						"name": "淮安区",
+						"latter": "H"
+					},
+					{
+						"name": "淮阴区",
+						"latter": "H"
+					},
+					{
+						"name": "清浦区",
+						"latter": "Q"
+					},
+					{
+						"name": "涟水县",
+						"latter": "L"
+					},
+					{
+						"name": "洪泽县",
+						"latter": "H"
+					},
+					{
+						"name": "盱眙县",
+						"latter": "X"
+					},
+					{
+						"name": "金湖县",
+						"latter": "J"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "盐城市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "亭湖区",
+						"latter": "T"
+					},
+					{
+						"name": "盐都区",
+						"latter": "Y"
+					},
+					{
+						"name": "响水县",
+						"latter": "X"
+					},
+					{
+						"name": "滨海县",
+						"latter": "B"
+					},
+					{
+						"name": "阜宁县",
+						"latter": "F"
+					},
+					{
+						"name": "射阳县",
+						"latter": "S"
+					},
+					{
+						"name": "建湖县",
+						"latter": "J"
+					},
+					{
+						"name": "东台市",
+						"latter": "D"
+					},
+					{
+						"name": "大丰市",
+						"latter": "D"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "扬州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "广陵区",
+						"latter": "G"
+					},
+					{
+						"name": "邗江区",
+						"latter": "H"
+					},
+					{
+						"name": "江都区",
+						"latter": "J"
+					},
+					{
+						"name": "宝应县",
+						"latter": "B"
+					},
+					{
+						"name": "仪征市",
+						"latter": "Y"
+					},
+					{
+						"name": "高邮市",
+						"latter": "G"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "镇江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "京口区",
+						"latter": "J"
+					},
+					{
+						"name": "润州区",
+						"latter": "R"
+					},
+					{
+						"name": "丹徒区",
+						"latter": "D"
+					},
+					{
+						"name": "丹阳市",
+						"latter": "D"
+					},
+					{
+						"name": "扬中市",
+						"latter": "Y"
+					},
+					{
+						"name": "句容市",
+						"latter": "J"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "泰州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海陵区",
+						"latter": "H"
+					},
+					{
+						"name": "高港区",
+						"latter": "G"
+					},
+					{
+						"name": "姜堰区",
+						"latter": "J"
+					},
+					{
+						"name": "兴化市",
+						"latter": "X"
+					},
+					{
+						"name": "靖江市",
+						"latter": "J"
+					},
+					{
+						"name": "泰兴市",
+						"latter": "T"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "宿迁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "宿城区",
+						"latter": "S"
+					},
+					{
+						"name": "宿豫区",
+						"latter": "S"
+					},
+					{
+						"name": "沭阳县",
+						"latter": "S"
+					},
+					{
+						"name": "泗阳县",
+						"latter": "S"
+					},
+					{
+						"name": "泗洪县",
+						"latter": "S"
+					}
+				],
+				"latter": "S"
+			}
+		],
+		"latter": "J"
+	},
+	{
+		"name": "浙江省",
+		"children": [{
+				"name": "杭州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "上城区",
+						"latter": "S"
+					},
+					{
+						"name": "下城区",
+						"latter": "X"
+					},
+					{
+						"name": "江干区",
+						"latter": "J"
+					},
+					{
+						"name": "拱墅区",
+						"latter": "G"
+					},
+					{
+						"name": "西湖区",
+						"latter": "X"
+					},
+					{
+						"name": "滨江区",
+						"latter": "B"
+					},
+					{
+						"name": "萧山区",
+						"latter": "X"
+					},
+					{
+						"name": "余杭区",
+						"latter": "Y"
+					},
+					{
+						"name": "桐庐县",
+						"latter": "T"
+					},
+					{
+						"name": "淳安县",
+						"latter": "C"
+					},
+					{
+						"name": "建德市",
+						"latter": "J"
+					},
+					{
+						"name": "富阳市",
+						"latter": "F"
+					},
+					{
+						"name": "临安市",
+						"latter": "L"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "宁波市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海曙区",
+						"latter": "H"
+					},
+					{
+						"name": "江东区",
+						"latter": "J"
+					},
+					{
+						"name": "江北区",
+						"latter": "J"
+					},
+					{
+						"name": "北仑区",
+						"latter": "B"
+					},
+					{
+						"name": "镇海区",
+						"latter": "Z"
+					},
+					{
+						"name": "鄞州区",
+						"latter": "Y"
+					},
+					{
+						"name": "象山县",
+						"latter": "X"
+					},
+					{
+						"name": "宁海县",
+						"latter": "N"
+					},
+					{
+						"name": "余姚市",
+						"latter": "Y"
+					},
+					{
+						"name": "慈溪市",
+						"latter": "C"
+					},
+					{
+						"name": "奉化市",
+						"latter": "F"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "温州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鹿城区",
+						"latter": "L"
+					},
+					{
+						"name": "龙湾区",
+						"latter": "L"
+					},
+					{
+						"name": "瓯海区",
+						"latter": "O"
+					},
+					{
+						"name": "洞头县",
+						"latter": "D"
+					},
+					{
+						"name": "永嘉县",
+						"latter": "Y"
+					},
+					{
+						"name": "平阳县",
+						"latter": "P"
+					},
+					{
+						"name": "苍南县",
+						"latter": "C"
+					},
+					{
+						"name": "文成县",
+						"latter": "W"
+					},
+					{
+						"name": "泰顺县",
+						"latter": "T"
+					},
+					{
+						"name": "瑞安市",
+						"latter": "R"
+					},
+					{
+						"name": "乐清市",
+						"latter": "L"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "嘉兴市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "南湖区",
+						"latter": "N"
+					},
+					{
+						"name": "秀洲区",
+						"latter": "X"
+					},
+					{
+						"name": "嘉善县",
+						"latter": "J"
+					},
+					{
+						"name": "海盐县",
+						"latter": "H"
+					},
+					{
+						"name": "海宁市",
+						"latter": "H"
+					},
+					{
+						"name": "平湖市",
+						"latter": "P"
+					},
+					{
+						"name": "桐乡市",
+						"latter": "T"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "湖州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "吴兴区",
+						"latter": "W"
+					},
+					{
+						"name": "南浔区",
+						"latter": "N"
+					},
+					{
+						"name": "德清县",
+						"latter": "D"
+					},
+					{
+						"name": "长兴县",
+						"latter": "C"
+					},
+					{
+						"name": "安吉县",
+						"latter": "A"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "绍兴市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "越城区",
+						"latter": "Y"
+					},
+					{
+						"name": "绍兴县",
+						"latter": "S"
+					},
+					{
+						"name": "新昌县",
+						"latter": "X"
+					},
+					{
+						"name": "诸暨市",
+						"latter": "Z"
+					},
+					{
+						"name": "上虞市",
+						"latter": "S"
+					},
+					{
+						"name": "嵊州市",
+						"latter": "S"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "金华市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "婺城区",
+						"latter": "W"
+					},
+					{
+						"name": "金东区",
+						"latter": "J"
+					},
+					{
+						"name": "武义县",
+						"latter": "W"
+					},
+					{
+						"name": "浦江县",
+						"latter": "P"
+					},
+					{
+						"name": "磐安县",
+						"latter": "P"
+					},
+					{
+						"name": "兰溪市",
+						"latter": "L"
+					},
+					{
+						"name": "义乌市",
+						"latter": "Y"
+					},
+					{
+						"name": "东阳市",
+						"latter": "D"
+					},
+					{
+						"name": "永康市",
+						"latter": "Y"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "衢州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "柯城区",
+						"latter": "K"
+					},
+					{
+						"name": "衢江区",
+						"latter": "Q"
+					},
+					{
+						"name": "常山县",
+						"latter": "C"
+					},
+					{
+						"name": "开化县",
+						"latter": "K"
+					},
+					{
+						"name": "龙游县",
+						"latter": "L"
+					},
+					{
+						"name": "江山市",
+						"latter": "J"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "舟山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "定海区",
+						"latter": "D"
+					},
+					{
+						"name": "普陀区",
+						"latter": "P"
+					},
+					{
+						"name": "岱山县",
+						"latter": "D"
+					},
+					{
+						"name": "嵊泗县",
+						"latter": "S"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "台州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "椒江区",
+						"latter": "J"
+					},
+					{
+						"name": "黄岩区",
+						"latter": "H"
+					},
+					{
+						"name": "路桥区",
+						"latter": "L"
+					},
+					{
+						"name": "玉环县",
+						"latter": "Y"
+					},
+					{
+						"name": "三门县",
+						"latter": "S"
+					},
+					{
+						"name": "天台县",
+						"latter": "T"
+					},
+					{
+						"name": "仙居县",
+						"latter": "X"
+					},
+					{
+						"name": "温岭市",
+						"latter": "W"
+					},
+					{
+						"name": "临海市",
+						"latter": "L"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "丽水市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "莲都区",
+						"latter": "L"
+					},
+					{
+						"name": "青田县",
+						"latter": "Q"
+					},
+					{
+						"name": "缙云县",
+						"latter": "J"
+					},
+					{
+						"name": "遂昌县",
+						"latter": "S"
+					},
+					{
+						"name": "松阳县",
+						"latter": "S"
+					},
+					{
+						"name": "云和县",
+						"latter": "Y"
+					},
+					{
+						"name": "庆元县",
+						"latter": "Q"
+					},
+					{
+						"name": "景宁畲族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "龙泉市",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			}
+		],
+		"latter": "Z"
+	},
+	{
+		"name": "安徽省",
+		"children": [{
+				"name": "合肥市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "瑶海区",
+						"latter": "Y"
+					},
+					{
+						"name": "庐阳区",
+						"latter": "L"
+					},
+					{
+						"name": "蜀山区",
+						"latter": "S"
+					},
+					{
+						"name": "包河区",
+						"latter": "B"
+					},
+					{
+						"name": "长丰县",
+						"latter": "C"
+					},
+					{
+						"name": "肥东县",
+						"latter": "F"
+					},
+					{
+						"name": "肥西县",
+						"latter": "F"
+					},
+					{
+						"name": "庐江县",
+						"latter": "L"
+					},
+					{
+						"name": "巢湖市",
+						"latter": "C"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "芜湖市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "镜湖区",
+						"latter": "J"
+					},
+					{
+						"name": "弋江区",
+						"latter": "Y"
+					},
+					{
+						"name": "鸠江区",
+						"latter": "J"
+					},
+					{
+						"name": "三山区",
+						"latter": "S"
+					},
+					{
+						"name": "芜湖县",
+						"latter": "W"
+					},
+					{
+						"name": "繁昌县",
+						"latter": "F"
+					},
+					{
+						"name": "南陵县",
+						"latter": "N"
+					},
+					{
+						"name": "无为县",
+						"latter": "W"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "蚌埠市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "龙子湖区",
+						"latter": "L"
+					},
+					{
+						"name": "蚌山区",
+						"latter": "B"
+					},
+					{
+						"name": "禹会区",
+						"latter": "Y"
+					},
+					{
+						"name": "淮上区",
+						"latter": "H"
+					},
+					{
+						"name": "怀远县",
+						"latter": "H"
+					},
+					{
+						"name": "五河县",
+						"latter": "W"
+					},
+					{
+						"name": "固镇县",
+						"latter": "G"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "淮南市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "大通区",
+						"latter": "D"
+					},
+					{
+						"name": "田家庵区",
+						"latter": "T"
+					},
+					{
+						"name": "谢家集区",
+						"latter": "X"
+					},
+					{
+						"name": "八公山区",
+						"latter": "B"
+					},
+					{
+						"name": "潘集区",
+						"latter": "P"
+					},
+					{
+						"name": "凤台县",
+						"latter": "F"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "马鞍山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "花山区",
+						"latter": "H"
+					},
+					{
+						"name": "雨山区",
+						"latter": "Y"
+					},
+					{
+						"name": "博望区",
+						"latter": "B"
+					},
+					{
+						"name": "当涂县",
+						"latter": "D"
+					},
+					{
+						"name": "含山县",
+						"latter": "H"
+					},
+					{
+						"name": "和县",
+						"latter": "H"
+					}
+				],
+				"latter": "M"
+			},
+			{
+				"name": "淮北市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "杜集区",
+						"latter": "D"
+					},
+					{
+						"name": "相山区",
+						"latter": "X"
+					},
+					{
+						"name": "烈山区",
+						"latter": "L"
+					},
+					{
+						"name": "濉溪县",
+						"latter": "S"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "铜陵市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "铜官山区",
+						"latter": "T"
+					},
+					{
+						"name": "狮子山区",
+						"latter": "S"
+					},
+					{
+						"name": "郊区",
+						"latter": "J"
+					},
+					{
+						"name": "铜陵县",
+						"latter": "T"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "安庆市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "迎江区",
+						"latter": "Y"
+					},
+					{
+						"name": "大观区",
+						"latter": "D"
+					},
+					{
+						"name": "宜秀区",
+						"latter": "Y"
+					},
+					{
+						"name": "怀宁县",
+						"latter": "H"
+					},
+					{
+						"name": "枞阳县",
+						"latter": "C"
+					},
+					{
+						"name": "潜山县",
+						"latter": "Q"
+					},
+					{
+						"name": "太湖县",
+						"latter": "T"
+					},
+					{
+						"name": "宿松县",
+						"latter": "S"
+					},
+					{
+						"name": "望江县",
+						"latter": "W"
+					},
+					{
+						"name": "岳西县",
+						"latter": "Y"
+					},
+					{
+						"name": "桐城市",
+						"latter": "T"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "黄山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "屯溪区",
+						"latter": "T"
+					},
+					{
+						"name": "黄山区",
+						"latter": "H"
+					},
+					{
+						"name": "徽州区",
+						"latter": "H"
+					},
+					{
+						"name": "歙县",
+						"latter": "X"
+					},
+					{
+						"name": "休宁县",
+						"latter": "X"
+					},
+					{
+						"name": "黟县",
+						"latter": "Y"
+					},
+					{
+						"name": "祁门县",
+						"latter": "Q"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "滁州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "琅琊区",
+						"latter": "L"
+					},
+					{
+						"name": "南谯区",
+						"latter": "N"
+					},
+					{
+						"name": "来安县",
+						"latter": "L"
+					},
+					{
+						"name": "全椒县",
+						"latter": "Q"
+					},
+					{
+						"name": "定远县",
+						"latter": "D"
+					},
+					{
+						"name": "凤阳县",
+						"latter": "F"
+					},
+					{
+						"name": "天长市",
+						"latter": "T"
+					},
+					{
+						"name": "明光市",
+						"latter": "M"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "阜阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "颍州区",
+						"latter": "Y"
+					},
+					{
+						"name": "颍东区",
+						"latter": "Y"
+					},
+					{
+						"name": "颍泉区",
+						"latter": "Y"
+					},
+					{
+						"name": "临泉县",
+						"latter": "L"
+					},
+					{
+						"name": "太和县",
+						"latter": "T"
+					},
+					{
+						"name": "阜南县",
+						"latter": "F"
+					},
+					{
+						"name": "颍上县",
+						"latter": "Y"
+					},
+					{
+						"name": "界首市",
+						"latter": "J"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "宿州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "埇桥区",
+						"latter": "Y"
+					},
+					{
+						"name": "砀山县",
+						"latter": "D"
+					},
+					{
+						"name": "萧县",
+						"latter": "X"
+					},
+					{
+						"name": "灵璧县",
+						"latter": "L"
+					},
+					{
+						"name": "泗县",
+						"latter": "S"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "六安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "金安区",
+						"latter": "J"
+					},
+					{
+						"name": "裕安区",
+						"latter": "Y"
+					},
+					{
+						"name": "寿县",
+						"latter": "S"
+					},
+					{
+						"name": "霍邱县",
+						"latter": "H"
+					},
+					{
+						"name": "舒城县",
+						"latter": "S"
+					},
+					{
+						"name": "金寨县",
+						"latter": "J"
+					},
+					{
+						"name": "霍山县",
+						"latter": "H"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "亳州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "谯城区",
+						"latter": "Q"
+					},
+					{
+						"name": "涡阳县",
+						"latter": "W"
+					},
+					{
+						"name": "蒙城县",
+						"latter": "M"
+					},
+					{
+						"name": "利辛县",
+						"latter": "L"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "池州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "贵池区",
+						"latter": "G"
+					},
+					{
+						"name": "东至县",
+						"latter": "D"
+					},
+					{
+						"name": "石台县",
+						"latter": "S"
+					},
+					{
+						"name": "青阳县",
+						"latter": "Q"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "宣城市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "宣州区",
+						"latter": "X"
+					},
+					{
+						"name": "郎溪县",
+						"latter": "L"
+					},
+					{
+						"name": "广德县",
+						"latter": "G"
+					},
+					{
+						"name": "泾县",
+						"latter": "J"
+					},
+					{
+						"name": "绩溪县",
+						"latter": "J"
+					},
+					{
+						"name": "旌德县",
+						"latter": "J"
+					},
+					{
+						"name": "宁国市",
+						"latter": "N"
+					}
+				],
+				"latter": "X"
+			}
+		],
+		"latter": "A"
+	},
+	{
+		"name": "福建省",
+		"children": [{
+				"name": "福州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鼓楼区",
+						"latter": "G"
+					},
+					{
+						"name": "台江区",
+						"latter": "T"
+					},
+					{
+						"name": "仓山区",
+						"latter": "C"
+					},
+					{
+						"name": "马尾区",
+						"latter": "M"
+					},
+					{
+						"name": "晋安区",
+						"latter": "J"
+					},
+					{
+						"name": "闽侯县",
+						"latter": "M"
+					},
+					{
+						"name": "连江县",
+						"latter": "L"
+					},
+					{
+						"name": "罗源县",
+						"latter": "L"
+					},
+					{
+						"name": "闽清县",
+						"latter": "M"
+					},
+					{
+						"name": "永泰县",
+						"latter": "Y"
+					},
+					{
+						"name": "平潭县",
+						"latter": "P"
+					},
+					{
+						"name": "福清市",
+						"latter": "F"
+					},
+					{
+						"name": "长乐市",
+						"latter": "C"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "厦门市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "思明区",
+						"latter": "S"
+					},
+					{
+						"name": "海沧区",
+						"latter": "H"
+					},
+					{
+						"name": "湖里区",
+						"latter": "H"
+					},
+					{
+						"name": "集美区",
+						"latter": "J"
+					},
+					{
+						"name": "同安区",
+						"latter": "T"
+					},
+					{
+						"name": "翔安区",
+						"latter": "X"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "莆田市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城厢区",
+						"latter": "C"
+					},
+					{
+						"name": "涵江区",
+						"latter": "H"
+					},
+					{
+						"name": "荔城区",
+						"latter": "L"
+					},
+					{
+						"name": "秀屿区",
+						"latter": "X"
+					},
+					{
+						"name": "仙游县",
+						"latter": "X"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "三明市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "梅列区",
+						"latter": "M"
+					},
+					{
+						"name": "三元区",
+						"latter": "S"
+					},
+					{
+						"name": "明溪县",
+						"latter": "M"
+					},
+					{
+						"name": "清流县",
+						"latter": "Q"
+					},
+					{
+						"name": "宁化县",
+						"latter": "N"
+					},
+					{
+						"name": "大田县",
+						"latter": "D"
+					},
+					{
+						"name": "尤溪县",
+						"latter": "Y"
+					},
+					{
+						"name": "沙县",
+						"latter": "S"
+					},
+					{
+						"name": "将乐县",
+						"latter": "J"
+					},
+					{
+						"name": "泰宁县",
+						"latter": "T"
+					},
+					{
+						"name": "建宁县",
+						"latter": "J"
+					},
+					{
+						"name": "永安市",
+						"latter": "Y"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "泉州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鲤城区",
+						"latter": "L"
+					},
+					{
+						"name": "丰泽区",
+						"latter": "F"
+					},
+					{
+						"name": "洛江区",
+						"latter": "L"
+					},
+					{
+						"name": "泉港区",
+						"latter": "Q"
+					},
+					{
+						"name": "惠安县",
+						"latter": "H"
+					},
+					{
+						"name": "安溪县",
+						"latter": "A"
+					},
+					{
+						"name": "永春县",
+						"latter": "Y"
+					},
+					{
+						"name": "德化县",
+						"latter": "D"
+					},
+					{
+						"name": "金门县",
+						"latter": "J"
+					},
+					{
+						"name": "石狮市",
+						"latter": "S"
+					},
+					{
+						"name": "晋江市",
+						"latter": "J"
+					},
+					{
+						"name": "南安市",
+						"latter": "N"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "漳州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "芗城区",
+						"latter": "X"
+					},
+					{
+						"name": "龙文区",
+						"latter": "L"
+					},
+					{
+						"name": "云霄县",
+						"latter": "Y"
+					},
+					{
+						"name": "漳浦县",
+						"latter": "Z"
+					},
+					{
+						"name": "诏安县",
+						"latter": "Z"
+					},
+					{
+						"name": "长泰县",
+						"latter": "C"
+					},
+					{
+						"name": "东山县",
+						"latter": "D"
+					},
+					{
+						"name": "南靖县",
+						"latter": "N"
+					},
+					{
+						"name": "平和县",
+						"latter": "P"
+					},
+					{
+						"name": "华安县",
+						"latter": "H"
+					},
+					{
+						"name": "龙海市",
+						"latter": "L"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "南平市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "延平区",
+						"latter": "Y"
+					},
+					{
+						"name": "顺昌县",
+						"latter": "S"
+					},
+					{
+						"name": "浦城县",
+						"latter": "P"
+					},
+					{
+						"name": "光泽县",
+						"latter": "G"
+					},
+					{
+						"name": "松溪县",
+						"latter": "S"
+					},
+					{
+						"name": "政和县",
+						"latter": "Z"
+					},
+					{
+						"name": "邵武市",
+						"latter": "S"
+					},
+					{
+						"name": "武夷山市",
+						"latter": "W"
+					},
+					{
+						"name": "建瓯市",
+						"latter": "J"
+					},
+					{
+						"name": "建阳市",
+						"latter": "J"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "龙岩市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新罗区",
+						"latter": "X"
+					},
+					{
+						"name": "长汀县",
+						"latter": "C"
+					},
+					{
+						"name": "永定县",
+						"latter": "Y"
+					},
+					{
+						"name": "上杭县",
+						"latter": "S"
+					},
+					{
+						"name": "武平县",
+						"latter": "W"
+					},
+					{
+						"name": "连城县",
+						"latter": "L"
+					},
+					{
+						"name": "漳平市",
+						"latter": "Z"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "宁德市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "蕉城区",
+						"latter": "J"
+					},
+					{
+						"name": "霞浦县",
+						"latter": "X"
+					},
+					{
+						"name": "古田县",
+						"latter": "G"
+					},
+					{
+						"name": "屏南县",
+						"latter": "P"
+					},
+					{
+						"name": "寿宁县",
+						"latter": "S"
+					},
+					{
+						"name": "周宁县",
+						"latter": "Z"
+					},
+					{
+						"name": "柘荣县",
+						"latter": "Z"
+					},
+					{
+						"name": "福安市",
+						"latter": "F"
+					},
+					{
+						"name": "福鼎市",
+						"latter": "F"
+					}
+				],
+				"latter": "N"
+			}
+		],
+		"latter": "F"
+	},
+	{
+		"name": "江西省",
+		"children": [{
+				"name": "南昌市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东湖区",
+						"latter": "D"
+					},
+					{
+						"name": "西湖区",
+						"latter": "X"
+					},
+					{
+						"name": "青云谱区",
+						"latter": "Q"
+					},
+					{
+						"name": "湾里区",
+						"latter": "W"
+					},
+					{
+						"name": "青山湖区",
+						"latter": "Q"
+					},
+					{
+						"name": "南昌县",
+						"latter": "N"
+					},
+					{
+						"name": "新建县",
+						"latter": "X"
+					},
+					{
+						"name": "安义县",
+						"latter": "A"
+					},
+					{
+						"name": "进贤县",
+						"latter": "J"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "景德镇市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "昌江区",
+						"latter": "C"
+					},
+					{
+						"name": "珠山区",
+						"latter": "Z"
+					},
+					{
+						"name": "浮梁县",
+						"latter": "F"
+					},
+					{
+						"name": "乐平市",
+						"latter": "L"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "萍乡市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "安源区",
+						"latter": "A"
+					},
+					{
+						"name": "湘东区",
+						"latter": "X"
+					},
+					{
+						"name": "莲花县",
+						"latter": "L"
+					},
+					{
+						"name": "上栗县",
+						"latter": "S"
+					},
+					{
+						"name": "芦溪县",
+						"latter": "L"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "九江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "庐山区",
+						"latter": "L"
+					},
+					{
+						"name": "浔阳区",
+						"latter": "X"
+					},
+					{
+						"name": "九江县",
+						"latter": "J"
+					},
+					{
+						"name": "武宁县",
+						"latter": "W"
+					},
+					{
+						"name": "修水县",
+						"latter": "X"
+					},
+					{
+						"name": "永修县",
+						"latter": "Y"
+					},
+					{
+						"name": "德安县",
+						"latter": "D"
+					},
+					{
+						"name": "星子县",
+						"latter": "X"
+					},
+					{
+						"name": "都昌县",
+						"latter": "D"
+					},
+					{
+						"name": "湖口县",
+						"latter": "H"
+					},
+					{
+						"name": "彭泽县",
+						"latter": "P"
+					},
+					{
+						"name": "瑞昌市",
+						"latter": "R"
+					},
+					{
+						"name": "共青城市",
+						"latter": "G"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "新余市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "渝水区",
+						"latter": "Y"
+					},
+					{
+						"name": "分宜县",
+						"latter": "F"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "鹰潭市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "月湖区",
+						"latter": "Y"
+					},
+					{
+						"name": "余江县",
+						"latter": "Y"
+					},
+					{
+						"name": "贵溪市",
+						"latter": "G"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "赣州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "章贡区",
+						"latter": "Z"
+					},
+					{
+						"name": "赣县",
+						"latter": "G"
+					},
+					{
+						"name": "信丰县",
+						"latter": "X"
+					},
+					{
+						"name": "大余县",
+						"latter": "D"
+					},
+					{
+						"name": "上犹县",
+						"latter": "S"
+					},
+					{
+						"name": "崇义县",
+						"latter": "C"
+					},
+					{
+						"name": "安远县",
+						"latter": "A"
+					},
+					{
+						"name": "龙南县",
+						"latter": "L"
+					},
+					{
+						"name": "定南县",
+						"latter": "D"
+					},
+					{
+						"name": "全南县",
+						"latter": "Q"
+					},
+					{
+						"name": "宁都县",
+						"latter": "N"
+					},
+					{
+						"name": "于都县",
+						"latter": "Y"
+					},
+					{
+						"name": "兴国县",
+						"latter": "X"
+					},
+					{
+						"name": "会昌县",
+						"latter": "H"
+					},
+					{
+						"name": "寻乌县",
+						"latter": "X"
+					},
+					{
+						"name": "石城县",
+						"latter": "S"
+					},
+					{
+						"name": "瑞金市",
+						"latter": "R"
+					},
+					{
+						"name": "南康市",
+						"latter": "N"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "吉安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "吉州区",
+						"latter": "J"
+					},
+					{
+						"name": "青原区",
+						"latter": "Q"
+					},
+					{
+						"name": "吉安县",
+						"latter": "J"
+					},
+					{
+						"name": "吉水县",
+						"latter": "J"
+					},
+					{
+						"name": "峡江县",
+						"latter": "X"
+					},
+					{
+						"name": "新干县",
+						"latter": "X"
+					},
+					{
+						"name": "永丰县",
+						"latter": "Y"
+					},
+					{
+						"name": "泰和县",
+						"latter": "T"
+					},
+					{
+						"name": "遂川县",
+						"latter": "S"
+					},
+					{
+						"name": "万安县",
+						"latter": "W"
+					},
+					{
+						"name": "安福县",
+						"latter": "A"
+					},
+					{
+						"name": "永新县",
+						"latter": "Y"
+					},
+					{
+						"name": "井冈山市",
+						"latter": "J"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "宜春市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "袁州区",
+						"latter": "Y"
+					},
+					{
+						"name": "奉新县",
+						"latter": "F"
+					},
+					{
+						"name": "万载县",
+						"latter": "W"
+					},
+					{
+						"name": "上高县",
+						"latter": "S"
+					},
+					{
+						"name": "宜丰县",
+						"latter": "Y"
+					},
+					{
+						"name": "靖安县",
+						"latter": "J"
+					},
+					{
+						"name": "铜鼓县",
+						"latter": "T"
+					},
+					{
+						"name": "丰城市",
+						"latter": "F"
+					},
+					{
+						"name": "樟树市",
+						"latter": "Z"
+					},
+					{
+						"name": "高安市",
+						"latter": "G"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "抚州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "临川区",
+						"latter": "L"
+					},
+					{
+						"name": "南城县",
+						"latter": "N"
+					},
+					{
+						"name": "黎川县",
+						"latter": "L"
+					},
+					{
+						"name": "南丰县",
+						"latter": "N"
+					},
+					{
+						"name": "崇仁县",
+						"latter": "C"
+					},
+					{
+						"name": "乐安县",
+						"latter": "L"
+					},
+					{
+						"name": "宜黄县",
+						"latter": "Y"
+					},
+					{
+						"name": "金溪县",
+						"latter": "J"
+					},
+					{
+						"name": "资溪县",
+						"latter": "Z"
+					},
+					{
+						"name": "东乡县",
+						"latter": "D"
+					},
+					{
+						"name": "广昌县",
+						"latter": "G"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "上饶市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "信州区",
+						"latter": "X"
+					},
+					{
+						"name": "上饶县",
+						"latter": "S"
+					},
+					{
+						"name": "广丰县",
+						"latter": "G"
+					},
+					{
+						"name": "玉山县",
+						"latter": "Y"
+					},
+					{
+						"name": "铅山县",
+						"latter": "Q"
+					},
+					{
+						"name": "横峰县",
+						"latter": "H"
+					},
+					{
+						"name": "弋阳县",
+						"latter": "Y"
+					},
+					{
+						"name": "余干县",
+						"latter": "Y"
+					},
+					{
+						"name": "鄱阳县",
+						"latter": "P"
+					},
+					{
+						"name": "万年县",
+						"latter": "W"
+					},
+					{
+						"name": "婺源县",
+						"latter": "W"
+					},
+					{
+						"name": "德兴市",
+						"latter": "D"
+					}
+				],
+				"latter": "S"
+			}
+		],
+		"latter": "J"
+	},
+	{
+		"name": "山东省",
+		"children": [{
+				"name": "济南市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "历下区",
+						"latter": "L"
+					},
+					{
+						"name": "市中区",
+						"latter": "S"
+					},
+					{
+						"name": "槐荫区",
+						"latter": "H"
+					},
+					{
+						"name": "天桥区",
+						"latter": "T"
+					},
+					{
+						"name": "历城区",
+						"latter": "L"
+					},
+					{
+						"name": "长清区",
+						"latter": "C"
+					},
+					{
+						"name": "平阴县",
+						"latter": "P"
+					},
+					{
+						"name": "济阳县",
+						"latter": "J"
+					},
+					{
+						"name": "商河县",
+						"latter": "S"
+					},
+					{
+						"name": "章丘市",
+						"latter": "Z"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "青岛市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "市南区",
+						"latter": "S"
+					},
+					{
+						"name": "市北区",
+						"latter": "S"
+					},
+					{
+						"name": "黄岛区",
+						"latter": "H"
+					},
+					{
+						"name": "崂山区",
+						"latter": "L"
+					},
+					{
+						"name": "李沧区",
+						"latter": "L"
+					},
+					{
+						"name": "城阳区",
+						"latter": "C"
+					},
+					{
+						"name": "胶州市",
+						"latter": "J"
+					},
+					{
+						"name": "即墨市",
+						"latter": "J"
+					},
+					{
+						"name": "平度市",
+						"latter": "P"
+					},
+					{
+						"name": "莱西市",
+						"latter": "L"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "淄博市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "淄川区",
+						"latter": "Z"
+					},
+					{
+						"name": "张店区",
+						"latter": "Z"
+					},
+					{
+						"name": "博山区",
+						"latter": "B"
+					},
+					{
+						"name": "临淄区",
+						"latter": "L"
+					},
+					{
+						"name": "周村区",
+						"latter": "Z"
+					},
+					{
+						"name": "桓台县",
+						"latter": "H"
+					},
+					{
+						"name": "高青县",
+						"latter": "G"
+					},
+					{
+						"name": "沂源县",
+						"latter": "Y"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "枣庄市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "市中区",
+						"latter": "S"
+					},
+					{
+						"name": "薛城区",
+						"latter": "X"
+					},
+					{
+						"name": "峄城区",
+						"latter": "Y"
+					},
+					{
+						"name": "台儿庄区",
+						"latter": "T"
+					},
+					{
+						"name": "山亭区",
+						"latter": "S"
+					},
+					{
+						"name": "滕州市",
+						"latter": "T"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "东营市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东营区",
+						"latter": "D"
+					},
+					{
+						"name": "河口区",
+						"latter": "H"
+					},
+					{
+						"name": "垦利县",
+						"latter": "K"
+					},
+					{
+						"name": "利津县",
+						"latter": "L"
+					},
+					{
+						"name": "广饶县",
+						"latter": "G"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "烟台市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "芝罘区",
+						"latter": "Z"
+					},
+					{
+						"name": "福山区",
+						"latter": "F"
+					},
+					{
+						"name": "牟平区",
+						"latter": "M"
+					},
+					{
+						"name": "莱山区",
+						"latter": "L"
+					},
+					{
+						"name": "长岛县",
+						"latter": "C"
+					},
+					{
+						"name": "龙口市",
+						"latter": "L"
+					},
+					{
+						"name": "莱阳市",
+						"latter": "L"
+					},
+					{
+						"name": "莱州市",
+						"latter": "L"
+					},
+					{
+						"name": "蓬莱市",
+						"latter": "P"
+					},
+					{
+						"name": "招远市",
+						"latter": "Z"
+					},
+					{
+						"name": "栖霞市",
+						"latter": "Q"
+					},
+					{
+						"name": "海阳市",
+						"latter": "H"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "潍坊市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "潍城区",
+						"latter": "W"
+					},
+					{
+						"name": "寒亭区",
+						"latter": "H"
+					},
+					{
+						"name": "坊子区",
+						"latter": "F"
+					},
+					{
+						"name": "奎文区",
+						"latter": "K"
+					},
+					{
+						"name": "临朐县",
+						"latter": "L"
+					},
+					{
+						"name": "昌乐县",
+						"latter": "C"
+					},
+					{
+						"name": "青州市",
+						"latter": "Q"
+					},
+					{
+						"name": "诸城市",
+						"latter": "Z"
+					},
+					{
+						"name": "寿光市",
+						"latter": "S"
+					},
+					{
+						"name": "安丘市",
+						"latter": "A"
+					},
+					{
+						"name": "高密市",
+						"latter": "G"
+					},
+					{
+						"name": "昌邑市",
+						"latter": "C"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "济宁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "市中区",
+						"latter": "S"
+					},
+					{
+						"name": "任城区",
+						"latter": "R"
+					},
+					{
+						"name": "微山县",
+						"latter": "W"
+					},
+					{
+						"name": "鱼台县",
+						"latter": "Y"
+					},
+					{
+						"name": "金乡县",
+						"latter": "J"
+					},
+					{
+						"name": "嘉祥县",
+						"latter": "J"
+					},
+					{
+						"name": "汶上县",
+						"latter": "W"
+					},
+					{
+						"name": "泗水县",
+						"latter": "S"
+					},
+					{
+						"name": "梁山县",
+						"latter": "L"
+					},
+					{
+						"name": "曲阜市",
+						"latter": "Q"
+					},
+					{
+						"name": "兖州市",
+						"latter": "Y"
+					},
+					{
+						"name": "邹城市",
+						"latter": "Z"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "泰安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "泰山区",
+						"latter": "T"
+					},
+					{
+						"name": "岱岳区",
+						"latter": "D"
+					},
+					{
+						"name": "宁阳县",
+						"latter": "N"
+					},
+					{
+						"name": "东平县",
+						"latter": "D"
+					},
+					{
+						"name": "新泰市",
+						"latter": "X"
+					},
+					{
+						"name": "肥城市",
+						"latter": "F"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "威海市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "环翠区",
+						"latter": "H"
+					},
+					{
+						"name": "文登市",
+						"latter": "W"
+					},
+					{
+						"name": "荣成市",
+						"latter": "R"
+					},
+					{
+						"name": "乳山市",
+						"latter": "R"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "日照市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东港区",
+						"latter": "D"
+					},
+					{
+						"name": "岚山区",
+						"latter": "L"
+					},
+					{
+						"name": "五莲县",
+						"latter": "W"
+					},
+					{
+						"name": "莒县",
+						"latter": "J"
+					}
+				],
+				"latter": "R"
+			},
+			{
+				"name": "莱芜市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "莱城区",
+						"latter": "L"
+					},
+					{
+						"name": "钢城区",
+						"latter": "G"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "临沂市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "兰山区",
+						"latter": "L"
+					},
+					{
+						"name": "罗庄区",
+						"latter": "L"
+					},
+					{
+						"name": "河东区",
+						"latter": "H"
+					},
+					{
+						"name": "沂南县",
+						"latter": "Y"
+					},
+					{
+						"name": "郯城县",
+						"latter": "T"
+					},
+					{
+						"name": "沂水县",
+						"latter": "Y"
+					},
+					{
+						"name": "苍山县",
+						"latter": "C"
+					},
+					{
+						"name": "费县",
+						"latter": "F"
+					},
+					{
+						"name": "平邑县",
+						"latter": "P"
+					},
+					{
+						"name": "莒南县",
+						"latter": "J"
+					},
+					{
+						"name": "蒙阴县",
+						"latter": "M"
+					},
+					{
+						"name": "临沭县",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "德州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "德城区",
+						"latter": "D"
+					},
+					{
+						"name": "陵县",
+						"latter": "L"
+					},
+					{
+						"name": "宁津县",
+						"latter": "N"
+					},
+					{
+						"name": "庆云县",
+						"latter": "Q"
+					},
+					{
+						"name": "临邑县",
+						"latter": "L"
+					},
+					{
+						"name": "齐河县",
+						"latter": "Q"
+					},
+					{
+						"name": "平原县",
+						"latter": "P"
+					},
+					{
+						"name": "夏津县",
+						"latter": "X"
+					},
+					{
+						"name": "武城县",
+						"latter": "W"
+					},
+					{
+						"name": "乐陵市",
+						"latter": "L"
+					},
+					{
+						"name": "禹城市",
+						"latter": "Y"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "聊城市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东昌府区",
+						"latter": "D"
+					},
+					{
+						"name": "阳谷县",
+						"latter": "Y"
+					},
+					{
+						"name": "莘县",
+						"latter": "S"
+					},
+					{
+						"name": "茌平县",
+						"latter": "C"
+					},
+					{
+						"name": "东阿县",
+						"latter": "D"
+					},
+					{
+						"name": "冠县",
+						"latter": "G"
+					},
+					{
+						"name": "高唐县",
+						"latter": "G"
+					},
+					{
+						"name": "临清市",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "滨州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "滨城区",
+						"latter": "B"
+					},
+					{
+						"name": "惠民县",
+						"latter": "H"
+					},
+					{
+						"name": "阳信县",
+						"latter": "Y"
+					},
+					{
+						"name": "无棣县",
+						"latter": "W"
+					},
+					{
+						"name": "沾化县",
+						"latter": "Z"
+					},
+					{
+						"name": "博兴县",
+						"latter": "B"
+					},
+					{
+						"name": "邹平县",
+						"latter": "Z"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "菏泽市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "牡丹区",
+						"latter": "M"
+					},
+					{
+						"name": "曹县",
+						"latter": "C"
+					},
+					{
+						"name": "单县",
+						"latter": "D"
+					},
+					{
+						"name": "成武县",
+						"latter": "C"
+					},
+					{
+						"name": "巨野县",
+						"latter": "J"
+					},
+					{
+						"name": "郓城县",
+						"latter": "Y"
+					},
+					{
+						"name": "鄄城县",
+						"latter": "J"
+					},
+					{
+						"name": "定陶县",
+						"latter": "D"
+					},
+					{
+						"name": "东明县",
+						"latter": "D"
+					}
+				],
+				"latter": "H"
+			}
+		],
+		"latter": "S"
+	},
+	{
+		"name": "河南省",
+		"children": [{
+				"name": "郑州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "中原区",
+						"latter": "Z"
+					},
+					{
+						"name": "二七区",
+						"latter": "E"
+					},
+					{
+						"name": "管城回族区",
+						"latter": "G"
+					},
+					{
+						"name": "金水区",
+						"latter": "J"
+					},
+					{
+						"name": "上街区",
+						"latter": "S"
+					},
+					{
+						"name": "惠济区",
+						"latter": "H"
+					},
+					{
+						"name": "中牟县",
+						"latter": "Z"
+					},
+					{
+						"name": "巩义市",
+						"latter": "G"
+					},
+					{
+						"name": "荥阳市",
+						"latter": "X"
+					},
+					{
+						"name": "新密市",
+						"latter": "X"
+					},
+					{
+						"name": "新郑市",
+						"latter": "X"
+					},
+					{
+						"name": "登封市",
+						"latter": "D"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "开封市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "龙亭区",
+						"latter": "L"
+					},
+					{
+						"name": "顺河回族区",
+						"latter": "S"
+					},
+					{
+						"name": "鼓楼区",
+						"latter": "G"
+					},
+					{
+						"name": "禹王台区",
+						"latter": "Y"
+					},
+					{
+						"name": "金明区",
+						"latter": "J"
+					},
+					{
+						"name": "杞县",
+						"latter": "Q"
+					},
+					{
+						"name": "通许县",
+						"latter": "T"
+					},
+					{
+						"name": "尉氏县",
+						"latter": "W"
+					},
+					{
+						"name": "开封县",
+						"latter": "K"
+					},
+					{
+						"name": "兰考县",
+						"latter": "L"
+					}
+				],
+				"latter": "K"
+			},
+			{
+				"name": "洛阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "老城区",
+						"latter": "L"
+					},
+					{
+						"name": "西工区",
+						"latter": "X"
+					},
+					{
+						"name": "瀍河回族区",
+						"latter": "C"
+					},
+					{
+						"name": "涧西区",
+						"latter": "J"
+					},
+					{
+						"name": "吉利区",
+						"latter": "J"
+					},
+					{
+						"name": "洛龙区",
+						"latter": "L"
+					},
+					{
+						"name": "孟津县",
+						"latter": "M"
+					},
+					{
+						"name": "新安县",
+						"latter": "X"
+					},
+					{
+						"name": "栾川县",
+						"latter": "L"
+					},
+					{
+						"name": "嵩县",
+						"latter": "S"
+					},
+					{
+						"name": "汝阳县",
+						"latter": "R"
+					},
+					{
+						"name": "宜阳县",
+						"latter": "Y"
+					},
+					{
+						"name": "洛宁县",
+						"latter": "L"
+					},
+					{
+						"name": "伊川县",
+						"latter": "Y"
+					},
+					{
+						"name": "偃师市",
+						"latter": "Y"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "平顶山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新华区",
+						"latter": "X"
+					},
+					{
+						"name": "卫东区",
+						"latter": "W"
+					},
+					{
+						"name": "石龙区",
+						"latter": "S"
+					},
+					{
+						"name": "湛河区",
+						"latter": "Z"
+					},
+					{
+						"name": "宝丰县",
+						"latter": "B"
+					},
+					{
+						"name": "叶县",
+						"latter": "Y"
+					},
+					{
+						"name": "鲁山县",
+						"latter": "L"
+					},
+					{
+						"name": "郏县",
+						"latter": "J"
+					},
+					{
+						"name": "舞钢市",
+						"latter": "W"
+					},
+					{
+						"name": "汝州市",
+						"latter": "R"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "安阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "文峰区",
+						"latter": "W"
+					},
+					{
+						"name": "北关区",
+						"latter": "B"
+					},
+					{
+						"name": "殷都区",
+						"latter": "Y"
+					},
+					{
+						"name": "龙安区",
+						"latter": "L"
+					},
+					{
+						"name": "安阳县",
+						"latter": "A"
+					},
+					{
+						"name": "汤阴县",
+						"latter": "T"
+					},
+					{
+						"name": "滑县",
+						"latter": "H"
+					},
+					{
+						"name": "内黄县",
+						"latter": "N"
+					},
+					{
+						"name": "林州市",
+						"latter": "L"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "鹤壁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鹤山区",
+						"latter": "H"
+					},
+					{
+						"name": "山城区",
+						"latter": "S"
+					},
+					{
+						"name": "淇滨区",
+						"latter": "Q"
+					},
+					{
+						"name": "浚县",
+						"latter": "J"
+					},
+					{
+						"name": "淇县",
+						"latter": "Q"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "新乡市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "红旗区",
+						"latter": "H"
+					},
+					{
+						"name": "卫滨区",
+						"latter": "W"
+					},
+					{
+						"name": "凤泉区",
+						"latter": "F"
+					},
+					{
+						"name": "牧野区",
+						"latter": "M"
+					},
+					{
+						"name": "新乡县",
+						"latter": "X"
+					},
+					{
+						"name": "获嘉县",
+						"latter": "H"
+					},
+					{
+						"name": "原阳县",
+						"latter": "Y"
+					},
+					{
+						"name": "延津县",
+						"latter": "Y"
+					},
+					{
+						"name": "封丘县",
+						"latter": "F"
+					},
+					{
+						"name": "长垣县",
+						"latter": "C"
+					},
+					{
+						"name": "卫辉市",
+						"latter": "W"
+					},
+					{
+						"name": "辉县市",
+						"latter": "H"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "焦作市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "解放区",
+						"latter": "J"
+					},
+					{
+						"name": "中站区",
+						"latter": "Z"
+					},
+					{
+						"name": "马村区",
+						"latter": "M"
+					},
+					{
+						"name": "山阳区",
+						"latter": "S"
+					},
+					{
+						"name": "修武县",
+						"latter": "X"
+					},
+					{
+						"name": "博爱县",
+						"latter": "B"
+					},
+					{
+						"name": "武陟县",
+						"latter": "W"
+					},
+					{
+						"name": "温县",
+						"latter": "W"
+					},
+					{
+						"name": "沁阳市",
+						"latter": "Q"
+					},
+					{
+						"name": "孟州市",
+						"latter": "M"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "濮阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "华龙区",
+						"latter": "H"
+					},
+					{
+						"name": "清丰县",
+						"latter": "Q"
+					},
+					{
+						"name": "南乐县",
+						"latter": "N"
+					},
+					{
+						"name": "范县",
+						"latter": "F"
+					},
+					{
+						"name": "台前县",
+						"latter": "T"
+					},
+					{
+						"name": "濮阳县",
+						"latter": "P"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "许昌市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "魏都区",
+						"latter": "W"
+					},
+					{
+						"name": "许昌县",
+						"latter": "X"
+					},
+					{
+						"name": "鄢陵县",
+						"latter": "Y"
+					},
+					{
+						"name": "襄城县",
+						"latter": "X"
+					},
+					{
+						"name": "禹州市",
+						"latter": "Y"
+					},
+					{
+						"name": "长葛市",
+						"latter": "C"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "漯河市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "源汇区",
+						"latter": "Y"
+					},
+					{
+						"name": "郾城区",
+						"latter": "Y"
+					},
+					{
+						"name": "召陵区",
+						"latter": "Z"
+					},
+					{
+						"name": "舞阳县",
+						"latter": "W"
+					},
+					{
+						"name": "临颍县",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "三门峡市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "湖滨区",
+						"latter": "H"
+					},
+					{
+						"name": "渑池县",
+						"latter": "M"
+					},
+					{
+						"name": "陕县",
+						"latter": "S"
+					},
+					{
+						"name": "卢氏县",
+						"latter": "L"
+					},
+					{
+						"name": "义马市",
+						"latter": "Y"
+					},
+					{
+						"name": "灵宝市",
+						"latter": "L"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "南阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "宛城区",
+						"latter": "W"
+					},
+					{
+						"name": "卧龙区",
+						"latter": "W"
+					},
+					{
+						"name": "南召县",
+						"latter": "N"
+					},
+					{
+						"name": "方城县",
+						"latter": "F"
+					},
+					{
+						"name": "西峡县",
+						"latter": "X"
+					},
+					{
+						"name": "镇平县",
+						"latter": "Z"
+					},
+					{
+						"name": "内乡县",
+						"latter": "N"
+					},
+					{
+						"name": "淅川县",
+						"latter": "X"
+					},
+					{
+						"name": "社旗县",
+						"latter": "S"
+					},
+					{
+						"name": "唐河县",
+						"latter": "T"
+					},
+					{
+						"name": "新野县",
+						"latter": "X"
+					},
+					{
+						"name": "桐柏县",
+						"latter": "T"
+					},
+					{
+						"name": "邓州市",
+						"latter": "D"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "商丘市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "梁园区",
+						"latter": "L"
+					},
+					{
+						"name": "睢阳区",
+						"latter": "H"
+					},
+					{
+						"name": "民权县",
+						"latter": "M"
+					},
+					{
+						"name": "睢县",
+						"latter": "H"
+					},
+					{
+						"name": "宁陵县",
+						"latter": "N"
+					},
+					{
+						"name": "柘城县",
+						"latter": "Z"
+					},
+					{
+						"name": "虞城县",
+						"latter": "Y"
+					},
+					{
+						"name": "夏邑县",
+						"latter": "X"
+					},
+					{
+						"name": "永城市",
+						"latter": "Y"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "信阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "浉河区",
+						"latter": "S"
+					},
+					{
+						"name": "平桥区",
+						"latter": "P"
+					},
+					{
+						"name": "罗山县",
+						"latter": "L"
+					},
+					{
+						"name": "光山县",
+						"latter": "G"
+					},
+					{
+						"name": "新县",
+						"latter": "X"
+					},
+					{
+						"name": "商城县",
+						"latter": "S"
+					},
+					{
+						"name": "固始县",
+						"latter": "G"
+					},
+					{
+						"name": "潢川县",
+						"latter": "H"
+					},
+					{
+						"name": "淮滨县",
+						"latter": "H"
+					},
+					{
+						"name": "息县",
+						"latter": "X"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "周口市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "川汇区",
+						"latter": "C"
+					},
+					{
+						"name": "扶沟县",
+						"latter": "F"
+					},
+					{
+						"name": "西华县",
+						"latter": "X"
+					},
+					{
+						"name": "商水县",
+						"latter": "S"
+					},
+					{
+						"name": "沈丘县",
+						"latter": "S"
+					},
+					{
+						"name": "郸城县",
+						"latter": "D"
+					},
+					{
+						"name": "淮阳县",
+						"latter": "H"
+					},
+					{
+						"name": "太康县",
+						"latter": "T"
+					},
+					{
+						"name": "鹿邑县",
+						"latter": "L"
+					},
+					{
+						"name": "项城市",
+						"latter": "X"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "驻马店市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "驿城区",
+						"latter": "Y"
+					},
+					{
+						"name": "西平县",
+						"latter": "X"
+					},
+					{
+						"name": "上蔡县",
+						"latter": "S"
+					},
+					{
+						"name": "平舆县",
+						"latter": "P"
+					},
+					{
+						"name": "正阳县",
+						"latter": "Z"
+					},
+					{
+						"name": "确山县",
+						"latter": "Q"
+					},
+					{
+						"name": "泌阳县",
+						"latter": "M"
+					},
+					{
+						"name": "汝南县",
+						"latter": "R"
+					},
+					{
+						"name": "遂平县",
+						"latter": "S"
+					},
+					{
+						"name": "新蔡县",
+						"latter": "X"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "省直辖县级行政区划",
+				"children": [{
+					"name": "济源市",
+					"latter": "J"
+				}],
+				"latter": "S"
+			}
+		],
+		"latter": "H"
+	},
+	{
+		"name": "湖北省",
+		"children": [{
+				"name": "武汉市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "江岸区",
+						"latter": "J"
+					},
+					{
+						"name": "江汉区",
+						"latter": "J"
+					},
+					{
+						"name": "硚口区",
+						"latter": "Q"
+					},
+					{
+						"name": "汉阳区",
+						"latter": "H"
+					},
+					{
+						"name": "武昌区",
+						"latter": "W"
+					},
+					{
+						"name": "青山区",
+						"latter": "Q"
+					},
+					{
+						"name": "洪山区",
+						"latter": "H"
+					},
+					{
+						"name": "东西湖区",
+						"latter": "D"
+					},
+					{
+						"name": "汉南区",
+						"latter": "H"
+					},
+					{
+						"name": "蔡甸区",
+						"latter": "C"
+					},
+					{
+						"name": "江夏区",
+						"latter": "J"
+					},
+					{
+						"name": "黄陂区",
+						"latter": "H"
+					},
+					{
+						"name": "新洲区",
+						"latter": "X"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "黄石市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "黄石港区",
+						"latter": "H"
+					},
+					{
+						"name": "西塞山区",
+						"latter": "X"
+					},
+					{
+						"name": "下陆区",
+						"latter": "X"
+					},
+					{
+						"name": "铁山区",
+						"latter": "T"
+					},
+					{
+						"name": "阳新县",
+						"latter": "Y"
+					},
+					{
+						"name": "大冶市",
+						"latter": "D"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "十堰市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "茅箭区",
+						"latter": "M"
+					},
+					{
+						"name": "张湾区",
+						"latter": "Z"
+					},
+					{
+						"name": "郧县",
+						"latter": "Y"
+					},
+					{
+						"name": "郧西县",
+						"latter": "Y"
+					},
+					{
+						"name": "竹山县",
+						"latter": "Z"
+					},
+					{
+						"name": "竹溪县",
+						"latter": "Z"
+					},
+					{
+						"name": "房县",
+						"latter": "F"
+					},
+					{
+						"name": "丹江口市",
+						"latter": "D"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "宜昌市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "西陵区",
+						"latter": "X"
+					},
+					{
+						"name": "伍家岗区",
+						"latter": "W"
+					},
+					{
+						"name": "点军区",
+						"latter": "D"
+					},
+					{
+						"name": "猇亭区",
+						"latter": "X"
+					},
+					{
+						"name": "夷陵区",
+						"latter": "Y"
+					},
+					{
+						"name": "远安县",
+						"latter": "Y"
+					},
+					{
+						"name": "兴山县",
+						"latter": "X"
+					},
+					{
+						"name": "秭归县",
+						"latter": "Z"
+					},
+					{
+						"name": "长阳土家族自治县",
+						"latter": "C"
+					},
+					{
+						"name": "五峰土家族自治县",
+						"latter": "W"
+					},
+					{
+						"name": "宜都市",
+						"latter": "Y"
+					},
+					{
+						"name": "当阳市",
+						"latter": "D"
+					},
+					{
+						"name": "枝江市",
+						"latter": "Z"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "襄阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "襄城区",
+						"latter": "X"
+					},
+					{
+						"name": "樊城区",
+						"latter": "F"
+					},
+					{
+						"name": "襄州区",
+						"latter": "X"
+					},
+					{
+						"name": "南漳县",
+						"latter": "N"
+					},
+					{
+						"name": "谷城县",
+						"latter": "G"
+					},
+					{
+						"name": "保康县",
+						"latter": "B"
+					},
+					{
+						"name": "老河口市",
+						"latter": "L"
+					},
+					{
+						"name": "枣阳市",
+						"latter": "Z"
+					},
+					{
+						"name": "宜城市",
+						"latter": "Y"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "鄂州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "梁子湖区",
+						"latter": "L"
+					},
+					{
+						"name": "华容区",
+						"latter": "H"
+					},
+					{
+						"name": "鄂城区",
+						"latter": "E"
+					}
+				],
+				"latter": "E"
+			},
+			{
+				"name": "荆门市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东宝区",
+						"latter": "D"
+					},
+					{
+						"name": "掇刀区",
+						"latter": "D"
+					},
+					{
+						"name": "京山县",
+						"latter": "J"
+					},
+					{
+						"name": "沙洋县",
+						"latter": "S"
+					},
+					{
+						"name": "钟祥市",
+						"latter": "Z"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "孝感市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "孝南区",
+						"latter": "X"
+					},
+					{
+						"name": "孝昌县",
+						"latter": "X"
+					},
+					{
+						"name": "大悟县",
+						"latter": "D"
+					},
+					{
+						"name": "云梦县",
+						"latter": "Y"
+					},
+					{
+						"name": "应城市",
+						"latter": "Y"
+					},
+					{
+						"name": "安陆市",
+						"latter": "A"
+					},
+					{
+						"name": "汉川市",
+						"latter": "H"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "荆州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "沙市区",
+						"latter": "S"
+					},
+					{
+						"name": "荆州区",
+						"latter": "J"
+					},
+					{
+						"name": "公安县",
+						"latter": "G"
+					},
+					{
+						"name": "监利县",
+						"latter": "J"
+					},
+					{
+						"name": "江陵县",
+						"latter": "J"
+					},
+					{
+						"name": "石首市",
+						"latter": "S"
+					},
+					{
+						"name": "洪湖市",
+						"latter": "H"
+					},
+					{
+						"name": "松滋市",
+						"latter": "S"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "黄冈市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "黄州区",
+						"latter": "H"
+					},
+					{
+						"name": "团风县",
+						"latter": "T"
+					},
+					{
+						"name": "红安县",
+						"latter": "H"
+					},
+					{
+						"name": "罗田县",
+						"latter": "L"
+					},
+					{
+						"name": "英山县",
+						"latter": "Y"
+					},
+					{
+						"name": "浠水县",
+						"latter": "X"
+					},
+					{
+						"name": "蕲春县",
+						"latter": "Q"
+					},
+					{
+						"name": "黄梅县",
+						"latter": "H"
+					},
+					{
+						"name": "麻城市",
+						"latter": "M"
+					},
+					{
+						"name": "武穴市",
+						"latter": "W"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "咸宁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "咸安区",
+						"latter": "X"
+					},
+					{
+						"name": "嘉鱼县",
+						"latter": "J"
+					},
+					{
+						"name": "通城县",
+						"latter": "T"
+					},
+					{
+						"name": "崇阳县",
+						"latter": "C"
+					},
+					{
+						"name": "通山县",
+						"latter": "T"
+					},
+					{
+						"name": "赤壁市",
+						"latter": "C"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "随州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "曾都区",
+						"latter": "Z"
+					},
+					{
+						"name": "随县",
+						"latter": "S"
+					},
+					{
+						"name": "广水市",
+						"latter": "G"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "恩施土家族苗族自治州",
+				"children": [{
+						"name": "恩施市",
+						"latter": "E"
+					},
+					{
+						"name": "利川市",
+						"latter": "L"
+					},
+					{
+						"name": "建始县",
+						"latter": "J"
+					},
+					{
+						"name": "巴东县",
+						"latter": "B"
+					},
+					{
+						"name": "宣恩县",
+						"latter": "X"
+					},
+					{
+						"name": "咸丰县",
+						"latter": "X"
+					},
+					{
+						"name": "来凤县",
+						"latter": "L"
+					},
+					{
+						"name": "鹤峰县",
+						"latter": "H"
+					}
+				],
+				"latter": "E"
+			},
+			{
+				"name": "省直辖县级行政区划",
+				"children": [{
+						"name": "仙桃市",
+						"latter": "X"
+					},
+					{
+						"name": "潜江市",
+						"latter": "Q"
+					},
+					{
+						"name": "天门市",
+						"latter": "T"
+					},
+					{
+						"name": "神农架林区",
+						"latter": "S"
+					}
+				],
+				"latter": "S"
+			}
+		],
+		"latter": "H"
+	},
+	{
+		"name": "湖南省",
+		"children": [{
+				"name": "长沙市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "芙蓉区",
+						"latter": "F"
+					},
+					{
+						"name": "天心区",
+						"latter": "T"
+					},
+					{
+						"name": "岳麓区",
+						"latter": "Y"
+					},
+					{
+						"name": "开福区",
+						"latter": "K"
+					},
+					{
+						"name": "雨花区",
+						"latter": "Y"
+					},
+					{
+						"name": "望城区",
+						"latter": "W"
+					},
+					{
+						"name": "长沙县",
+						"latter": "C"
+					},
+					{
+						"name": "宁乡县",
+						"latter": "N"
+					},
+					{
+						"name": "浏阳市",
+						"latter": "L"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "株洲市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "荷塘区",
+						"latter": "H"
+					},
+					{
+						"name": "芦淞区",
+						"latter": "L"
+					},
+					{
+						"name": "石峰区",
+						"latter": "S"
+					},
+					{
+						"name": "天元区",
+						"latter": "T"
+					},
+					{
+						"name": "株洲县",
+						"latter": "Z"
+					},
+					{
+						"name": "攸县",
+						"latter": "Y"
+					},
+					{
+						"name": "茶陵县",
+						"latter": "C"
+					},
+					{
+						"name": "炎陵县",
+						"latter": "Y"
+					},
+					{
+						"name": "醴陵市",
+						"latter": "L"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "湘潭市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "雨湖区",
+						"latter": "Y"
+					},
+					{
+						"name": "岳塘区",
+						"latter": "Y"
+					},
+					{
+						"name": "湘潭县",
+						"latter": "X"
+					},
+					{
+						"name": "湘乡市",
+						"latter": "X"
+					},
+					{
+						"name": "韶山市",
+						"latter": "S"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "衡阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "珠晖区",
+						"latter": "Z"
+					},
+					{
+						"name": "雁峰区",
+						"latter": "Y"
+					},
+					{
+						"name": "石鼓区",
+						"latter": "S"
+					},
+					{
+						"name": "蒸湘区",
+						"latter": "Z"
+					},
+					{
+						"name": "南岳区",
+						"latter": "N"
+					},
+					{
+						"name": "衡阳县",
+						"latter": "H"
+					},
+					{
+						"name": "衡南县",
+						"latter": "H"
+					},
+					{
+						"name": "衡山县",
+						"latter": "H"
+					},
+					{
+						"name": "衡东县",
+						"latter": "H"
+					},
+					{
+						"name": "祁东县",
+						"latter": "Q"
+					},
+					{
+						"name": "耒阳市",
+						"latter": "L"
+					},
+					{
+						"name": "常宁市",
+						"latter": "C"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "邵阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "双清区",
+						"latter": "S"
+					},
+					{
+						"name": "大祥区",
+						"latter": "D"
+					},
+					{
+						"name": "北塔区",
+						"latter": "B"
+					},
+					{
+						"name": "邵东县",
+						"latter": "S"
+					},
+					{
+						"name": "新邵县",
+						"latter": "X"
+					},
+					{
+						"name": "邵阳县",
+						"latter": "S"
+					},
+					{
+						"name": "隆回县",
+						"latter": "L"
+					},
+					{
+						"name": "洞口县",
+						"latter": "D"
+					},
+					{
+						"name": "绥宁县",
+						"latter": "S"
+					},
+					{
+						"name": "新宁县",
+						"latter": "X"
+					},
+					{
+						"name": "城步苗族自治县",
+						"latter": "C"
+					},
+					{
+						"name": "武冈市",
+						"latter": "W"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "岳阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "岳阳楼区",
+						"latter": "Y"
+					},
+					{
+						"name": "云溪区",
+						"latter": "Y"
+					},
+					{
+						"name": "君山区",
+						"latter": "J"
+					},
+					{
+						"name": "岳阳县",
+						"latter": "Y"
+					},
+					{
+						"name": "华容县",
+						"latter": "H"
+					},
+					{
+						"name": "湘阴县",
+						"latter": "X"
+					},
+					{
+						"name": "平江县",
+						"latter": "P"
+					},
+					{
+						"name": "汨罗市",
+						"latter": "M"
+					},
+					{
+						"name": "临湘市",
+						"latter": "L"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "常德市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "武陵区",
+						"latter": "W"
+					},
+					{
+						"name": "鼎城区",
+						"latter": "D"
+					},
+					{
+						"name": "安乡县",
+						"latter": "A"
+					},
+					{
+						"name": "汉寿县",
+						"latter": "H"
+					},
+					{
+						"name": "澧县",
+						"latter": "L"
+					},
+					{
+						"name": "临澧县",
+						"latter": "L"
+					},
+					{
+						"name": "桃源县",
+						"latter": "T"
+					},
+					{
+						"name": "石门县",
+						"latter": "S"
+					},
+					{
+						"name": "津市市",
+						"latter": "J"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "张家界市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "永定区",
+						"latter": "Y"
+					},
+					{
+						"name": "武陵源区",
+						"latter": "W"
+					},
+					{
+						"name": "慈利县",
+						"latter": "C"
+					},
+					{
+						"name": "桑植县",
+						"latter": "S"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "益阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "资阳区",
+						"latter": "Z"
+					},
+					{
+						"name": "赫山区",
+						"latter": "H"
+					},
+					{
+						"name": "南县",
+						"latter": "N"
+					},
+					{
+						"name": "桃江县",
+						"latter": "T"
+					},
+					{
+						"name": "安化县",
+						"latter": "A"
+					},
+					{
+						"name": "沅江市",
+						"latter": "Y"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "郴州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "北湖区",
+						"latter": "B"
+					},
+					{
+						"name": "苏仙区",
+						"latter": "S"
+					},
+					{
+						"name": "桂阳县",
+						"latter": "G"
+					},
+					{
+						"name": "宜章县",
+						"latter": "Y"
+					},
+					{
+						"name": "永兴县",
+						"latter": "Y"
+					},
+					{
+						"name": "嘉禾县",
+						"latter": "J"
+					},
+					{
+						"name": "临武县",
+						"latter": "L"
+					},
+					{
+						"name": "汝城县",
+						"latter": "R"
+					},
+					{
+						"name": "桂东县",
+						"latter": "G"
+					},
+					{
+						"name": "安仁县",
+						"latter": "A"
+					},
+					{
+						"name": "资兴市",
+						"latter": "Z"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "永州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "零陵区",
+						"latter": "L"
+					},
+					{
+						"name": "冷水滩区",
+						"latter": "L"
+					},
+					{
+						"name": "祁阳县",
+						"latter": "Q"
+					},
+					{
+						"name": "东安县",
+						"latter": "D"
+					},
+					{
+						"name": "双牌县",
+						"latter": "S"
+					},
+					{
+						"name": "道县",
+						"latter": "D"
+					},
+					{
+						"name": "江永县",
+						"latter": "J"
+					},
+					{
+						"name": "宁远县",
+						"latter": "N"
+					},
+					{
+						"name": "蓝山县",
+						"latter": "L"
+					},
+					{
+						"name": "新田县",
+						"latter": "X"
+					},
+					{
+						"name": "江华瑶族自治县",
+						"latter": "J"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "怀化市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "鹤城区",
+						"latter": "H"
+					},
+					{
+						"name": "中方县",
+						"latter": "Z"
+					},
+					{
+						"name": "沅陵县",
+						"latter": "Y"
+					},
+					{
+						"name": "辰溪县",
+						"latter": "C"
+					},
+					{
+						"name": "溆浦县",
+						"latter": "X"
+					},
+					{
+						"name": "会同县",
+						"latter": "H"
+					},
+					{
+						"name": "麻阳苗族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "新晃侗族自治县",
+						"latter": "X"
+					},
+					{
+						"name": "芷江侗族自治县",
+						"latter": "Z"
+					},
+					{
+						"name": "靖州苗族侗族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "通道侗族自治县",
+						"latter": "T"
+					},
+					{
+						"name": "洪江市",
+						"latter": "H"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "娄底市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "娄星区",
+						"latter": "L"
+					},
+					{
+						"name": "双峰县",
+						"latter": "S"
+					},
+					{
+						"name": "新化县",
+						"latter": "X"
+					},
+					{
+						"name": "冷水江市",
+						"latter": "L"
+					},
+					{
+						"name": "涟源市",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "湘西土家族苗族自治州",
+				"children": [{
+						"name": "吉首市",
+						"latter": "J"
+					},
+					{
+						"name": "泸溪县",
+						"latter": "L"
+					},
+					{
+						"name": "凤凰县",
+						"latter": "F"
+					},
+					{
+						"name": "花垣县",
+						"latter": "H"
+					},
+					{
+						"name": "保靖县",
+						"latter": "B"
+					},
+					{
+						"name": "古丈县",
+						"latter": "G"
+					},
+					{
+						"name": "永顺县",
+						"latter": "Y"
+					},
+					{
+						"name": "龙山县",
+						"latter": "L"
+					}
+				],
+				"latter": "X"
+			}
+		],
+		"latter": "H"
+	},
+	{
+		"name": "广东省",
+		"children": [{
+				"name": "广州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "荔湾区",
+						"latter": "L"
+					},
+					{
+						"name": "越秀区",
+						"latter": "Y"
+					},
+					{
+						"name": "海珠区",
+						"latter": "H"
+					},
+					{
+						"name": "天河区",
+						"latter": "T"
+					},
+					{
+						"name": "白云区",
+						"latter": "B"
+					},
+					{
+						"name": "黄埔区",
+						"latter": "H"
+					},
+					{
+						"name": "番禺区",
+						"latter": "F"
+					},
+					{
+						"name": "花都区",
+						"latter": "H"
+					},
+					{
+						"name": "南沙区",
+						"latter": "N"
+					},
+					{
+						"name": "萝岗区",
+						"latter": "L"
+					},
+					{
+						"name": "增城市",
+						"latter": "Z"
+					},
+					{
+						"name": "从化市",
+						"latter": "C"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "韶关市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "武江区",
+						"latter": "W"
+					},
+					{
+						"name": "浈江区",
+						"latter": "Z"
+					},
+					{
+						"name": "曲江区",
+						"latter": "Q"
+					},
+					{
+						"name": "始兴县",
+						"latter": "S"
+					},
+					{
+						"name": "仁化县",
+						"latter": "R"
+					},
+					{
+						"name": "翁源县",
+						"latter": "W"
+					},
+					{
+						"name": "乳源瑶族自治县",
+						"latter": "R"
+					},
+					{
+						"name": "新丰县",
+						"latter": "X"
+					},
+					{
+						"name": "乐昌市",
+						"latter": "L"
+					},
+					{
+						"name": "南雄市",
+						"latter": "N"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "深圳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "罗湖区",
+						"latter": "L"
+					},
+					{
+						"name": "福田区",
+						"latter": "F"
+					},
+					{
+						"name": "南山区",
+						"latter": "N"
+					},
+					{
+						"name": "宝安区",
+						"latter": "B"
+					},
+					{
+						"name": "龙岗区",
+						"latter": "L"
+					},
+					{
+						"name": "盐田区",
+						"latter": "Y"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "珠海市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "香洲区",
+						"latter": "X"
+					},
+					{
+						"name": "斗门区",
+						"latter": "D"
+					},
+					{
+						"name": "金湾区",
+						"latter": "J"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "汕头市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "龙湖区",
+						"latter": "L"
+					},
+					{
+						"name": "金平区",
+						"latter": "J"
+					},
+					{
+						"name": "濠江区",
+						"latter": "H"
+					},
+					{
+						"name": "潮阳区",
+						"latter": "C"
+					},
+					{
+						"name": "潮南区",
+						"latter": "C"
+					},
+					{
+						"name": "澄海区",
+						"latter": "C"
+					},
+					{
+						"name": "南澳县",
+						"latter": "N"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "佛山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "禅城区",
+						"latter": "C"
+					},
+					{
+						"name": "南海区",
+						"latter": "N"
+					},
+					{
+						"name": "顺德区",
+						"latter": "S"
+					},
+					{
+						"name": "三水区",
+						"latter": "S"
+					},
+					{
+						"name": "高明区",
+						"latter": "G"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "江门市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "蓬江区",
+						"latter": "P"
+					},
+					{
+						"name": "江海区",
+						"latter": "J"
+					},
+					{
+						"name": "新会区",
+						"latter": "X"
+					},
+					{
+						"name": "台山市",
+						"latter": "T"
+					},
+					{
+						"name": "开平市",
+						"latter": "K"
+					},
+					{
+						"name": "鹤山市",
+						"latter": "H"
+					},
+					{
+						"name": "恩平市",
+						"latter": "E"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "湛江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "赤坎区",
+						"latter": "C"
+					},
+					{
+						"name": "霞山区",
+						"latter": "X"
+					},
+					{
+						"name": "坡头区",
+						"latter": "P"
+					},
+					{
+						"name": "麻章区",
+						"latter": "M"
+					},
+					{
+						"name": "遂溪县",
+						"latter": "S"
+					},
+					{
+						"name": "徐闻县",
+						"latter": "X"
+					},
+					{
+						"name": "廉江市",
+						"latter": "L"
+					},
+					{
+						"name": "雷州市",
+						"latter": "L"
+					},
+					{
+						"name": "吴川市",
+						"latter": "W"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "茂名市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "茂南区",
+						"latter": "M"
+					},
+					{
+						"name": "茂港区",
+						"latter": "M"
+					},
+					{
+						"name": "电白县",
+						"latter": "D"
+					},
+					{
+						"name": "高州市",
+						"latter": "G"
+					},
+					{
+						"name": "化州市",
+						"latter": "H"
+					},
+					{
+						"name": "信宜市",
+						"latter": "X"
+					}
+				],
+				"latter": "M"
+			},
+			{
+				"name": "肇庆市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "端州区",
+						"latter": "D"
+					},
+					{
+						"name": "鼎湖区",
+						"latter": "D"
+					},
+					{
+						"name": "广宁县",
+						"latter": "G"
+					},
+					{
+						"name": "怀集县",
+						"latter": "H"
+					},
+					{
+						"name": "封开县",
+						"latter": "F"
+					},
+					{
+						"name": "德庆县",
+						"latter": "D"
+					},
+					{
+						"name": "高要市",
+						"latter": "G"
+					},
+					{
+						"name": "四会市",
+						"latter": "S"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "惠州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "惠城区",
+						"latter": "H"
+					},
+					{
+						"name": "惠阳区",
+						"latter": "H"
+					},
+					{
+						"name": "博罗县",
+						"latter": "B"
+					},
+					{
+						"name": "惠东县",
+						"latter": "H"
+					},
+					{
+						"name": "龙门县",
+						"latter": "L"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "梅州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "梅江区",
+						"latter": "M"
+					},
+					{
+						"name": "梅县",
+						"latter": "M"
+					},
+					{
+						"name": "大埔县",
+						"latter": "D"
+					},
+					{
+						"name": "丰顺县",
+						"latter": "F"
+					},
+					{
+						"name": "五华县",
+						"latter": "W"
+					},
+					{
+						"name": "平远县",
+						"latter": "P"
+					},
+					{
+						"name": "蕉岭县",
+						"latter": "J"
+					},
+					{
+						"name": "兴宁市",
+						"latter": "X"
+					}
+				],
+				"latter": "M"
+			},
+			{
+				"name": "汕尾市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城区",
+						"latter": "C"
+					},
+					{
+						"name": "海丰县",
+						"latter": "H"
+					},
+					{
+						"name": "陆河县",
+						"latter": "L"
+					},
+					{
+						"name": "陆丰市",
+						"latter": "L"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "河源市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "源城区",
+						"latter": "Y"
+					},
+					{
+						"name": "紫金县",
+						"latter": "Z"
+					},
+					{
+						"name": "龙川县",
+						"latter": "L"
+					},
+					{
+						"name": "连平县",
+						"latter": "L"
+					},
+					{
+						"name": "和平县",
+						"latter": "H"
+					},
+					{
+						"name": "东源县",
+						"latter": "D"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "阳江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "江城区",
+						"latter": "J"
+					},
+					{
+						"name": "阳西县",
+						"latter": "Y"
+					},
+					{
+						"name": "阳东县",
+						"latter": "Y"
+					},
+					{
+						"name": "阳春市",
+						"latter": "Y"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "清远市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "清城区",
+						"latter": "Q"
+					},
+					{
+						"name": "清新区",
+						"latter": "Q"
+					},
+					{
+						"name": "佛冈县",
+						"latter": "F"
+					},
+					{
+						"name": "阳山县",
+						"latter": "Y"
+					},
+					{
+						"name": "连山壮族瑶族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "连南瑶族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "英德市",
+						"latter": "Y"
+					},
+					{
+						"name": "连州市",
+						"latter": "L"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "东莞市",
+				"latter": "D"
+			},
+			{
+				"name": "中山市",
+				"latter": "Z"
+			},
+			{
+				"name": "潮州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "湘桥区",
+						"latter": "X"
+					},
+					{
+						"name": "潮安区",
+						"latter": "C"
+					},
+					{
+						"name": "饶平县",
+						"latter": "R"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "揭阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "榕城区",
+						"latter": "R"
+					},
+					{
+						"name": "揭东区",
+						"latter": "J"
+					},
+					{
+						"name": "揭西县",
+						"latter": "J"
+					},
+					{
+						"name": "惠来县",
+						"latter": "H"
+					},
+					{
+						"name": "普宁市",
+						"latter": "P"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "云浮市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "云城区",
+						"latter": "Y"
+					},
+					{
+						"name": "新兴县",
+						"latter": "X"
+					},
+					{
+						"name": "郁南县",
+						"latter": "Y"
+					},
+					{
+						"name": "云安县",
+						"latter": "Y"
+					},
+					{
+						"name": "罗定市",
+						"latter": "L"
+					}
+				],
+				"latter": "Y"
+			}
+		],
+		"latter": "G"
+	},
+	{
+		"name": "广西壮族自治区",
+		"children": [{
+				"name": "南宁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "兴宁区",
+						"latter": "X"
+					},
+					{
+						"name": "青秀区",
+						"latter": "Q"
+					},
+					{
+						"name": "江南区",
+						"latter": "J"
+					},
+					{
+						"name": "西乡塘区",
+						"latter": "X"
+					},
+					{
+						"name": "良庆区",
+						"latter": "L"
+					},
+					{
+						"name": "邕宁区",
+						"latter": "Y"
+					},
+					{
+						"name": "武鸣县",
+						"latter": "W"
+					},
+					{
+						"name": "隆安县",
+						"latter": "L"
+					},
+					{
+						"name": "马山县",
+						"latter": "M"
+					},
+					{
+						"name": "上林县",
+						"latter": "S"
+					},
+					{
+						"name": "宾阳县",
+						"latter": "B"
+					},
+					{
+						"name": "横县",
+						"latter": "H"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "柳州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城中区",
+						"latter": "C"
+					},
+					{
+						"name": "鱼峰区",
+						"latter": "Y"
+					},
+					{
+						"name": "柳南区",
+						"latter": "L"
+					},
+					{
+						"name": "柳北区",
+						"latter": "L"
+					},
+					{
+						"name": "柳江县",
+						"latter": "L"
+					},
+					{
+						"name": "柳城县",
+						"latter": "L"
+					},
+					{
+						"name": "鹿寨县",
+						"latter": "L"
+					},
+					{
+						"name": "融安县",
+						"latter": "R"
+					},
+					{
+						"name": "融水苗族自治县",
+						"latter": "R"
+					},
+					{
+						"name": "三江侗族自治县",
+						"latter": "S"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "桂林市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "秀峰区",
+						"latter": "X"
+					},
+					{
+						"name": "叠彩区",
+						"latter": "D"
+					},
+					{
+						"name": "象山区",
+						"latter": "X"
+					},
+					{
+						"name": "七星区",
+						"latter": "Q"
+					},
+					{
+						"name": "雁山区",
+						"latter": "Y"
+					},
+					{
+						"name": "临桂区",
+						"latter": "L"
+					},
+					{
+						"name": "阳朔县",
+						"latter": "Y"
+					},
+					{
+						"name": "灵川县",
+						"latter": "L"
+					},
+					{
+						"name": "全州县",
+						"latter": "Q"
+					},
+					{
+						"name": "兴安县",
+						"latter": "X"
+					},
+					{
+						"name": "永福县",
+						"latter": "Y"
+					},
+					{
+						"name": "灌阳县",
+						"latter": "G"
+					},
+					{
+						"name": "龙胜各族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "资源县",
+						"latter": "Z"
+					},
+					{
+						"name": "平乐县",
+						"latter": "P"
+					},
+					{
+						"name": "荔浦县",
+						"latter": "L"
+					},
+					{
+						"name": "恭城瑶族自治县",
+						"latter": "G"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "梧州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "万秀区",
+						"latter": "W"
+					},
+					{
+						"name": "长洲区",
+						"latter": "C"
+					},
+					{
+						"name": "龙圩区",
+						"latter": "L"
+					},
+					{
+						"name": "苍梧县",
+						"latter": "C"
+					},
+					{
+						"name": "藤县",
+						"latter": "T"
+					},
+					{
+						"name": "蒙山县",
+						"latter": "M"
+					},
+					{
+						"name": "岑溪市",
+						"latter": "C"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "北海市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "海城区",
+						"latter": "H"
+					},
+					{
+						"name": "银海区",
+						"latter": "Y"
+					},
+					{
+						"name": "铁山港区",
+						"latter": "T"
+					},
+					{
+						"name": "合浦县",
+						"latter": "H"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "防城港市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "港口区",
+						"latter": "G"
+					},
+					{
+						"name": "防城区",
+						"latter": "F"
+					},
+					{
+						"name": "上思县",
+						"latter": "S"
+					},
+					{
+						"name": "东兴市",
+						"latter": "D"
+					}
+				],
+				"latter": "F"
+			},
+			{
+				"name": "钦州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "钦南区",
+						"latter": "Q"
+					},
+					{
+						"name": "钦北区",
+						"latter": "Q"
+					},
+					{
+						"name": "灵山县",
+						"latter": "L"
+					},
+					{
+						"name": "浦北县",
+						"latter": "P"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "贵港市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "港北区",
+						"latter": "G"
+					},
+					{
+						"name": "港南区",
+						"latter": "G"
+					},
+					{
+						"name": "覃塘区",
+						"latter": "T"
+					},
+					{
+						"name": "平南县",
+						"latter": "P"
+					},
+					{
+						"name": "桂平市",
+						"latter": "G"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "玉林市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "玉州区",
+						"latter": "Y"
+					},
+					{
+						"name": "福绵区",
+						"latter": "F"
+					},
+					{
+						"name": "容县",
+						"latter": "R"
+					},
+					{
+						"name": "陆川县",
+						"latter": "L"
+					},
+					{
+						"name": "博白县",
+						"latter": "B"
+					},
+					{
+						"name": "兴业县",
+						"latter": "X"
+					},
+					{
+						"name": "北流市",
+						"latter": "B"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "百色市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "右江区",
+						"latter": "Y"
+					},
+					{
+						"name": "田阳县",
+						"latter": "T"
+					},
+					{
+						"name": "田东县",
+						"latter": "T"
+					},
+					{
+						"name": "平果县",
+						"latter": "P"
+					},
+					{
+						"name": "德保县",
+						"latter": "D"
+					},
+					{
+						"name": "靖西县",
+						"latter": "J"
+					},
+					{
+						"name": "那坡县",
+						"latter": "N"
+					},
+					{
+						"name": "凌云县",
+						"latter": "L"
+					},
+					{
+						"name": "乐业县",
+						"latter": "L"
+					},
+					{
+						"name": "田林县",
+						"latter": "T"
+					},
+					{
+						"name": "西林县",
+						"latter": "X"
+					},
+					{
+						"name": "隆林各族自治县",
+						"latter": "L"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "贺州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "八步区",
+						"latter": "B"
+					},
+					{
+						"name": "昭平县",
+						"latter": "Z"
+					},
+					{
+						"name": "钟山县",
+						"latter": "Z"
+					},
+					{
+						"name": "富川瑶族自治县",
+						"latter": "F"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "河池市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "金城江区",
+						"latter": "J"
+					},
+					{
+						"name": "南丹县",
+						"latter": "N"
+					},
+					{
+						"name": "天峨县",
+						"latter": "T"
+					},
+					{
+						"name": "凤山县",
+						"latter": "F"
+					},
+					{
+						"name": "东兰县",
+						"latter": "D"
+					},
+					{
+						"name": "罗城仫佬族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "环江毛南族自治县",
+						"latter": "H"
+					},
+					{
+						"name": "巴马瑶族自治县",
+						"latter": "B"
+					},
+					{
+						"name": "都安瑶族自治县",
+						"latter": "D"
+					},
+					{
+						"name": "大化瑶族自治县",
+						"latter": "D"
+					},
+					{
+						"name": "宜州市",
+						"latter": "Y"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "来宾市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "兴宾区",
+						"latter": "X"
+					},
+					{
+						"name": "忻城县",
+						"latter": "X"
+					},
+					{
+						"name": "象州县",
+						"latter": "X"
+					},
+					{
+						"name": "武宣县",
+						"latter": "W"
+					},
+					{
+						"name": "金秀瑶族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "合山市",
+						"latter": "H"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "崇左市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "江州区",
+						"latter": "J"
+					},
+					{
+						"name": "扶绥县",
+						"latter": "F"
+					},
+					{
+						"name": "宁明县",
+						"latter": "N"
+					},
+					{
+						"name": "龙州县",
+						"latter": "L"
+					},
+					{
+						"name": "大新县",
+						"latter": "D"
+					},
+					{
+						"name": "天等县",
+						"latter": "T"
+					},
+					{
+						"name": "凭祥市",
+						"latter": "P"
+					}
+				],
+				"latter": "C"
+			}
+		],
+		"latter": "G"
+	},
+	{
+		"name": "海南省",
+		"children": [{
+				"name": "海口市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "秀英区",
+						"latter": "X"
+					},
+					{
+						"name": "龙华区",
+						"latter": "L"
+					},
+					{
+						"name": "琼山区",
+						"latter": "Q"
+					},
+					{
+						"name": "美兰区",
+						"latter": "M"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "三亚市",
+				"children": [{
+					"name": "市辖区",
+					"latter": "S"
+				}],
+				"latter": "S"
+			},
+			{
+				"name": "三沙市",
+				"children": [{
+						"name": "西沙群岛",
+						"latter": "X"
+					},
+					{
+						"name": "南沙群岛",
+						"latter": "N"
+					},
+					{
+						"name": "中沙群岛的岛礁及其海域",
+						"latter": "Z"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "省直辖县级行政区划",
+				"children": [{
+						"name": "五指山市",
+						"latter": "W"
+					},
+					{
+						"name": "琼海市",
+						"latter": "Q"
+					},
+					{
+						"name": "儋州市",
+						"latter": "D"
+					},
+					{
+						"name": "文昌市",
+						"latter": "W"
+					},
+					{
+						"name": "万宁市",
+						"latter": "W"
+					},
+					{
+						"name": "东方市",
+						"latter": "D"
+					},
+					{
+						"name": "定安县",
+						"latter": "D"
+					},
+					{
+						"name": "屯昌县",
+						"latter": "T"
+					},
+					{
+						"name": "澄迈县",
+						"latter": "C"
+					},
+					{
+						"name": "临高县",
+						"latter": "L"
+					},
+					{
+						"name": "白沙黎族自治县",
+						"latter": "B"
+					},
+					{
+						"name": "昌江黎族自治县",
+						"latter": "C"
+					},
+					{
+						"name": "乐东黎族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "陵水黎族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "保亭黎族苗族自治县",
+						"latter": "B"
+					},
+					{
+						"name": "琼中黎族苗族自治县",
+						"latter": "Q"
+					}
+				],
+				"latter": "S"
+			}
+		],
+		"latter": "H"
+	},
+	{
+		"name": "重庆市",
+		"latter": "C",
+		"children":[
+			{
+				"name": "重庆市",
+				"children": [{
+						"name": "万州区",
+						"latter": "W"
+					},
+					{
+						"name": "涪陵区",
+						"latter": "F"
+					},
+					{
+						"name": "渝中区",
+						"latter": "Y"
+					},
+					{
+						"name": "大渡口区",
+						"latter": "D"
+					},
+					{
+						"name": "江北区",
+						"latter": "J"
+					},
+					{
+						"name": "沙坪坝区",
+						"latter": "S"
+					},
+					{
+						"name": "九龙坡区",
+						"latter": "J"
+					},
+					{
+						"name": "南岸区",
+						"latter": "N"
+					},
+					{
+						"name": "北碚区",
+						"latter": "B"
+					},
+					{
+						"name": "綦江区",
+						"latter": "Q"
+					},
+					{
+						"name": "大足区",
+						"latter": "D"
+					},
+					{
+						"name": "渝北区",
+						"latter": "Y"
+					},
+					{
+						"name": "巴南区",
+						"latter": "B"
+					},
+					{
+						"name": "黔江区",
+						"latter": "Q"
+					},
+					{
+						"name": "长寿区",
+						"latter": "C"
+					},
+					{
+						"name": "江津区",
+						"latter": "J"
+					},
+					{
+						"name": "合川区",
+						"latter": "H"
+					},
+					{
+						"name": "永川区",
+						"latter": "Y"
+					},
+					{
+						"name": "南川区",
+						"latter": "N"
+					},
+					{
+						"name": "潼南县",
+						"latter": "T"
+					},
+					{
+						"name": "铜梁县",
+						"latter": "T"
+					},
+					{
+						"name": "荣昌县",
+						"latter": "R"
+					},
+					{
+						"name": "璧山县",
+						"latter": "B"
+					},
+					{
+						"name": "梁平县",
+						"latter": "L"
+					},
+					{
+						"name": "城口县",
+						"latter": "C"
+					},
+					{
+						"name": "丰都县",
+						"latter": "F"
+					},
+					{
+						"name": "垫江县",
+						"latter": "D"
+					},
+					{
+						"name": "武隆县",
+						"latter": "W"
+					},
+					{
+						"name": "忠县",
+						"latter": "Z"
+					},
+					{
+						"name": "开县",
+						"latter": "K"
+					},
+					{
+						"name": "云阳县",
+						"latter": "Y"
+					},
+					{
+						"name": "奉节县",
+						"latter": "F"
+					},
+					{
+						"name": "巫山县",
+						"latter": "W"
+					},
+					{
+						"name": "巫溪县",
+						"latter": "W"
+					},
+					{
+						"name": "石柱土家族自治县",
+						"latter": "S"
+					},
+					{
+						"name": "秀山土家族苗族自治县",
+						"latter": "X"
+					},
+					{
+						"name": "酉阳土家族苗族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "彭水苗族土家族自治县",
+						"latter": "P"
+					}
+				],
+				"latter": "Z"
+			}
+		]
+	},
+	{
+		"name": "四川省",
+		"children": [{
+				"name": "成都市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "锦江区",
+						"latter": "J"
+					},
+					{
+						"name": "青羊区",
+						"latter": "Q"
+					},
+					{
+						"name": "金牛区",
+						"latter": "J"
+					},
+					{
+						"name": "武侯区",
+						"latter": "W"
+					},
+					{
+						"name": "成华区",
+						"latter": "C"
+					},
+					{
+						"name": "龙泉驿区",
+						"latter": "L"
+					},
+					{
+						"name": "青白江区",
+						"latter": "Q"
+					},
+					{
+						"name": "新都区",
+						"latter": "X"
+					},
+					{
+						"name": "温江区",
+						"latter": "W"
+					},
+					{
+						"name": "金堂县",
+						"latter": "J"
+					},
+					{
+						"name": "双流县",
+						"latter": "S"
+					},
+					{
+						"name": "郫县",
+						"latter": "P"
+					},
+					{
+						"name": "大邑县",
+						"latter": "D"
+					},
+					{
+						"name": "蒲江县",
+						"latter": "P"
+					},
+					{
+						"name": "新津县",
+						"latter": "X"
+					},
+					{
+						"name": "都江堰市",
+						"latter": "D"
+					},
+					{
+						"name": "彭州市",
+						"latter": "P"
+					},
+					{
+						"name": "邛崃市",
+						"latter": "Q"
+					},
+					{
+						"name": "崇州市",
+						"latter": "C"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "自贡市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "自流井区",
+						"latter": "Z"
+					},
+					{
+						"name": "贡井区",
+						"latter": "G"
+					},
+					{
+						"name": "大安区",
+						"latter": "D"
+					},
+					{
+						"name": "沿滩区",
+						"latter": "Y"
+					},
+					{
+						"name": "荣县",
+						"latter": "R"
+					},
+					{
+						"name": "富顺县",
+						"latter": "F"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "攀枝花市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东区",
+						"latter": "D"
+					},
+					{
+						"name": "西区",
+						"latter": "X"
+					},
+					{
+						"name": "仁和区",
+						"latter": "R"
+					},
+					{
+						"name": "米易县",
+						"latter": "M"
+					},
+					{
+						"name": "盐边县",
+						"latter": "Y"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "泸州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "江阳区",
+						"latter": "J"
+					},
+					{
+						"name": "纳溪区",
+						"latter": "N"
+					},
+					{
+						"name": "龙马潭区",
+						"latter": "L"
+					},
+					{
+						"name": "泸县",
+						"latter": "L"
+					},
+					{
+						"name": "合江县",
+						"latter": "H"
+					},
+					{
+						"name": "叙永县",
+						"latter": "X"
+					},
+					{
+						"name": "古蔺县",
+						"latter": "G"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "德阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "旌阳区",
+						"latter": "J"
+					},
+					{
+						"name": "中江县",
+						"latter": "Z"
+					},
+					{
+						"name": "罗江县",
+						"latter": "L"
+					},
+					{
+						"name": "广汉市",
+						"latter": "G"
+					},
+					{
+						"name": "什邡市",
+						"latter": "S"
+					},
+					{
+						"name": "绵竹市",
+						"latter": "M"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "绵阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "涪城区",
+						"latter": "F"
+					},
+					{
+						"name": "游仙区",
+						"latter": "Y"
+					},
+					{
+						"name": "三台县",
+						"latter": "S"
+					},
+					{
+						"name": "盐亭县",
+						"latter": "Y"
+					},
+					{
+						"name": "安县",
+						"latter": "A"
+					},
+					{
+						"name": "梓潼县",
+						"latter": "Z"
+					},
+					{
+						"name": "北川羌族自治县",
+						"latter": "B"
+					},
+					{
+						"name": "平武县",
+						"latter": "P"
+					},
+					{
+						"name": "江油市",
+						"latter": "J"
+					}
+				],
+				"latter": "M"
+			},
+			{
+				"name": "广元市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "利州区",
+						"latter": "L"
+					},
+					{
+						"name": "元坝区",
+						"latter": "Y"
+					},
+					{
+						"name": "朝天区",
+						"latter": "Z"
+					},
+					{
+						"name": "旺苍县",
+						"latter": "W"
+					},
+					{
+						"name": "青川县",
+						"latter": "Q"
+					},
+					{
+						"name": "剑阁县",
+						"latter": "J"
+					},
+					{
+						"name": "苍溪县",
+						"latter": "C"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "遂宁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "船山区",
+						"latter": "C"
+					},
+					{
+						"name": "安居区",
+						"latter": "A"
+					},
+					{
+						"name": "蓬溪县",
+						"latter": "P"
+					},
+					{
+						"name": "射洪县",
+						"latter": "S"
+					},
+					{
+						"name": "大英县",
+						"latter": "D"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "内江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "市中区",
+						"latter": "S"
+					},
+					{
+						"name": "东兴区",
+						"latter": "D"
+					},
+					{
+						"name": "威远县",
+						"latter": "W"
+					},
+					{
+						"name": "资中县",
+						"latter": "Z"
+					},
+					{
+						"name": "隆昌县",
+						"latter": "L"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "乐山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "市中区",
+						"latter": "S"
+					},
+					{
+						"name": "沙湾区",
+						"latter": "S"
+					},
+					{
+						"name": "五通桥区",
+						"latter": "W"
+					},
+					{
+						"name": "金口河区",
+						"latter": "J"
+					},
+					{
+						"name": "犍为县",
+						"latter": "J"
+					},
+					{
+						"name": "井研县",
+						"latter": "J"
+					},
+					{
+						"name": "夹江县",
+						"latter": "J"
+					},
+					{
+						"name": "沐川县",
+						"latter": "M"
+					},
+					{
+						"name": "峨边彝族自治县",
+						"latter": "E"
+					},
+					{
+						"name": "马边彝族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "峨眉山市",
+						"latter": "E"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "南充市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "顺庆区",
+						"latter": "S"
+					},
+					{
+						"name": "高坪区",
+						"latter": "G"
+					},
+					{
+						"name": "嘉陵区",
+						"latter": "J"
+					},
+					{
+						"name": "南部县",
+						"latter": "N"
+					},
+					{
+						"name": "营山县",
+						"latter": "Y"
+					},
+					{
+						"name": "蓬安县",
+						"latter": "P"
+					},
+					{
+						"name": "仪陇县",
+						"latter": "Y"
+					},
+					{
+						"name": "西充县",
+						"latter": "X"
+					},
+					{
+						"name": "阆中市",
+						"latter": "L"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "眉山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "东坡区",
+						"latter": "D"
+					},
+					{
+						"name": "仁寿县",
+						"latter": "R"
+					},
+					{
+						"name": "彭山县",
+						"latter": "P"
+					},
+					{
+						"name": "洪雅县",
+						"latter": "H"
+					},
+					{
+						"name": "丹棱县",
+						"latter": "D"
+					},
+					{
+						"name": "青神县",
+						"latter": "Q"
+					}
+				],
+				"latter": "M"
+			},
+			{
+				"name": "宜宾市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "翠屏区",
+						"latter": "C"
+					},
+					{
+						"name": "南溪区",
+						"latter": "N"
+					},
+					{
+						"name": "宜宾县",
+						"latter": "Y"
+					},
+					{
+						"name": "江安县",
+						"latter": "J"
+					},
+					{
+						"name": "长宁县",
+						"latter": "C"
+					},
+					{
+						"name": "高县",
+						"latter": "G"
+					},
+					{
+						"name": "珙县",
+						"latter": "G"
+					},
+					{
+						"name": "筠连县",
+						"latter": "Y"
+					},
+					{
+						"name": "兴文县",
+						"latter": "X"
+					},
+					{
+						"name": "屏山县",
+						"latter": "P"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "广安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "广安区",
+						"latter": "G"
+					},
+					{
+						"name": "前锋区",
+						"latter": "Q"
+					},
+					{
+						"name": "岳池县",
+						"latter": "Y"
+					},
+					{
+						"name": "武胜县",
+						"latter": "W"
+					},
+					{
+						"name": "邻水县",
+						"latter": "L"
+					},
+					{
+						"name": "华蓥市",
+						"latter": "H"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "达州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "通川区",
+						"latter": "T"
+					},
+					{
+						"name": "达川区",
+						"latter": "D"
+					},
+					{
+						"name": "宣汉县",
+						"latter": "X"
+					},
+					{
+						"name": "开江县",
+						"latter": "K"
+					},
+					{
+						"name": "大竹县",
+						"latter": "D"
+					},
+					{
+						"name": "渠县",
+						"latter": "Q"
+					},
+					{
+						"name": "万源市",
+						"latter": "W"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "雅安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "雨城区",
+						"latter": "Y"
+					},
+					{
+						"name": "名山区",
+						"latter": "M"
+					},
+					{
+						"name": "荥经县",
+						"latter": "X"
+					},
+					{
+						"name": "汉源县",
+						"latter": "H"
+					},
+					{
+						"name": "石棉县",
+						"latter": "S"
+					},
+					{
+						"name": "天全县",
+						"latter": "T"
+					},
+					{
+						"name": "芦山县",
+						"latter": "L"
+					},
+					{
+						"name": "宝兴县",
+						"latter": "B"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "巴中市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "巴州区",
+						"latter": "B"
+					},
+					{
+						"name": "恩阳区",
+						"latter": "E"
+					},
+					{
+						"name": "通江县",
+						"latter": "T"
+					},
+					{
+						"name": "南江县",
+						"latter": "N"
+					},
+					{
+						"name": "平昌县",
+						"latter": "P"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "资阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "雁江区",
+						"latter": "Y"
+					},
+					{
+						"name": "安岳县",
+						"latter": "A"
+					},
+					{
+						"name": "乐至县",
+						"latter": "L"
+					},
+					{
+						"name": "简阳市",
+						"latter": "J"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "阿坝藏族羌族自治州",
+				"children": [{
+						"name": "汶川县",
+						"latter": "W"
+					},
+					{
+						"name": "理县",
+						"latter": "L"
+					},
+					{
+						"name": "茂县",
+						"latter": "M"
+					},
+					{
+						"name": "松潘县",
+						"latter": "S"
+					},
+					{
+						"name": "九寨沟县",
+						"latter": "J"
+					},
+					{
+						"name": "金川县",
+						"latter": "J"
+					},
+					{
+						"name": "小金县",
+						"latter": "X"
+					},
+					{
+						"name": "黑水县",
+						"latter": "H"
+					},
+					{
+						"name": "马尔康县",
+						"latter": "M"
+					},
+					{
+						"name": "壤塘县",
+						"latter": "R"
+					},
+					{
+						"name": "阿坝县",
+						"latter": "A"
+					},
+					{
+						"name": "若尔盖县",
+						"latter": "R"
+					},
+					{
+						"name": "红原县",
+						"latter": "H"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "甘孜藏族自治州",
+				"children": [{
+						"name": "康定县",
+						"latter": "K"
+					},
+					{
+						"name": "泸定县",
+						"latter": "L"
+					},
+					{
+						"name": "丹巴县",
+						"latter": "D"
+					},
+					{
+						"name": "九龙县",
+						"latter": "J"
+					},
+					{
+						"name": "雅江县",
+						"latter": "Y"
+					},
+					{
+						"name": "道孚县",
+						"latter": "D"
+					},
+					{
+						"name": "炉霍县",
+						"latter": "L"
+					},
+					{
+						"name": "甘孜县",
+						"latter": "G"
+					},
+					{
+						"name": "新龙县",
+						"latter": "X"
+					},
+					{
+						"name": "德格县",
+						"latter": "D"
+					},
+					{
+						"name": "白玉县",
+						"latter": "B"
+					},
+					{
+						"name": "石渠县",
+						"latter": "S"
+					},
+					{
+						"name": "色达县",
+						"latter": "S"
+					},
+					{
+						"name": "理塘县",
+						"latter": "L"
+					},
+					{
+						"name": "巴塘县",
+						"latter": "B"
+					},
+					{
+						"name": "乡城县",
+						"latter": "X"
+					},
+					{
+						"name": "稻城县",
+						"latter": "D"
+					},
+					{
+						"name": "得荣县",
+						"latter": "D"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "凉山彝族自治州",
+				"children": [{
+						"name": "西昌市",
+						"latter": "X"
+					},
+					{
+						"name": "木里藏族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "盐源县",
+						"latter": "Y"
+					},
+					{
+						"name": "德昌县",
+						"latter": "D"
+					},
+					{
+						"name": "会理县",
+						"latter": "H"
+					},
+					{
+						"name": "会东县",
+						"latter": "H"
+					},
+					{
+						"name": "宁南县",
+						"latter": "N"
+					},
+					{
+						"name": "普格县",
+						"latter": "P"
+					},
+					{
+						"name": "布拖县",
+						"latter": "B"
+					},
+					{
+						"name": "金阳县",
+						"latter": "J"
+					},
+					{
+						"name": "昭觉县",
+						"latter": "Z"
+					},
+					{
+						"name": "喜德县",
+						"latter": "X"
+					},
+					{
+						"name": "冕宁县",
+						"latter": "M"
+					},
+					{
+						"name": "越西县",
+						"latter": "Y"
+					},
+					{
+						"name": "甘洛县",
+						"latter": "G"
+					},
+					{
+						"name": "美姑县",
+						"latter": "M"
+					},
+					{
+						"name": "雷波县",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			}
+		],
+		"latter": "S"
+	},
+	{
+		"name": "贵州省",
+		"children": [{
+				"name": "贵阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "南明区",
+						"latter": "N"
+					},
+					{
+						"name": "云岩区",
+						"latter": "Y"
+					},
+					{
+						"name": "花溪区",
+						"latter": "H"
+					},
+					{
+						"name": "乌当区",
+						"latter": "W"
+					},
+					{
+						"name": "白云区",
+						"latter": "B"
+					},
+					{
+						"name": "观山湖区",
+						"latter": "G"
+					},
+					{
+						"name": "开阳县",
+						"latter": "K"
+					},
+					{
+						"name": "息烽县",
+						"latter": "X"
+					},
+					{
+						"name": "修文县",
+						"latter": "X"
+					},
+					{
+						"name": "清镇市",
+						"latter": "Q"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "六盘水市",
+				"children": [{
+						"name": "钟山区",
+						"latter": "Z"
+					},
+					{
+						"name": "六枝特区",
+						"latter": "L"
+					},
+					{
+						"name": "水城县",
+						"latter": "S"
+					},
+					{
+						"name": "盘县",
+						"latter": "P"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "遵义市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "红花岗区",
+						"latter": "H"
+					},
+					{
+						"name": "汇川区",
+						"latter": "H"
+					},
+					{
+						"name": "遵义县",
+						"latter": "Z"
+					},
+					{
+						"name": "桐梓县",
+						"latter": "T"
+					},
+					{
+						"name": "绥阳县",
+						"latter": "S"
+					},
+					{
+						"name": "正安县",
+						"latter": "Z"
+					},
+					{
+						"name": "道真仡佬族苗族自治县",
+						"latter": "D"
+					},
+					{
+						"name": "务川仡佬族苗族自治县",
+						"latter": "W"
+					},
+					{
+						"name": "凤冈县",
+						"latter": "F"
+					},
+					{
+						"name": "湄潭县",
+						"latter": "M"
+					},
+					{
+						"name": "余庆县",
+						"latter": "Y"
+					},
+					{
+						"name": "习水县",
+						"latter": "X"
+					},
+					{
+						"name": "赤水市",
+						"latter": "C"
+					},
+					{
+						"name": "仁怀市",
+						"latter": "R"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "安顺市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "西秀区",
+						"latter": "X"
+					},
+					{
+						"name": "平坝县",
+						"latter": "P"
+					},
+					{
+						"name": "普定县",
+						"latter": "P"
+					},
+					{
+						"name": "镇宁布依族苗族自治县",
+						"latter": "Z"
+					},
+					{
+						"name": "关岭布依族苗族自治县",
+						"latter": "G"
+					},
+					{
+						"name": "紫云苗族布依族自治县",
+						"latter": "Z"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "毕节市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "七星关区",
+						"latter": "Q"
+					},
+					{
+						"name": "大方县",
+						"latter": "D"
+					},
+					{
+						"name": "黔西县",
+						"latter": "Q"
+					},
+					{
+						"name": "金沙县",
+						"latter": "J"
+					},
+					{
+						"name": "织金县",
+						"latter": "Z"
+					},
+					{
+						"name": "纳雍县",
+						"latter": "N"
+					},
+					{
+						"name": "威宁彝族回族苗族自治县",
+						"latter": "W"
+					},
+					{
+						"name": "赫章县",
+						"latter": "H"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "铜仁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "碧江区",
+						"latter": "B"
+					},
+					{
+						"name": "万山区",
+						"latter": "W"
+					},
+					{
+						"name": "江口县",
+						"latter": "J"
+					},
+					{
+						"name": "玉屏侗族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "石阡县",
+						"latter": "S"
+					},
+					{
+						"name": "思南县",
+						"latter": "S"
+					},
+					{
+						"name": "印江土家族苗族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "德江县",
+						"latter": "D"
+					},
+					{
+						"name": "沿河土家族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "松桃苗族自治县",
+						"latter": "S"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "黔西南布依族苗族自治州",
+				"children": [{
+						"name": "兴义市",
+						"latter": "X"
+					},
+					{
+						"name": "兴仁县",
+						"latter": "X"
+					},
+					{
+						"name": "普安县",
+						"latter": "P"
+					},
+					{
+						"name": "晴隆县",
+						"latter": "Q"
+					},
+					{
+						"name": "贞丰县",
+						"latter": "Z"
+					},
+					{
+						"name": "望谟县",
+						"latter": "W"
+					},
+					{
+						"name": "册亨县",
+						"latter": "C"
+					},
+					{
+						"name": "安龙县",
+						"latter": "A"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "黔东南苗族侗族自治州",
+				"children": [{
+						"name": "凯里市",
+						"latter": "K"
+					},
+					{
+						"name": "黄平县",
+						"latter": "H"
+					},
+					{
+						"name": "施秉县",
+						"latter": "S"
+					},
+					{
+						"name": "三穗县",
+						"latter": "S"
+					},
+					{
+						"name": "镇远县",
+						"latter": "Z"
+					},
+					{
+						"name": "岑巩县",
+						"latter": "C"
+					},
+					{
+						"name": "天柱县",
+						"latter": "T"
+					},
+					{
+						"name": "锦屏县",
+						"latter": "J"
+					},
+					{
+						"name": "剑河县",
+						"latter": "J"
+					},
+					{
+						"name": "台江县",
+						"latter": "T"
+					},
+					{
+						"name": "黎平县",
+						"latter": "L"
+					},
+					{
+						"name": "榕江县",
+						"latter": "R"
+					},
+					{
+						"name": "从江县",
+						"latter": "C"
+					},
+					{
+						"name": "雷山县",
+						"latter": "L"
+					},
+					{
+						"name": "麻江县",
+						"latter": "M"
+					},
+					{
+						"name": "丹寨县",
+						"latter": "D"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "黔南布依族苗族自治州",
+				"children": [{
+						"name": "都匀市",
+						"latter": "D"
+					},
+					{
+						"name": "福泉市",
+						"latter": "F"
+					},
+					{
+						"name": "荔波县",
+						"latter": "L"
+					},
+					{
+						"name": "贵定县",
+						"latter": "G"
+					},
+					{
+						"name": "瓮安县",
+						"latter": "W"
+					},
+					{
+						"name": "独山县",
+						"latter": "D"
+					},
+					{
+						"name": "平塘县",
+						"latter": "P"
+					},
+					{
+						"name": "罗甸县",
+						"latter": "L"
+					},
+					{
+						"name": "长顺县",
+						"latter": "C"
+					},
+					{
+						"name": "龙里县",
+						"latter": "L"
+					},
+					{
+						"name": "惠水县",
+						"latter": "H"
+					},
+					{
+						"name": "三都水族自治县",
+						"latter": "S"
+					}
+				],
+				"latter": "Q"
+			}
+		],
+		"latter": "G"
+	},
+	{
+		"name": "云南省",
+		"children": [{
+				"name": "昆明市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "五华区",
+						"latter": "W"
+					},
+					{
+						"name": "盘龙区",
+						"latter": "P"
+					},
+					{
+						"name": "官渡区",
+						"latter": "G"
+					},
+					{
+						"name": "西山区",
+						"latter": "X"
+					},
+					{
+						"name": "东川区",
+						"latter": "D"
+					},
+					{
+						"name": "呈贡区",
+						"latter": "C"
+					},
+					{
+						"name": "晋宁县",
+						"latter": "J"
+					},
+					{
+						"name": "富民县",
+						"latter": "F"
+					},
+					{
+						"name": "宜良县",
+						"latter": "Y"
+					},
+					{
+						"name": "石林彝族自治县",
+						"latter": "S"
+					},
+					{
+						"name": "嵩明县",
+						"latter": "S"
+					},
+					{
+						"name": "禄劝彝族苗族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "寻甸回族彝族自治县",
+						"latter": "X"
+					},
+					{
+						"name": "安宁市",
+						"latter": "A"
+					}
+				],
+				"latter": "K"
+			},
+			{
+				"name": "曲靖市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "麒麟区",
+						"latter": "Q"
+					},
+					{
+						"name": "马龙县",
+						"latter": "M"
+					},
+					{
+						"name": "陆良县",
+						"latter": "L"
+					},
+					{
+						"name": "师宗县",
+						"latter": "S"
+					},
+					{
+						"name": "罗平县",
+						"latter": "L"
+					},
+					{
+						"name": "富源县",
+						"latter": "F"
+					},
+					{
+						"name": "会泽县",
+						"latter": "H"
+					},
+					{
+						"name": "沾益县",
+						"latter": "Z"
+					},
+					{
+						"name": "宣威市",
+						"latter": "X"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "玉溪市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "红塔区",
+						"latter": "H"
+					},
+					{
+						"name": "江川县",
+						"latter": "J"
+					},
+					{
+						"name": "澄江县",
+						"latter": "C"
+					},
+					{
+						"name": "通海县",
+						"latter": "T"
+					},
+					{
+						"name": "华宁县",
+						"latter": "H"
+					},
+					{
+						"name": "易门县",
+						"latter": "Y"
+					},
+					{
+						"name": "峨山彝族自治县",
+						"latter": "E"
+					},
+					{
+						"name": "新平彝族傣族自治县",
+						"latter": "X"
+					},
+					{
+						"name": "元江哈尼族彝族傣族自治县",
+						"latter": "Y"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "保山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "隆阳区",
+						"latter": "L"
+					},
+					{
+						"name": "施甸县",
+						"latter": "S"
+					},
+					{
+						"name": "腾冲县",
+						"latter": "T"
+					},
+					{
+						"name": "龙陵县",
+						"latter": "L"
+					},
+					{
+						"name": "昌宁县",
+						"latter": "C"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "昭通市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "昭阳区",
+						"latter": "Z"
+					},
+					{
+						"name": "鲁甸县",
+						"latter": "L"
+					},
+					{
+						"name": "巧家县",
+						"latter": "Q"
+					},
+					{
+						"name": "盐津县",
+						"latter": "Y"
+					},
+					{
+						"name": "大关县",
+						"latter": "D"
+					},
+					{
+						"name": "永善县",
+						"latter": "Y"
+					},
+					{
+						"name": "绥江县",
+						"latter": "S"
+					},
+					{
+						"name": "镇雄县",
+						"latter": "Z"
+					},
+					{
+						"name": "彝良县",
+						"latter": "Y"
+					},
+					{
+						"name": "威信县",
+						"latter": "W"
+					},
+					{
+						"name": "水富县",
+						"latter": "S"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "丽江市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "古城区",
+						"latter": "G"
+					},
+					{
+						"name": "玉龙纳西族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "永胜县",
+						"latter": "Y"
+					},
+					{
+						"name": "华坪县",
+						"latter": "H"
+					},
+					{
+						"name": "宁蒗彝族自治县",
+						"latter": "N"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "普洱市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "思茅区",
+						"latter": "S"
+					},
+					{
+						"name": "宁洱哈尼族彝族自治县",
+						"latter": "N"
+					},
+					{
+						"name": "墨江哈尼族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "景东彝族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "景谷傣族彝族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "镇沅彝族哈尼族拉祜族自治县",
+						"latter": "Z"
+					},
+					{
+						"name": "江城哈尼族彝族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "孟连傣族拉祜族佤族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "澜沧拉祜族自治县",
+						"latter": "L"
+					},
+					{
+						"name": "西盟佤族自治县",
+						"latter": "X"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "临沧市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "临翔区",
+						"latter": "L"
+					},
+					{
+						"name": "凤庆县",
+						"latter": "F"
+					},
+					{
+						"name": "云县",
+						"latter": "Y"
+					},
+					{
+						"name": "永德县",
+						"latter": "Y"
+					},
+					{
+						"name": "镇康县",
+						"latter": "Z"
+					},
+					{
+						"name": "双江拉祜族佤族布朗族傣族自治县",
+						"latter": "S"
+					},
+					{
+						"name": "耿马傣族佤族自治县",
+						"latter": "G"
+					},
+					{
+						"name": "沧源佤族自治县",
+						"latter": "C"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "楚雄彝族自治州",
+				"children": [{
+						"name": "楚雄市",
+						"latter": "C"
+					},
+					{
+						"name": "双柏县",
+						"latter": "S"
+					},
+					{
+						"name": "牟定县",
+						"latter": "M"
+					},
+					{
+						"name": "南华县",
+						"latter": "N"
+					},
+					{
+						"name": "姚安县",
+						"latter": "Y"
+					},
+					{
+						"name": "大姚县",
+						"latter": "D"
+					},
+					{
+						"name": "永仁县",
+						"latter": "Y"
+					},
+					{
+						"name": "元谋县",
+						"latter": "Y"
+					},
+					{
+						"name": "武定县",
+						"latter": "W"
+					},
+					{
+						"name": "禄丰县",
+						"latter": "L"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "红河哈尼族彝族自治州",
+				"children": [{
+						"name": "个旧市",
+						"latter": "G"
+					},
+					{
+						"name": "开远市",
+						"latter": "K"
+					},
+					{
+						"name": "蒙自市",
+						"latter": "M"
+					},
+					{
+						"name": "弥勒市",
+						"latter": "M"
+					},
+					{
+						"name": "屏边苗族自治县",
+						"latter": "P"
+					},
+					{
+						"name": "建水县",
+						"latter": "J"
+					},
+					{
+						"name": "石屏县",
+						"latter": "S"
+					},
+					{
+						"name": "泸西县",
+						"latter": "L"
+					},
+					{
+						"name": "元阳县",
+						"latter": "Y"
+					},
+					{
+						"name": "红河县",
+						"latter": "H"
+					},
+					{
+						"name": "金平苗族瑶族傣族自治县",
+						"latter": "J"
+					},
+					{
+						"name": "绿春县",
+						"latter": "L"
+					},
+					{
+						"name": "河口瑶族自治县",
+						"latter": "H"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "文山壮族苗族自治州",
+				"children": [{
+						"name": "文山市",
+						"latter": "W"
+					},
+					{
+						"name": "砚山县",
+						"latter": "Y"
+					},
+					{
+						"name": "西畴县",
+						"latter": "X"
+					},
+					{
+						"name": "麻栗坡县",
+						"latter": "M"
+					},
+					{
+						"name": "马关县",
+						"latter": "M"
+					},
+					{
+						"name": "丘北县",
+						"latter": "Q"
+					},
+					{
+						"name": "广南县",
+						"latter": "G"
+					},
+					{
+						"name": "富宁县",
+						"latter": "F"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "西双版纳傣族自治州",
+				"children": [{
+						"name": "景洪市",
+						"latter": "J"
+					},
+					{
+						"name": "勐海县",
+						"latter": "M"
+					},
+					{
+						"name": "勐腊县",
+						"latter": "M"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "大理白族自治州",
+				"children": [{
+						"name": "大理市",
+						"latter": "D"
+					},
+					{
+						"name": "漾濞彝族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "祥云县",
+						"latter": "X"
+					},
+					{
+						"name": "宾川县",
+						"latter": "B"
+					},
+					{
+						"name": "弥渡县",
+						"latter": "M"
+					},
+					{
+						"name": "南涧彝族自治县",
+						"latter": "N"
+					},
+					{
+						"name": "巍山彝族回族自治县",
+						"latter": "W"
+					},
+					{
+						"name": "永平县",
+						"latter": "Y"
+					},
+					{
+						"name": "云龙县",
+						"latter": "Y"
+					},
+					{
+						"name": "洱源县",
+						"latter": "E"
+					},
+					{
+						"name": "剑川县",
+						"latter": "J"
+					},
+					{
+						"name": "鹤庆县",
+						"latter": "H"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "德宏傣族景颇族自治州",
+				"children": [{
+						"name": "瑞丽市",
+						"latter": "R"
+					},
+					{
+						"name": "芒市",
+						"latter": "M"
+					},
+					{
+						"name": "梁河县",
+						"latter": "L"
+					},
+					{
+						"name": "盈江县",
+						"latter": "Y"
+					},
+					{
+						"name": "陇川县",
+						"latter": "L"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "怒江傈僳族自治州",
+				"children": [{
+						"name": "泸水县",
+						"latter": "L"
+					},
+					{
+						"name": "福贡县",
+						"latter": "F"
+					},
+					{
+						"name": "贡山独龙族怒族自治县",
+						"latter": "G"
+					},
+					{
+						"name": "兰坪白族普米族自治县",
+						"latter": "L"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "迪庆藏族自治州",
+				"children": [{
+						"name": "香格里拉县",
+						"latter": "X"
+					},
+					{
+						"name": "德钦县",
+						"latter": "D"
+					},
+					{
+						"name": "维西傈僳族自治县",
+						"latter": "W"
+					}
+				],
+				"latter": "D"
+			}
+		],
+		"latter": "Y"
+	},
+	{
+		"name": "西藏自治区",
+		"children": [{
+				"name": "拉萨市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城关区",
+						"latter": "C"
+					},
+					{
+						"name": "林周县",
+						"latter": "L"
+					},
+					{
+						"name": "当雄县",
+						"latter": "D"
+					},
+					{
+						"name": "尼木县",
+						"latter": "N"
+					},
+					{
+						"name": "曲水县",
+						"latter": "Q"
+					},
+					{
+						"name": "堆龙德庆县",
+						"latter": "D"
+					},
+					{
+						"name": "达孜县",
+						"latter": "D"
+					},
+					{
+						"name": "墨竹工卡县",
+						"latter": "M"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "昌都地区",
+				"children": [{
+						"name": "昌都县",
+						"latter": "C"
+					},
+					{
+						"name": "江达县",
+						"latter": "J"
+					},
+					{
+						"name": "贡觉县",
+						"latter": "G"
+					},
+					{
+						"name": "类乌齐县",
+						"latter": "L"
+					},
+					{
+						"name": "丁青县",
+						"latter": "D"
+					},
+					{
+						"name": "察雅县",
+						"latter": "C"
+					},
+					{
+						"name": "八宿县",
+						"latter": "B"
+					},
+					{
+						"name": "左贡县",
+						"latter": "Z"
+					},
+					{
+						"name": "芒康县",
+						"latter": "M"
+					},
+					{
+						"name": "洛隆县",
+						"latter": "L"
+					},
+					{
+						"name": "边坝县",
+						"latter": "B"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "山南地区",
+				"children": [{
+						"name": "乃东县",
+						"latter": "N"
+					},
+					{
+						"name": "扎囊县",
+						"latter": "Z"
+					},
+					{
+						"name": "贡嘎县",
+						"latter": "G"
+					},
+					{
+						"name": "桑日县",
+						"latter": "S"
+					},
+					{
+						"name": "琼结县",
+						"latter": "Q"
+					},
+					{
+						"name": "曲松县",
+						"latter": "Q"
+					},
+					{
+						"name": "措美县",
+						"latter": "C"
+					},
+					{
+						"name": "洛扎县",
+						"latter": "L"
+					},
+					{
+						"name": "加查县",
+						"latter": "J"
+					},
+					{
+						"name": "隆子县",
+						"latter": "L"
+					},
+					{
+						"name": "错那县",
+						"latter": "C"
+					},
+					{
+						"name": "浪卡子县",
+						"latter": "L"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "日喀则地区",
+				"children": [{
+						"name": "日喀则市",
+						"latter": "R"
+					},
+					{
+						"name": "南木林县",
+						"latter": "N"
+					},
+					{
+						"name": "江孜县",
+						"latter": "J"
+					},
+					{
+						"name": "定日县",
+						"latter": "D"
+					},
+					{
+						"name": "萨迦县",
+						"latter": "S"
+					},
+					{
+						"name": "拉孜县",
+						"latter": "L"
+					},
+					{
+						"name": "昂仁县",
+						"latter": "A"
+					},
+					{
+						"name": "谢通门县",
+						"latter": "X"
+					},
+					{
+						"name": "白朗县",
+						"latter": "B"
+					},
+					{
+						"name": "仁布县",
+						"latter": "R"
+					},
+					{
+						"name": "康马县",
+						"latter": "K"
+					},
+					{
+						"name": "定结县",
+						"latter": "D"
+					},
+					{
+						"name": "仲巴县",
+						"latter": "Z"
+					},
+					{
+						"name": "亚东县",
+						"latter": "Y"
+					},
+					{
+						"name": "吉隆县",
+						"latter": "J"
+					},
+					{
+						"name": "聂拉木县",
+						"latter": "N"
+					},
+					{
+						"name": "萨嘎县",
+						"latter": "S"
+					},
+					{
+						"name": "岗巴县",
+						"latter": "G"
+					}
+				],
+				"latter": "R"
+			},
+			{
+				"name": "那曲地区",
+				"children": [{
+						"name": "那曲县",
+						"latter": "N"
+					},
+					{
+						"name": "嘉黎县",
+						"latter": "J"
+					},
+					{
+						"name": "比如县",
+						"latter": "B"
+					},
+					{
+						"name": "聂荣县",
+						"latter": "N"
+					},
+					{
+						"name": "安多县",
+						"latter": "A"
+					},
+					{
+						"name": "申扎县",
+						"latter": "S"
+					},
+					{
+						"name": "索县",
+						"latter": "S"
+					},
+					{
+						"name": "班戈县",
+						"latter": "B"
+					},
+					{
+						"name": "巴青县",
+						"latter": "B"
+					},
+					{
+						"name": "尼玛县",
+						"latter": "N"
+					},
+					{
+						"name": "双湖县",
+						"latter": "S"
+					}
+				],
+				"latter": "N"
+			},
+			{
+				"name": "阿里地区",
+				"children": [{
+						"name": "普兰县",
+						"latter": "P"
+					},
+					{
+						"name": "札达县",
+						"latter": "Z"
+					},
+					{
+						"name": "噶尔县",
+						"latter": "G"
+					},
+					{
+						"name": "日土县",
+						"latter": "R"
+					},
+					{
+						"name": "革吉县",
+						"latter": "G"
+					},
+					{
+						"name": "改则县",
+						"latter": "G"
+					},
+					{
+						"name": "措勤县",
+						"latter": "C"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "林芝地区",
+				"children": [{
+						"name": "林芝县",
+						"latter": "L"
+					},
+					{
+						"name": "工布江达县",
+						"latter": "G"
+					},
+					{
+						"name": "米林县",
+						"latter": "M"
+					},
+					{
+						"name": "墨脱县",
+						"latter": "M"
+					},
+					{
+						"name": "波密县",
+						"latter": "B"
+					},
+					{
+						"name": "察隅县",
+						"latter": "C"
+					},
+					{
+						"name": "朗县",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			}
+		],
+		"latter": "X"
+	},
+	{
+		"name": "陕西省",
+		"children": [{
+				"name": "西安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "新城区",
+						"latter": "X"
+					},
+					{
+						"name": "碑林区",
+						"latter": "B"
+					},
+					{
+						"name": "莲湖区",
+						"latter": "L"
+					},
+					{
+						"name": "灞桥区",
+						"latter": "B"
+					},
+					{
+						"name": "未央区",
+						"latter": "W"
+					},
+					{
+						"name": "雁塔区",
+						"latter": "Y"
+					},
+					{
+						"name": "阎良区",
+						"latter": "Y"
+					},
+					{
+						"name": "临潼区",
+						"latter": "L"
+					},
+					{
+						"name": "长安区",
+						"latter": "C"
+					},
+					{
+						"name": "蓝田县",
+						"latter": "L"
+					},
+					{
+						"name": "周至县",
+						"latter": "Z"
+					},
+					{
+						"name": "户县",
+						"latter": "H"
+					},
+					{
+						"name": "高陵县",
+						"latter": "G"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "铜川市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "王益区",
+						"latter": "W"
+					},
+					{
+						"name": "印台区",
+						"latter": "Y"
+					},
+					{
+						"name": "耀州区",
+						"latter": "Y"
+					},
+					{
+						"name": "宜君县",
+						"latter": "Y"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "宝鸡市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "渭滨区",
+						"latter": "W"
+					},
+					{
+						"name": "金台区",
+						"latter": "J"
+					},
+					{
+						"name": "陈仓区",
+						"latter": "C"
+					},
+					{
+						"name": "凤翔县",
+						"latter": "F"
+					},
+					{
+						"name": "岐山县",
+						"latter": "Q"
+					},
+					{
+						"name": "扶风县",
+						"latter": "F"
+					},
+					{
+						"name": "眉县",
+						"latter": "M"
+					},
+					{
+						"name": "陇县",
+						"latter": "L"
+					},
+					{
+						"name": "千阳县",
+						"latter": "Q"
+					},
+					{
+						"name": "麟游县",
+						"latter": "L"
+					},
+					{
+						"name": "凤县",
+						"latter": "F"
+					},
+					{
+						"name": "太白县",
+						"latter": "T"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "咸阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "秦都区",
+						"latter": "Q"
+					},
+					{
+						"name": "杨陵区",
+						"latter": "Y"
+					},
+					{
+						"name": "渭城区",
+						"latter": "W"
+					},
+					{
+						"name": "三原县",
+						"latter": "S"
+					},
+					{
+						"name": "泾阳县",
+						"latter": "J"
+					},
+					{
+						"name": "乾县",
+						"latter": "Q"
+					},
+					{
+						"name": "礼泉县",
+						"latter": "L"
+					},
+					{
+						"name": "永寿县",
+						"latter": "Y"
+					},
+					{
+						"name": "彬县",
+						"latter": "B"
+					},
+					{
+						"name": "长武县",
+						"latter": "C"
+					},
+					{
+						"name": "旬邑县",
+						"latter": "X"
+					},
+					{
+						"name": "淳化县",
+						"latter": "C"
+					},
+					{
+						"name": "武功县",
+						"latter": "W"
+					},
+					{
+						"name": "兴平市",
+						"latter": "X"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "渭南市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "临渭区",
+						"latter": "L"
+					},
+					{
+						"name": "华县",
+						"latter": "H"
+					},
+					{
+						"name": "潼关县",
+						"latter": "T"
+					},
+					{
+						"name": "大荔县",
+						"latter": "D"
+					},
+					{
+						"name": "合阳县",
+						"latter": "H"
+					},
+					{
+						"name": "澄城县",
+						"latter": "C"
+					},
+					{
+						"name": "蒲城县",
+						"latter": "P"
+					},
+					{
+						"name": "白水县",
+						"latter": "B"
+					},
+					{
+						"name": "富平县",
+						"latter": "F"
+					},
+					{
+						"name": "韩城市",
+						"latter": "H"
+					},
+					{
+						"name": "华阴市",
+						"latter": "H"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "延安市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "宝塔区",
+						"latter": "B"
+					},
+					{
+						"name": "延长县",
+						"latter": "Y"
+					},
+					{
+						"name": "延川县",
+						"latter": "Y"
+					},
+					{
+						"name": "子长县",
+						"latter": "Z"
+					},
+					{
+						"name": "安塞县",
+						"latter": "A"
+					},
+					{
+						"name": "志丹县",
+						"latter": "Z"
+					},
+					{
+						"name": "吴起县",
+						"latter": "W"
+					},
+					{
+						"name": "甘泉县",
+						"latter": "G"
+					},
+					{
+						"name": "富县",
+						"latter": "F"
+					},
+					{
+						"name": "洛川县",
+						"latter": "L"
+					},
+					{
+						"name": "宜川县",
+						"latter": "Y"
+					},
+					{
+						"name": "黄龙县",
+						"latter": "H"
+					},
+					{
+						"name": "黄陵县",
+						"latter": "H"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "汉中市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "汉台区",
+						"latter": "H"
+					},
+					{
+						"name": "南郑县",
+						"latter": "N"
+					},
+					{
+						"name": "城固县",
+						"latter": "C"
+					},
+					{
+						"name": "洋县",
+						"latter": "Y"
+					},
+					{
+						"name": "西乡县",
+						"latter": "X"
+					},
+					{
+						"name": "勉县",
+						"latter": "M"
+					},
+					{
+						"name": "宁强县",
+						"latter": "N"
+					},
+					{
+						"name": "略阳县",
+						"latter": "L"
+					},
+					{
+						"name": "镇巴县",
+						"latter": "Z"
+					},
+					{
+						"name": "留坝县",
+						"latter": "L"
+					},
+					{
+						"name": "佛坪县",
+						"latter": "F"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "榆林市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "榆阳区",
+						"latter": "Y"
+					},
+					{
+						"name": "神木县",
+						"latter": "S"
+					},
+					{
+						"name": "府谷县",
+						"latter": "F"
+					},
+					{
+						"name": "横山县",
+						"latter": "H"
+					},
+					{
+						"name": "靖边县",
+						"latter": "J"
+					},
+					{
+						"name": "定边县",
+						"latter": "D"
+					},
+					{
+						"name": "绥德县",
+						"latter": "S"
+					},
+					{
+						"name": "米脂县",
+						"latter": "M"
+					},
+					{
+						"name": "佳县",
+						"latter": "J"
+					},
+					{
+						"name": "吴堡县",
+						"latter": "W"
+					},
+					{
+						"name": "清涧县",
+						"latter": "Q"
+					},
+					{
+						"name": "子洲县",
+						"latter": "Z"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "安康市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "汉滨区",
+						"latter": "H"
+					},
+					{
+						"name": "汉阴县",
+						"latter": "H"
+					},
+					{
+						"name": "石泉县",
+						"latter": "S"
+					},
+					{
+						"name": "宁陕县",
+						"latter": "N"
+					},
+					{
+						"name": "紫阳县",
+						"latter": "Z"
+					},
+					{
+						"name": "岚皋县",
+						"latter": "L"
+					},
+					{
+						"name": "平利县",
+						"latter": "P"
+					},
+					{
+						"name": "镇坪县",
+						"latter": "Z"
+					},
+					{
+						"name": "旬阳县",
+						"latter": "X"
+					},
+					{
+						"name": "白河县",
+						"latter": "B"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "商洛市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "商州区",
+						"latter": "S"
+					},
+					{
+						"name": "洛南县",
+						"latter": "L"
+					},
+					{
+						"name": "丹凤县",
+						"latter": "D"
+					},
+					{
+						"name": "商南县",
+						"latter": "S"
+					},
+					{
+						"name": "山阳县",
+						"latter": "S"
+					},
+					{
+						"name": "镇安县",
+						"latter": "Z"
+					},
+					{
+						"name": "柞水县",
+						"latter": "Z"
+					}
+				],
+				"latter": "S"
+			}
+		],
+		"latter": "S"
+	},
+	{
+		"name": "甘肃省",
+		"children": [{
+				"name": "兰州市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城关区",
+						"latter": "C"
+					},
+					{
+						"name": "七里河区",
+						"latter": "Q"
+					},
+					{
+						"name": "西固区",
+						"latter": "X"
+					},
+					{
+						"name": "安宁区",
+						"latter": "A"
+					},
+					{
+						"name": "红古区",
+						"latter": "H"
+					},
+					{
+						"name": "永登县",
+						"latter": "Y"
+					},
+					{
+						"name": "皋兰县",
+						"latter": "G"
+					},
+					{
+						"name": "榆中县",
+						"latter": "Y"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "嘉峪关市",
+				"children": [{
+					"name": "市辖区",
+					"latter": "S"
+				}],
+				"latter": "J"
+			},
+			{
+				"name": "金昌市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "金川区",
+						"latter": "J"
+					},
+					{
+						"name": "永昌县",
+						"latter": "Y"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "白银市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "白银区",
+						"latter": "B"
+					},
+					{
+						"name": "平川区",
+						"latter": "P"
+					},
+					{
+						"name": "靖远县",
+						"latter": "J"
+					},
+					{
+						"name": "会宁县",
+						"latter": "H"
+					},
+					{
+						"name": "景泰县",
+						"latter": "J"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "天水市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "秦州区",
+						"latter": "Q"
+					},
+					{
+						"name": "麦积区",
+						"latter": "M"
+					},
+					{
+						"name": "清水县",
+						"latter": "Q"
+					},
+					{
+						"name": "秦安县",
+						"latter": "Q"
+					},
+					{
+						"name": "甘谷县",
+						"latter": "G"
+					},
+					{
+						"name": "武山县",
+						"latter": "W"
+					},
+					{
+						"name": "张家川回族自治县",
+						"latter": "Z"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "武威市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "凉州区",
+						"latter": "L"
+					},
+					{
+						"name": "民勤县",
+						"latter": "M"
+					},
+					{
+						"name": "古浪县",
+						"latter": "G"
+					},
+					{
+						"name": "天祝藏族自治县",
+						"latter": "T"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "张掖市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "甘州区",
+						"latter": "G"
+					},
+					{
+						"name": "肃南裕固族自治县",
+						"latter": "S"
+					},
+					{
+						"name": "民乐县",
+						"latter": "M"
+					},
+					{
+						"name": "临泽县",
+						"latter": "L"
+					},
+					{
+						"name": "高台县",
+						"latter": "G"
+					},
+					{
+						"name": "山丹县",
+						"latter": "S"
+					}
+				],
+				"latter": "Z"
+			},
+			{
+				"name": "平凉市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "崆峒区",
+						"latter": "K"
+					},
+					{
+						"name": "泾川县",
+						"latter": "J"
+					},
+					{
+						"name": "灵台县",
+						"latter": "L"
+					},
+					{
+						"name": "崇信县",
+						"latter": "C"
+					},
+					{
+						"name": "华亭县",
+						"latter": "H"
+					},
+					{
+						"name": "庄浪县",
+						"latter": "Z"
+					},
+					{
+						"name": "静宁县",
+						"latter": "J"
+					}
+				],
+				"latter": "P"
+			},
+			{
+				"name": "酒泉市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "肃州区",
+						"latter": "S"
+					},
+					{
+						"name": "金塔县",
+						"latter": "J"
+					},
+					{
+						"name": "瓜州县",
+						"latter": "G"
+					},
+					{
+						"name": "肃北蒙古族自治县",
+						"latter": "S"
+					},
+					{
+						"name": "阿克塞哈萨克族自治县",
+						"latter": "A"
+					},
+					{
+						"name": "玉门市",
+						"latter": "Y"
+					},
+					{
+						"name": "敦煌市",
+						"latter": "D"
+					}
+				],
+				"latter": "J"
+			},
+			{
+				"name": "庆阳市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "西峰区",
+						"latter": "X"
+					},
+					{
+						"name": "庆城县",
+						"latter": "Q"
+					},
+					{
+						"name": "环县",
+						"latter": "H"
+					},
+					{
+						"name": "华池县",
+						"latter": "H"
+					},
+					{
+						"name": "合水县",
+						"latter": "H"
+					},
+					{
+						"name": "正宁县",
+						"latter": "Z"
+					},
+					{
+						"name": "宁县",
+						"latter": "N"
+					},
+					{
+						"name": "镇原县",
+						"latter": "Z"
+					}
+				],
+				"latter": "Q"
+			},
+			{
+				"name": "定西市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "安定区",
+						"latter": "A"
+					},
+					{
+						"name": "通渭县",
+						"latter": "T"
+					},
+					{
+						"name": "陇西县",
+						"latter": "L"
+					},
+					{
+						"name": "渭源县",
+						"latter": "W"
+					},
+					{
+						"name": "临洮县",
+						"latter": "L"
+					},
+					{
+						"name": "漳县",
+						"latter": "Z"
+					},
+					{
+						"name": "岷县",
+						"latter": "M"
+					}
+				],
+				"latter": "D"
+			},
+			{
+				"name": "陇南市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "武都区",
+						"latter": "W"
+					},
+					{
+						"name": "成县",
+						"latter": "C"
+					},
+					{
+						"name": "文县",
+						"latter": "W"
+					},
+					{
+						"name": "宕昌县",
+						"latter": "D"
+					},
+					{
+						"name": "康县",
+						"latter": "K"
+					},
+					{
+						"name": "西和县",
+						"latter": "X"
+					},
+					{
+						"name": "礼县",
+						"latter": "L"
+					},
+					{
+						"name": "徽县",
+						"latter": "H"
+					},
+					{
+						"name": "两当县",
+						"latter": "L"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "临夏回族自治州",
+				"children": [{
+						"name": "临夏市",
+						"latter": "L"
+					},
+					{
+						"name": "临夏县",
+						"latter": "L"
+					},
+					{
+						"name": "康乐县",
+						"latter": "K"
+					},
+					{
+						"name": "永靖县",
+						"latter": "Y"
+					},
+					{
+						"name": "广河县",
+						"latter": "G"
+					},
+					{
+						"name": "和政县",
+						"latter": "H"
+					},
+					{
+						"name": "东乡族自治县",
+						"latter": "D"
+					},
+					{
+						"name": "积石山保安族东乡族撒拉族自治县",
+						"latter": "J"
+					}
+				],
+				"latter": "L"
+			},
+			{
+				"name": "甘南藏族自治州",
+				"children": [{
+						"name": "合作市",
+						"latter": "H"
+					},
+					{
+						"name": "临潭县",
+						"latter": "L"
+					},
+					{
+						"name": "卓尼县",
+						"latter": "Z"
+					},
+					{
+						"name": "舟曲县",
+						"latter": "Z"
+					},
+					{
+						"name": "迭部县",
+						"latter": "D"
+					},
+					{
+						"name": "玛曲县",
+						"latter": "M"
+					},
+					{
+						"name": "碌曲县",
+						"latter": "L"
+					},
+					{
+						"name": "夏河县",
+						"latter": "X"
+					}
+				],
+				"latter": "G"
+			}
+		],
+		"latter": "G"
+	},
+	{
+		"name": "青海省",
+		"children": [{
+				"name": "西宁市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "城东区",
+						"latter": "C"
+					},
+					{
+						"name": "城中区",
+						"latter": "C"
+					},
+					{
+						"name": "城西区",
+						"latter": "C"
+					},
+					{
+						"name": "城北区",
+						"latter": "C"
+					},
+					{
+						"name": "大通回族土族自治县",
+						"latter": "D"
+					},
+					{
+						"name": "湟中县",
+						"latter": "H"
+					},
+					{
+						"name": "湟源县",
+						"latter": "H"
+					}
+				],
+				"latter": "X"
+			},
+			{
+				"name": "海东市",
+				"children": [{
+						"name": "乐都区",
+						"latter": "L"
+					},
+					{
+						"name": "平安县",
+						"latter": "P"
+					},
+					{
+						"name": "民和回族土族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "互助土族自治县",
+						"latter": "H"
+					},
+					{
+						"name": "化隆回族自治县",
+						"latter": "H"
+					},
+					{
+						"name": "循化撒拉族自治县",
+						"latter": "X"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "海北藏族自治州",
+				"children": [{
+						"name": "门源回族自治县",
+						"latter": "M"
+					},
+					{
+						"name": "祁连县",
+						"latter": "Q"
+					},
+					{
+						"name": "海晏县",
+						"latter": "H"
+					},
+					{
+						"name": "刚察县",
+						"latter": "G"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "黄南藏族自治州",
+				"children": [{
+						"name": "同仁县",
+						"latter": "T"
+					},
+					{
+						"name": "尖扎县",
+						"latter": "J"
+					},
+					{
+						"name": "泽库县",
+						"latter": "Z"
+					},
+					{
+						"name": "河南蒙古族自治县",
+						"latter": "H"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "海南藏族自治州",
+				"children": [{
+						"name": "共和县",
+						"latter": "G"
+					},
+					{
+						"name": "同德县",
+						"latter": "T"
+					},
+					{
+						"name": "贵德县",
+						"latter": "G"
+					},
+					{
+						"name": "兴海县",
+						"latter": "X"
+					},
+					{
+						"name": "贵南县",
+						"latter": "G"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "果洛藏族自治州",
+				"children": [{
+						"name": "玛沁县",
+						"latter": "M"
+					},
+					{
+						"name": "班玛县",
+						"latter": "B"
+					},
+					{
+						"name": "甘德县",
+						"latter": "G"
+					},
+					{
+						"name": "达日县",
+						"latter": "D"
+					},
+					{
+						"name": "久治县",
+						"latter": "J"
+					},
+					{
+						"name": "玛多县",
+						"latter": "M"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "玉树藏族自治州",
+				"children": [{
+						"name": "玉树市",
+						"latter": "Y"
+					},
+					{
+						"name": "杂多县",
+						"latter": "Z"
+					},
+					{
+						"name": "称多县",
+						"latter": "C"
+					},
+					{
+						"name": "治多县",
+						"latter": "Z"
+					},
+					{
+						"name": "囊谦县",
+						"latter": "N"
+					},
+					{
+						"name": "曲麻莱县",
+						"latter": "Q"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "海西蒙古族藏族自治州",
+				"children": [{
+						"name": "格尔木市",
+						"latter": "G"
+					},
+					{
+						"name": "德令哈市",
+						"latter": "D"
+					},
+					{
+						"name": "乌兰县",
+						"latter": "W"
+					},
+					{
+						"name": "都兰县",
+						"latter": "D"
+					},
+					{
+						"name": "天峻县",
+						"latter": "T"
+					}
+				],
+				"latter": "H"
+			}
+		],
+		"latter": "Q"
+	},
+	{
+		"name": "宁夏回族自治区",
+		"children": [{
+				"name": "银川市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "兴庆区",
+						"latter": "X"
+					},
+					{
+						"name": "西夏区",
+						"latter": "X"
+					},
+					{
+						"name": "金凤区",
+						"latter": "J"
+					},
+					{
+						"name": "永宁县",
+						"latter": "Y"
+					},
+					{
+						"name": "贺兰县",
+						"latter": "H"
+					},
+					{
+						"name": "灵武市",
+						"latter": "L"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "石嘴山市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "大武口区",
+						"latter": "D"
+					},
+					{
+						"name": "惠农区",
+						"latter": "H"
+					},
+					{
+						"name": "平罗县",
+						"latter": "P"
+					}
+				],
+				"latter": "S"
+			},
+			{
+				"name": "吴忠市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "利通区",
+						"latter": "L"
+					},
+					{
+						"name": "红寺堡区",
+						"latter": "H"
+					},
+					{
+						"name": "盐池县",
+						"latter": "Y"
+					},
+					{
+						"name": "同心县",
+						"latter": "T"
+					},
+					{
+						"name": "青铜峡市",
+						"latter": "Q"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "固原市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "原州区",
+						"latter": "Y"
+					},
+					{
+						"name": "西吉县",
+						"latter": "X"
+					},
+					{
+						"name": "隆德县",
+						"latter": "L"
+					},
+					{
+						"name": "泾源县",
+						"latter": "J"
+					},
+					{
+						"name": "彭阳县",
+						"latter": "P"
+					}
+				],
+				"latter": "G"
+			},
+			{
+				"name": "中卫市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "沙坡头区",
+						"latter": "S"
+					},
+					{
+						"name": "中宁县",
+						"latter": "Z"
+					},
+					{
+						"name": "海原县",
+						"latter": "H"
+					}
+				],
+				"latter": "Z"
+			}
+		],
+		"latter": "N"
+	},
+	{
+		"name": "新疆维吾尔自治区",
+		"children": [{
+				"name": "乌鲁木齐市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "天山区",
+						"latter": "T"
+					},
+					{
+						"name": "沙依巴克区",
+						"latter": "S"
+					},
+					{
+						"name": "新市区",
+						"latter": "X"
+					},
+					{
+						"name": "水磨沟区",
+						"latter": "S"
+					},
+					{
+						"name": "头屯河区",
+						"latter": "T"
+					},
+					{
+						"name": "达坂城区",
+						"latter": "D"
+					},
+					{
+						"name": "米东区",
+						"latter": "M"
+					},
+					{
+						"name": "乌鲁木齐县",
+						"latter": "W"
+					}
+				],
+				"latter": "W"
+			},
+			{
+				"name": "克拉玛依市",
+				"children": [{
+						"name": "市辖区",
+						"latter": "S"
+					},
+					{
+						"name": "独山子区",
+						"latter": "D"
+					},
+					{
+						"name": "克拉玛依区",
+						"latter": "K"
+					},
+					{
+						"name": "白碱滩区",
+						"latter": "B"
+					},
+					{
+						"name": "乌尔禾区",
+						"latter": "W"
+					}
+				],
+				"latter": "K"
+			},
+			{
+				"name": "吐鲁番地区",
+				"children": [{
+						"name": "吐鲁番市",
+						"latter": "T"
+					},
+					{
+						"name": "鄯善县",
+						"latter": "S"
+					},
+					{
+						"name": "托克逊县",
+						"latter": "T"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "哈密地区",
+				"children": [{
+						"name": "哈密市",
+						"latter": "H"
+					},
+					{
+						"name": "巴里坤哈萨克自治县",
+						"latter": "B"
+					},
+					{
+						"name": "伊吾县",
+						"latter": "Y"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "昌吉回族自治州",
+				"children": [{
+						"name": "昌吉市",
+						"latter": "C"
+					},
+					{
+						"name": "阜康市",
+						"latter": "F"
+					},
+					{
+						"name": "呼图壁县",
+						"latter": "H"
+					},
+					{
+						"name": "玛纳斯县",
+						"latter": "M"
+					},
+					{
+						"name": "奇台县",
+						"latter": "Q"
+					},
+					{
+						"name": "吉木萨尔县",
+						"latter": "J"
+					},
+					{
+						"name": "木垒哈萨克自治县",
+						"latter": "M"
+					}
+				],
+				"latter": "C"
+			},
+			{
+				"name": "博尔塔拉蒙古自治州",
+				"children": [{
+						"name": "博乐市",
+						"latter": "B"
+					},
+					{
+						"name": "阿拉山口市",
+						"latter": "A"
+					},
+					{
+						"name": "精河县",
+						"latter": "J"
+					},
+					{
+						"name": "温泉县",
+						"latter": "W"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "巴音郭楞蒙古自治州",
+				"children": [{
+						"name": "库尔勒市",
+						"latter": "K"
+					},
+					{
+						"name": "轮台县",
+						"latter": "L"
+					},
+					{
+						"name": "尉犁县",
+						"latter": "W"
+					},
+					{
+						"name": "若羌县",
+						"latter": "R"
+					},
+					{
+						"name": "且末县",
+						"latter": "Q"
+					},
+					{
+						"name": "焉耆回族自治县",
+						"latter": "Y"
+					},
+					{
+						"name": "和静县",
+						"latter": "H"
+					},
+					{
+						"name": "和硕县",
+						"latter": "H"
+					},
+					{
+						"name": "博湖县",
+						"latter": "B"
+					}
+				],
+				"latter": "B"
+			},
+			{
+				"name": "阿克苏地区",
+				"children": [{
+						"name": "阿克苏市",
+						"latter": "A"
+					},
+					{
+						"name": "温宿县",
+						"latter": "W"
+					},
+					{
+						"name": "库车县",
+						"latter": "K"
+					},
+					{
+						"name": "沙雅县",
+						"latter": "S"
+					},
+					{
+						"name": "新和县",
+						"latter": "X"
+					},
+					{
+						"name": "拜城县",
+						"latter": "B"
+					},
+					{
+						"name": "乌什县",
+						"latter": "W"
+					},
+					{
+						"name": "阿瓦提县",
+						"latter": "A"
+					},
+					{
+						"name": "柯坪县",
+						"latter": "K"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "克孜勒苏柯尔克孜自治州",
+				"children": [{
+						"name": "阿图什市",
+						"latter": "A"
+					},
+					{
+						"name": "阿克陶县",
+						"latter": "A"
+					},
+					{
+						"name": "阿合奇县",
+						"latter": "A"
+					},
+					{
+						"name": "乌恰县",
+						"latter": "W"
+					}
+				],
+				"latter": "K"
+			},
+			{
+				"name": "喀什地区",
+				"children": [{
+						"name": "喀什市",
+						"latter": "K"
+					},
+					{
+						"name": "疏附县",
+						"latter": "S"
+					},
+					{
+						"name": "疏勒县",
+						"latter": "S"
+					},
+					{
+						"name": "英吉沙县",
+						"latter": "Y"
+					},
+					{
+						"name": "泽普县",
+						"latter": "Z"
+					},
+					{
+						"name": "莎车县",
+						"latter": "S"
+					},
+					{
+						"name": "叶城县",
+						"latter": "Y"
+					},
+					{
+						"name": "麦盖提县",
+						"latter": "M"
+					},
+					{
+						"name": "岳普湖县",
+						"latter": "Y"
+					},
+					{
+						"name": "伽师县",
+						"latter": "Q"
+					},
+					{
+						"name": "巴楚县",
+						"latter": "B"
+					},
+					{
+						"name": "塔什库尔干塔吉克自治县",
+						"latter": "T"
+					}
+				],
+				"latter": "K"
+			},
+			{
+				"name": "和田地区",
+				"children": [{
+						"name": "和田市",
+						"latter": "H"
+					},
+					{
+						"name": "和田县",
+						"latter": "H"
+					},
+					{
+						"name": "墨玉县",
+						"latter": "M"
+					},
+					{
+						"name": "皮山县",
+						"latter": "P"
+					},
+					{
+						"name": "洛浦县",
+						"latter": "L"
+					},
+					{
+						"name": "策勒县",
+						"latter": "C"
+					},
+					{
+						"name": "于田县",
+						"latter": "Y"
+					},
+					{
+						"name": "民丰县",
+						"latter": "M"
+					}
+				],
+				"latter": "H"
+			},
+			{
+				"name": "伊犁哈萨克自治州",
+				"children": [{
+						"name": "伊宁市",
+						"latter": "Y"
+					},
+					{
+						"name": "奎屯市",
+						"latter": "K"
+					},
+					{
+						"name": "伊宁县",
+						"latter": "Y"
+					},
+					{
+						"name": "察布查尔锡伯自治县",
+						"latter": "C"
+					},
+					{
+						"name": "霍城县",
+						"latter": "H"
+					},
+					{
+						"name": "巩留县",
+						"latter": "G"
+					},
+					{
+						"name": "新源县",
+						"latter": "X"
+					},
+					{
+						"name": "昭苏县",
+						"latter": "Z"
+					},
+					{
+						"name": "特克斯县",
+						"latter": "T"
+					},
+					{
+						"name": "尼勒克县",
+						"latter": "N"
+					}
+				],
+				"latter": "Y"
+			},
+			{
+				"name": "塔城地区",
+				"children": [{
+						"name": "塔城市",
+						"latter": "T"
+					},
+					{
+						"name": "乌苏市",
+						"latter": "W"
+					},
+					{
+						"name": "额敏县",
+						"latter": "E"
+					},
+					{
+						"name": "沙湾县",
+						"latter": "S"
+					},
+					{
+						"name": "托里县",
+						"latter": "T"
+					},
+					{
+						"name": "裕民县",
+						"latter": "Y"
+					},
+					{
+						"name": "和布克赛尔蒙古自治县",
+						"latter": "H"
+					}
+				],
+				"latter": "T"
+			},
+			{
+				"name": "阿勒泰地区",
+				"children": [{
+						"name": "阿勒泰市",
+						"latter": "A"
+					},
+					{
+						"name": "布尔津县",
+						"latter": "B"
+					},
+					{
+						"name": "富蕴县",
+						"latter": "F"
+					},
+					{
+						"name": "福海县",
+						"latter": "F"
+					},
+					{
+						"name": "哈巴河县",
+						"latter": "H"
+					},
+					{
+						"name": "青河县",
+						"latter": "Q"
+					},
+					{
+						"name": "吉木乃县",
+						"latter": "J"
+					}
+				],
+				"latter": "A"
+			},
+			{
+				"name": "自治区直辖县级行政区划",
+				"children": [{
+						"name": "石河子市",
+						"latter": "S"
+					},
+					{
+						"name": "阿拉尔市",
+						"latter": "A"
+					},
+					{
+						"name": "图木舒克市",
+						"latter": "T"
+					},
+					{
+						"name": "五家渠市",
+						"latter": "W"
+					}
+				],
+				"latter": "Z"
+			}
+		],
+		"latter": "X"
+	}
+]

+ 14 - 0
components/lee-select-city/hot-cities.json

@@ -0,0 +1,14 @@
+[["台州",["浙江省","台州市"]],
+	["北京", ["北京市"]],
+	["上海", ["上海"]],
+	["广州", ["广东省", "广州市"]],
+	["深圳", ["广东省", "深圳市"]],
+	["杭州", ["浙江省", "杭州市"]],
+	["南京", ["江苏省", "南京市"]],
+	["苏州", ["江苏省", "苏州市"]],
+	["天津", ["天津市"]],
+	["武汉", ["湖北省", "武汉市"]],
+	["长沙", ["湖南省", "长沙市"]],
+	["重庆", ["重庆市"]],
+	["成都", ["四川省", "成都市"]]
+]

+ 83 - 0
components/lee-select-city/lee-latter-list.vue

@@ -0,0 +1,83 @@
+<template>
+	<view class="latter-list">
+		<view class="latter-list-item" v-for="(v, k) in data" :key="k">
+			<view class="latter-list-latter">{{ v[0] }}</view>
+			<view class="plist">
+				<view class="plist-item"
+					v-for="(m, n) of v[1]"
+					:key="n"
+					:class="{ selected: selected === m }"
+					@click="selectHandler(m)"
+				>
+					<text>{{ m.name }}</text>
+					<text class="select-icon">✔</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			data: {
+				type: Array,
+				required: true
+			},
+			selected: Object
+		},
+		methods: {
+			selectHandler(item) {
+				this.$emit('select', item)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$lee-spacing-base: 30upx;
+	$lee-spacing-large: 40upx;
+	$lee-font-size-caption: 28upx;
+	$lee-text-height: 60upx;
+	
+	.latter-list {
+		&-item {
+			display: flex;
+			&:not(:last-child) {
+				margin-bottom: $lee-spacing-large;
+			}
+		}
+		
+		&-latter {
+			$width: 60upx;
+			width: $width;
+			font-size: $lee-font-size-caption;
+			color: $uni-text-color-grey;
+			line-height: $lee-text-height;
+		}
+	}
+	
+	.plist {
+		flex: 1;
+		width: 0;
+		
+		&-item {
+			height: $lee-text-height;
+			line-height: $lee-text-height;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			
+			&:not(:last-child) {
+				margin-bottom: $lee-spacing-base;
+			}
+			
+			&.selected {
+				color: $uni-color-primary;
+			}
+			&:not(.selected) > .select-icon {
+				display: none;
+			}
+		}
+	}
+</style>

+ 434 - 0
components/lee-select-city/lee-select-city.vue

@@ -0,0 +1,434 @@
+<template>
+	<view class="lee-select-city" :style="{ height }">
+		<!-- 选择提示 -->
+		<view class="lee-select-display" v-if="currentSelected.length">
+			<view class="lee-select-display-item"
+				v-for="(v, k) of currentSelected"
+				:key="k"
+				:class="{ active: currentLevel === k }"
+				@click="skipLevel(k)"
+			>{{ v.name }}</view>
+			<view class="lee-select-display-item"
+				v-if="placeholder">{{ placeholder }}</view>
+		</view>
+		<!-- 选择提示END -->
+		
+		<view class="swiper">
+			<view class="swiper-wrapper" :style="{
+				transform: `translateX(-${100 * currentLevel/3}%)`
+			}">
+				<!-- 省级 -->
+				<scroll-view class="swiper-item" scroll-y>
+					<view class="swiper-content">
+						<!-- 当前定位 -->
+						<block v-if="currentPosition">
+							<view class="caption">
+								<text>当前定位</text>
+								<text class="action" @click="getNewPosition">重新定位</text>
+							</view>
+							<view class="current-position"
+								@click="selectCurrentPosition">
+								{{ currentPosition }}
+							</view>
+						</block>
+						<!-- 当前定位END -->
+						
+						<!-- 热门城市 -->
+						<block v-if="hotCities.length">
+							<view class="caption">热门城市</view>
+							<view class="gird">
+								<view class="gird-item"
+									v-for="(v, k) of hotCities"
+									:key="k"
+								>
+									<view @click="hotCitySelectHandler(v)">{{ v[0] }}</view>
+								</view>
+							</view>
+						</block>
+						<!-- 热门城市END -->
+						<view class="caption">选择省份/地区</view>
+						<lee-latter-list
+							:data="dataByLetter"
+							:selected="currentSelected[0]"
+							@select="selectPro"
+						/>
+					</view>
+				</scroll-view>
+				<!-- 省级END -->
+				
+				<!-- 市级 -->
+				<scroll-view class="swiper-item" scroll-y>
+					<view class="swiper-content">
+						<view class="caption">选择城市</view>
+						<lee-latter-list
+							:data="level2Data"
+							:selected="currentSelected[1]"
+							@select="selectCity"
+						/>
+					</view>
+				</scroll-view>
+				<!-- 市级END -->
+				
+				<!-- 市级 -->
+				<scroll-view class="swiper-item" scroll-y>
+					<view class="swiper-content">
+						<view class="caption">选择区/县</view>
+						<lee-latter-list
+							:data="level3Data"
+							:selected="currentSelected[2]"
+							@select="selectQu"
+						/>
+					</view>
+				</scroll-view>
+				<!-- 市级END -->
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import LeeLatterList from './lee-latter-list.vue'
+	import cityData from './city.json'
+	import hotCities from './hot-cities.json'
+	
+	export default {
+		components: {
+			LeeLatterList
+		},
+		props: {
+			// 容器高度
+			height: {
+				type: String,
+				default: '100%'
+				// default: '100px'
+			},
+			
+			// 城市级联数据
+			data: {
+				type: Array,
+				default: () => JSON.parse(JSON.stringify(cityData))
+			},
+			
+			// 热门城市
+			hotCities: {
+				type: Array,
+				default: () => JSON.parse(JSON.stringify(hotCities))
+			},
+			
+			// 重新定位
+			getPosition: Function,
+			
+			// 默认选择
+			defaultSelected: {
+				type: Array,
+				default: () => []
+			},
+		},
+		data() {
+			const currentSelected = []
+			if (this.defaultSelected) {
+				let current = this.data
+				for (const name of this.defaultSelected) {
+					const item = current.find(v => v.name === name)
+					if (!item) {
+						currentSelected = []
+						break
+					}
+					currentSelected.push(item)
+					current = item.children || []
+				}
+			}
+			
+			return {
+				currentLevel: Math.min(2, this.defaultSelected.length),
+				currentSelected,
+				showPlaceholder: true,
+				currentPosition: null
+			}
+		},
+		computed: {
+			// 获取按Letter分组后的一级列表
+			dataByLetter() {
+				return this.formatByLatter(this.data)
+			},
+			
+			// 当前二级列表
+			level2Data() {
+				const lastLevel = this.currentSelected[0]
+				if (!lastLevel) return []
+				return this.formatByLatter(lastLevel.children || [])
+			},
+			
+			// 当前三级列表
+			level3Data() {
+				const lastLevel = this.currentSelected[1]
+				if (!lastLevel) return []
+				return this.formatByLatter(lastLevel.children || [])
+			},
+			
+			placeholder() {
+				const ln = this.currentSelected.length
+				if (ln === 0) return '请选择地区'
+				if (ln === 1) return '请选择城市'
+				if (ln === 2) return '请选择县'
+				return ''
+			}
+		},
+		async created() {
+			await this.getNewPosition()
+			console.log(this.data)
+		},
+		methods: {
+			// 选择省份
+			selectPro(item) {
+				this.currentSelected = [item]
+				console.log()
+				if (this.level2Data.length) {
+					this.currentLevel = 1
+				} else {
+					this.submit()
+				}
+			},
+			
+			// 选择城市
+			selectCity(item) {
+				this.currentSelected.splice(1)
+				this.$set(this.currentSelected, 1, item)
+				if (this.level3Data.length) {
+					this.currentLevel = 2
+				} else {
+					this.submit()
+				}
+			},
+			
+			// 选择区/县
+			selectQu(item) {
+				this.currentSelected.splice(2)
+				this.$set(this.currentSelected, 2, item)
+				this.submit()
+				this.$store.commit('setChoose',{
+						chooseProvince: this.currentSelected[0].name,
+						chooseCity: this.currentSelected[1].name,
+						chooseDistrict: this.currentSelected[2].name,
+				})
+				// this.$api.prePage().reGetStoreList();
+				
+				uni.switchTab({
+					url: '/pages/index/index'
+				})
+			},
+			
+			// 跳转到指定级数
+			skipLevel(level) {
+				this.currentLevel = level
+			},
+			
+			// 提交当前选择
+			submit() {
+				const selected = this.currentSelected.slice(0)
+				const simple = selected.map(v => v.name)
+				this.$emit('submit', { simple, selected })
+			},
+			
+			// 点击热门城市
+			hotCitySelectHandler(item) {
+				let current = this.data
+				const selected = []
+				for (const v of item[1]) {
+					const node = current.find(m => m.name === v)
+					if (!node) return
+					current = node.children
+					if (!current || current.length === 0) return
+					selected.push(node)
+				}
+				this.currentSelected = selected
+				const nextLevel = selected.length
+				if (
+					(nextLevel === 1 && this.level2Data.length) ||
+					(nextLevel === 2 && this.level3Data.length)
+				) {
+					this.currentLevel = nextLevel
+				} else {
+					this.submit()
+				}
+			},
+			
+			// 使用当前定位
+			selectCurrentPosition() {
+				this.$emit('select-current', this.currentPosition)
+			},
+			// 重新定位
+			async getNewPosition() {
+				if (typeof this.getPosition === 'function') {
+					this.currentPosition = await this.getPosition()
+				}
+			},
+			
+			// 按latter格式化
+			formatByLatter(list) {
+				return list.reduce((map, item) => {
+					if (!item.latter) return map
+					let tmp = map.find(v => v[0] === item.latter)
+					if (!tmp) {
+						tmp = [item.latter, []]
+						map.push(tmp)
+					}
+					tmp[1].push(item)
+					tmp[1].sort((a, b) => {
+						return a.name - b.name
+					})
+					return map
+				}, []).sort((a, b) => {
+					return a[0].charCodeAt(0) - b[0].charCodeAt(0)
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$lee-spacing-small: 10upx;
+	$lee-spacing-base: 30upx;
+	$lee-spacing-large: 40upx;
+	$lee-font-size-caption: 28upx;
+	$lee-text-height: 60upx;
+	
+	.lee-select-city {
+		display: flex;
+		flex-direction: column;
+		position: relative;
+		background-color: $uni-bg-color;
+	}
+	
+	.swiper {
+		flex: 1;
+		width: 100%;
+		height: 0;
+		overflow: hidden;
+		position: relative;
+		&-wrapper {
+			width: 300%;
+			height: 100%;
+			display: flex;
+			position: relative;
+		}
+		&-item {
+			width: calc(100% / 3);
+			height: 100%;
+			position: relative;
+			box-sizing: border-box;
+		}
+		
+		&-content {
+			position: relative;
+			box-sizing: border-box;
+			padding: $lee-spacing-base;
+			
+			> .caption {
+				color: $uni-text-color-grey;
+				font-size: $lee-font-size-caption;
+				margin-bottom: $lee-spacing-base;
+				
+				> .action {
+					float: right;
+				}
+			}
+		}
+	}
+	
+	// 已选择显示
+	.lee-select-display {
+		padding: $lee-spacing-base;
+		box-shadow: 0 2upx 2upx rgba(0, 0, 0, .15);
+		
+		&-item {
+			$height: 80upx;
+			height: $height;
+			line-height: $height;
+			box-sizing: border-box;
+			padding: 0 $lee-spacing-base;
+			font-size: $lee-font-size-caption;
+			border-left: 1px solid $uni-color-primary;
+			position: relative;
+			
+			&.active {
+				color: $uni-color-primary;
+			}
+			
+			&::before {
+				content: '';
+				top: 0;
+				left: -4upx;
+				width: 8upx;
+				height: 50%;
+				background-color: $uni-bg-color;
+				position: absolute;
+				display: none;
+			}
+			&:first-child::before,
+			&:last-child::before {
+				display: block;
+			}
+			&:last-child::before {
+				top: 50%;
+			}
+			
+			&::after {
+				$size: 14upx;
+				top: 50%;
+				left: 0;
+				content: '';
+				width: $size;
+				height: $size;
+				border-radius: 50%;
+				position: absolute;
+				background-color: $uni-color-primary;
+				transform: translate(-50%, -50%);
+			}
+			&:last-child::after {
+				background-color: $uni-text-color-grey;
+			}
+		}
+	}
+	
+	// 热门城市
+	.gird {
+		$height: 80upx;
+		
+		display: flex;
+		flex-wrap: wrap;
+		position: relative;
+		margin-bottom: $lee-spacing-base;
+		
+		&-item {
+			width: 20%;
+			height: $height;
+			box-sizing: border-box;
+			padding: $lee-spacing-small;
+			
+			> view {
+				width: 100%;
+				height: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: $lee-font-size-caption;
+				background-color: $uni-bg-color-hover;
+				border-radius: 8upx;
+			}
+		}
+	}
+	
+	// 当前定位
+	.current-position {
+		$height: 80upx;
+		height: $height;
+		line-height: $height;
+		text-align: center;
+		font-size: $lee-font-size-caption;
+		margin-bottom: $lee-spacing-base;
+		color: $uni-color-primary;
+		background-color: lighten($uni-color-primary, 40%);
+		border-radius: 8upx;
+	}
+</style>

+ 0 - 349
components/maramlee-waterfalls-flow/maramlee-waterfalls-flow.vue

@@ -1,349 +0,0 @@
-<template>
-  <view class="waterfalls-box" :style="{ height: height + 'px' }">
-    <!--  #ifdef  MP-WEIXIN -->
-    <view
-      v-for="(item, index) of list"
-      class="waterfalls-list"
-      :key="item[idKey]"
-      :id="'waterfalls-list-id-' + item[idKey]"
-      :ref="'waterfalls-list-id-' + item[idKey]"
-      :style="{
-        '--offset': offset + 'px',
-        '--cols': cols,
-        top: allPositionArr[index].top || 0,
-        left: allPositionArr[index].left || 0,
-      }"
-      @click="$emit('wapper-lick', item)"
-    >
-		  <view class="pictrue">
-				<image
-				  class="waterfalls-list-image"
-				  mode="aspectFill"
-				  :class="{ single }"
-                  :style="imageStyle"
-				  :src="item[imageSrcKey] || ' '"
-				  @load="imageLoadHandle(index)"
-				  @error="imageLoadHandle(index)"
-				  @click="$emit('image-click', item)"
-				/>
-				<view class="masks acea-row row-center-wrapper" v-if="item.stock<=0">
-					<view class="bg">
-						<view>暂时</view>
-						<view>售罄</view>
-					</view>
-				</view>
-				<video
-					v-if="product_video_status && item.video_link"
-					:src="item.video_link"
-					:controls="false"
-					:show-center-play-btn="false"
-					:id="`video${item.id}`"
-					:poster="item[imageSrcKey] || ''"
-					class="video"
-					objectFit="cover"
-					loop
-					muted
-				></video>
-				<view class="activityFrame" v-if="item.activity_frame.image" :style="'background-image: url('+item.activity_frame.image+');'"></view>
-			</view>
-      <slot name="slot{{index}}" />
-    </view>
-    <!--  #endif -->
-    <!--  #ifndef  MP-WEIXIN -->
-    <view
-      v-for="(item, index) of list"
-      class="waterfalls-list"
-      :key="item[idKey]"
-      :id="'waterfalls-list-id-' + item[idKey]"
-      :ref="'waterfalls-list-id-' + item[idKey]"
-      :style="{
-        '--offset': offset + 'px',
-        '--cols': cols,
-        ...listStyle,
-        ...(allPositionArr[index] || {}),
-      }"
-      @click="$emit('wapper-lick', item)"
-    >
-	  <view class="pictrue">
-		  <image
-		    class="waterfalls-list-image"
-		    :class="{ single }"
-		    mode="aspectFill"
-		    :style="imageStyle"
-		    :src="item[imageSrcKey] || ' '"
-		    @load="imageLoadHandle(index)"
-		    @error="imageLoadHandle(index)"
-		    @click="$emit('image-click', item)"
-		  />
-			<view class="masks acea-row row-center-wrapper" v-if="item.stock<=0">
-				<view class="bg">
-					<view>暂时</view>
-					<view>售罄</view>
-				</view>
-			</view>
-			<!-- #ifdef H5 -->
-			<video
-				v-if="product_video_status && item.video_link"
-				:src="item.video_link"
-				:controls="false"
-				:show-center-play-btn="false"
-				:id="`video${item.id}`"
-				:poster="item[imageSrcKey] || ''"
-				objectFit="cover"
-				class="video"
-				loop
-				muted
-			></video>
-			<!-- #endif -->
-			<view class="activityFrame" v-if="item.activity_frame.image" :style="'background-image: url('+item.activity_frame.image+');'"></view>
-	  </view>
-      <slot v-bind="item" />
-    </view>
-    <!--  #endif -->
-  </view>
-</template>
-<script>
-import store from '../../store';
-import {
-		diyProduct
-	} from '@/api/store.js';
-	import {
-		mapMutations
-	} from 'vuex';
-export default {
-  props: {
-    list: { type: Array, required: true },
-    // offset 间距,单位为 px
-    offset: { type: Number, default: 10 },
-    // 列表渲染的 key 的键名,值必须唯一,默认为 id
-    idKey: { type: String, default: "id" },
-    // 图片 src 的键名
-    imageSrcKey: { type: String, default: "image" },
-    // 列数
-    cols: { type: Number, default: 2, validator: (num) => num >= 2 },
-    imageStyle: { type: Object },
-
-    // 是否是单独的渲染图片的样子,只控制图片圆角而已
-    single: { type: Boolean, default: false },
-
-    // #ifndef MP-WEIXIN
-    listStyle: { type: Object },
-    // #endif
-  },
-  data() {
-    return {
-      topArr: [], // left, right 多个时依次表示第几列的数据
-      allPositionArr: [], // 保存所有的位置信息
-      allHeightArr: [], // 保存所有的 height 信息
-      height: 0, // 外层包裹高度
-      oldNum: 0,
-      num: 0,
-	  updateCount: 0,
-	  product_video_status: false
-    };
-  },
-  watch: {
-  	list: {
-		handler(newValue, oldValue) {
-			// #ifndef APP-PLUS
-			if (!newValue.length) {
-				return;
-			}
-			this.$nextTick(() => {
-				this.updateCount++;
-				if (!this.product_video_status) {
-					return;
-				}
-				uni.getNetworkType({
-					success: (res) => {
-						if (['wifi', 'unknown'].includes(res.networkType)) {
-							// 监听
-							this.observeVideo();
-						}
-						if (['2g', '3g', '4g', '5g'].includes(res.networkType)) {
-							if (!this.$store.state.app.autoplay) {
-								if (this.updateCount != 1) {
-									return;
-								}
-								return uni.showModal({
-									content: '当前使用移动网络,是否继续播放视频?',
-									success: (res) => {
-										if (res.confirm) {
-											// 监听
-											this.SET_AUTOPLAY(true);
-											this.observeVideo();
-										}
-									}
-								});
-							}
-							// 监听
-							this.observeVideo();
-						}
-					}
-				});
-			});
-			// #endif
-		},
-		immediate: true
-  	}
-  },
-  created() {
-	  let that = this;
-    this.refresh();
-	let product_video_status = null;
-	try{
-		product_video_status = JSON.parse(uni.getStorageSync('product_video_status'));
-	}catch(e){
-		//TODO handle the exception
-	}
-	if (typeof product_video_status == 'boolean') {
-		this.product_video_status = product_video_status;
-	} else{
-		this.getdiyProduct();
-	}
-  },
-  methods: {
-	  ...mapMutations(['SET_AUTOPLAY']),
-	  observeVideo() {
-	  	let observer = uni.createIntersectionObserver(this, { observeAll: true });
-	  	observer.relativeToViewport().observe('.video', res => {
-	  		if (res.intersectionRatio) {
-				setTimeout(() => {
-					uni.createVideoContext(res.id, this).play();
-				}, 200)
-	  		} else{
-				setTimeout(() => {
-					uni.createVideoContext(res.id, this).pause();
-				}, 200)
-	  		}
-	  	});
-		this.$once('hook:beforeDestroy', () => {
-			observer.disconnect();
-		});
-	  },
-	  // div商品详情
-	getdiyProduct() {
-		diyProduct().then(res => {
-			uni.setStorageSync('product_video_status',JSON.stringify(res.data.product_video_status))
-			this.product_video_status = res.data.product_video_status;
-		})
-	},
-    imageLoadHandle(index) {
-			if(!this.list.length){
-				return
-			}
-      const id = "waterfalls-list-id-" + this.list[index][this.idKey],
-        query = uni.createSelectorQuery().in(this);
-      query
-        .select("#" + id)
-        .fields({ size: true }, (data) => {
-          this.num++;
-          this.$set(this.allHeightArr, index, data.height);
-          if (this.num === this.list.length) {
-            for (let i = this.oldNum; i < this.num; i++) {
-              const getTopArrMsg = () => {
-                let arrtmp = [...this.topArr].sort((a, b) => a - b);
-                return {
-                  shorterIndex: this.topArr.indexOf(arrtmp[0]),
-                  shorterValue: arrtmp[0],
-                  longerIndex: this.topArr.indexOf(arrtmp[this.cols - 1]),
-                  longerValue: arrtmp[this.cols - 1],
-                };
-              };
-
-              const { shorterIndex, shorterValue } = getTopArrMsg();
-              const position = {
-                top: shorterValue + "px",
-                left: (data.width + this.offset) * shorterIndex + "px",
-              };
-              this.$set(this.allPositionArr, i, position);
-              this.topArr[shorterIndex] =
-                shorterValue + this.allHeightArr[i] + this.offset;
-              this.height = getTopArrMsg().longerValue - this.offset;
-            }
-            this.oldNum = this.num;
-            // 完成渲染 emit `image-load` 事件
-            this.$emit("image-load");
-          }
-        })
-        .exec();
-    },
-    refresh() {
-      let arr = [];
-      for (let i = 0; i < this.cols; i++) {
-        arr.push(0);
-      }
-      this.topArr = arr;
-      this.num = 0;
-      this.oldNum = 0;
-      this.height = 0;
-    },
-  },
-};
-</script>
-<style lang="scss" scoped>
-// 这里可以自行配置
-$border-radius: 10px;
-
-.waterfalls-box {
-  position: relative;
-  width: 100%;
-  overflow: hidden;
-  .waterfalls-list {
-    width: 346rpx;
-    position: absolute;
-    background-color: #fff;
-    border-radius: $border-radius;
-    // 防止刚开始渲染时堆叠在第一幅图的地方
-    left: calc(-50% - var(--offset));
-	.pictrue{
-		position: relative;
-		.masks{
-			position: absolute;
-			top: 0;
-			left: 0;
-			right: 0;
-			bottom: 0;
-			background: rgba(0, 0, 0, 0.2);
-			border-radius: 20rpx 20rpx 0 0;
-			.bg{
-				width: 152rpx;
-				height: 152rpx;
-				background: #000000;
-				opacity: 0.6;
-				color: #fff;
-				font-size: 32rpx;
-				border-radius: 50%;
-				padding: 34rpx 0;
-				text-align: center;
-			}
-		}
-		.activityFrame{
-			border-radius: $border-radius $border-radius 0 0;
-		}
-	}
-	
-	
-	
-    .waterfalls-list-image {
-	  width: 100%;
-	  height: 346rpx !important;
-      will-change: transform;
-      border-radius: $border-radius $border-radius 0 0;
-      display: block;
-      &.single {
-        border-radius: $border-radius;
-      }
-    }
-  }
-  
-  .video {
-	  position: absolute;
-	  top: 0;
-	  left: 0;
-	  width: 100%;
-	  height: 346rpx !important;
-	  border-radius: $border-radius $border-radius 0 0;
-  }
-}
-</style>

+ 421 - 0
components/newlist/nowList.vue

@@ -0,0 +1,421 @@
+<template>
+	<view class="other">
+		<view class="other-1">大家还在拼</view>
+		
+		<view class="preferred_item" v-for="item in recommendedlist" @click.stop="ToKaiTuan(item)">
+			<view class="flex_item" style="overflow: hidden;">
+				<view class="tlist-img">
+					<view class="leftImgIcon">AA团</view>
+					<!-- <view class="leftImgIcon" v-if="sid == 129">达人团</view> -->
+					<view class="img"><image :src="item.image" mode="scaleToFill"></image></view>
+				</view>
+				<view class="tlist-img " v-for="imgItem in item.images">
+					<view class="img"><image :src="imgItem" mode="scaleToFill"></image></view>
+				</view>
+			</view>
+			<view class="goods_name">
+				<view class="goods_title flex_item">
+					<view class="text">{{ item.min_people }}人团</view>
+					<view class="title">{{ item.title }}</view>
+				</view>
+				<view class="goods-height">
+					<!-- <view class="goods_num clamp">{{ item.info }}</view> -->
+					<view class="flex goods-peplo">
+						<view class="goods-tip flex_item">
+							<view class="peplo">库存剩{{ item.percent | parseIntTo }}%</view>
+							<view class="make">{{ item.mark }}</view>
+						</view>
+						<view class="right flex_item">
+							<image src="/static/icon/hot.png" mode="aspectFill"></image>
+							<text>已拼{{ item.sales }}份</text>
+						</view>
+					</view>
+				</view>
+				<view class="price flex">
+					<view class="price_list">
+						<view class="price-red">
+							<text>单人仅付:</text>
+							<text class="moneyIcon">¥</text>
+							<text class="money">{{ item.price }}</text>
+							<text class="moneyType">/{{ item.unit_name }}</text>
+							<!-- <text class="outMoney">¥{{ item.product_price }}</text> -->
+						</view>
+					</view>
+					<view class="img position-relative" @click.stop="ToKaiTuan(item)">去开团</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		recommendedlist: {
+			type: Array,
+			default: function() {
+				return {
+				};
+			}
+		}
+	},
+	data() {
+		return {};
+	},
+	filters: {
+		parseIntTo(percent) {
+			percent = +percent * 100;
+			if (percent % 1 === 0) {
+				return percent;
+			} else {
+				percent = percent.toFixed(1);
+				return percent;
+			}
+		}
+	},
+	methods: {
+		// 去开团
+		ToKaiTuan(item) {
+			console.log(8754847)
+			let id = item.id;
+			uni.navigateTo({
+				url: '/pages/product/productGroup?id=' + id
+			});
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.other{
+		.other-1{
+			font-size:27rpx;
+			color:#333333;
+			line-height: 55rpx;
+		}
+		
+		.preferred_item {
+			width: 100%;
+			height: 100%;
+			padding: 25rpx 25rpx;
+			position: relative;
+			background-color: #FFFFFF;
+			border-radius: 15rpx;
+			margin-bottom: 15rpx;
+			.tlist-img {
+				width: 225rpx;
+				position: relative;
+				margin-right: 15rpx;
+				.leftImgIcon {
+					position: absolute;
+					top: 0;
+					left: 0;
+					font-size: 22rpx;
+					font-family: PingFangSC;
+					color: rgba(148, 71, 34, 1);
+					background: rgba(254, 242, 111, 1);
+					z-index: 99;
+					border-radius: 5rpx;
+					padding: 5rpx 10rpx;
+				}
+				.img {
+					width: 210rpx;
+					height: 210rpx;
+					image {
+						width: 100%;
+						height: 100%;
+						border-radius: 20rpx;
+					}
+				}
+				.stock {
+					margin-top: 13rpx;
+					font-size: 26rpx;
+					background: #fff1ee;
+					width: 100%;
+					color: #fb4912;
+					padding: 6rpx 0;
+					border-radius: 5rpx;
+					justify-content: center;
+					align-items: center;
+					position: absolute;
+					left: 0;
+					bottom: 0;
+					.img {
+						width: 20rpx;
+						height: 20rpx;
+						flex-shrink: 0;
+					}
+					.stock-num {
+						padding-left: 7rpx;
+						font-size: 22rpx;
+						border-radius: 5rpx;
+						height: 32rpx;
+						line-height: 32rpx;
+					}
+				}
+			}
+			.goods_name {
+				.goods_title {
+					padding-top: 15rpx;
+					color:rgba(0,0,0,1);
+					// white-space: nowrap;
+					// overflow: hidden;
+					// text-overflow: ellipsis;
+					font-size:32rpx;
+					color: $font-color-dark;
+					// height: 70rpx;
+					align-items: baseline;
+					.text{
+						border-radius: 8rpx;
+						border: 2rpx solid #FF1A27;
+						color: #FF1A27;
+						padding:0rpx 10rpx;
+						font-size: 26rpx !important;
+						margin-right: 15rpx;
+						
+					}
+					.title {
+						width: 80%;
+						overflow : hidden;
+						text-overflow: ellipsis;
+						display: -webkit-box;
+						-webkit-line-clamp: 2;
+						-webkit-box-orient: vertical;
+					}
+				}
+				.goods-height {
+					min-height: 60rpx;
+				}
+				.goods_num {
+					font-size: 26rpx;
+					color: #8f8f97;
+					padding-bottom: 15rpx;
+				}
+				.goods-peplo {
+					height: 45rpx;
+					margin-top: 15rpx;
+					.right {
+						color:#8e8e8e;
+						font-size: 24rpx;
+						width:195rpx;
+						image {
+							width: 30rpx;
+							height: 33rpx;
+							margin-right: 15rpx;
+						}
+					}
+					.goods-tip {
+						.peplo {
+							background:linear-gradient(14deg,rgba(255,116,37,1),rgba(255,30,41,1));
+							padding: 5rpx 10rpx;
+							color: #ffffff;
+							border-top-left-radius:8rpx;
+							border-bottom-left-radius: 8rpx;
+						}
+						.make {
+							background-color: #fef26f;
+							color: #944722;
+							border-top-right-radius: 8rpx;
+							border-bottom-right-radius: 8rpx;
+						}
+						.make,
+						.peplo {
+							font-size: $font-sm;
+							padding: 5rpx 10rpx;
+						}
+					}
+				}
+				.price {
+					font-size: 28rpx;
+					position: relative;
+					padding-top: 15rpx;
+					.price_list {
+						.price-red {
+							font-size: 30rpx !important;
+							font-family: Source Han Sans CN;
+							color: rgba(253, 27, 42, 1);
+							font-size: $font-base;
+							font-weight: bold;
+							.moneyIcon {
+								font-weight: normal !important; 
+							}
+							.money {
+								font-size: 58rpx;
+							}
+							.moneyType {
+								font-weight: 400;
+							}
+							.outMoney {
+								font-weight: 400;
+								text-decoration: line-through;
+								color: rgba(142, 142, 142, 1);
+							}
+						}
+						.price-green {
+							color: #2dbd59;
+							font-size: 26rpx !important;
+							font-weight: bold;
+							text {
+								background: linear-gradient(45deg, rgba(21, 197, 52, 1), rgba(21, 197, 52, 1));
+								color: #ffffff;
+								padding: 0rpx 10rpx;
+								border-radius: 7rpx;
+								font-size: 24rpx !important;
+								margin-left: 15rpx;
+							}
+						}
+					}
+					.img {
+						width: 265rpx;
+						height: 74rpx;
+						line-height: 74rpx;
+						// background:linear-gradient(14deg,rgba(255,116,37,1),rgba(255,30,41,1));
+						background: linear-gradient(270deg, rgba(181,116,242, 1) 0%, rgba(139,86,254, 1) 100%);
+						border-radius: 99rpx;
+						color: #ffffff;
+						font-size: $font-lg;
+						text-align: center;
+					}
+					.img1{
+						background-color: #D3D3D3;
+						width: 265rpx;
+						height: 74rpx;
+						line-height: 74rpx;
+						border-radius: 99rpx;
+						color: #ffffff;
+						font-size: $font-lg;
+						text-align: center;
+					}
+					.tomorrow {
+						background: #29a66e;
+						color: #ffffff;
+						border-radius: 25rpx;
+						padding: 10rpx 25rpx;
+					}
+				}
+			}
+		}
+		
+		
+		.other-2{
+			width: 100%;
+			background:#ffffff;
+			padding: 10rpx 15rpx ;
+			border-radius: 20rpx;
+			.content-row{
+				padding: 10rpx 0;
+				.row-1{
+					width: 210rpx;
+					position: relative;
+					margin-right: 20rpx;
+					text-align: center;
+					.row-1-1{
+						text-align: center;
+						height:40rpx;
+						background:#fff1ee;
+						border-radius:6rpx;
+						font-size:22rpx;
+						font-weight:500;
+						color:#fb4912;
+						line-height:40rpx;
+						image{
+							width: 23rpx;
+							height: 23rpx;
+							margin-right: 5rpx;
+						}
+					}
+					.img1{
+						width:170rpx;
+						height:170rpx;
+						border-radius:10rpx;
+					}
+					.img2{
+						position: absolute;
+						top: 0;
+						left: 16rpx;
+						width:80rpx;
+						height:32rpx;
+						border-radius:5px;
+					}
+				}
+				.row-2{
+					padding: 20rpx 0 20rpx 0;
+					width:calc(100% - 210rpx);
+					position: relative;
+					
+					border-bottom: 1px solid #EAEAEA;
+					.word-1{
+						font-size:32rpx;
+						font-weight:bold;
+						color:#141821;
+						margin-left: 10rpx;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+					}
+					.word-2{
+						margin-top: 10rpx;
+						font-size:24rpx;
+						color:#979797;
+					}
+					.word-3{
+						margin-top: 10rpx;
+						position: relative;
+						font-size:20rpx;
+						color:#ffffff;
+						image{
+							width: 235rpx;
+							height: 50rpx;
+						}
+						.word-3-1{
+							position: absolute;
+							top:8px;
+							left:2px;
+							width: 230rpx;
+							text-align: center;
+							.word-3-1-1{
+								display: inline-block;
+								color:#FD1B2A;
+								width: 50%;
+							}
+							
+						}
+					}
+					.word-4{
+						margin-top: 15rpx;
+						font-size:23rpx;
+						color:#fd1b2a;
+						margin-left: 10rpx;
+						text{
+							font-size:23rpx;
+							font-weight:bold;
+						}
+						.word-4-1{
+							font-size:36rpx;
+						}
+					}
+					.word-5{
+						margin-top: 15rpx;
+						font-size:21rpx;
+						color:#868686;
+					}
+					.button{
+						width:145rpx;
+						height:60rpx;
+						background:linear-gradient(14deg,#ff7425,#ff1e29);
+						border-radius:30rpx;
+						font-size:27rpx;
+						font-weight:bold;
+						color:#ffffff;
+						line-height:60rpx;
+						text-align: center;
+						
+						position: absolute;
+						bottom: 20rpx;
+						right: 0;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 0 - 512
components/orderGoods/index.vue

@@ -1,512 +0,0 @@
-<template>
-	<!-- 订单商品 -->
-	<view class="orderGoods" :class="product_type?'on':''">
-		<view class='total' v-if="!split && totalNmu>0">
-			<view>共{{totalNmu+totaliveNmu}}件商品</view>
-			<!-- <navigator v-if="isGroup" class="navigator" :url="`/pages/store/group_goods/index?collage_id=${collageId}`" hover-class="none">拼单详情<text class="iconfont icon-xiangyou"></text></navigator> -->
-			<navigator v-if="[1,2,3,4,5].includes(statusType) && (deliveryType==2 || sendType=='send')" class="navigator" :url="`/pages/goods/verify_record/index?oid=${oid}`" hover-class="none">核销记录<text class="iconfont icon-xiangyou"></text></navigator>
-		</view>
-		<view class='total' v-if="split">
-			<text>订单包裹{{index + 1}}</text>
-			<view class="rig-btn" v-if="status_type === 2">
-				<view class="logistics sure" @click="confirmOrder(orderId)">确认收货</view>
-				<view v-if="delivery_type === 'express'" class="logistics" @click="logistics(orderId)">查看物流</view>
-			</view>
-			<view class="rig-btn" v-else-if="status_type === -1">
-				<view class="refund">申请退款中</view>
-			</view>
-			<view class="rig-btn" v-else-if="status_type === -2">
-				<view class="refund">已退款</view>
-			</view>
-			<view class="rig-btn" v-else-if="status_type === 4">
-				<view class="done">已完成</view>
-			</view>
-		</view>
-		<view class='goodWrapper'>
-			<view class='list' :class="{op:!item.is_valid}"
-				v-for="(item,index) in cartInfo" :key="index" @click="jumpCon(item.product_id)">
-				<view class="item acea-row row-between-wrapper">
-					<view class='pictrue'>
-						<image :src='item.productInfo.attrInfo.image' v-if="item.productInfo.attrInfo"></image>
-						<image :src='item.productInfo.image' v-else></image>
-					</view>
-					<view class='text'>
-						<view class='acea-row row-between-wrapper'>
-							<view class='name line1'>{{item.productInfo.store_name}}</view>
-							<view class='num'>x {{item.cart_num}}</view>
-						</view>
-						<view class='attr line1' v-if="item.productInfo.attrInfo">{{item.productInfo.attrInfo.suk}}</view>
-						<view class='money font-color pic'>
-							<text v-if="item.type != 8">
-								{{item.productInfo.attrInfo?item.productInfo.attrInfo.price:item.productInfo.price}}{{item.productInfo.is_brokerage == 0?'健康豆':'健康米'}}
-							</text>
-							<text class="valid" v-if="!item.is_valid">{{shippingType==0?'不送达':'不支持自提'}}</text>
-						</view>
-						<view class="posBnt acea-row row-middle">
-							<view class="evaluate writeOff" v-if="(statusType==5 || statusType==1 || statusType==2 || statusType==3) && (deliveryType==2 || sendType=='send')">
-								<text class="on" v-if="item.is_writeoff">已核销</text>
-								<text class="on" v-if="!item.is_writeoff && item.surplus_num<item.cart_num">已核销{{parseInt(item.cart_num)-parseInt(item.surplus_num)}}件</text>
-								<text v-if="!item.is_writeoff && item.surplus_num==item.cart_num">未核销</text>
-							</view>
-							<!-- #ifdef H5 || APP-PLUS -->
-							<slot name="bottom" :item="item"></slot>
-							<!-- #endif -->
-							<!-- #ifdef MP -->
-							<slot name="bottom{{index}}"></slot>
-							<!-- #endif -->
-							<text class="refund" v-if="item.refund_num && statusType !=-2">{{item.refund_num}}件退款中</text>
-						</view>
-					</view>
-				</view>
-				<view class="button acea-row row-right" v-if="item.type != 8">
-					<!-- <view class="bnt acea-row row-center-wrapper" v-if="refund_status === 0 && item.refund_num !=item.cart_num && paid && item.is_support_refund" @click.stop="openSubcribe(item,productType)">申请退款</view> -->
-					<view class='bnt acea-row row-center-wrapper' v-if='evaluate==3 && item.is_reply==0 && pid != -1'
-						@click.stop="evaluateTap(item.unique,orderId)">评价</view>
-					<view class='bnt acea-row row-center-wrapper' v-else-if="evaluate==3 && item.is_reply==1">已评价</view>
-				</view>
-				<!-- #ifdef H5 || APP-PLUS -->
-				<slot name="footer" :item="item"></slot>
-				<!-- #endif -->
-				<!-- #ifdef MP -->
-				<slot name="footer{{index}}"></slot>
-				<!-- #endif -->
-			</view>
-			<view class="giveGoods">
-				<view class="item acea-row row-between-wrapper" v-for="(item,index) in giveCartInfo" :key="item.id">
-					<view class="picTxt acea-row row-middle">
-						<view class="pictrue">
-							<image :src="item.productInfo.attrInfo.image" v-if="item.productInfo.attrInfo"></image>
-							<image :src="item.productInfo.image" v-else></image>
-						</view>
-						<view class="texts">
-							<view class="name line1">[赠品]{{item.productInfo.store_name}}</view>
-							<view class="limit line1" v-if="item.productInfo.attrInfo">{{item.productInfo.attrInfo.suk}}</view>
-						</view>
-					</view>
-					<view class="num">x{{item.cart_num}}</view>
-				</view>
-				<view class="item acea-row row-between-wrapper" v-for="(item,index) in giveData.give_coupon" :key="item.id" v-if="giveData.give_coupon.length">
-					<view class="picTxt acea-row row-middle">
-						<view class="pictrue acea-row row-center-wrapper">
-							<text class="iconfont icon-pc-youhuiquan"></text>
-						</view>
-						<view class="texts">
-							<view class="line1">[赠品]{{item.coupon_title}}</view>
-						</view>
-					</view>
-				</view>
-				<view class="item acea-row row-between-wrapper" v-if="giveData.give_integral>0">
-					<view class="picTxt acea-row row-middle">
-						<view class="pictrue acea-row row-center-wrapper">
-							<text class="iconfont icon-pc-jifen"></text>
-						</view>
-						<view class="texts">
-							<view class="line1">[赠品]{{giveData.give_integral}}积分</view>
-						</view>
-					</view>
-				</view>
-			</view>
-			<view class="more-operation" v-if="split && refund_status === 0" @click="changeOperation">
-				{{operationModel?'关闭':'更多操作'}}
-			</view>
-			<transition name="fade" mode="out-in" v-if="split && operationModel && refund_status === 0">
-				<!-- #ifdef MP -->
-				<!-- <view>
-					<view class="more-operation b-top" @click="openSubcribe">
-						申请退款
-					</view>
-				</view> -->
-				<!-- #endif -->
-				<!-- #ifndef MP -->
-				<!-- <navigator hover-class="none" :url="'/pages/goods/goods_return/index?orderId='+ orderId"
-					class='more-operation b-top'>申请退款
-				</navigator> -->
-				<!-- #endif -->
-			</transition>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		openOrderRefundSubscribe
-	} from '@/utils/SubscribeMessage.js';
-    import { type } from 'os';
-	export default {
-		props: {
-			productType:{
-				type: Number,
-				default: 0,
-			},
-			product_type:{
-				type: Number,
-				default: 0,
-			},
-			evaluate: {
-				type: Number,
-				default: 0,
-			},
-			paid: {
-				type: Number,
-				default: 0
-			},
-			// 订单状态
-			statusType: {
-				type: Number,
-				default: 0,
-			},
-			// 配送方式
-			deliveryType: {
-				type: Number,
-				default: 0,
-			},
-			// 送货方式
-			sendType: {
-				type: String,
-				default: '',
-			},
-			cartInfo: {
-				type: Array,
-				default: function() {
-					return [];
-				}
-			},
-			giveData:{
-				type:Object,
-				default: function() {
-					return [];
-				}
-			},
-			giveCartInfo:{
-				type: Array,
-				default: function() {
-					return [];
-				}
-			},
-			orderId: {
-				type: String,
-				default: '',
-			},
-			delivery_type: {
-				type: String,
-				default: '',
-			},
-			shippingType: {
-				type: Number,
-				default: 0,
-			},
-			id:{
-				type: Number,
-				default: 0,
-			},
-			oid:{
-				type: Number,
-				default: 0,
-			},
-			jump: {
-				type: Boolean,
-				default: false,
-			},
-			split: {
-				type: Boolean,
-				default: false,
-			},
-			jumpDetail: {
-				type: Boolean,
-				default: false,
-			},
-			index: {
-				type: Number,
-				default: 0,
-			},
-			pid: {
-				type: Number,
-				default: 0,
-			},
-			refund_status: {
-				type: Number,
-				default: -1,
-			},
-			status_type: {
-				type: Number,
-				default: 0,
-			},
-			// isGroup: {
-			// 	type: Boolean,
-			// 	default: false
-			// },
-			collageId: {
-				type: Number,
-				default: 0
-			}
-		},
-		data() {
-			return {
-				totaliveNmu:0,
-				totalNmu: 0,
-				operationModel: false,
-				status: ""
-			};
-		},
-		watch: {
-			cartInfo: function(nVal, oVal) {
-				console.log(this.$parent)
-				let num = 0
-				nVal.forEach((item, index) => {
-					num += item.cart_num
-				})
-				this.totalNmu = num
-			},
-			giveCartInfo:function(nVal, oVal){
-				let num = 0
-				nVal.forEach((item, index) => {
-					num += item.cart_num
-				})
-				this.totaliveNmu = num
-			},
-			giveData(val) {
-				console.log(val)
-			}
-		},
-		methods: {
-			evaluateTap: function(unique, orderId) {
-				uni.navigateTo({
-					url: "/pages/goods/goods_comment_con/index?unique=" + unique + "&uni=" + orderId
-				})
-			},
-			jumpCon: function(id) {
-				if (this.jump) {
-					uni.navigateTo({
-						url: `/pages/goods_details/index?id=${id}`
-					})
-				} else if (this.jumpDetail) {
-					uni.navigateTo({
-						url: `/pages/goods/order_details/index?order_id=${this.orderId}`
-					})
-				}
-			},
-			logistics(order_id) {
-				uni.navigateTo({
-					url: '/pages/goods/goods_logistics/index?orderId=' + order_id
-				})
-			},
-			confirmOrder(orderId) {
-				this.$emit('confirmOrder', orderId)
-			},
-			changeOperation() {
-				this.operationModel = !this.operationModel
-			},
-			openSubcribe: function(item,productType) {
-				let cartIds = [
-						{
-							cart_id:item.id,
-							cart_num:parseInt(item.cart_num) - parseInt(item.refund_num)
-						}
-				]
-				cartIds = JSON.stringify(cartIds);
-				let page = `/pages/goods/goods_return/index?orderId=`+this.orderId+ '&id=' + this.oid+ '&cartIds='+ cartIds+'&productType='+this.productType;
-				// #ifdef MP
-				uni.showLoading({
-					title: '正在加载',
-				})
-				openOrderRefundSubscribe().then(res => {
-					uni.hideLoading();
-					uni.navigateTo({
-						url: page,
-					});
-				}).catch(() => {
-					uni.hideLoading();
-				});
-				// #endif
-				// #ifndef MP
-				uni.navigateTo({
-					url: page
-				})
-				// #endif
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.giveGoods{
-		.item{
-			padding: 14rpx 30rpx 14rpx 0;
-			margin-left: 30rpx;
-			border-bottom: 1px solid #eee;
-			.picTxt{
-				.pictrue{
-					width: 76rpx;
-					height: 76rpx;
-					border-radius: 6rpx;
-					background-color: #F5F5F5;
-					color: var(--view-theme);
-					.iconfont{
-						font-size: 34rpx;
-					}
-					image{
-						width: 100%;
-						height: 100%;
-						border-radius: 6rpx;
-					}
-					margin-right: 16rpx;
-				}
-				.texts{
-					width: 360rpx;
-					color: #999999;
-					font-size: 20rpx;
-					.name{
-						color: #333;
-					}
-					.limit{
-						font-size: 20rpx;
-						margin-top: 4rpx;
-					}
-				}
-			}
-			.num{
-				color: #999999;
-				font-size: 20rpx;
-			}
-		}
-	}
-	.goodWrapper .list .button{
-		margin-bottom: 16rpx;
-		.bnt{
-			font-size: 24rpx;
-			color: #666;
-			width: 140rpx;
-			height: 48rpx;
-			border-radius: 23rpx;
-			border: 1rpx solid #CCCCCC;
-			margin-left: 20rpx;
-		}
-	}
-	.goodWrapper .item .text .posBnt{
-		position: absolute;
-		right: 0;
-		bottom: -5rpx
-	}
-	.goodWrapper .item .text .refund{
-		font-size: 24rpx;
-		color: #E93323;
-		margin-left: 20rpx;
-	}
-	.goodWrapper .item .text .writeOff{
-		border: 0;
-		width: unset;
-		font-size: 20rpx;
-		color: #1890FF;
-	}
-	.goodWrapper .item .text .writeOff .on{
-		color: #999;
-	}
-	.fontcolor {
-		color: var(--view-theme);
-	}
-
-	.orderGoods {
-		background-color: #fff;
-		margin-top: 12rpx;
-		&.on{
-			margin-top: 0;
-		}
-	}
-
-	.orderGoods .total {
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		width: 100%;
-		// height: 86rpx;
-		padding: 0 30rpx;
-		border-bottom: 2rpx solid #f0f0f0;
-		font-size: 30rpx;
-		color: #282828;
-		line-height: 86rpx;
-		box-sizing: border-box;
-
-		.rig-btn {
-			display: flex;
-			align-items: center;
-
-			.refund {
-				font-size: 26rpx;
-				color: var(--view-theme);
-			}
-
-			.done {
-				font-size: 26rpx;
-				color: #F19D2F;
-			}
-		}
-
-		.logistics {
-			// height: 46rpx;
-			line-height: 30rpx;
-			color: #999999;
-			font-size: 20rpx;
-			border: 1px solid;
-			border-radius: 30rpx;
-			padding: 6rpx 12rpx;
-			margin-left: 10rpx;
-		}
-
-		.sure {
-			color: var(--view-theme);
-			border: 1px solid var(--view-theme);
-		}
-		
-		.navigator {
-			font-size: 24rpx;
-			color: #999999;
-			
-			.iconfont {
-				margin-left: 10rpx;
-				font-size: 24rpx;
-				color: #999999;
-			}
-		}
-	}
-
-	.more-operation {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		padding: 10rpx 0;
-		color: #bbb;
-	}
-
-	.b-top {
-		margin-left: 30rpx;
-		margin-right: 30rpx;
-		border-top: 1px solid #f0f0f0
-	}
-
-	.fade-enter-active,
-	.fade-leave-active {
-		transition: all 0.1s;
-	}
-
-	.fade-enter,
-	.fade-leave-to
-
-	/* .fade-leave-active below version 2.1.8 */
-		{
-		opacity: 0;
-		transform: translateY(-10px);
-	}
-
-	.op {
-		opacity: 0.5;
-	}
-
-	.pic {
-		display: flex;
-		justify-content: space-between;
-	}
-
-	.valid {
-		font-size: 24rpx;
-	}
-</style>

+ 0 - 160
components/pageFooter/index.vue

@@ -1,160 +0,0 @@
-<template>
-	<!-- 底部导航 -->
-	<view>
-		<view v-if="newData.bgColor">
-			<view class="page-footer" id="target" :style="{'background-color':newData.bgColor.color[0].item}">
-				<view class="foot-item" v-for="(item,index) in newData.menuList" :key="index" @click="goRouter(item)">
-					<block v-if="item.link.split('?')[0] == activeRouter">
-						<image :src="item.imgList[0]"></image>
-						<view class="txt" :style="{color:newData.activeTxtColor.color[0].item}">{{item.name}}</view>
-					</block>
-					<block v-else>
-						<image :src="item.imgList[1]"></image>
-						<view class="txt" :style="{color:newData.txtColor.color[0].item}">{{item.name}}</view>
-					</block>
-					<!-- <div class="count-num"
-						v-if="item.link === '/pages/order_addcart/order_addcart' && cartNum>0">
-						{{cartNum}}
-					</div> -->
-					<uni-badge v-if="item.link === '/pages/order_addcart/order_addcart' && cartNum>0" class="uni-badge-left-margin" :text="cartNum" absolute="rightTop">
-					</uni-badge>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {
-		mapState,
-		mapGetters
-	} from "vuex"
-	import {
-		getNavigation
-	} from '@/api/public.js'
-	import {
-		getCartCounts,
-	} from '@/api/order.js';
-	export default {
-		name: 'pageFooter',
-		props: {},
-		computed: mapGetters(['isLogin', 'cartNum']),
-		created() {
-			let routes = getCurrentPages(); //获取当前打开过的页面路由数组
-			let curRoute = routes[routes.length - 1].route //获取当前页面路由
-			this.activeRouter = '/' + curRoute
-		},
-		mounted() {
-			this.navigationInfo();
-			if (this.isLogin) {
-				this.getCartNum()
-			}
-		},
-		data() {
-			return {
-				newData: {},
-				activeRouter:''
-			}
-		},
-		methods: {
-			navigationInfo(){
-				getNavigation().then(res => {
-					this.newData = res.data
-					console.log(this.newData.status,'this.newData.status')
-					this.$emit('newDataStatus', this.newData.status?this.newData.status.status:false)
-					if (this.newData.status && this.newData.status.status) {
-						uni.hideTabBar()
-					} else {
-						uni.hideTabBar()
-					}
-				})
-			},
-			goRouter(item) {
-				var pages = getCurrentPages();
-				var page = (pages[pages.length - 1]).$page.fullPath;
-				if (item.link == page) return
-				if(item.link == '/pages/short_video/appSwiper/index' || item.link == '/pages/short_video/nvueSwiper/index'){
-					//#ifdef APP
-					item.link = '/pages/short_video/appSwiper/index'
-					//#endif
-					//#ifndef APP
-					item.link = '/pages/short_video/nvueSwiper/index'
-					//#endif
-				}
-				uni.switchTab({
-					url: item.link,
-					fail(err) {
-						uni.redirectTo({
-							url: item.link
-						})
-					}
-				})
-			},
-			getCartNum: function() {
-				let id = uni.getStorageSync('user_store_id') || 0;
-				getCartCounts(0,id).then(res => {
-					this.$store.commit('indexData/setCartNum', res.data.count + '')
-				});
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.page-footer {
-		position: fixed;
-		bottom: 0;
-		z-index: 666;
-		display: flex;
-		align-items: center;
-		justify-content: space-around;
-		width: 100%;
-		height: calc(98rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		height: calc(98rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-		box-sizing: border-box;
-		border-top: solid 1rpx #F3F3F3;
-		background-color: #fff;
-		box-shadow: 0px 0px 17rpx 1rpx rgba(206, 206, 206, 0.32);
-		padding-bottom: constant(safe-area-inset-bottom); ///兼容 IOS<11.2/
-		padding-bottom: env(safe-area-inset-bottom); ///兼容 IOS>11.2/
-		
-		.foot-item {
-			display: flex;
-			width: max-content;
-			align-items: center;
-			justify-content: center;
-			flex-direction: column;
-			position: relative;
-
-			.count-num {
-				position: absolute;
-				display: flex;
-				justify-content: center;
-				align-items: center;
-				width: 40rpx;
-				height: 40rpx;
-				top: 0rpx;
-				right: -15rpx;
-				color: #fff;
-				font-size: 20rpx;
-				background-color: #FD502F;
-				border-radius: 50%;
-				padding: 4rpx;
-			}
-		}
-
-		.foot-item image {
-			height: 50rpx;
-			width: 50rpx;
-			text-align: center;
-			margin: 0 auto;
-		}
-
-		.foot-item .txt {
-			font-size: 24rpx;
-
-
-			&.active {}
-		}
-	}
-</style>

+ 0 - 478
components/payment/index.vue

@@ -1,478 +0,0 @@
-<template>
-	<!-- 支付弹窗 -->
-	<view :style="colorStyle">
-		<view class="payment" :class="pay_close ? 'on' : ''">
-			<view class="title acea-row row-center-wrapper">
-				选择付款方式<text class="iconfont icon-guanbi" @click='close'></text>
-			</view>
-			<view class="item acea-row row-between-wrapper" v-for="(item,index) in payMode" :key="index"
-				v-if='item.payStatus' @click="payType(item.number || 0 , item.value,index)">
-				<view class="left acea-row row-between-wrapper">
-					<view class="iconfont" :class="item.icon"></view>
-					<view class="text">
-						<view class="name">{{item.name}}</view>
-						<view class="info" v-if="item.value == 'yue'">
-							{{item.title}} <span class="money">{{ item.number }}</span>
-						</view>
-						<view class="info" v-else-if="item.value == 'brokerage'">
-							{{item.title}} <span class="money">{{ item.number }}</span>
-						</view>
-						<view class="info" v-else>{{item.title}}</view>
-					</view>
-				</view>
-				<view class="iconfont" :class="active==index?'icon-xuanzhong11 font-num':'icon-weixuan'"></view>
-			</view>
-			<view class="payMoney">支付<span class="font-color"><span class="money">{{totalPrice}}</span>{{paytype == 'weixin'?'元':paytype == 'yue'?'健康豆':'健康米'}}</span></view>
-			<view class="button bg-color acea-row row-center-wrapper" @click='goPay(number, paytype)'>去付款</view>
-			<slot name="buttom"></slot>
-		</view>
-		<view class="mask" @click='close' v-if="pay_close"></view>
-		<view v-show="false" v-html="formContent"></view>
-	</view>
-</template>
-
-<script>
-	import {
-		orderPay
-	} from '@/api/order.js';
-	import colors from '@/mixins/color.js';
-	export default {
-		props: {
-			payMode: {
-				type: Array,
-				default: function() {
-					return [];
-				}
-			},
-			pay_close: {
-				type: Boolean,
-				default: false,
-			},
-			order_id: {
-				type: String,
-				default: ''
-			},
-			is_brokerage:{},
-			totalPrice:'',
-			isCall: {
-				type: Boolean,
-				default: false
-			}
-		},
-		mixins:[colors],
-		data() {
-			return {
-				formContent: '',
-				active: 0,
-				paytype: '',
-				number: 0
-			};
-		},
-		watch: {
-			payMode: {
-				handler(newV, oldValue) {
-					let newPayList = [];
-					newV.forEach((item, index) => {
-						if (item.payStatus) {
-							item.index = index;
-							newPayList.push(item)
-						}
-					});
-					this.active = newPayList[0].index;
-					this.paytype = newPayList[0].value;
-					this.number = newPayList[0].number || 0;
-				},
-				immediate: true,
-				deep: true
-			}
-		},
-		methods: {
-			payType(number, paytype, index) {
-				this.active = index;
-				this.paytype = paytype;
-				this.number = number;
-				console.log(this.paytype,'this.paytype')
-				this.$emit('changePayType', paytype)
-			},
-			close: function() {
-				this.$emit('onChangeFun', {
-					action: 'payClose'
-				});
-			},
-			goPay: function(number, paytype) {
-				if (this.isCall) {
-					return this.$emit('onChangeFun', {
-						action: 'payCheck',
-						value: paytype
-					});
-				}
-				let that = this;
-				if (!that.order_id) return that.$util.Tips({
-					title: '请选择要支付的订单'
-				});
-				if (paytype == 'yue' && parseFloat(number) < parseFloat(that.totalPrice)) 
-					return that.$util.Tips({
-						title: '健康豆不足!'
-					});
-				if (paytype == 'brokerage' && parseFloat(number) < parseFloat(that.totalPrice)) 
-					return that.$util.Tips({
-						title: '健康米不足!'
-					});
-				uni.showLoading({
-					title: '支付中'
-				});
-
-				orderPay({
-					uni: that.order_id,
-					paytype: paytype,
-					// #ifdef MP 
-					'from': 'routine',
-					// #endif
-					// #ifdef H5
-					'from': this.$wechat.isWeixin() ? 'weixin' : 'weixinh5',
-					// #endif
-					// #ifdef H5
-					quitUrl: location.port ? location.protocol + '//' + location.hostname + ':' + location
-						.port +
-						'/pages/goods/order_details/index?order_id=' + this.order_id : location.protocol +
-						'//' + location.hostname +
-						'/pages/goods/order_details/index?order_id=' + this.order_id
-					// #endif
-					// #ifdef APP-PLUS
-					quitUrl: '/pages/goods/order_details/index?order_id=' + this.order_id
-					// #endif
-				}).then(res => {
-					let jsConfig = res.data.result.jsConfig;
-					switch (paytype) {
-						case 'weixin':
-							if (res.data.result === undefined) return that.$util.Tips({
-								title: '缺少支付参数'
-							});
-
-							// #ifdef MP
-							let mp_pay_name=''
-							if(uni.requestOrderPayment){
-								mp_pay_name='requestOrderPayment'
-							}else{
-								mp_pay_name='requestPayment'
-							}
-							uni[mp_pay_name]({
-								timeStamp: jsConfig.timestamp,
-								nonceStr: jsConfig.nonceStr,
-								package: jsConfig.package,
-								signType: jsConfig.signType,
-								paySign: jsConfig.paySign,
-								success: function(res) {
-									uni.hideLoading();
-									return that.$util.Tips({
-										title: res.msg,
-										icon: 'success'
-									}, () => {
-										that.$emit('onChangeFun', {
-											action: 'pay_complete'
-										});
-									});
-								},
-								fail: function(e) {
-									uni.hideLoading();
-									return that.$util.Tips({
-										title: '取消支付'
-									}, () => {
-										that.$emit('onChangeFun', {
-											action: 'pay_fail'
-										});
-									});
-								},
-								complete: function(e) {
-									uni.hideLoading();
-									if (e.errMsg == 'requestPayment:cancel') return that.$util
-										.Tips({
-											title: '取消支付'
-										}, () => {
-											that.$emit('onChangeFun', {
-												action: 'pay_fail'
-											});
-										});
-								},
-							});
-							// #endif
-							// #ifdef H5
-							let data = res.data;
-							if (data.status == "WECHAT_H5_PAY") {
-								uni.hideLoading();
-								location.replace(data.result.jsConfig.mweb_url);
-								return that.$util.Tips({
-									title: "支付成功",
-									icon: 'success'
-								}, () => {
-									that.$emit('onChangeFun', {
-										action: 'pay_complete'
-									});
-								});
-							} else {
-								that.$wechat.pay(data.result.jsConfig)
-									.then(() => {
-										return that.$util.Tips({
-											title: "支付成功",
-											icon: 'success'
-										}, () => {
-											that.$emit('onChangeFun', {
-												action: 'pay_complete'
-											});
-										});
-									})
-									.catch(function(res) {
-										if (res.errMsg == 'chooseWXPay:cancel') return that.$util.Tips({
-											title: '取消支付'
-										},() => {
-											that.$emit('onChangeFun', {
-												action: 'pay_fail'
-											});
-										});
-									});
-							}
-							// #endif
-							// #ifdef APP-PLUS
-							uni.requestPayment({
-								provider: 'wxpay',
-								orderInfo: jsConfig,
-								success: (e) => {
-									let url = '/pages/goods/order_pay_status/index?order_id=' + orderId +
-										'&msg=支付成功';
-									uni.showToast({
-										title: "支付成功"
-									})
-									setTimeout(res => {
-										that.$emit('onChangeFun', {
-											action: 'pay_complete'
-										});
-									}, 2000)
-								},
-								fail: (e) => {
-									uni.showModal({
-										content: "支付失败",
-										showCancel: false,
-										success: function(res) {
-											if (res.confirm) {
-												that.$emit('onChangeFun', {
-													action: 'pay_fail'
-												});
-											} else if (res.cancel) {}
-										}
-									})
-								},
-								complete: () => {
-									uni.hideLoading();
-								},
-							});
-							// #endif
-							break;
-						case 'yue':
-							uni.hideLoading();
-							return that.$util.Tips({
-								title: res.msg,
-								icon: 'success'
-							}, () => {
-								that.$emit('onChangeFun', {
-									action: 'pay_complete'
-								});
-							});
-							break;
-						case 'offline':
-							uni.hideLoading();
-							return that.$util.Tips({
-								title: res.msg,
-								icon: 'success'
-							}, () => {
-								that.$emit('onChangeFun', {
-									action: 'pay_complete'
-								});
-							});
-							break;
-						case 'alipay':
-							uni.hideLoading();
-							//#ifdef H5
-							if (this.$wechat.isWeixin()) {
-								uni.redirectTo({
-									url: `/pages/users/alipay_invoke/index?id=${res.data.result.order_id}&pay_key=${res.data.result.pay_key}`
-								});
-							} else {
-								uni.hideLoading();
-								that.formContent = res.data.result.jsConfig;
-								that.$nextTick(() => {
-									document.getElementById('alipaysubmit').submit();
-								});
-							}
-							//#endif
-							// #ifdef MP
-							uni.navigateTo({
-								url: `/pages/users/alipay_invoke/index?id=${res.data.result.order_id}&link=${res.data.result.jsConfig.qrCode}`
-							});
-							// #endif
-							// #ifdef APP-PLUS
-							uni.requestPayment({
-								provider: 'alipay',
-								orderInfo: jsConfig,
-								success: (e) => {
-									uni.showToast({
-										title: "支付成功"
-									})
-									setTimeout(res => {
-										that.$emit('onChangeFun', {
-											action: 'pay_complete'
-										});
-									}, 2000)
-
-								},
-								fail: (e) => {
-									uni.showModal({
-										content: "支付失败",
-										showCancel: false,
-										success: function(res) {
-											if (res.confirm) {
-												that.$emit('onChangeFun', {
-													action: 'pay_fail'
-												});
-											} else if (res.cancel) {}
-										}
-									})
-								},
-								complete: () => {
-									uni.hideLoading();
-								},
-							});
-							// #endif
-							break;
-					}
-				}).catch(err => {
-					uni.hideLoading();
-					return that.$util.Tips({
-						title: err
-					}, () => {
-						that.$emit('onChangeFun', {
-							action: 'pay_fail'
-						});
-					});
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.bgcolor{
-		background-color: var(--view-theme)
-	}
-	.payment {
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		border-radius: 16rpx 16rpx 0 0;
-		background-color: #fff;
-		padding-bottom: 60rpx;
-		z-index: 999;
-		transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
-		transform: translate3d(0, 100%, 0);
-
-		.payMoney {
-			font-size: 28rpx;
-			color: #333333;
-			text-align: center;
-			margin-top: 50rpx;
-
-			.font-color {
-				margin-left: 10rpx;
-
-				.money {
-					font-size: 40rpx;
-				}
-			}
-		}
-
-		.button {
-			width: 690rpx;
-			height: 90rpx;
-			border-radius: 45rpx;
-			color: #FFFFFF;
-			margin: 20rpx auto 0 auto;
-		}
-	}
-
-	.payment.on {
-		transform: translate3d(0, 0, 0);
-	}
-
-	.payment .title {
-		text-align: center;
-		height: 123rpx;
-		font-size: 32rpx;
-		color: #282828;
-		font-weight: bold;
-		padding-right: 30rpx;
-		margin-left: 30rpx;
-		position: relative;
-		border-bottom: 1rpx solid #eee;
-	}
-
-	.payment .title .iconfont {
-		position: absolute;
-		right: 30rpx;
-		top: 50%;
-		transform: translateY(-50%);
-		font-size: 38rpx;
-		color: #8a8a8a;
-		font-weight: normal;
-	}
-
-	.payment .item {
-		border-bottom: 1rpx solid #eee;
-		height: 130rpx;
-		margin-left: 30rpx;
-		padding-right: 30rpx;
-	}
-
-	.payment .item .left {
-		width: 610rpx;
-	}
-
-	.payment .item .left .text {
-		width: 540rpx;
-	}
-
-	.payment .item .left .text .name {
-		font-size: 32rpx;
-		color: #282828;
-	}
-
-	.payment .item .left .text .info {
-		font-size: 24rpx;
-		color: #999;
-	}
-
-	.payment .item .left .text .info .money {
-		color: #ff9900;
-	}
-
-	.payment .item .left .iconfont {
-		font-size: 45rpx;
-		color: #09bb07;
-	}
-
-	.payment .item .left .iconfont.icon-zhifubao {
-		color: #00aaea;
-	}
-
-	.payment .item .left .iconfont.icon-yuezhifu {
-		color: #ff9900;
-	}
-
-	.payment .item .left .iconfont.icon-yuezhifu1 {
-		color: #eb6623;
-	}
-
-	.payment .item .iconfont {
-		font-size: 40rpx;
-		color: #ccc;
-	}
-</style>

+ 0 - 199
components/privacyAgreementPopup/index.vue

@@ -1,199 +0,0 @@
-<template>
-	<view :style="colorStyle">
-		<view class="mask" @touchmove.prevent :hidden="isShow === false"></view>
-		<view class="product-window" :class="{'on':isShow}">
-			<view class="mp-data">
-				<text class="mp-name">服务与隐私协议</text>
-			</view>
-			<view class="trip-msg">
-				<view class="trip">
-					{{`请仔细阅读以下内容,并作出适当的选择:`}}
-				</view>
-			</view>
-			<view class="trip-title">
-				隐私政策概要
-			</view>
-			<view class="trip-msg">
-				<view class="trip">
-					当您点击同意并继续使用产品服务时,即表示您已理解并同意该条款内容,该条款将对您产生法律约束力。如您拒绝,将无法继续下一步操作。
-				</view>
-			</view>
-			<view class="main-color" @click.stop="privacy('privacy')">点击阅读{{agreementName}}</view>
-			<view class="bottom">
-				<button class="save open" type="default" id="agree-btn" open-type="agreePrivacyAuthorization"
-					@agreeprivacyauthorization="handleAgree">同意并继续</button>
-				<button class="reject" @click="rejectAgreement">取消</button>
-			</view>
-		</view>
-	</view>
-
-</template>
-
-<script>
-	import colors from "@/mixins/color";
-	export default {
-		mixins: [colors],
-		data() {
-			return {
-				isShow: false,
-				agreementName: '',
-				configData: this.$Cache.get('BASIC_CONFIG'),
-			};
-		},
-		mounted() {
-			wx.getPrivacySetting({
-				success: res => {
-					if (res.needAuthorization) {
-						// 需要弹出隐私协议
-						this.isShow = true
-						this.agreementName = res.privacyContractName
-					} else {
-						this.$emit('onAgree');
-						// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用已声明过的隐私接口
-						// wx.getUserProfile()
-						// wx.chooseMedia()
-						// wx.getClipboardData()
-						// wx.startRecord()
-					}
-				},
-				fail: () => {},
-				complete: () => {}
-			})
-		},
-		methods: {
-			// 同意
-			handleAgree() {
-				this.isShow = false
-				this.$emit('onAgree');
-			},
-			// 拒绝
-			rejectAgreement() {
-				this.isShow = false
-				uni.switchTab({
-					url: '/pages/index/index'
-				})
-				this.$emit('onReject');
-			},
-			// 跳转协议
-			privacy(type) {
-				uni.navigateTo({
-					url: "/pages/users/privacy/index?type=" + type
-				})
-			},
-		}
-	}
-</script>
-<style>
-	.pl-sty {
-		color: #999999;
-		font-size: 30rpx;
-	}
-</style>
-<style scoped lang="scss">
-	.product-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-
-	.mask {
-		z-index: 99;
-	}
-
-	.product-window {
-		position: fixed;
-		bottom: 0;
-		width: 100%;
-		left: 0;
-		background-color: #fff;
-		z-index: 1000;
-		border-radius: 40rpx 40rpx 0 0;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-		padding: 64rpx 40rpx;
-		padding-bottom: 38rpx;
-		padding-bottom: calc(38rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		padding-bottom: calc(38rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-		box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);
-
-		.icon-guanbi {
-			position: absolute;
-			top: 40rpx;
-			right: 40rpx;
-			font-size: 24rpx;
-			font-weight: bold;
-			color: #999;
-		}
-
-		.mp-data {
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			margin-bottom: 40rpx;
-
-			.mp-name {
-				font-size: 34rpx;
-				font-weight: 500;
-				color: #333333;
-				line-height: 48rpx;
-			}
-		}
-
-		.trip-msg {
-			padding-bottom: 32rpx;
-
-			.title {
-				font-size: 30rpx;
-				font-weight: bold;
-				color: #000;
-				margin-bottom: 6rpx;
-			}
-
-			.trip {
-				color: #333333;
-				font-size: 28rpx;
-				font-family: PingFang SC-Regular, PingFang SC;
-				font-weight: 400;
-			}
-		}
-
-		.trip-title {
-			font-size: 28rpx;
-			font-weight: 500;
-			color: #333333;
-			margin-bottom: 8rpx;
-		}
-
-		.main-color {
-			font-size: 28rpx;
-			font-weight: 400;
-			color: var(--view-theme);
-			margin-bottom: 40rpx;
-		}
-
-		.bottom {
-			display: flex;
-			align-items: center;
-			justify-content: center;
-			flex-direction: column;
-
-			.save,
-			.reject {
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				width: 670rpx;
-				height: 80rpx;
-				border-radius: 80rpx;
-				background-color: #F5F5F5;
-				color: #333;
-				font-size: 30rpx;
-				font-weight: 500;
-			}
-
-			.save {
-				background-color: var(--view-theme);
-				color: #fff;
-				margin-bottom: 24rpx;
-			}
-		}
-	}
-</style>

+ 0 - 186
components/productConSwiper/index.vue

@@ -1,186 +0,0 @@
-<template>
-	<!-- 商品详情轮播图 -->
-	<view class='product-bg'>
-		<swiper :indicator-dots="indicatorDots" indicator-active-color="var(--view-theme)" :autoplay="autoplay" :circular="circular"
-		 :interval="interval" :duration="duration" @change="change" v-if="isPlay">
-		 <!-- #ifndef APP-PLUS -->
-			<swiper-item v-if="videoline">
-				<view class="item">
-					<view v-show="!controls" class="item-box">
-						<video id="myVideo" :src='videoline' objectFit="cover" controls style="width:100%;height:100% "
-						 show-center-play-btn show-mute-btn="true" auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false" :poster="imgUrls[0]" @pause="videoPause"></video>
-					</view>
-					<view class="poster" v-show="controls">
-						<image class="image" :src="imgUrls[0]"></image>
-					</view>
-					<view class="stop" v-show="controls" @tap="bindPause">
-						<image class="image" src="../../static/images/stop.png"></image>
-					</view>
-				</view>
-			</swiper-item>
-			<!-- #endif -->
-			<!-- #ifdef APP-PLUS -->
-			<swiper-item v-if="videoline">
-				<view class="item">
-					<view class="poster" v-show="controls">
-						<image class="image" :src="imgUrls[0]"></image>
-					</view>
-					<view class="stop" v-show="controls" @tap="bindPause">
-						<image class="image" src="../../static/images/stop.png"></image>
-					</view>
-				</view>
-			</swiper-item>
-			<!-- #endif -->
-			<block v-for="(item,index) in imgUrls" :key='index'>
-				<swiper-item v-if="videoline?index>=1:index>=0">
-					<image :src="item" class="slide-image" />
-				</swiper-item>
-			</block>
-		</swiper>
-		<!-- #ifdef APP-PLUS -->
-		<view v-if="!isPlay" style="width: 100%; height: 750rpx;">
-			<video id="myVideo" :src='videoline' objectFit="cover" controls style="width:100%;height:100% "
-			 show-center-play-btn show-mute-btn="true" autoplay="true" auto-pause-if-navigate :custom-cache="false" :enable-progress-gesture="false" :poster="imgUrls[0]" @pause="videoPause"></video>
-		</view>
-		<!-- #endif -->
-	</view>
-</template>
-
-<script>
-	export default {
-		props: {
-			imgUrls: {
-				type: Array,
-				default: function() {
-					return [];
-				}
-			},
-			videoline: {
-				type: String,
-				value: ""
-			}
-		},
-		data() {
-			return {
-				indicatorDots: true,
-				circular: true,
-				autoplay: true,
-				interval: 3000,
-				duration: 500,
-				currents: "1",
-				controls: true,
-				isPlay:true,
-				videoContext:''
-			};
-		},
-		mounted() {
-			if(this.videoline){
-				this.imgUrls.shift()
-			}
-			// #ifndef APP-PLUS
-			this.videoContext = uni.createVideoContext('myVideo', this);
-			// #endif
-		},
-		methods: {
-			videoPause(e){
-				// #ifdef APP-PLUS
-				this.isPlay= true
-				this.autoplay = true
-				// #endif
-			},
-			bindPause: function() {
-				
-				// #ifndef APP-PLUS
-				this.videoContext.play();
-				this.$set(this, 'controls', false)
-				this.autoplay = false
-				// #endif
-				// #ifdef APP-PLUS
-				this.isPlay= false
-				this.videoContext = uni.createVideoContext('myVideo', this);
-				this.videoContext.play();
-				// #endif
-			},
-			change: function(e) {
-				this.$set(this, 'currents', e.detail.current + 1);
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss"> 
-  .item-box {
-    width:100%;
-    height:100% 
-  }
-	.product-bg {
-		width: 100%;
-		height: 750rpx;
-		position: relative;
-	}
-
-	.product-bg swiper {
-		width: 100%;
-		height: 100%;
-		position: relative;
-	}
-
-	.product-bg .slide-image {
-		width: 100%;
-		height: 100%;
-	}
-
-	.product-bg .pages {
-		position: absolute;
-		background-color: #fff;
-		height: 34rpx;
-		padding: 0 10rpx;
-		border-radius: 3rpx;
-		right: 30rpx;
-		bottom: 30rpx;
-		line-height: 34rpx;
-		font-size: 24rpx;
-		color: #050505;
-	}
-
-	#myVideo {
-		width: 100%;
-		height: 100%
-	}
-
-	.product-bg .item {
-		position: relative;
-		width: 100%;
-		height: 100%;
-	}
-
-	.product-bg .item .poster {
-		position: absolute;
-		top: 0;
-		left: 0;
-		height: 750rpx;
-		width: 100%;
-		z-index: 9;
-	}
-
-	.product-bg .item .poster .image {
-		width: 100%;
-		height: 100%;
-	}
-
-	.product-bg .item .stop {
-		position: absolute;
-		top: 50%;
-		left: 50%;
-		width: 136rpx;
-		height: 136rpx;
-		margin-top: -68rpx;
-		margin-left: -68rpx;
-		z-index: 9;
-	}
-
-	.product-bg .item .stop .image {
-		width: 100%;
-		height: 100%;
-	}
-</style>

+ 0 - 860
components/productWindow/index.vue

@@ -1,860 +0,0 @@
-<template>
-	<!-- 商品属性规格弹窗 -->
-	<view>
-		<view class="product-window"
-			:class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt?'join':'') + ' ' + (iScart?'joinCart':'')">
-			<view class="textpic acea-row row-between-wrapper">
-				<view class="pictrue" @click="showImg()">
-					<image :src="attr.productSelect.image"></image>
-					<view class="icon acea-row row-center-wrapper" v-if="cusPreviewImg">
-						<view class="iconfont icon-fangda1"></view>
-					</view>
-				</view>
-				<view class="text">
-					<view class="line1">
-						{{ type == 'setMeal'?title : attr.productSelect.store_name }}
-					</view>
-					<view class="money font-color">
-						<view class="acea-row row-middle">
-							<text v-if="type =='points'">
-								<text v-if="parseFloat(attr.productSelect.integral)"><text class="num">{{ attr.productSelect.integral }}</text>积分</text>
-								<text v-if="parseFloat(attr.productSelect.price) && parseFloat(attr.productSelect.integral)">+</text>
-								<text v-if="parseFloat(attr.productSelect.price)">¥<text class="num">{{ attr.productSelect.price }}</text></text>
-							</text>
-							<text v-else>¥<text class="num">{{ attr.productSelect.price }}</text></text>
-							<text class='vip-money'
-								v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'member'">¥{{attr.productSelect.vip_price}}</text>
-							<view class="vipImg" v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'member'">
-								<image src="../../static/images/vip.png"></image>
-							</view>
-							
-							<view class="icon" v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'level'"><text class="iconfont icon-dengjitubiao"></text>{{storeInfo.level_name}}</view>
-							
-						</view>
-						<text class="stock" v-if='isShow'>库存: {{ attr.productSelect.stock }}</text>
-						<text class='stock' v-if="limitNum">{{type == 'seckill' ? '限量' : type == 'points'?'剩余':'库存'}}: {{attr.productSelect.quota}}</text>
-						<slot name="bottom" :attr="attr"></slot>
-					</view>
-				</view>
-				<view class="iconfont icon-guanbi" @click="closeAttr"></view>
-			</view>
-			<view class="rollTop">
-				<view class="productWinList">
-					<view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
-						<view class="title">{{ item.attr_name }}</view>
-						<view class="listn acea-row row-middle">
-							<view class="itemn" :class="item.index === itemn.attr ? 'on' : ''"
-								v-for="(itemn, indexn) in item.attr_value" @click="tapAttr(indexw, indexn)"
-								:key="indexn">
-								{{ itemn.attr }}
-							</view>
-						</view>
-					</view>
-					<view class="item" v-if="isDelivery">
-						 <view class="title">配送方式</view>
-						 <view class="listn acea-row row-middle">
-							 <view class="itemn" v-if="attr.deliveryType.includes('1')" @click="getstoreInfo('1')" :class="flag==1?'on':isStoreBuy?'on2':''">商城配送</view>
-							 <view class="itemn" v-if="attr.deliveryType.includes('2') && attr.store_self_mention && selfStoreList.length" @click="getstoreInfo('2')" :class="flag==2?'on':''">门店自提</view>
-							 <view class="itemn" v-if="attr.deliveryType.includes('3') && storeList.length" @click="getstoreInfo('3')" :class="flag==3?'on':''">门店配送</view>
-						 </view>
-					</view>
-					<view class="address acea-row row-middle" v-if="flag ==1 && isDelivery" @click="openAddress">
-						<view class="adsInfo">{{addressInfo}}</view>
-						<view class="iconfont icon-gengduo3"></view>
-					</view>
-					<view class="address acea-row row-middle" v-if="flag ==3 && isDelivery" @click="openStore">
-						<view class="adsInfo">{{deliveryName}}{{deliveryAddress}}{{distance}}</view>
-						<view class="iconfont icon-gengduo3" v-if="attr.isType != 1"></view>
-					</view>
-					<view class="address" v-if="flag ==2 && isDelivery"  @click="openStore">
-						<view>{{deliveryName}}</view>
-						<view class="info acea-row row-between-wrapper">
-							<view class="con">{{deliveryAddress}}</view>
-							<view>{{distance}}<text class="iconfont icon-gengduo3" v-if="attr.isType != 1"></text></view>
-						</view>
-					</view>
-				</view>
-				<view class="cart acea-row row-between-wrapper" v-if="type != 'setMeal' && type !='points'">
-				  <view class="title">数量</view>
-					<view class="carnum acea-row row-left">
-						<view class="item reduce acea-row row-center-wrapper"
-							:class="attr.productSelect.cart_num <= 1 ? 'on' : ''" v-if="attr.productSelect.cart_num <= 1">
-							<text class="iconfont icon-shangpinshuliang-jian"></text>
-						</view>
-						<view class="item reduce acea-row row-center-wrapper"
-							:class="attr.productSelect.cart_num <= 1 ? 'on' : ''" @click="CartNumDes" v-else>
-							<text class="iconfont icon-shangpinshuliang-jian"></text>
-						</view>
-						<view class='item num acea-row row-middle'>
-							<input type="number" v-model="attr.productSelect.cart_num"
-								data-name="productSelect.cart_num" :always-embed="true" :adjust-position="true" cursor-spacing="30"
-								@input="bindCode(attr.productSelect.cart_num)"></input>
-						</view>
-						<view v-if="iSplus" class="item plus acea-row row-center-wrapper" :class="
-				      attr.productSelect.cart_num >= attr.productSelect.stock
-				        ? 'on'
-				        : ''
-				    " @click="CartNumAdd">
-							<text class="iconfont icon-shangpinshuliang-jia"></text>
-						</view>
-						<view v-else class='item plus'
-							:class='(attr.productSelect.cart_num >= attr.productSelect.quota) || (attr.productSelect.cart_num >= attr.productSelect.product_stock) || (attr.productSelect.cart_num >= attr.productSelect.num) || (type=="seckill" && attr.productSelect.cart_num >= attr.productSelect.once_num)? "on":""'
-							@click='CartNumAdd'>+</view>
-					</view>
-				</view>
-			</view>
-			<view class="joinBnt bg-color"
-				v-if="iSbnt && attr.productSelect.product_stock>0 &&attr.productSelect.quota>0" @click="goCat">我要参团
-			</view>
-			<view class="joinBnt on"
-				v-else-if="(iSbnt && attr.productSelect.quota<=0)||(iSbnt &&attr.productSelect.product_stock<=0)">已售罄
-			</view>
-			<view class="joinBnt bg-color" v-if="iScart && attr.productSelect.stock" @click="goCat">确定</view>
-			<view class="joinBnt on" v-else-if="iScart && !attr.productSelect.stock">已售罄</view>
-		</view>
-		<!-- 选择门店 -->
-    <view class="product-window" :class="isStore?'store':''">
-			<view class="storeTitle">选择门店<text class="iconfont icon-guanbi5" @click="closeStore"></text></view>
-			<view class="storeList">
-				<view class="item" :class="active == index?'on':''" v-for="(item,index) in storeList" :key="index" @click="tapStore(index,item)">
-					<view class="name line1">{{item.name}}</view>
-					<view class="address acea-row row-between">
-						<view class="iconfont icon-dingwei2"></view>
-						<view class="info">{{item.address}}</view>
-					</view>
-					<view class="time acea-row row-middle">
-						<view class="iconfont icon-yingyeshijian2"></view>
-						<view>营业时间:{{item.day_time}}</view>
-					</view>
-					<view class="iconfont icon-xuanzhong6" v-if="active == index"></view>
-				</view>
-			</view>
-    </view>
-    <addressWindow ref="addressWindow" :isFooter="isFooter" :pagesUrl="pagesUrl" :fromType="1" :address="address" @changeClose="changeClose" @OnChangeAddress="OnChangeAddress">
-    </addressWindow>
-		<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
-		<view class="mask on" @touchmove.prevent :hidden="isStore === false" @click="closeStore"></view>
-	</view>
-</template>
-
-<script>
-  import addressWindow from '@/components/addressWindow';
-  import {getAddressList} from '@/api/user.js'
-  import {storeListApi} from '@/api/store.js'
-	import {
-		mapGetters,
-		mapState
-	} from 'vuex';
-	export default {
-		computed: {
-			...mapState({
-				nearbyStore: state => state.app.nearbyStore
-			}),
-			...mapGetters(['isLogin'])
-		},
-		components:{
-		  addressWindow
-		},
-		props: {
-			isStoreBuy: {
-				type: Number,
-				value: 0
-			},
-			productId: {
-				type: Number | String,
-				value: 0
-			},
-			productType: {
-				type: Number | String,
-				value: 0
-			},
-			cusPreviewImg: {
-				type: Number,
-				value: 0
-			},
-			title: {
-				type: String,
-				default: ''
-			},
-			attr: {
-				type: Object,
-				default: () => {}
-			},
-			storeInfo: {
-				type: Object,
-				default: () => {}
-			},
-			limitNum: {
-				type: Number,
-				value: 0
-			},
-			isShow: {
-				type: Number,
-				value: 0
-			},
-			iSbnt: {
-				type: Number,
-				value: 0
-			},
-			iSplus: {
-				type: Number,
-				value: 0
-			},
-			iScart: {
-				type: Number,
-				value: 0
-			},
-			is_vip: {
-				type: Number,
-				value: 0
-			},
-			type: {
-				type: String,
-				default: ''
-			},
-			isFooter: {
-			  type: Boolean,
-			  default: false
-			}
-		},
-		data() {
-			return {
-        flag:1,
-        addressInfo:'', // 商城快递
-        deliveryName:'', // 门店配送
-				distance:'',
-				deliveryAddress:'',
-				address: {
-					address: false
-				},
-				pagesUrl:'',
-			 user_latitude: 0,
-			 user_longitude: 0,
-			 isDelivery: false,
-			 storeList: [],
-			 deliveryStoreList: [],
-			 selfStoreList: [],
-			 active:0,
-			 isStore: false
-      }
-		},
-    
-		mounted() {
-		 try {
-		 	this.user_latitude = uni.getStorageSync('user_latitude');
-		 	this.user_longitude = uni.getStorageSync('user_longitude');
-		 } catch (e) {}
-    },
-		watch: {
-			// 'attr.deliveryType': {
-			// 	handler(newV) {
-			// 		if(newV){
-			// 			if(this.active<1){
-			// 				if (this.user_latitude && this.user_longitude) {
-			// 					this.getList();
-			// 				} else {
-			// 					this.selfLocation();
-			// 				}
-			// 			}
-			// 			this.flag = newV[0];
-			// 			this.$emit('deliveryFun',newV[0]);
-			// 		}
-			// 	},
-			// 	deep: true
-			// }
-			'attr.deliveryType'(newValue, oldValue) {
-				if (JSON.stringify(newValue) != JSON.stringify(oldValue)) {
-					if (newValue.length) {
-						if(this.active<1){
-							this.getList();
-							// if (this.user_latitude && this.user_longitude) {
-							// 	this.getList();
-							// } else {
-							// 	this.selfLocation();
-							// }
-						}
-						let num = 1;
-						if(newValue[0] == 1 && this.isStoreBuy){
-							num = newValue[1];
-						}else{
-							num = newValue[0];
-						}
-						this.flag = num
-						this.$emit('deliveryFun',num);
-					}
-				}
-			}
-		},
-		methods: {
-			closeStore(){
-				this.isStore = false;
-			},
-			openStore(){
-				if(this.attr.isType != 1){
-					this.isStore = true;
-				}
-			},
-			// 切换门店
-				tapStore(index,item){
-					this.active = index;
-					this.deliveryName = item.name;
-					this.deliveryAddress = item.detailed_address+'\xa0';
-					this.distance = '距您'+item.range+'km';
-					this.isStore = false;
-					this.$emit('onstoreId',item,this.flag);
-				},
-				// 切换地址
-				OnChangeAddress: function(e,row) {
-				  this.address.address = false;
-					this.addressInfo = row.province+'省'+'\xa0'+row.city+'\xa0'+row.district+'\xa0'+row.street+'\xa0'+row.detail
-					this.$emit('onAddressId',row)
-				},
-				// 打开弹窗
-			openAddress(){
-				this.$refs.addressWindow.getAddressList();
-				this.address.address = true;
-				this.pagesUrl = '/pages/users/user_address/index'
-			},
-			goCat: function() {
-				this.$emit('goCat');
-			},
-      // 配送地址
-      getAddressList() {
-        getAddressList({
-					page: 1,
-					limit: 1
-				}).then(res=>{
-					let data = res.data[0];
-					if(res.data.length){
-						 this.addressInfo = data.province+'省'+'\xa0'+data.city+'\xa0'+data.district+'\xa0'+data.street+'\xa0'+data.detail
-						 this.$emit('onAddressId',data)
-					}else{
-						this.addressInfo = '点击添加地址'
-					}
-        })
-      },
-			// 关闭地址弹窗;
-			changeClose: function() {
-			  this.$set(this.address, 'address', false);
-			},
-			selfLocation() {
-				let self = this
-				// #ifdef H5
-				if (self.$wechat.isWeixin()) {
-					self.$wechat.location().then(res => {
-						this.user_latitude = res.latitude;
-						this.user_longitude = res.longitude;
-						uni.setStorageSync('user_latitude', res.latitude);
-						uni.setStorageSync('user_longitude', res.longitude);
-						self.getList();
-					})
-				} else {
-					// #endif	
-					uni.getLocation({
-						type: 'wgs84',
-						success: (res) => {
-							try {
-								this.user_latitude = res.latitude;
-								this.user_longitude = res.longitude;
-								uni.setStorageSync('user_latitude', res.latitude);
-								uni.setStorageSync('user_longitude', res.longitude);
-							} catch {}
-							self.getList();
-						},
-						fail:(res)=>{
-							console.log(res)
-							// #ifdef MP
-							uni.getSetting({
-								success: res=>{
-									if(typeof(res.authSetting['scope.userLocation']) != 'undefined' && !res.authSetting['scope.userLocation']){
-									  uni.setStorageSync('refuseLocation', true);
-									}
-								}
-							})
-							// #endif
-						}
-						// complete: function() {
-						// 	self.getList();
-						// }
-					});
-					// #ifdef H5	
-				}
-				// #endif
-			},
-			getList: function(id) {
-				let data = {
-					latitude: this.user_latitude || "", //纬度
-					longitude: this.user_longitude || "", //经度
-					page: 1,
-					limit: 100,
-					product_id: this.productId,
-					is_store:'',   //查找所有门店列表
-					type: this.type == 'seckill'?1:0,
-					store_id: id?id:this.nearbyStore
-				};
-				storeListApi(data)
-					.then(res => {
-						let list = res.data.list.list;
-						if(!id && list.length && this.attr && ((this.attr.deliveryType.indexOf('2') != -1 && this.attr.store_self_mention) || this.attr.deliveryType.indexOf('3') != -1)){
-							this.isDelivery = true;
-							if(this.$store.getters.isLogin){
-								this.getAddressList()
-							}
-						}
-						// 拆分自提门店列表和配送门店列表
-						let selfStoreList = [];
-						list.forEach(function(item,index){
-							if(item.is_store === 1) selfStoreList.push(item);
-						});
-						this.storeList = this.flag==2?selfStoreList:list;
-						this.selfStoreList = selfStoreList;//门店自提
-						this.deliveryStoreList = list;//门店配送
-						this.active = 0;
-						this.deliveryName = list[0].name;
-						this.deliveryAddress = list[0].detailed_address+'\xa0';
-						this.distance = '距您'+list[0].range+'km';
-						this.$emit('onstoreId',list[0],this.flag);
-					})
-					.catch(err => {
-						this.$util.Tips({
-							title: err
-						})
-					});
-			},
-			/**
-			 * 购物车手动输入数量
-			 * 
-			 */
-			bindCode: function(e) {
-				this.$emit('iptCartNum', this.attr.productSelect.cart_num);
-			},
-			closeAttr: function() {
-				this.$emit('myevent');
-			},
-			CartNumDes: function() {
-				this.$emit('ChangeCartNum', false);
-			},
-			CartNumAdd: function() {
-				this.$emit('ChangeCartNum', true);
-			},
-			tapAttr: function(indexw, indexn) {
-				let that = this;
-				that.$emit("attrVal", {
-					indexw: indexw,
-					indexn: indexn
-				});
-				this.$set(this.attr.productAttr[indexw], 'index', this.attr.productAttr[indexw].attr_values[indexn]);
-				let value = that
-					.getCheckedValue()
-					.join(",");
-				that.$emit("ChangeAttr", value);
-
-			},
-			//获取被选中属性;
-			getCheckedValue: function() {
-				let productAttr = this.attr.productAttr;
-				let value = [];
-				for (let i = 0; i < productAttr.length; i++) {
-					for (let j = 0; j < productAttr[i].attr_values.length; j++) {
-						if (productAttr[i].index === productAttr[i].attr_values[j]) {
-							value.push(productAttr[i].attr_values[j]);
-						}
-					}
-				}
-				return value;
-			},
-		  // 选择配送方式
-		  getstoreInfo(index) {
-					if(index == 1 && this.isStoreBuy){
-						return false
-					}
-					if(index === '2' || index === '3'){
-						if ((!this.user_latitude || !this.user_longitude) && !uni.getStorageSync('refuseLocation')) {
-							this.selfLocation();
-						}
-					}
-					if(index === '2') this.storeList = this.selfStoreList; //门店自提
-					if(index === '3') this.storeList = this.deliveryStoreList; //门店配送
-					this.flag = index;
-					this.active = 0;
-					this.deliveryName = this.storeList[0].name;
-					this.deliveryAddress = this.storeList[0].detailed_address+'\xa0';
-					this.distance = '距您'+this.storeList[0].range+'km';
-					this.$emit('deliveryFun',index);
-					this.$emit('onstoreId',this.storeList[0],index);
-		  },
-		  showLocation(){
-			  if ((!this.user_latitude || !this.user_longitude) && !uni.getStorageSync('refuseLocation')) {
-			  	this.selfLocation();
-			  }
-		  },
-		  showImg() {
-		  	this.$emit('getImg');
-		  }
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.mask.on{
-		z-index: 100 !important;
-	}
-	.product-window{
-		 .productWinList{
-			 .address{
-				 width: 690rpx;
-				 background: #F5F5F5;
-				 padding: 30rpx 24rpx;
-				 margin: 0 auto;
-				 margin-top: 20rpx;
-				 font-weight: 400;
-				 color: #333333;
-				 font-size: 26rpx;
-				 border-radius: 10rpx;
-				 .adsInfo{
-					 max-width: 594rpx;
-				 }
-				 .iconfont{
-					 font-size: 18rpx;
-					 margin-left: 12rpx;
-				 }
-				 .info{
-					 font-weight: 400;
-					 color: #999999;
-					 margin-top: 12rpx;
-					 .con{
-						 width: 416rpx;
-					 }
-				 }
-			 }
-		 }
-	}
-  .active {
-    position: relative;
-    border: 1px solid var(--view-theme);
-    .icon-xuanzhong6 {
-      font-size: 46rpx;
-      position: absolute;
-      bottom: -4rpx;
-      right: -6rpx;
-      color: var(--view-theme);
-    }
-  }
-	.vip-money {
-		color: #282828;
-		font-size: 28rpx;
-		font-weight: 700;
-		margin-left: 6rpx;
-	}
-	.vipImg {
-		width: 56rpx;
-		height: 20rpx;
-		margin-left: 6rpx;
-
-		image {
-			width: 100%;
-			height: 100%;
-			display: block;
-		}
-	}
-	
-	.product-window{
-		&.store{
-			background-color: #F5F5F5;
-			border-radius: 20rpx 20rpx 0 0;
-			transform: translate3d(0, 0, 0);
-			z-index: 102;
-			margin: 0;
-		}
-		.storeTitle{
-			text-align: center;
-			height: 100rpx;
-			line-height: 100rpx;
-			font-size: 32rpx;
-			font-weight: 500;
-			color: #282828;
-			position: relative;
-			.iconfont{
-				position: absolute;
-				font-size: 35rpx;
-				right: 30rpx;
-			}
-		}
-		.storeList{
-			max-height: 690rpx;
-			overflow: auto;
-			.item{
-				width: 690rpx;
-				background: #FFFFFF;
-				border-radius: 12rpx;
-				margin: 0 auto 20rpx auto;
-				padding: 28rpx 30rpx;
-				border: 1px solid #fff;
-				position: relative;
-				&.on{
-					border-color: var(--view-theme);
-				}
-				.icon-xuanzhong6{
-					position: absolute;
-					right: -6rpx;
-					bottom: -6rpx;
-					color: var(--view-theme);
-					font-size: 54rpx;
-				}
-				.name{
-					font-weight: 500;
-					color: #333333;
-					font-size: 28rpx;
-				}
-				.time{
-					font-weight: 400;
-					color: #888888;
-					font-size: 22rpx;
-					margin-top: 15rpx;
-					.iconfont{
-						font-size: 20rpx;
-						margin-right: 8rpx;
-					}
-				}
-				.address{
-					font-weight: 400;
-					color: #888888;
-					font-size: 22rpx;
-					margin-top: 13rpx;
-					.iconfont{
-						font-size: 20rpx;
-						margin-right: 8rpx;
-						margin-top: 6rpx;
-					}
-					.info{
-						width: 590rpx;
-						line-height: 1.5;
-					}
-				}
-			}
-		}
-	}
-
-	.product-window {
-		position: fixed;
-		bottom: 0;
-		width: 100%;
-		left: 0;
-		background-color: #fff;
-		z-index: 100;
-		border-radius: 16rpx 16rpx 0 0;
-		transform: translate3d(0, 100%, 0);
-		transition: all .3s cubic-bezier(.25, .5, .5, .9);
-		padding-bottom: 140rpx;
-		padding-bottom: calc(140rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
-		padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
-	}
-
-	.product-window.on {
-		transform: translate3d(0, 0, 0);
-	}
-
-	.product-window.join {
-		padding-bottom: 30rpx;
-	}
-
-	.product-window.joinCart {
-		padding-bottom: 30rpx;
-		z-index: 10000;
-	}
-
-	.product-window .textpic {
-		padding: 0 130rpx 0 30rpx;
-		margin-top: 29rpx;
-		position: relative;
-	}
-
-	.product-window .textpic .pictrue {
-		width: 150rpx;
-		height: 150rpx;
-		position: relative;
-		.icon{
-			width: 30rpx;
-			height: 30rpx;
-			background-color: rgba(0,0,0,0.4);
-			border-radius: 4rpx;
-			position: absolute;
-			bottom: 8rpx;
-			right: 8rpx;
-			text-align: center;
-			line-height: 23rpx;
-			.iconfont{
-				color: #fff;
-				font-size: 20rpx;
-			}
-		}
-	}
-
-	.product-window .textpic .pictrue image {
-		width: 100%;
-		height: 100%;
-		border-radius: 10rpx;
-	}
-
-	.product-window .textpic .text {
-		width: 410rpx;
-		font-size: 32rpx;
-		color: #202020;
-	}
-
-	.product-window .textpic .text .money {
-		font-size: 24rpx;
-		margin-top: 40rpx;
-		.icon{
-			display: inline-block;
-			font-size: 16rpx;
-			font-weight: normal;
-			background: #FF9500;
-      color: #fff;
-			border-radius: 18rpx;
-			padding: 2rpx 6rpx;
-			margin-left: 10rpx;
-			.iconfont{
-				font-size: 16rpx;
-				margin-right: 4rpx;
-				color: #fff;
-			}
-		}
-	}
-
-	.product-window .textpic .text .money .num {
-		font-size: 36rpx;
-	}
-
-	.product-window .textpic .text .money .stock {
-		color: #999;
-		margin-left: 6rpx;
-	}
-
-	.product-window .textpic .icon-guanbi {
-		position: absolute;
-		right: 30rpx;
-		top: -5rpx;
-		font-size: 35rpx;
-		color: #8a8a8a;
-	}
-
-	.product-window .rollTop {
-		max-height: 535rpx;
-		overflow: auto;
-		margin-top: 36rpx;
-	}
-
-	.product-window .productWinList .item~.item {
-		margin-top: 36rpx;
-	}
-
-	.product-window .productWinList .item .title {
-		font-size: 30rpx;
-		color: #999;
-		padding: 0 30rpx;
-	}
-
-	.product-window .productWinList .item .listn {
-		padding: 0 30rpx 0 16rpx;
-	}
-
-	.product-window .productWinList .item .listn .itemn {
-		border: 1px solid #F2F2F2;
-		font-size: 26rpx;
-		color: #282828;
-		padding: 7rpx 33rpx;
-		border-radius: 25rpx;
-		margin: 20rpx 0 0 14rpx;
-		background-color: #F2F2F2;
-		word-break: break-all;
-	}
-
-	.product-window .productWinList .item .listn .itemn.on {
-		color: var(--view-theme);
-		background: var(--view-minorColorT);
-		border-color: var(--view-theme);
-	}
-	.product-window .productWinList .item .listn .itemn.on2{
-		background: #bbb;
-		color: #fff;
-		border-color: #bbb;
-	}
-	.product-window .productWinList .item .listn .itemn.limit {
-		color: #999;
-		text-decoration: line-through;
-	}
-
-	.product-window .cart {
-		margin-top: 36rpx;
-		padding: 0 30rpx;
-    
-	}
-	.product-window .cart .title {
-		font-size: 30rpx;
-		color: #999;
-	}
-
-	.product-window .cart .carnum {
-		height: 54rpx;
-		margin-top: 24rpx;
-	}
-
-	.product-window .cart .carnum .iconfont {
-		font-size: 25rpx;
-	}
-
-	.product-window .cart .carnum view {
-		// border: 1px solid #a4a4a4;
-		width: 84rpx;
-		text-align: center;
-		height: 100%;
-		line-height: 54rpx;
-		color: #282828;
-		font-size: 45rpx;
-	}
-
-	.product-window .cart .carnum .reduce {
-		border-right: 0;
-		border-radius: 6rpx 0 0 6rpx;
-		line-height: 48rpx;
-		font-size: 60rpx;
-	}
-
-	.product-window .cart .carnum .reduce.on {
-		color: #DEDEDE;
-	}
-
-	.product-window .cart .carnum .plus {
-		border-left: 0;
-		border-radius: 0 6rpx 6rpx 0;
-		line-height: 46rpx;
-	}
-
-	.product-window .cart .carnum .plus.on {
-		// border-color: #e3e3e3;
-		color: #dedede;
-	}
-
-	.product-window .cart .carnum .num {
-		background: rgba(242, 242, 242, 1);
-		color: #282828;
-		font-size: 28rpx;
-	}
-
-	.product-window .joinBnt {
-		font-size: 30rpx;
-		width: 620rpx;
-		height: 86rpx;
-		border-radius: 50rpx;
-		text-align: center;
-		line-height: 86rpx;
-		color: #fff;
-		margin: 21rpx auto 0 auto;
-	}
-
-	.product-window .joinBnt.on {
-		background-color: #bbb;
-		color: #fff;
-	}
-</style>

+ 0 - 125
components/recommend/index.vue

@@ -1,125 +0,0 @@
-<template>
-	<!-- 热门推荐 -->
-	<view class='recommend' :style="colorStyle">
-		<view class='title acea-row row-center-wrapper'>
-			<text class='iconfont icon-zhuangshixian'></text>
-			<text class='name'>热门推荐</text>
-			<text class='iconfont icon-zhuangshixian lefticon'></text>
-		</view>
-		<view class='recommendList acea-row row-between-wrapper'>
-			<view class='item' v-for="(item,index) in hostProduct" :key="index" hover-class='none' @tap="goDetail(item)">
-				<view class='pictrue'>
-					<image :src='item.image' mode="aspectFill"></image>
-					<span class="pictrue_log_big pictrue_log_class" v-if="item.activity && item.activity.type === '1'">秒杀</span>
-					<span class="pictrue_log_big pictrue_log_class" v-if="item.activity && item.activity.type === '2'">砍价</span>
-					<span class="pictrue_log_big pictrue_log_class" v-if="item.activity && item.activity.type === '3'">拼团</span>
-					<view class="activityFrame" v-if="item.activity_frame.image" :style="'background-image: url('+item.activity_frame.image+');'"></view>
-				</view>
-				<view class='name line1'>{{item.store_name}}</view>
-				<!-- #ifdef H5 || APP-PLUS -->
-				<slot name="center" :item="item"></slot>
-				<!-- #endif -->
-				<!-- #ifdef MP -->
-				<slot name="center{{index}}"></slot>
-				<!-- #endif -->
-				<view class='money font-color'>¥<text class='num'>{{item.price}}</text></view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import {mapGetters} from "vuex";
-	import { goShopDetail } from '@/libs/order.js'
-	import colors from "@/mixins/color";
-	export default {
-	computed: mapGetters(['uid']),
-		props: {
-			hostProduct: {
-				type: Array,
-				default: function() {
-					return [];
-				}
-			}
-		},
-		mixins: [colors],
-		data() {
-			return {
-
-			};
-		},
-		methods: {
-			goDetail(item){
-				goShopDetail(item,this.uid).then(res=>{
-					uni.navigateTo({
-						url:`/pages/goods_details/index?id=${item.id}`
-					})
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="scss">
-	.activityFrame{
-		border-radius: 20rpx;
-	}
-	.recommend {
-		background-color: #fff;
-	}
-
-	.recommend .title {
-		height: 135rpx;
-		font-size: 28rpx;
-		color: #282828;
-	}
-
-	.recommend .title .name {
-		margin: 0 28rpx;
-	}
-
-	.recommend .title .iconfont {
-		font-size: 170rpx;
-		color: #454545;
-	}
-
-	.recommend .title .iconfont.lefticon {
-		transform: rotate(180deg);
-	}
-
-	.recommend .recommendList {
-		padding: 0 30rpx;
-	}
-
-	.recommend .recommendList .item {
-		width: 335rpx;
-		margin-bottom: 30rpx;
-	}
-
-	.recommend .recommendList .item .pictrue {
-		position: relative;
-		width: 100%;
-		height: 335rpx;
-	}
-
-	.recommend .recommendList .item .pictrue image {
-		width: 100%;
-		height: 100%;
-		border-radius: 20rpx;
-	}
-
-	.recommend .recommendList .item .name {
-		font-size: 28rpx;
-		color: #282828;
-		margin-top: 20rpx;
-	}
-
-	.recommend .recommendList .item .money {
-		font-size: 20rpx;
-		margin-top: 8rpx;
-	}
-
-	.recommend .recommendList .item .money .num {
-		font-size: 28rpx;
-	}
-</style>

+ 68 - 0
components/returnButton.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="content">
+		<view class="retun-Box" @click="navTo('/pages/order/order?state=0')">
+			<image class="return-img" src=".././static/tabBar/dingdan.png"></image>
+			<view class="return-text">订单</view>
+		</view>
+		<view class="retun-Box" @click="GoHome">
+			<image class="return-img" src=".././static/tabBar/home.png" ></image>
+			<view class="return-text">首页</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		
+	},
+	data() {
+		return {
+			
+		}
+	},
+	methods: {
+		navTo(url) {
+			uni.navigateTo({
+				url: url
+			})
+		},
+		GoHome() {
+			// uni.navigateTo({
+			// 	url: '/pages/groupBooking/index'
+			// })
+			uni.switchTab({
+				url: '/pages/index/index'
+			})
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.content {
+	position: fixed;
+	right: 0;
+	bottom: 330rpx;
+	.retun-Box {
+		border-radius: 50%;
+		background: #FFFFFF;
+		width: 100rpx;
+		height: 100rpx;
+		margin-top: 30rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		box-shadow: 0 6rpx 20rpx #888888;
+		.return-img {
+			width: 40rpx;
+			height: 40rpx;
+		}
+		.return-text {
+			font-size: $font-sm;
+			margin-top: 8rpx;
+		}
+	}
+}
+</style>

+ 252 - 0
components/seckill/seckill.vue

@@ -0,0 +1,252 @@
+<template>
+	<view class="seckill-section m-t" v-if="show">
+		<view class="s-header">
+			<view class="f-left-icon"><image src="../../static/img/seckill-inco.png" mode=""></image></view>
+			<view class="tit-box"><text class="tit">限时秒杀</text></view>
+			<view class="tip-box">
+				<text class="tip" v-if="status == 1">{{ showTime }}点场结束</text>
+				<text class="tip" v-if="status == 2">距离下场开始</text>
+				<text class="tip" v-if="status == 0">当天活动已结束</text>
+				<uni-countdown v-if="status == 1 || status == 2" :show-day="false" :hour="stopTimeH" :minute="stopTimeM" :second="stopTimeS"></uni-countdown>
+			</view>
+			<view class="textNav iconfont iconenter" @click="navTo('/pages/product/seckill')">更多</view>
+		</view>
+		<scroll-view class="floor-list" scroll-x>
+			<view class="scoll-wrapper position-relative" @click="navTo('/pages/product/seckill')">
+				<view v-for="(item, index) in list" :key="index" class="floor-item">
+					<image class="list-image" :src="item.image" mode="aspectFill"></image>
+					<text class="title clamp">{{ item.title }}</text>
+					<text class="price">¥{{ item.price }}</text>
+				</view>
+				<view v-if="list.length == 0" class="floor-item ">
+					<image class="list-image" mode="aspectFill"></image>
+					<text class="title clamp"></text>
+					<text class="price"></text>
+				</view>
+				<view v-if="list.length == 0" class="noGoodsBg"><view>敬请期待</view></view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+import uniCountdown from '@/components/uni-countdown/uni-countdown.vue';
+import { getSeckillList, getSeckillClass } from '@/api/product.js';
+import { timeComputed } from '@/utils/rocessor.js';
+export default {
+	components: {
+		uniCountdown
+	},
+	data() {
+		return {
+			list: [],
+			page: 1,
+			limit: 10,
+			showTime: '', //显示的时间
+			showTImeId: '', //显示时间id用于查询数据
+			stopTimeH: 0,
+			stopTimeM: 0,
+			stopTimeS: 0,
+			// 判断是否所有活动已经结束
+			stop: false, //活动是否已经结束
+			show: false, //是否显示活动
+			status: 0 //获取状态值1为有活动开始中 2为活动未开始 0为活动已经结束
+		};
+	},
+	created: function(e) {
+		// 载入分类
+		this.getClass();
+	},
+	methods: {
+		navTo(url) {
+			uni.navigateTo({
+				url
+			});
+		},
+		getList() {
+			getSeckillList(
+				{
+					page: this.page,
+					limit: this.limit
+				},
+				this.showTImeId
+			)
+				.then(e => {
+					this.list = e.data;
+				})
+				.catch(e => {
+					console.log(e);
+				});
+		},
+		getClass() {
+			let obj = this;
+			getSeckillClass({})
+				.then(({ data }) => {
+					let arr = data.seckillTime;
+					// 用于判断是否有数据
+					let showDate = false;
+					for (var i = 0; i < arr.length; i++) {
+						let ar = arr[i];
+						if (ar.status === 1 || ar.status === 2) {
+							obj.status = ar.status;
+							// 保存要显示的场次时间
+							obj.showTime = ar.time;
+							// 保存要显示活动商品的id
+							obj.showTImeId = ar.id;
+							// 保存当前状态值
+							// 计算倒计时时间
+							if (ar.status === 1) {
+								obj.timeComputed(ar.stop * 1000);
+							} else {
+								// 获取需要开始
+								let arTime = ar.time.split(':');
+								let h = arTime[0];
+								let m = arTime[1];
+								let time = new Date();
+								// 设置时间
+								time.setHours(h, m, 0);
+								obj.timeComputed(time.getTime());
+							}
+							// 获取商品列表
+							obj.getList();
+							// 保存当前有活动在举行
+							showDate = true;
+							// 任务查询结束跳出循环
+							break;
+						}
+					}
+					// 判断是否有活动
+					if (arr.length > 0) {
+						obj.show = true;
+					}
+					// 判断今天活动是否已经全部结束
+					if (!showDate) {
+						// 保存活动结束最后一个小时的活动商品
+						obj.showTImeId = arr[arr.length - 1].id;
+						// 活动已经结束
+						obj.status = 0;
+						// 获取结束时的商品
+						obj.getList();
+						console.log(obj.status);
+					}
+					// 如果所有场次均已经结束
+				})
+				.catch(e => {
+					uni.showModal({
+						title: JSON.stringify(e)
+					});
+				});
+		},
+		// 计算倒计时时间
+		timeComputed(da) {
+			let obj = this;
+			let stopTime = timeComputed(da);
+			obj.stopTimeH = stopTime.hours;
+			obj.stopTimeM = stopTime.minutes;
+			obj.stopTimeS = stopTime.seconds;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+/* 秒杀专区 */
+.seckill-section {
+	padding: 4rpx 30rpx 24rpx;
+	.s-header {
+		display: flex;
+		align-items: center;
+		height: 92rpx;
+		line-height: 1;
+		.tit-box {
+			margin-left: 6rpx;
+			flex-shrink: 0;
+		}
+		.tit {
+			@extend %font-title;
+		}
+		.f-left-icon {
+			width: 36rpx;
+			height: 36rpx;
+			image{
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.textNav {
+			line-height: 1;
+			padding: 15rpx 0;
+			flex-shrink: 0;
+			flex-grow: 1;
+			min-width: 100rpx;
+		}
+		.tip-box {
+			flex-grow: 1;
+			display: flex;
+			justify-content: flex-start;
+			align-items: center;
+		}
+		.tip {
+			font-size: $font-sm;
+			color: $font-color-light;
+			padding-left: 10rpx;
+			padding-right: 10rpx;
+		}
+		.timer {
+			display: inline-block;
+			width: 40rpx;
+			height: 36rpx;
+			text-align: center;
+			line-height: 36rpx;
+			margin-right: 14rpx;
+			font-size: $font-sm + 2rpx;
+			color: #fff;
+			border-radius: 2px;
+			background: rgba(0, 0, 0, 0.8);
+		}
+		.iconenter {
+			font-size: $font-sm;
+			color: $font-color-light;
+			flex: 1;
+			text-align: right;
+		}
+	}
+	.floor-list {
+		white-space: nowrap;
+		background-color: white;
+		padding: 20rpx;
+		border-radius: 5rpx;
+		box-shadow: $box-shadow;
+	}
+	.scoll-wrapper {
+		display: flex;
+		align-items: flex-start;
+		.noGoodsBg {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			height: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			color: $font-color-light;
+		}
+		.floor-item {
+			width: 150rpx;
+			margin-right: 20rpx;
+			font-size: $font-sm + 2rpx;
+			color: $font-color-dark;
+			line-height: 1.8;
+			.list-image {
+				width: 150rpx;
+				height: 150rpx;
+				border-radius: 6rpx;
+			}
+			.price {
+				color: $color-red;
+			}
+		}
+	}
+}
+</style>

+ 0 - 180
components/service/index.vue

@@ -1,180 +0,0 @@
-<template>
-	<view>
-		<uni-popup class="" ref="popup">
-			<view class="popup-box">
-				<view class="img">
-					<image src="/static/image/img29.png" mode=""></image>
-				</view>
-				<view class="mian">
-					<view class="delivery">
-						<view class="title">已经为您定制专属客服</view>
-						<image src="/static/image/img30.png" mode=""></image>
-					</view>
-					<view class="nocancel">客服VX:{{ kefu }}</view>
-					<view class="comfirm-box">
-						<view class="cancel" @click="close">取消</view>
-						<view class="comfirm" @click="comfirm(kefu)">复制微信</view>
-					</view>
-				</view>
-			</view>
-		</uni-popup>
-	</view>
-</template>
-
-<script>
-	
-	export default {
-		props: [],
-		data() {
-			return{
-	            kefu:'vx458562',
-				show:false
-			};
-		},
-		mounted() {},
-		methods: {
-			open(){
-				this.$refs.popup.open('center')
-			},
-			close(){
-				this.$refs.popup.close()
-			},
-			comfirm(text) {
-				console.log(text);
-				const result = this.uniCopy(text);
-				if (result === false) {
-					uni.showToast({
-						title: "不支持",
-					});
-				} else {
-					uni.showToast({
-						title: "复制成功",
-						icon: "none",
-					});
-				}
-				this.close();
-			},
-			uniCopy(content) {
-				/**
-				 * 小程序端 和 app端的复制逻辑
-				 */
-				//#ifndef H5
-				uni.setClipboardData({
-					data: content,
-					success: function () {
-						console.log("success");
-						return true;
-					},
-				});
-				//#endif
-			
-				/**
-				 * H5端的复制逻辑
-				 */
-				// #ifdef H5
-				if (!document.queryCommandSupported("copy")) {
-					//为了兼容有些浏览器 queryCommandSupported 的判断
-					// 不支持
-					return false;
-				}
-				let textarea = document.createElement("textarea");
-				textarea.value = content;
-				textarea.readOnly = "readOnly";
-				document.body.appendChild(textarea);
-				textarea.select(); // 选择对象
-				textarea.setSelectionRange(0, content.length); //核心
-				let result = document.execCommand("copy"); // 执行浏览器复制命令
-				textarea.remove();
-				return result;
-				// #endif
-			},
-		},
-	};
-</script>
-
-<style lang="scss" scoped>
-	.popup-box {
-		position: relative;
-		background-color: #ffffff;
-		border-radius: 25rpx;
-		.img {
-			position: relative;
-			top: -60rpx;
-			left: 10%;
-			width: 80%;
-			height: 150rpx;
-			display: flex;
-			justify-content: center;
-			image {
-				border-radius: 20rpx 20rpx 0 0;
-				height: 150rpx;
-			}
-		}
-		.mian {
-			margin-top: -44rpx;
-			display: flex;
-			flex-direction: column;
-			align-items: center;
-			// padding: 32rpx 32rpx;
-			background-color: #ffffff;
-			border-radius: 0 0 20rpx 20rpx;
-			text-align: center;
-			.delivery {
-				font-size: 40rpx;
-				color: #333333;
-				display: flex;
-				align-items: center;
-				flex-direction: column;
-	
-				.title {
-				}
-	
-				image {
-					margin-top: 48rpx;
-					width: 172rpx;
-					height: 160rpx;
-				}
-			}
-	
-			.nocancel {
-				font-size: 32rpx;
-				color: #333333;
-				margin-top: 14rpx;
-			}
-	
-			.comfirm-box {
-				margin: 52rpx 0rpx;
-				display: flex;
-				.cancel {
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					width: 197rpx;
-					height: 74rpx;
-					border: 1px solid #dcc786;
-					border-radius: 38rpx;
-	
-					font-size: 32rpx;
-					color: #605128;
-				}
-	
-				.comfirm {
-					margin-left: 32rpx;
-					display: flex;
-					align-items: center;
-					justify-content: center;
-					width: 197rpx;
-					height: 74rpx;
-					background: linear-gradient(
-						-90deg,
-						#d1ba77 0%,
-						#f7e8ad 100%
-					);
-					border-radius: 38px;
-					font-size: 32rpx;
-					color: #605128;
-				}
-			}
-		}
-	}
-</style>

+ 196 - 0
components/share.vue

@@ -0,0 +1,196 @@
+<template>
+	<view v-if="show" class="mask" @click="toggleMask" @touchmove.stop.prevent="stopPrevent" :style="{ backgroundColor: backgroundColor }">
+		<view
+			class="mask-content"
+			@click.stop.prevent="stopPrevent"
+			:style="[
+				{
+					height: config.height,
+					transform: transform
+				}
+			]"
+		>
+			<scroll-view class="view-content" scroll-y>
+				<view class="share-header">分享到</view>
+				<view class="share-list">
+					<view v-for="(item, index) in shareList" :key="index" class="share-item" @click="shareToFriend(item.text)">
+						<image class="itemImage" :src="item.icon" mode=""></image>
+						<text class="itemText">{{ item.text }}</text>
+					</view>
+				</view>
+			</scroll-view>
+			<view class="bottomButtom b-t" @click="toggleMask">取消</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			transform: 'translateY(50vh)',
+			timer: 0,
+			backgroundColor: 'rgba(0,0,0,0)',
+			show: false,
+			config: {}
+		};
+	},
+	props: {
+		contentHeight: {
+			type: Number,
+			default: 0
+		},
+		//是否是tabbar页面
+		hasTabbar: {
+			type: Boolean,
+			default: false
+		},
+		shareList: {
+			type: Array,
+			default: function() {
+				return [];
+			}
+		}
+	},
+	created() {
+		const height = uni.upx2px(this.contentHeight) + 'px';
+		this.config = {
+			height: height,
+			transform: `translateY(${height})`,
+			backgroundColor: 'rgba(0,0,0,.4)'
+		};
+		this.transform = this.config.transform;
+	},
+	methods: {
+		toggleMask() {
+			//防止高频点击
+			if (this.timer == 1) {
+				return;
+			}
+			this.timer = 1;
+			setTimeout(() => {
+				this.timer = 0;
+			}, 500);
+
+			if (this.show) {
+				this.transform = this.config.transform;
+				this.backgroundColor = 'rgba(0,0,0,0)';
+				setTimeout(() => {
+					this.show = false;
+					this.hasTabbar && uni.showTabBar();
+				}, 200);
+				return;
+			}
+
+			this.show = true;
+			//等待mask重绘完成执行
+			if (this.hasTabbar) {
+				uni.hideTabBar({
+					success: () => {
+						setTimeout(() => {
+							this.backgroundColor = this.config.backgroundColor;
+							this.transform = 'translateY(0px)';
+						}, 10);
+					}
+				});
+			} else {
+				setTimeout(() => {
+					this.backgroundColor = this.config.backgroundColor;
+					this.transform = 'translateY(0px)';
+				}, 10);
+			}
+		},
+		//防止冒泡和滚动穿透
+		stopPrevent() {},
+		//分享操作
+		shareToFriend(type) {
+			this.$api.msg(`分享给${type}`);
+			this.toggleMask();
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.mask {
+	position: fixed;
+	left: 0;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	display: flex;
+	justify-content: center;
+	align-items: flex-end;
+	z-index: 998;
+	transition: 0.3s;
+	.bottomButtom {
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		width: 100%;
+		height: 90rpx;
+		background: #fff;
+		z-index: 9;
+		font-size: $font-base + 2rpx;
+		color: $font-color-dark;
+	}
+}
+.mask-content {
+	width: 100%;
+	height: 580rpx;
+	transition: 0.3s;
+	background: #fff;
+	&.has-bottom {
+		padding-bottom: 90rpx;
+	}
+	.view-content {
+		height: 100%;
+	}
+}
+.share-header {
+	height: 110rpx;
+	font-size: $font-base + 2rpx;
+	color: font-color-dark;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	padding-top: 10rpx;
+	&:before,
+	&:after {
+		content: '';
+		width: 240rpx;
+		heighg: 0;
+		border-top: 1px solid $border-color-base;
+		transform: scaleY(0.5);
+		margin-right: 30rpx;
+	}
+	&:after {
+		margin-left: 30rpx;
+		margin-right: 0;
+	}
+}
+.share-list {
+	display: flex;
+	flex-wrap: wrap;
+}
+.share-item {
+	min-width: 33.33%;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	height: 180rpx;
+	.itemImage {
+		width: 80rpx;
+		height: 80rpx;
+		margin-bottom: 16rpx;
+	}
+	.itemText {
+		font-size: $font-base;
+		color: $font-color-base;
+	}
+}
+</style>

+ 0 - 198
components/skeleton/index.vue

@@ -1,198 +0,0 @@
-<template>
-	<view v-if="show"
-		:style="{width: systemInfo.width + 'px', height: systemInfo.height + 'px', backgroundColor: bgcolor, position: 'absolute', left: 0, top: 0, zIndex: 9998}">
-		<view v-for="(item,rect_idx) in skeletonRectLists" :key="item.rect"
-			:class="[loading == 'chiaroscuro' ? 'chiaroscuro' : '']"
-			:style="{width: item.width + 'px', height: item.height + 'px', backgroundColor: 'rgb(194, 207, 214,.3)', position: 'absolute', left: item.left + 'px', top: item.top + 'px'}">
-		</view>
-		<view v-for="(item,circle_idx) in skeletonCircleLists" :key="item.circle"
-			:class="loading == 'chiaroscuro' ? 'chiaroscuro' : ''"
-			:style="{width: item.width + 'px', height: item.height + 'px', backgroundColor: 'rgb(194, 207, 214,.3)', borderRadius: item.width + 'px', position: 'absolute', left: item.left + 'px', top: item.top + 'px'}">
-		</view>
-		<view class="spinbox" v-if="loading == 'spin'">
-			<view class="spin"></view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "skeleton",
-		props: {
-			bgcolor: {
-				type: String,
-				value: '#FFF'
-			},
-			selector: {
-				type: String,
-				value: 'skeleton'
-			},
-			loading: {
-				type: String,
-				value: 'spin'
-			},
-			show: {
-				type: Boolean,
-				value: false
-			},
-			isNodes: {
-				type: Number,
-				value: false
-			} //控制什么时候开始抓取元素节点,只要数值改变就重新抓取
-		},
-		data() {
-			return {
-				loadingAni: ['spin', 'chiaroscuro'],
-				systemInfo: {},
-				skeletonRectLists: [],
-				skeletonCircleLists: []
-			}
-		},
-		watch: {
-			isNodes(val) {
-				this.readyAction();
-			}
-		},
-		mounted() {
-			this.attachedAction();
-		},
-		methods: {
-			attachedAction: function() {
-				//默认的首屏宽高,防止内容闪现
-				const systemInfo = uni.getSystemInfoSync();
-				this.systemInfo = {
-					width: systemInfo.windowWidth,
-					height: systemInfo.windowHeight
-				};
-				this.loading = this.loadingAni.includes(this.loading) ? this.loading : 'spin';
-			},
-			readyAction: function() {
-				const that = this;
-				//绘制背景
-				uni.createSelectorQuery().selectAll(`.${this.selector}`).boundingClientRect().exec(function(res) {
-					if(res[0].length>0)
-					that.systemInfo.height = res[0][0].height + res[0][0].top;
-				});
-
-				//绘制矩形
-				this.rectHandle();
-
-				//绘制圆形
-				this.radiusHandle();
-			},
-			rectHandle: function() {
-				const that = this;
-
-				//绘制不带样式的节点
-				uni.createSelectorQuery().selectAll(`.${this.selector}-rect`).boundingClientRect().exec(function(res) {
-					let obj = res[0];
-					obj.forEach((item,index)=>{
-						item.rect = 'rect'+index
-					})
-					that.skeletonRectLists = obj;
-				});
-
-			},
-			radiusHandle() {
-				const that = this;
-
-				uni.createSelectorQuery().selectAll(`.${this.selector}-radius`).boundingClientRect().exec(function(res) {
-					let obj = res[0];
-					obj.forEach((item,index)=>{
-						item.circle = 'circle'+index
-					})
-					that.skeletonCircleLists = obj;
-				});
-			}
-		}
-	}
-</script>
-
-<style>
-	.spinbox {
-		position: fixed;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		height: 100%;
-		width: 100%;
-		z-index: 9999
-	}
-
-	.spin {
-		display: inline-block;
-		width: 64rpx;
-		height: 64rpx;
-	}
-
-	.spin:after {
-		content: " ";
-		display: block;
-		width: 46rpx;
-		height: 46rpx;
-		margin: 1rpx;
-		border-radius: 50%;
-		border: 5rpx solid #409eff;
-		border-color: #409eff transparent #409eff transparent;
-		animation: spin 1.2s linear infinite;
-	}
-
-	@keyframes spin {
-		0% {
-			transform: rotate(0deg);
-		}
-
-		100% {
-			transform: rotate(360deg);
-		}
-	}
-
-	.chiaroscuro {
-		width: 100%;
-		height: 100%;
-		background: rgb(194, 207, 214);
-		animation-duration: 2s;
-		animation-name: blink;
-		animation-iteration-count: infinite;
-	}
-
-	@keyframes blink {
-		0% {
-			opacity: .4;
-		}
-
-		50% {
-			opacity: 1;
-		}
-
-		100% {
-			opacity: .4;
-		}
-	}
-
-	@keyframes flush {
-		0% {
-			left: -100%;
-		}
-
-		50% {
-			left: 0;
-		}
-
-		100% {
-			left: 100%;
-		}
-	}
-
-	.shine {
-		animation: flush 2s linear infinite;
-		position: absolute;
-		top: 0;
-		bottom: 0;
-		width: 100%;
-		background: linear-gradient(to left,
-				rgba(255, 255, 255, 0) 0%,
-				rgba(255, 255, 255, .85) 50%,
-				rgba(255, 255, 255, 0) 100%)
-	}
-</style>

+ 0 - 246
components/splitOrder/index.vue

@@ -1,246 +0,0 @@
-<template>
-	<!-- 拆单订单 -->
-	<view class='splitOrder' v-if="splitGoods.length">
-		<view class="all" v-if="select_all">
-			<checkbox-group @change="checkboxAllChange">
-				<checkbox value="all" :checked="isAllSelect" />
-				<text class='checkAll'>全选</text>
-			</checkbox-group>
-		</view>
-		<checkbox-group @change="checkboxChange">
-			<block v-for="(item,index) in splitGoods" :key="index">
-				<view class='items acea-row row-between-wrapper'>
-					<!-- #ifndef MP -->
-					<checkbox :value="(item.id).toString()" :checked="item.checked" />
-					<!-- #endif -->
-					<!-- #ifdef MP -->
-					<checkbox :value="item.id" :checked="item.checked"/>
-					<!-- #endif -->
-					<view class='picTxt acea-row row-between-wrapper'>
-						<view class='pictrue'>
-							<image :src='item.cart_info.productInfo.image'></image>
-						</view>
-						<view class='text'>
-							<view class="acea-row row-between-wrapper">
-								<view class='name line1'>{{item.cart_info.productInfo.store_name}}</view>
-								<view>×{{item.cart_num}}</view>
-							</view>
-							<view class='infor line1'>
-								属性:{{item.cart_info.productInfo.attrInfo.suk || '默认'}}</view>
-							<view class='money'>¥{{item.cart_info.truePrice}}</view>
-						</view>
-						<view class='carnum acea-row row-center-wrapper'>
-							<view class="reduce" :class="item.surplus_num == 1 ? 'on' : ''"
-								@click.stop='subCart(item)'>-</view>
-							<view class='num'>{{item.surplus_num}}</view>
-							<view class="plus" :class="item.surplus_num == item.numShow ? 'on' : ''"
-								@click.stop='addCart(item)'>+</view>
-						</view>
-					</view>
-				</view>
-			</block>
-		</checkbox-group>
-	</view>
-</template>
-
-<script>
-	export default {
-		props:{
-			splitGoods: {
-				type: Array,
-				default: () => []
-			},
-			select_all: {
-				type: Boolean,
-				default: true
-			}
-		},
-		data() {
-			return {
-				isAllSelect:false
-			};
-		},
-		mounted(){
-			
-		},
-		methods: {
-			subCart(item){
-				item.surplus_num = Number(item.surplus_num) - 1;
-				if(item.surplus_num<=1){
-					item.surplus_num = 1
-				}
-				this.$emit('getList',this.splitGoods);
-			},
-			addCart(item){
-				item.surplus_num = Number(item.surplus_num) + 1;
-				if(item.surplus_num>=item.numShow){
-					item.surplus_num = item.numShow
-				}
-				this.$emit('getList',this.splitGoods);
-			},
-			inArray: function(search, array) {
-				for (let i in array) {
-					if (array[i] == search) {
-						return true;
-					}
-				}
-				return false;
-			},
-			checkboxChange(event){
-				let idList = event.detail.value;
-				this.splitGoods.forEach((item)=>{
-					if(this.inArray(item.id, idList)){
-						item.checked = true;
-					}else{
-						item.checked = false;
-					}
-				})
-				this.$emit('getList',this.splitGoods);
-				if(idList.length == this.splitGoods.length){
-					this.isAllSelect = true;
-				}else{
-					this.isAllSelect = false;
-				}
-			},
-			forGoods(val){
-				let that = this;
-				if(!that.splitGoods.length) return
-				that.splitGoods.forEach((item)=>{
-					if(val){
-						item.checked = true;
-					}else{
-						item.checked = false;
-					}
-				})
-				that.$emit('getList',that.splitGoods);
-			},
-			checkboxAllChange(event){
-				let value = event.detail.value;
-				if(value.length){
-					this.forGoods(1)
-				}else{
-					this.forGoods(0)
-				}
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	
-	.splitOrder {
-		border-bottom: 1px solid #f0f0f0;
-	}
-	
-	.splitOrder .all{
-		padding: 20rpx 30rpx;
-	}
-	
-	.splitOrder .all .checkAll{
-		margin-left: 20rpx;
-	}
-	
-	.splitOrder .items {
-		padding: 25rpx 30rpx;
-		background-color: #fff;
-		margin-bottom: 15rpx;
-	}
-	
-	.splitOrder .items .picTxt {
-		width: 627rpx;
-		position: relative;
-	}
-	
-	.splitOrder .items .picTxt .name{
-		width: 360rpx;
-	}
-	
-	.splitOrder .items .picTxt .pictrue {
-		width: 160rpx;
-		height: 160rpx;
-	}
-	
-	.splitOrder .items .picTxt .pictrue image {
-		width: 100%;
-		height: 100%;
-		border-radius: 6rpx;
-	}
-	
-	.splitOrder .items .picTxt .text {
-		width: 444rpx;
-		font-size: 28rpx;
-		color: #282828;
-	}
-	
-	.splitOrder .items .picTxt .text .reColor {
-		color: #999;
-	}
-	
-	.splitOrder .items .picTxt .text .reElection {
-		margin-top: 20rpx;
-	}
-	
-	.splitOrder .items .picTxt .text .reElection .title {
-		font-size: 24rpx;
-	}
-	
-	.splitOrder .items .picTxt .text .reElection .reBnt {
-		width: 120rpx;
-		height: 46rpx;
-		border-radius: 23rpx;
-		font-size: 26rpx;
-	}
-	
-	.splitOrder .items .picTxt .text .infor {
-		font-size: 24rpx;
-		color: #868686;
-		margin-top: 16rpx;
-	}
-	
-	.splitOrder .items .picTxt .text .money {
-		font-size: 32rpx;
-		color: #282828;
-		margin-top: 28rpx;
-	}
-	
-	.splitOrder .items .picTxt .carnum {
-		height: 47rpx;
-		position: absolute;
-		bottom: 7rpx;
-		right: 0;
-	}
-	
-	.splitOrder .items .picTxt .carnum view {
-		border: 1rpx solid #a4a4a4;
-		width: 66rpx;
-		text-align: center;
-		height: 100%;
-		line-height: 40rpx;
-		font-size: 28rpx;
-		color: #a4a4a4;
-	}
-	
-	.splitOrder .items .picTxt .carnum .reduce {
-		border-right: 0;
-		border-radius: 3rpx 0 0 3rpx;
-	}
-	
-	.splitOrder .items .picTxt .carnum .reduce.on {
-		border-color: #e3e3e3;
-		color: #dedede;
-	}
-	
-	.splitOrder .items .picTxt .carnum .plus {
-		border-left: 0;
-		border-radius: 0 3rpx 3rpx 0;
-	}
-	
-	.splitOrder .items .picTxt .carnum .plus.on {
-		border-color: #e3e3e3;
-		color: #dedede;
-	}
-	
-	.splitOrder .items .picTxt .carnum .num {
-		color: #282828;
-	}
-</style>

+ 292 - 0
components/ss-calendar/ss-calendar.vue

@@ -0,0 +1,292 @@
+<template>
+	<view class="calendar__wrap">
+		<view class="header">
+			<view class="current-date">{{ currentDate }}</view>
+		</view>
+		<view class="body">
+			<view class="weeks">
+				<view class="week__item" v-for="week in weeks" :key="week">{{ week }}</view>
+			</view>
+			<view class="day__list">
+				<view class="day__item" v-for="(item, index) in dateData" :key="index">
+					<view class="checked-box" :class="[checksClass]" v-if="item === 'checked'">
+						<text class="checked iconfavor" v-if="!checksIcon"></text>
+						<image v-else :src="checksIcon" mode="aspectFit"></image>
+						<view class="check_text" v-if="checkTextShow">{{ dayLoad(index) }}</view>
+					</view>
+					<text class="current-box" v-else>{{ item }}</text>
+				</view>
+			</view>
+		</view>
+		<view class="header" v-if="nextMounth">
+			<view class="current-date">{{ currentDate1 }}</view>
+		</view>
+		<view class="body" v-if="nextMounth">
+			<view class="day__list">
+				<view class="day__item" v-for="(item, index) in dateData1" :key="index">
+					<view class="checked-box" :class="[checksClass]" v-if="item === 'checked'">
+						<text class="checked iconfavor" v-if="!checksIcon"></text>
+						<image v-else :src="checksIcon" mode="aspectFit"></image>
+						<view class="check_text" v-if="checkTextShow">{{ dayLoad(index) }}</view>
+					</view>
+					<text class="current-box" v-else>{{ item }}</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		//选中的日期数据
+		checks: {
+			type: Array,
+			default() {
+				// 例子[1,2,3,4],表示本月1,2,3,4号4天被选中
+				return [];
+			}
+		},
+		nextMounth: {
+			type: Boolean,
+			default: false
+		},
+		// 选中物品的样式类
+		checksClass: {
+			type: String,
+			default: ''
+		},
+		// 选中时图标
+		checksIcon: {
+			type: String
+		},
+		// 选中时是否显示文字
+		checkTextShow: {
+			type: Boolean,
+			default: false
+		},
+		// 表示当前日期的样式
+		actionClass: {
+			type: String,
+			default: ''
+		}
+	},
+	data() {
+		const { year, month, day } = this.getDate();
+		const dateData = this.getDateData(year, month);
+		const dateData1 = this.getDateData(year, month + 1);
+		const noDay = new Date(year, month - 1, 1).getDay();
+		const noDay1 = new Date(year, month, 1).getDay();
+		return {
+			year,
+			month,
+			day,
+			dateData,
+			dateData1,
+			noDay, //本月1号是星期几
+			noDay1, //下个月1号是星期几
+			weeks: ['日', '一', '二', '三', '四', '五', '六'],
+		};
+	},
+	computed: {
+		// 获取当前日期
+		currentDate() {
+			return `${this.year}-${this.format(this.month)}`;
+		},
+		// 获取下个月日期
+		currentDate1() {
+			return `${this.year}-${this.format(this.month + 1)}`;
+		}
+	},
+	watch: {
+		checks(val) {
+			console.log(val,"123456");
+			const { year, month } = this.getDate();
+			const dateData = this.getDateData(year, month);
+			const dateData1 = this.getDateData1(year, month + 1);
+			// 保存当前月份信息
+			this.dateData = dateData;
+			this.dateData1 = dateData1;
+		}
+	},
+	methods: {
+		// 重新计算时间
+		dayLoad: function(value) {
+			if(this.nextMounth) {
+				return value + 1 - this.noDay1;
+			}else {
+				return value + 1 - this.noDay;
+			}
+		},
+		// 获取当前日期
+		getDate(current) {
+			const date = current ? new Date(current) : new Date();
+			const year = date.getFullYear();
+			// 月份值默认从0开始
+			const month = date.getMonth() + 1;
+			const day = date.getDate();
+			return {
+				year,
+				month,
+				day
+			};
+		},
+		// 日期处理
+		getDateData(year, month) {
+			// 新增月份时需要减少1个月
+			const date = new Date(year, month - 1, 1);
+			const firstDayWeek = date.getDay();
+			let data
+			if(this.nextMounth) {
+				data = [...this.getEmptys(firstDayWeek), ...this.getDays1(firstDayWeek)];
+			}else {
+				data = [...this.getEmptys(firstDayWeek), ...this.getDays(firstDayWeek)];
+			}
+			const day = new Date().getDate();
+			if(this.nextMounth) {
+				const cd = data.indexOf(day);
+				let del = (cd - cd%7);
+				for(let i=0;i<del;i++) {
+					data.shift()
+				}
+			} 
+			console.log(data);
+			return data;
+		},
+		// 下个月日期处理
+		getDateData1(year, month) {
+			// 新增月份时需要减少1个月
+			const date = new Date(year, month - 1, 1);
+			const firstDayWeek = date.getDay();
+			let data
+			if(this.nextMounth) {
+				data = [...this.getEmptys(firstDayWeek), ...this.getDays(firstDayWeek)];
+			}else {
+				data = [...this.getEmptys(firstDayWeek), ...this.getDays1(firstDayWeek)];
+			}
+			
+			data.length = 14
+			return data;
+		},
+		// 查询日期列表有几个空格
+		getEmptys(count) {
+			let arr = [];
+			if (count) {
+				for (let i = 0; i < count; i++) {
+					arr.push('');
+				}
+			}
+			return arr;
+		},
+		getLastDay() {
+			let { year, month } = this.getDate();
+			month += 1;
+			if (month > 11) {
+				year += 1;
+				month = 1;
+			}
+			let firstDayTimeStamp = new Date(`${year}/${month}/1`).getTime();
+			let oneDayTimeStamp = 24 * 60 * 60 * 1000;
+			let lastDay = new Date(firstDayTimeStamp - oneDayTimeStamp).getDate();
+			return lastDay;
+		},
+		getDays() {
+			const lastDay = this.getLastDay();
+			const days = [];
+			for (let i = 1; i <= lastDay; i++) {
+				days.push(this.checks.includes(i) ? 'checked' : i);
+			}
+			return days;
+		},
+		getDays1() {
+			const lastDay = this.getLastDay();
+			const days = [];
+			for (let i = 1; i <= lastDay; i++) {
+				days.push(this.checks.includes(i) ? 'checked' : i);
+			}
+			return days;
+		},
+		format(num) {
+			return num < 10 ? `0${num}` : num;
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.calendar__wrap {
+	background-color: #fff;
+	color: $uni-text-color;
+	.header {
+		padding: 0 24rpx;
+		.current-date {
+			text-align: center;
+			font-size: $font-lg + 2rpx;
+			// border-bottom: 2rpx solid #eee;
+			padding: 32rpx 0;
+		}
+	}
+	.body {
+		.weeks {
+			display: flex;
+			font-size: $font-lg;
+			padding: 10rpx 0;
+			background-color: #f4f7ff;
+			.week__item {
+				flex: 1;
+				text-align: center;
+			}
+		}
+		.day__list {
+			display: flex;
+			flex-wrap: wrap;
+			.day__item {
+				display: flex;
+				justify-content: center;
+				width: 14.285%;
+				text-align: center;
+				padding: 30rpx 0;
+				font-size: 34rpx;
+				color: $font-color-light;
+				.checked-box,
+				.current-box {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					border-radius: 100%;
+					box-sizing: border-box;
+					position: relative;
+				}
+				image,
+				.checked-box,
+				.current-box,
+				.check_text {
+					width: 56rpx;
+					height: 56rpx;
+					line-height: 56rpx;
+				}
+				image,
+				.check_text {
+					position: absolute;
+					top: 0;
+					left: 0;
+				}
+				.checked {
+					width: 56rpx;
+					height: 56rpx;
+					border-radius: 6rpx;
+					font-size: 40rpx;
+					background-color: #fbed66;
+					color: #fff;
+				}
+				.current {
+					padding: 18rpx;
+					background-color: #fbed66;
+					color: #fff;
+					font-size: 28rpx;
+				}
+			}
+		}
+	}
+}
+</style>

+ 0 - 207
components/storeLis/index.vue

@@ -1,207 +0,0 @@
-<template>
-	<!-- 门店列表 -->
-	<view class="list">
-		<view class="item">
-			<view class="name line1"><text class="iconfont icon-shangjiadingdan"></text>{{storeList.name}}</view>
-			<view class="address line1"><text class="font-num" v-if="storeList.range">距您{{ storeList.range }}km</text><text class="spot" v-if="storeList.range">·</text>{{ storeList.address }}{{ ", " + storeList.detailed_address }}</view>
-			
-		</view>
-	</view>
-</template>
-<script>
-	import {
-		storeListApi
-	} from "@/api/store";
-	import {
-		isWeixin
-	} from "@/utils/index";
-	// #ifdef H5
-	import {
-		wechatEvevt,
-		wxShowLocation
-	} from "@/libs/wechat";
-	// #endif
-	import {
-		mapState,
-		mapGetters
-	} from "vuex";
-	const LONGITUDE = "user_longitude";
-	const LATITUDE = "user_latitude";
-	const MAPKEY = "mapKey";
-	export default {
-		name: "storeList",
-		props: {
-			num : {
-				type: Number,
-				default: 1,
-			},
-			ids: {
-				type: Number,
-				default: 0,
-			},
-			type: {
-				type: String,
-				default: ''
-			},
-			storeList: {
-				typeof: Object,
-				default: {}
-			}
-		},
-		data() {
-			return {
-				page: 1,
-				limit: 20,
-				loaded: false,
-				loading: false,
-				system_store: {},
-				user_latitude: 0,
-				user_longitude: 0
-			};
-		},
-		computed: mapState({
-			nearbyStore: state => state.app.nearbyStore
-		}),
-		created() {
-			// try {
-			// 	this.user_latitude = uni.getStorageSync('user_latitude');
-			// 	this.user_longitude = uni.getStorageSync('user_longitude');
-			// 	this.selfLocation();
-			// 	if(!this.$util.checkOpenGPSServiceByAndroidIOS()){
-			// 		this.getList();
-			// 	}
-			// } catch (e) {
-			// 	this.getList();
-			// }
-		},
-		mounted() {
-			// if (this.user_latitude && this.user_longitude) {
-			// 	this.getList();
-			// } else {
-			// 	this.selfLocation();
-			// }
-		},
-		methods: {
-			call(phone) {
-				uni.makePhoneCall({
-					phoneNumber: phone,
-				});
-			},
-			selfLocation() {
-				let self = this
-				// #ifdef H5
-				if (self.$wechat.isWeixin()) {
-					self.$wechat.location().then(res => {
-						this.user_latitude = res.latitude;
-						this.user_longitude = res.longitude;
-						uni.setStorageSync('user_latitude', res.latitude);
-						uni.setStorageSync('user_longitude', res.longitude);
-						self.getList();
-					}).catch(err=>{
-						self.getList();
-					})
-				} else {
-					// #endif	
-					uni.getLocation({
-						type: 'wgs84',
-						success: (res) => {
-							try {
-								this.user_latitude = res.latitude;
-								this.user_longitude = res.longitude;
-								uni.setStorageSync('user_latitude', res.latitude);
-								uni.setStorageSync('user_longitude', res.longitude);
-							} catch {}
-							self.getList();
-						},
-						complete: function() {
-							self.getList();
-						}
-					});
-					// #ifdef H5	
-				}
-				// #endif
-			},
-			showMaoLocation(e) {
-				let self = this;
-				// #ifdef H5
-				if (self.$wechat.isWeixin()) {
-					self.$wechat.seeLocation({
-						latitude: Number(e.latitude),
-						longitude: Number(e.longitude),
-						name: e.name,
-						address: `${e.address}-${e.detailed_address}`,
-					}).then(res => {
-					})
-				} else {
-					// #endif	
-					uni.openLocation({
-						latitude: Number(e.latitude),
-						longitude: Number(e.longitude),
-						name: e.name,
-						address: `${e.address}-${e.detailed_address}`,
-						success: function() {
-							Number
-						}
-					});
-					// #ifdef H5	
-				}
-				// #endif
-			},
-			// 获取门店列表数据
-			getList: function() {
-				if (this.loading || this.loaded) return;
-				this.loading = true;
-				let data = {
-					latitude: this.user_latitude || "", //纬度
-					longitude: this.user_longitude || "", //经度
-					page: this.page,
-					limit: this.limit,
-					product_id: this.ids,
-					type: this.type == 'seckill'?1:0,
-					store_id: this.storeId?this.storeId:this.nearbyStore
-				};
-				storeListApi(data)
-					.then(res => {
-						this.loading = false;
-						this.loaded = res.data.list.length < this.limit;
-						this.storeList.push.apply(this.storeList, res.data.list.list);
-						if(this.page == 1){
-							this.$emit('getStoreList',this.storeList.length)
-						}
-						this.page = this.page + 1;
-					})
-					.catch(err => {
-						this.$util.Tips({
-							title: err
-						})
-					});
-			}
-		},
-		onReachBottom() {
-			// this.getList();
-		}
-	};
-</script>
-
-<style lang="scss">
-	.list{
-		width: 508rpx;
-		margin-left: 28rpx;
-		.item{
-			font-size: 26rpx;
-			color: #333;
-			.iconfont{
-				font-size: 30rpx;
-				margin-right: 10rpx;
-				color: #333;
-			}
-			.address{
-				font-size: 22rpx;
-				margin-top: 10rpx;
-				.spot{
-					margin: 0 20rpx;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 181
components/thorui/tui-collapse.vue

@@ -1,181 +0,0 @@
-<template>
-	<view class="tui-collapse" :style="{backgroundColor:bgColor}">
-		<view class="tui-collapse-head" :style="{backgroundColor:hdBgColor}" @tap.stop="handleClick">
-			<view class="tui-header" :class="{'tui-opacity':disabled}">
-				<slot name="title"></slot>
-        <view class="open" v-if="!isOpen">
-          展开
-        </view> 
-         <view class="open" v-else>
-          收起
-        </view>
-				<view class="tui-collapse-icon tui-icon-arrow" :class="{'tui-icon-active':isOpen}" :style="{color:arrowColor}" v-if="arrow"></view>
-			</view>
-		</view>
-		<view class="tui-collapse-body_box" :style="{backgroundColor:bdBgColor,height:isOpen?height:'0rpx'}">
-			<view class="tui-collapse-body" :class="{'tui-collapse-transform':height=='auto','tui-collapse-body_show':isOpen && height=='auto'}">
-				<slot name="content"></slot>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "tuiCollapse",
-		emits: ['click'],
-		props: {
-			//collapse背景颜色
-			bgColor: {
-				type: String,
-				default: 'transparent'
-			},
-			//collapse-head 背景颜色
-			hdBgColor: {
-				type: String,
-				default: '#fff'
-			},
-			//collapse-body 背景颜色
-			bdBgColor: {
-				type: String,
-				default: 'transparent'
-			},
-			//collapse-body实际高度 open时使用
-			height: {
-				type: String,
-				default: 'auto'
-			},
-			//索引
-			index: {
-				type: Number,
-				default: 0
-			},
-			//当前索引,index==current时展开
-			current: {
-				type: Number,
-				default: -1
-			},
-			// 是否禁用
-			disabled: {
-				type: [Boolean, String],
-				default: false
-			},
-			//是否带箭头
-			arrow: {
-				type: [Boolean, String],
-				default: true
-			},
-			//箭头颜色
-			arrowColor: {
-				type: String,
-				default: "#666666"
-			}
-		},
-		watch: {
-			current() {
-				this.updateCurrentChange()
-			}
-		},
-		created() {
-			this.updateCurrentChange()
-		},
-		data() {
-			return {
-				isOpen: false
-			};
-		},
-		methods: {
-			updateCurrentChange() {
-				this.isOpen = this.index == this.current
-			},
-			handleClick() {
-				if (this.disabled) return;
-				this.$emit("click", {
-					index: Number(this.index)
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	@font-face {
-		font-family: 'tuiCollapse';
-		src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAQ4AA0AAAAABlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEHAAAABoAAAAciRx3B0dERUYAAAP8AAAAHgAAAB4AKQAKT1MvMgAAAaAAAABCAAAAVjxuR/JjbWFwAAAB9AAAAD4AAAFCAA/pq2dhc3AAAAP0AAAACAAAAAj//wADZ2x5ZgAAAkAAAABEAAAARCs1U/toZWFkAAABMAAAADAAAAA2FpaT+mhoZWEAAAFgAAAAHQAAACQHngOFaG10eAAAAeQAAAAPAAAAEAwAAEBsb2NhAAACNAAAAAoAAAAKACIAAG1heHAAAAGAAAAAHwAAACABDwAdbmFtZQAAAoQAAAFJAAACiCnmEVVwb3N0AAAD0AAAACMAAAA1DunpUnjaY2BkYGAAYja/oO54fpuvDNwsDCBwc4/6fzjtwNDNfICpBMjlYGACiQIAGVAKZnjaY2BkYGBu+N/AEMPCAALMBxgYGVABCwBVNgMsAAAAeNpjYGRgYGBhEGQA0QwMTEDMBYQMDP/BfAYACnYBLQB42mNgZGFgnMDAysDA1Ml0hoGBoR9CM75mMGLkAIoysDIzYAUBaa4pDA7PGJ4xMDf8b2CIYW5gaAAKM4LkANq9C9sAAHjaY2GAABYIdgAAAMAATQB42mNgYGBmgGAZBkYGELAB8hjBfBYGBSDNAoRA/jOG//8hpBQzVCUDIxsDjMnAyAQkmBhQASPDsAcAMCAGoQAAAAAAAAAAAAAAIgAAAAEAQACLA8ACdAAQAAAlASYiBhQXARYyNwE2NCYiBwIA/oYNIBkMAZcNIA0BlwwZIA3uAXoMGSAN/mkMDAGXDSAZDAB42n2QPU4DMRCFn/MHJBJCIKhdUQDa/JQpEyn0CKWjSDbekGjXXnmdSDkBLRUHoOUYHIAbINFyCl6WSZMia+3o85uZ57EBnOMbCv/fJe6EFY7xKFzBETLhKvUX4Rr5XbiOFj6FG9R/hJu4VQPhFi7UGx1U7YS7m9JtywpnGAhXcIon4Sr1lXCN/CpcxxU+hBvUv4SbGONXuIVrZakM4WEwQWCcQWOKDeMCMRwskjIG1qE59GYSzExPN3oRO5s4GyjvV2KXAx5oOeeAKe09t2a+Sif+YMuB1JhuHgVLtimNLiJ0KBtfLJzV3ahzsP2e7ba02L9rgTXH7FENbNT8Pdsz0khsDK+QkjXyMrekElOPaGus8btnKdbzXgiJTrzL9IjHmjR1OvduaeLA4ufyjBx9tLmSPfeoHD5jWQh5v91OxCCKXYY/k9hxGQAAAHjaY2BigAAuMMnIgA5YwKJMjExciUVF+eW6KfnleQAZ0wQyAAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAMAAQAEAAAAAgAAAAB42mNgYGBkAIKrS9Q5QPTNPer/YTQAQ+0HIAAA) format('woff');
-		font-weight: normal;
-		font-style: normal;
-	}
-
-	.tui-collapse-icon {
-		font-family: "tuiCollapse" !important;
-		font-style: normal;
-		-webkit-font-smoothing: antialiased;
-		-moz-osx-font-smoothing: grayscale;
-	}
-
-	.tui-icon-arrow:before {
-		content: "\e600";
-	}
-.open {
-  position: absolute;
-  top: 22rpx;
-  right: 50rpx;
-  font-size: 20rpx;
-  font-weight: 400;
-  color: #666666;
-	margin-right: 10rpx;
-}
-	.tui-icon-arrow {
-		font-size: 16rpx;
-		transform: rotate(0);
-		transform-origin: center center;
-		transition: all 0.3s;
-		position: absolute;
-		top: 50%;
-		margin-top: -8px;
-		right: 30rpx;
-	}
-
-	.tui-arrow-padding {
-		padding-right: 62rpx;
-		box-sizing: border-box;
-	}
-
-	.tui-icon-active {
-		transform: rotate(180deg);
-		transform-origin: center center;
-	}
-
-	.tui-header {
-		position: relative;
-		z-index: 2;
-	}
-   .tui-collapse-body_box{
-	   transition: all 0.25s;
-	   overflow: hidden;
-   }
-	.tui-collapse-body {
-		transition: all 0.25s;
-		overflow: hidden;
-		position: relative;
-		z-index: 1;
-	}
-
-	.tui-collapse-transform {
-		opacity: 0;
-		visibility: hidden;
-		-webkit-transform: translateY(-40%);
-		transform: translateY(-40%);
-	}
-
-	.tui-collapse-body_show {
-		opacity: 1;
-		visibility: visible;
-		-webkit-transform: translateY(0);
-		transform: translateY(0);
-	}
-
-	.tui-opacity {
-		opacity: 0.6;
-	}
-</style>

+ 0 - 140
components/thorui/tui-drawer.vue

@@ -1,140 +0,0 @@
-<template>
-	<!-- @touchmove.stop.prevent -->
-	<view>
-		<view v-if="mask" class="tui-drawer-mask" :class="{ 'tui-drawer-mask_show': visible }" :style="{ zIndex: maskZIndex }" @tap="handleMaskClick"></view>
-		<view
-			class="tui-drawer-container"
-			:class="[`tui-drawer-container_${mode}`, visible ? `tui-drawer-${mode}__show` : '']"
-			:style="{ zIndex: zIndex, backgroundColor: backgroundColor }"
-		>
-			<slot></slot>
-		</view>
-	</view>
-</template>
-
-<script>
-/**
- * 超过一屏时插槽使用scroll-view
- **/
-export default {
-	name: 'tuiDrawer',
-	emits: ['close'],
-	props: {
-		visible: {
-			type: Boolean,
-			default: false
-		},
-		mask: {
-			type: Boolean,
-			default: true
-		},
-		maskClosable: {
-			type: Boolean,
-			default: true
-		},
-		// left right bottom top
-		mode: {
-			type: String,
-			default: 'right'
-		},
-		//drawer z-index
-		zIndex: {
-			type: [Number, String],
-			default: 9999
-		},
-		//mask z-index
-		maskZIndex: {
-			type: [Number, String],
-			default: 9998
-		},
-		backgroundColor: {
-			type: String,
-			default: '#fff'
-		}
-	},
-	methods: {
-		handleMaskClick() {
-			if (!this.maskClosable) {
-				return;
-			}
-			this.$emit('close', {});
-		}
-	}
-};
-</script>
-
-<style scoped>
-.tui-drawer-mask {
-	opacity: 0;
-	visibility: hidden;
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	background-color: rgba(0, 0, 0, 0.6);
-	transition: all 0.3s ease-in-out;
-}
-.tui-drawer-mask_show {
-	display: block;
-	visibility: visible;
-	opacity: 1;
-}
-
-.tui-drawer-container {
-	position: fixed;
-	left: 50%;
-	height: 100.2%;
-	top: 0;
-	transform: translate3d(-50%, -50%, 0);
-	transform-origin: center;
-	transition: all 0.3s ease-in-out;
-	opacity: 0;
-	overflow-y: scroll;
-	-webkit-overflow-scrolling: touch;
-	-ms-touch-action: pan-y cross-slide-y;
-	-ms-scroll-chaining: none;
-	-ms-scroll-limit: 0 50 0 50;
-}
-.tui-drawer-container_left {
-	left: 0;
-	top: 50%;
-	transform: translate3d(-100%, -50%, 0);
-}
-
-.tui-drawer-container_right {
-	right: 0;
-	top: 50%;
-	left: auto;
-	transform: translate3d(100%, -50%, 0);
-}
-
-.tui-drawer-container_bottom,
-.tui-drawer-container_top {
-	width: 100%;
-	height: auto !important;
-	min-height: 20rpx;
-	left: 0;
-	right: 0;
-	transform-origin: center;
-	transition: all 0.3s ease-in-out;
-}
-.tui-drawer-container_bottom {
-	bottom: 0;
-	top: auto;
-	transform: translate3d(0, 100%, 0);
-}
-.tui-drawer-container_top {
-	transform: translate3d(0, -100%, 0);
-}
-.tui-drawer-left__show,
-.tui-drawer-right__show {
-	opacity: 1;
-	transform: translate3d(0, -50%, 0);
-}
-.tui-drawer-top__show,
-.tui-drawer-bottom__show {
-	opacity: 1;
-	transform: translate3d(0, 0, 0);
-}
-</style>

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