Browse Source

扩展地区选择功能,添加完整的中国省市区列表

pull/1/head
SwTt29 3 months ago
parent
commit
2a0d89f1e3
  1. 122
      pages/seller/index.js
  2. 66
      pages/seller/index.wxml
  3. 116
      pages/seller/index.wxss

122
pages/seller/index.js

@ -34,6 +34,13 @@ Page({
editSpecSearchKeyword: '', // 编辑货源弹窗中的规格搜索关键词
filteredSpecOptions: [], // 过滤后的规格选项数组
filteredEditSpecOptions: [], // 编辑货源过滤后的规格选项数组
// 地区选择相关变量
showRegionSelectModal: false, // 控制地区选择弹窗显示
currentRegionMode: 'create', // 当前地区选择模式:create 或 edit
regionOptions: ['北京', '上海', '天津', '重庆', '河北', '石家庄', '唐山', '秦皇岛', '邯郸', '邢台', '保定', '张家口', '承德', '沧州', '廊坊', '衡水', '山西', '太原', '大同', '阳泉', '长治', '晋城', '朔州', '晋中', '运城', '忻州', '临汾', '吕梁', '内蒙古', '呼和浩特', '包头', '乌海', '赤峰', '通辽', '鄂尔多斯', '呼伦贝尔', '巴彦淖尔', '乌兰察布', '兴安盟', '锡林郭勒盟', '阿拉善盟', '辽宁', '沈阳', '大连', '鞍山', '抚顺', '本溪', '丹东', '锦州', '营口', '阜新', '辽阳', '盘锦', '铁岭', '朝阳', '葫芦岛', '吉林', '长春', '吉林', '四平', '辽源', '通化', '白山', '松原', '白城', '延边朝鲜族自治州', '黑龙江', '哈尔滨', '齐齐哈尔', '鸡西', '鹤岗', '双鸭山', '大庆', '伊春', '佳木斯', '七台河', '牡丹江', '黑河', '绥化', '大兴安岭地区', '江苏', '南京', '无锡', '徐州', '常州', '苏州', '南通', '连云港', '淮安', '盐城', '扬州', '镇江', '泰州', '宿迁', '浙江', '杭州', '宁波', '温州', '嘉兴', '湖州', '绍兴', '金华', '衢州', '舟山', '台州', '丽水', '安徽', '合肥', '芜湖', '蚌埠', '淮南', '马鞍山', '淮北', '铜陵', '安庆', '黄山', '滁州', '阜阳', '宿州', '六安', '亳州', '池州', '宣城', '福建', '福州', '厦门', '莆田', '三明', '泉州', '漳州', '南平', '龙岩', '宁德', '江西', '南昌', '景德镇', '萍乡', '九江', '新余', '鹰潭', '赣州', '吉安', '宜春', '抚州', '上饶', '山东', '济南', '青岛', '淄博', '枣庄', '东营', '烟台', '潍坊', '济宁', '泰安', '威海', '日照', '临沂', '德州', '聊城', '滨州', '菏泽', '河南', '郑州', '开封', '洛阳', '平顶山', '安阳', '鹤壁', '新乡', '焦作', '濮阳', '许昌', '漯河', '三门峡', '南阳', '商丘', '信阳', '周口', '驻马店', '湖北', '武汉', '黄石', '十堰', '宜昌', '襄阳', '鄂州', '荆门', '孝感', '荆州', '黄冈', '咸宁', '随州', '恩施土家族苗族自治州', '湖南', '长沙', '株洲', '湘潭', '衡阳', '邵阳', '岳阳', '常德', '张家界', '益阳', '郴州', '永州', '怀化', '娄底', '湘西土家族苗族自治州', '广东', '广州', '深圳', '珠海', '汕头', '佛山', '韶关', '湛江', '肇庆', '江门', '茂名', '惠州', '梅州', '汕尾', '河源', '阳江', '清远', '东莞', '中山', '潮州', '揭阳', '云浮', '广西', '南宁', '柳州', '桂林', '梧州', '北海', '防城港', '钦州', '贵港', '玉林', '百色', '贺州', '河池', '来宾', '崇左', '海南', '海口', '三亚', '三沙', '儋州', '四川', '成都', '自贡', '攀枝花', '泸州', '德阳', '绵阳', '广元', '遂宁', '内江', '乐山', '南充', '眉山', '宜宾', '广安', '达州', '雅安', '巴中', '资阳', '阿坝藏族羌族自治州', '甘孜藏族自治州', '凉山彝族自治州', '贵州', '贵阳', '六盘水', '遵义', '安顺', '毕节', '铜仁', '黔西南布依族苗族自治州', '黔东南苗族侗族自治州', '黔南布依族苗族自治州', '云南', '昆明', '曲靖', '玉溪', '保山', '昭通', '丽江', '普洱', '临沧', '楚雄彝族自治州', '红河哈尼族彝族自治州', '文山壮族苗族自治州', '西双版纳傣族自治州', '大理白族自治州', '德宏傣族景颇族自治州', '怒江傈僳族自治州', '迪庆藏族自治州', '西藏', '拉萨', '日喀则', '昌都', '林芝', '山南', '那曲', '阿里', '陕西', '西安', '铜川', '宝鸡', '咸阳', '渭南', '延安', '汉中', '榆林', '安康', '商洛', '甘肃', '兰州', '嘉峪关', '金昌', '白银', '天水', '武威', '张掖', '平凉', '酒泉', '庆阳', '定西', '陇南', '临夏回族自治州', '甘南藏族自治州', '青海', '西宁', '海东', '海北藏族自治州', '黄南藏族自治州', '海南藏族自治州', '果洛藏族自治州', '玉树藏族自治州', '海西蒙古族藏族自治州', '宁夏', '银川', '石嘴山', '吴忠', '固原', '中卫', '新疆', '乌鲁木齐', '克拉玛依', '吐鲁番', '哈密', '阿克苏地区', '喀什地区', '和田地区', '昌吉回族自治州', '博尔塔拉蒙古自治州', '巴音郭楞蒙古自治州', '克孜勒苏柯尔克孜自治州', '伊犁哈萨克自治州', '塔城地区', '阿勒泰地区', '石河子', '阿拉尔', '图木舒克', '五家渠', '北屯', '铁门关', '双河', '可克达拉', '昆玉', '胡杨河', '新星'], // 地区选项列表(包含中国大部分省市区)
regionSearchKeyword: '', // 创建货源弹窗中的地区搜索关键词
editRegionSearchKeyword: '', // 编辑货源弹窗中的地区搜索关键词
filteredRegionOptions: [], // 过滤后的地区选项数组
newSupply: {
name: '', // 品种
price: '',
@ -47,7 +54,8 @@ Page({
imageUrls: [] // 图片URL数组,支持多张图片
},
newSupplyRegionArray: [], // 新创建货源的省市区数组
editSupplyRegionArray: [], // 编辑货源的省市区数组,
editSupplyRegionArray: [], // 编辑货源的省市区数组
selectedRegionIndex: -1, // 地区弹窗中选中的地区索引
editSupply: {
yolkIndex: 0,
specIndex: 0
@ -3341,6 +3349,118 @@ Page({
});
},
// 打开创建货源的地区选择弹窗
openCreateRegionModal() {
this.setData({
currentRegionMode: 'create',
regionSearchKeyword: '',
filteredRegionOptions: this.data.regionOptions,
showRegionSelectModal: true
});
},
// 打开编辑货源的地区选择弹窗
openEditRegionModal() {
this.setData({
currentRegionMode: 'edit',
editRegionSearchKeyword: '',
filteredRegionOptions: this.data.regionOptions,
showRegionSelectModal: true
});
},
// 关闭地区选择弹窗
closeRegionModal() {
this.setData({
showRegionSelectModal: false,
selectedRegionIndex: -1
});
},
// 处理创建货源弹窗中的地区搜索输入
onRegionSearchInput(e) {
const keyword = e.detail.value.toLowerCase().trim();
this.setData({
regionSearchKeyword: keyword
});
// 过滤地区选项
this.filterRegionOptions(keyword, 'create');
},
// 处理编辑货源弹窗中的地区搜索输入
onEditRegionSearchInput(e) {
const keyword = e.detail.value.toLowerCase().trim();
this.setData({
editRegionSearchKeyword: keyword
});
// 过滤地区选项
this.filterRegionOptions(keyword, 'edit');
},
// 过滤地区选项的通用函数
filterRegionOptions(keyword, type) {
const regionOptions = this.data.regionOptions;
let filteredOptions = regionOptions;
if (keyword) {
filteredOptions = regionOptions.filter(option => {
return option.toLowerCase().includes(keyword);
});
}
this.setData({
filteredRegionOptions: filteredOptions
});
},
// 清除地区搜索关键词
clearRegionSearch() {
this.setData({
regionSearchKeyword: '',
filteredRegionOptions: this.data.regionOptions
});
},
// 清除编辑弹窗中的地区搜索关键词
clearEditRegionSearch() {
this.setData({
editRegionSearchKeyword: '',
filteredRegionOptions: this.data.regionOptions
});
},
// 选择地区
selectRegion(e) {
const index = e.currentTarget.dataset.index;
this.setData({
selectedRegionIndex: index
});
},
// 确认地区选择
confirmRegionSelection() {
const selectedIndex = this.data.selectedRegionIndex;
if (selectedIndex === -1) {
this.closeRegionModal();
return;
}
const selectedRegion = this.data.filteredRegionOptions[selectedIndex];
const mode = this.data.currentRegionMode;
if (mode === 'create') {
this.setData({
'newSupply.region': selectedRegion
});
} else if (mode === 'edit') {
this.setData({
'editSupply.region': selectedRegion
});
}
this.closeRegionModal();
},
/**
* 阻止触摸移动事件用于WXML绑定
*/

66
pages/seller/index.wxml

@ -534,15 +534,13 @@
<view style="font-size: 28rpx; font-weight: 500; color: #333; margin-bottom: 12rpx; margin-left: 10rpx;">地区</view>
<picker
mode="region"
value="{{newSupplyRegionArray}}"
bindchange="onNewSupplyRegionChange"
<view
class="region-picker input"
bindtap="openCreateRegionModal"
style="width: 100%; height: 90rpx; line-height: 90rpx; padding: 0 24rpx; font-size: 30rpx; border: 2rpx solid #eee; border-radius: 12rpx; box-sizing: border-box; margin: 0 auto 30rpx; display: block;"
>
<text>{{newSupply.region || '请选择省市区'}}</text>
</picker>
</view>
<view style="display: flex; justify-content: space-between; margin-top: 20rpx; margin-bottom: 20rpx; gap: 20rpx;">
<button bindtap="hideModal" style="flex: 1; height: 90rpx; line-height: 90rpx; background-color: #f5f5f5; color: #666; font-size: 30rpx; border-radius: 12rpx; margin: 0; display: flex; align-items: center; justify-content: center;">取消</button>
@ -617,15 +615,13 @@
<view style="font-size: 28rpx; font-weight: 500; color: #333; margin-bottom: 12rpx; margin-left: 10rpx;">地区</view>
<picker
mode="region"
value="{{editSupplyRegionArray}}"
bindchange="onEditSupplyRegionChange"
<view
class="region-picker input"
bindtap="openEditRegionModal"
style="width: 100%; height: 90rpx; line-height: 90rpx; padding: 0 24rpx; font-size: 30rpx; border: 2rpx solid #eee; border-radius: 12rpx; box-sizing: border-box; margin: 0 auto 30rpx; display: block;"
>
<text>{{editSupply.region || '请选择省市区'}}</text>
</picker>
</view>
<view style="display: flex; justify-content: space-between; margin-top: 20rpx; margin-bottom: 20rpx; gap: 20rpx;">
<button bindtap="hideEditModal" style="flex: 1; height: 90rpx; line-height: 90rpx; background-color: #f5f5f5; color: #666; font-size: 30rpx; border-radius: 12rpx; margin: 0; display: flex; align-items: center; justify-content: center;">取消</button>
@ -860,4 +856,54 @@
</view>
</view>
<!-- 地区选择弹窗 -->
<view class="region-select-modal" wx:if="{{showRegionSelectModal}}" style="position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); display: flex; justify-content: center; z-index: 9999;" catchtouchmove="true">
<view style="position: fixed; bottom: 0; left: 0; right: 0; background: white; border-radius: 20rpx 20rpx 0 0; max-height: 80vh;">
<!-- 顶部操作栏:取消和确定按钮 -->
<view style="padding: 20rpx; display: flex; justify-content: space-between; align-items: center; border-bottom: 1rpx solid #eee;">
<view bindtap="closeRegionModal" style="font-size: 32rpx; color: #333; padding: 10rpx 20rpx;">取消</view>
<view bindtap="confirmRegionSelection" style="font-size: 32rpx; color: #07c160; padding: 10rpx 20rpx;">确定</view>
</view>
<!-- 搜索框区域 -->
<view style="padding: 20rpx;">
<view style="position: relative; background: #f5f5f5; border-radius: 40rpx; padding: 0 30rpx;">
<input
type="text"
placeholder="搜索地区"
value="{{currentRegionMode === 'create' ? regionSearchKeyword : editRegionSearchKeyword}}"
bindinput="{{currentRegionMode === 'create' ? 'onRegionSearchInput' : 'onEditRegionSearchInput'}}"
confirm-type="search"
style="width: 100%; height: 70rpx; line-height: 70rpx; font-size: 28rpx; background: transparent;"
/>
<view
wx:if="{{currentRegionMode === 'create' ? regionSearchKeyword : editRegionSearchKeyword}}"
bindtap="{{currentRegionMode === 'create' ? 'clearRegionSearch' : 'clearEditRegionSearch'}}"
style="position: absolute; right: 30rpx; top: 50%; transform: translateY(-50%); color: #999;"
>
</view>
</view>
</view>
<!-- 地区列表 -->
<scroll-view
scroll-y="true"
style="max-height: 60vh; padding: 0; -webkit-overflow-scrolling: touch;"
enable-back-to-top="false"
>
<view
wx:for="{{filteredRegionOptions}}"
wx:key="index"
class="region-item {{selectedRegionIndex === index ? 'selected' : ''}}"
bindtap="selectRegion"
data-index="{{index}}"
style="padding: 32rpx 40rpx; border-bottom: 1rpx solid #f0f0f0; font-size: 32rpx; color: {{selectedRegionIndex === index ? '#07c160' : '#131413'}}; text-align: center;"
>
{{item}}
</view>
</scroll-view>
</view>
</view>
</view>

116
pages/seller/index.wxss

@ -825,3 +825,119 @@ button {
transform: translateZ(0);
will-change: transform;
}
/* 地区选择弹窗样式 */
.region-select-modal {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
z-index: 9999;
overflow: hidden;
}
.region-select-modal .modal-content {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: white;
border-radius: 20rpx 20rpx 0 0;
max-height: 80vh;
will-change: transform;
-webkit-transition: transform 0.3s ease;
transition: transform 0.3s ease;
}
.region-select-modal .modal-header {
padding: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1rpx solid #eee;
background-color: white;
border-radius: 20rpx 20rpx 0 0;
}
.region-select-modal .modal-title {
font-size: 32rpx;
font-weight: 500;
color: #333;
}
.region-select-modal .modal-btn {
font-size: 32rpx;
padding: 10rpx 20rpx;
}
.region-select-modal .modal-btn.cancel {
color: #333;
}
.region-select-modal .modal-btn.confirm {
color: #07c160;
}
.region-select-modal .search-area {
padding: 20rpx;
background-color: white;
border-bottom: 1rpx solid #f0f0f0;
}
.region-select-modal .search-box {
position: relative;
background: #f5f5f5;
border-radius: 40rpx;
padding: 0 30rpx;
}
.region-select-modal .search-input {
width: 100%;
height: 70rpx;
line-height: 70rpx;
font-size: 28rpx;
background: transparent;
-webkit-appearance: none;
appearance: none;
border: none;
outline: none;
}
.region-select-modal .search-clear {
position: absolute;
right: 30rpx;
top: 50%;
transform: translateY(-50%);
color: #999;
font-size: 32rpx;
cursor: pointer;
}
.region-select-modal .region-list {
max-height: 60vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.region-select-modal .region-item {
padding: 32rpx 40rpx;
border-bottom: 1rpx solid #f0f0f0;
font-size: 32rpx;
color: #131413;
text-align: center;
cursor: pointer;
transition: background-color 0.2s ease;
}
.region-select-modal .region-item:hover {
background-color: #f5f5f5;
}
.region-select-modal .region-item.selected {
color: #07c160;
background-color: #f0f8f3;
}
Loading…
Cancel
Save