|
@@ -0,0 +1,145 @@
|
|
|
+import config from '@/config'
|
|
|
+const mapKey = config.mapKey;
|
|
|
+const appName = config.appName;
|
|
|
+
|
|
|
+import addressData from './address'
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 腾讯位置服务地图选点
|
|
|
+ */
|
|
|
+const chooseLocationInit = () => {
|
|
|
+ const key = mapKey; //使用在腾讯位置服务申请的key
|
|
|
+ const referer = appName; //调用插件的app的名称
|
|
|
+ wx.navigateTo({
|
|
|
+ url: `plugin://chooseLocation/index?key=${key}&referer=${referer}`,
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 腾讯位置服务城市选择器
|
|
|
+ * @param {*} city 城市名称
|
|
|
+ */
|
|
|
+const citySelectorNavigateTo = (city) => {
|
|
|
+ const key = mapKey; // 使用在腾讯位置服务申请的key
|
|
|
+ const referer = appName; // 调用插件的app的名称
|
|
|
+ const hotCitys = '重庆'; // 用户自定义的的热门城市
|
|
|
+
|
|
|
+ wx.navigateTo({
|
|
|
+ url: `plugin://citySelector/index?key=${key}&referer=${referer}&hotCitys=${hotCitys}`,
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function splitAddress(address) {
|
|
|
+ // 处理直辖市(如北京市朝阳区)
|
|
|
+ const directCityRegex = /^(北京|天津|上海|重庆)(市)?(.+?区)/;
|
|
|
+ const directMatch = address.match(directCityRegex);
|
|
|
+ if (directMatch) {
|
|
|
+ return {
|
|
|
+ province: directMatch[1],
|
|
|
+ city: directMatch[1] + '市',
|
|
|
+ district: directMatch[3],
|
|
|
+ detail: address.replace(directCityRegex, '')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 常规拆分逻辑
|
|
|
+ const provinceRegex = /(.+?(省|自治区|行政区|特别行政区))/;
|
|
|
+ const cityRegex = /(.+?(市|自治州|州|盟))/;
|
|
|
+
|
|
|
+ const province = address.match(provinceRegex)?.[1] || '';
|
|
|
+ const city = address.replace(province, '').match(cityRegex)?.[1] || '';
|
|
|
+ const remaining = address.replace(province + city, '');
|
|
|
+ const district = remaining.match(/(.+?( 区|县|市|旗))/)?.[1] || '';
|
|
|
+ const detail = remaining.replace(district, '').trim();
|
|
|
+
|
|
|
+ return { province, city, district, detail };
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function normalizeAddress(str) {
|
|
|
+ return str.replace(/(市|区|省)/g, '').trim();
|
|
|
+}
|
|
|
+/**
|
|
|
+ * 根据地址字符串返回 name 数组、code 数组、index 路径
|
|
|
+ * @param {string} address 例如:"重庆 重庆市 永川区"
|
|
|
+ * @returns {Object|null} 包含 data/name、code、index 的对象
|
|
|
+ */
|
|
|
+const getCityCode = (address) => {
|
|
|
+ // //address:重庆市永川区人民大道191号
|
|
|
+ // const names = normalizeAddress(address).split(/\s+/);
|
|
|
+ // let result = [];
|
|
|
+
|
|
|
+ // // 查找省份
|
|
|
+ // let province = addressData.find(p => p.name.includes(names[0]));
|
|
|
+ // if (!province) return [];
|
|
|
+
|
|
|
+ // result.push(province.code);
|
|
|
+
|
|
|
+ // if (names.length < 2) return result;
|
|
|
+
|
|
|
+ // // 查找城市
|
|
|
+ // let city = province.children?.find(c => c.name.includes(names[1]));
|
|
|
+ // if (!city) return result;
|
|
|
+
|
|
|
+ // result.push(city.code);
|
|
|
+
|
|
|
+ // if (names.length < 3) return result;
|
|
|
+
|
|
|
+ // // 查找区县
|
|
|
+ // let district = city.children?.find(d => d.name.includes(names[2]));
|
|
|
+ // if (!district) return result;
|
|
|
+
|
|
|
+ // result.push(district.code);
|
|
|
+
|
|
|
+ // return result;
|
|
|
+
|
|
|
+ const names = address.split(/\s+/)
|
|
|
+ const result = {
|
|
|
+ data: [],
|
|
|
+ code: [],
|
|
|
+ index: []
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找省份
|
|
|
+ const provinceIndex = addressData.findIndex(p => p.name.includes(names[0]))
|
|
|
+ if (provinceIndex === -1) return null
|
|
|
+
|
|
|
+ const province = addressData[provinceIndex]
|
|
|
+ result.data.push(province.name)
|
|
|
+ result.code.push(province.code)
|
|
|
+ result.index.push(provinceIndex)
|
|
|
+
|
|
|
+ if (names.length < 2) return result
|
|
|
+
|
|
|
+ // 查找城市
|
|
|
+ const cityIndex = province.children.findIndex(c => c.name.includes(names[1]))
|
|
|
+ if (cityIndex === -1) return result
|
|
|
+
|
|
|
+ const city = province.children[cityIndex]
|
|
|
+ result.data.push(city.name)
|
|
|
+ result.code.push(city.code)
|
|
|
+ result.index.push(cityIndex)
|
|
|
+
|
|
|
+ if (names.length < 3) return result
|
|
|
+
|
|
|
+ // 查找区县
|
|
|
+ const districtIndex = city.children.findIndex(d => d.name.includes(names[2]))
|
|
|
+ if (districtIndex === -1) return result
|
|
|
+
|
|
|
+ const district = city.children[districtIndex]
|
|
|
+ result.data.push(district.name)
|
|
|
+ result.code.push(district.code)
|
|
|
+ result.index.push(districtIndex)
|
|
|
+
|
|
|
+ return result
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+export {
|
|
|
+ chooseLocationInit,
|
|
|
+ citySelectorNavigateTo,
|
|
|
+ splitAddress,
|
|
|
+ getCityCode
|
|
|
+}
|