You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5210 lines
197 KiB

3 months ago
// pages/seller/index.js
const API = require('../../utils/api.js')
Page({
data: {
supplies: [],
publishedSupplies: [],
pendingSupplies: [], // 审核中的货源
rejectedSupplies: [], // 审核失败的货源
draftSupplies: [],
showModal: false,
showEditModal: false,
showRejectReasonModal: false, // 控制审核失败原因弹窗显示
currentRejectSupply: null, // 当前显示的审核失败货源
rejectReason: '', // 审核失败原因
showTabBar: true, // 控制底部自定义tab-bar的显示状态
showSpecSelectModal: false, // 控制规格选择弹窗显示
modalSpecSearchKeyword: '', // 规格弹窗中的搜索关键词
filteredModalSpecOptions: [], // 弹窗中过滤后的规格选项
selectedModalSpecIndex: -1, // 弹窗中选中的规格索引
currentSpecMode: 'create', // 当前规格选择模式:create 或 edit
showNameSelectModal: false, // 控制商品名称选择弹窗显示
showYolkSelectModal: false, // 控制蛋黄选择弹窗显示
selectedNameIndex: -1, // 商品名称弹窗中选中的索引
selectedYolkIndex: -1,//蛋黄弹窗中选中的索引,
// 商品名称选项列表
productNameOptions: ['罗曼粉', '伊莎粉', '罗曼灰', '海蓝灰', '海蓝褐', '绿壳', '粉一', '粉二', '粉八', '京粉1号', '京红', '京粉6号', '京粉3号', '农大系列', '黑鸡土蛋', '双黄蛋', '大午金凤', '黑凤'],
3 months ago
// 蛋黄选项
yolkOptions: ['红心', '黄心', '双色'],
// 规格选项
specOptions: ['格子装', '散托', '不限规格', '净重47+', '净重46-47', '净重45-46', '净重44-45', '净重43-44', '净重42-43', '净重41-42', '净重40-41', '净重39-40', '净重38-39', '净重37-39', '净重37-38', '净重36-38', '净重36-37', '净重35-36', '净重34-35', '净重33-34', '净重32-33', '净重32-34', '净重31-32', '净重30-35', '净重30-34', '净重30-32', '净重30-31', '净重29-31', '净重29-30', '净重28-29', '净重28以下', '毛重52以上', '毛重50-51', '毛重48-49', '毛重47-48', '毛重46-47', '毛重45-47', '毛重45-46', '毛重44-45', '毛重43-44', '毛重42-43', '毛重41-42', '毛重40-41', '毛重38-39', '毛重36-37', '毛重34-35', '毛重32-33', '毛重30-31', '毛重30以下'],
3 months ago
// 规格搜索相关变量
specSearchKeyword: '', // 创建货源弹窗中的规格搜索关键词
editSpecSearchKeyword: '', // 编辑货源弹窗中的规格搜索关键词
filteredSpecOptions: [], // 过滤后的规格选项数组
filteredEditSpecOptions: [], // 编辑货源过滤后的规格选项数组
// 地区选择相关变量 - 三级联动
showRegionSelectModal: false, // 控制地区选择弹窗显示
currentRegionMode: 'create', // 当前地区选择模式:create 或 edit
// 三级联动地区数据结构
regionOptions: [
// 直辖市
{
name: '北京市',
cities: [
{
name: '北京市',
districts: ['东城区', '西城区', '朝阳区', '丰台区', '石景山区', '海淀区', '门头沟区', '房山区', '通州区', '顺义区', '昌平区', '大兴区', '怀柔区', '平谷区', '密云区', '延庆区']
}
]
},
{
name: '陕西省',
cities: [
{ name: '西安市', districts: ['新城区', '碑林区', '莲湖区', '灞桥区', '未央区', '雁塔区', '阎良区', '临潼区', '长安区', '高陵区', '鄠邑区', '蓝田县', '周至县'] },
{ name: '铜川市', districts: ['王益区', '印台区', '耀州区', '宜君县'] },
{ name: '宝鸡市', districts: ['渭滨区', '金台区', '陈仓区', '凤翔区', '岐山县', '扶风县', '眉县', '陇县', '千阳县', '麟游县', '凤县', '太白县'] },
{ name: '咸阳市', districts: ['秦都区', '杨陵区', '渭城区', '兴平市', '三原县', '泾阳县', '乾县', '礼泉县', '永寿县', '长武县', '旬邑县', '淳化县', '武功县'] },
{ name: '渭南市', districts: ['临渭区', '华州区', '韩城市', '华阴市', '潼关县', '大荔县', '合阳县', '澄城县', '蒲城县', '白水县', '富平县'] },
{ name: '延安市', districts: ['宝塔区', '安塞区', '延长县', '延川县', '子长市', '志丹县', '吴起县', '甘泉县', '富县', '洛川县', '宜川县', '黄龙县', '黄陵县'] },
{ name: '汉中市', districts: ['汉台区', '南郑区', '城固县', '洋县', '西乡县', '勉县', '宁强县', '略阳县', '镇巴县', '留坝县', '佛坪县'] },
{ name: '榆林市', districts: ['榆阳区', '横山区', '神木市', '府谷县', '靖边县', '定边县', '绥德县', '米脂县', '佳县', '吴堡县', '清涧县', '子洲县'] },
{ name: '安康市', districts: ['汉滨区', '汉阴县', '石泉县', '宁陕县', '紫阳县', '岚皋县', '平利县', '镇坪县', '旬阳市', '白河县'] },
{ name: '商洛市', districts: ['商州区', '洛南县', '丹凤县', '商南县', '山阳县', '镇安县', '柞水县'] }
]
},
{
name: '甘肃省',
cities: [
{ name: '兰州市', districts: ['城关区', '七里河区', '西固区', '安宁区', '红古区', '永登县', '皋兰县', '榆中县'] },
{ name: '嘉峪关市', districts: ['嘉峪关市'] },
{ name: '金昌市', districts: ['金川区', '永昌县'] },
{ name: '白银市', districts: ['白银区', '平川区', '靖远县', '会宁县', '景泰县'] },
{ name: '天水市', districts: ['秦州区', '麦积区', '清水县', '秦安县', '甘谷县', '武山县', '张家川回族自治县'] },
{ name: '武威市', districts: ['凉州区', '民勤县', '古浪县', '天祝藏族自治县'] },
{ name: '张掖市', districts: ['甘州区', '肃南裕固族自治县', '民乐县', '临泽县', '高台县', '山丹县'] },
{ name: '平凉市', districts: ['崆峒区', '泾川县', '灵台县', '崇信县', '华亭市', '庄浪县', '静宁县'] },
{ name: '酒泉市', districts: ['肃州区', '金塔县', '瓜州县', '肃北蒙古族自治县', '阿克塞哈萨克族自治县', '玉门市', '敦煌市'] },
{ name: '庆阳市', districts: ['西峰区', '庆城县', '环县', '华池县', '合水县', '正宁县', '宁县', '镇原县'] },
{ name: '定西市', districts: ['安定区', '通渭县', '陇西县', '渭源县', '临洮县', '漳县', '岷县'] },
{ name: '陇南市', districts: ['武都区', '成县', '文县', '宕昌县', '康县', '西和县', '礼县', '徽县', '两当县'] },
{ name: '临夏回族自治州', districts: ['临夏市', '临夏县', '康乐县', '永靖县', '广河县', '和政县', '东乡族自治县', '积石山保安族东乡族撒拉族自治县'] },
{ name: '甘南藏族自治州', districts: ['合作市', '临潭县', '卓尼县', '舟曲县', '迭部县', '玛曲县', '碌曲县', '夏河县'] }
]
},
{
name: '青海省',
cities: [
{ name: '西宁市', districts: ['城东区', '城中区', '城西区', '城北区', '大通回族土族自治县', '湟中区', '湟源县'] },
{ name: '海东市', districts: ['乐都区', '平安区', '民和回族土族自治县', '互助土族自治县', '化隆回族自治县', '循化撒拉族自治县'] },
{ name: '海北藏族自治州', districts: ['海晏县', '祁连县', '刚察县', '门源回族自治县'] },
{ name: '黄南藏族自治州', districts: ['同仁市', '尖扎县', '泽库县', '河南蒙古族自治县'] },
{ name: '海南藏族自治州', districts: ['共和县', '同德县', '贵德县', '兴海县', '贵南县'] },
{ name: '果洛藏族自治州', districts: ['玛沁县', '班玛县', '甘德县', '达日县', '久治县', '玛多县'] },
{ name: '玉树藏族自治州', districts: ['玉树市', '杂多县', '称多县', '治多县', '囊谦县', '曲麻莱县'] },
{ name: '海西蒙古族藏族自治州', districts: ['格尔木市', '德令哈市', '茫崖市', '天峻县', '都兰县', '乌兰县'] }
]
},
{
name: '台湾省',
cities: [
{ name: '台北市', districts: ['中正区', '大同区', '中山区', '松山区', '大安区', '万华区', '信义区', '士林区', '北投区', '内湖区', '南港区', '文山区'] },
{ name: '高雄市', districts: ['新兴区', '前金区', '苓雅区', '盐埕区', '鼓山区', '旗津区', '前镇区', '三民区', '楠梓区', '小港区', '左营区', '仁武区', '大树区', '鸟松区', '冈山区', '桥头区', '燕巢区', '田寮区', '阿莲区', '路竹区', '湖内区', '茄萣区', '永安区', '弥陀区', '梓官区', '旗山区', '美浓区', '六龟区', '甲仙区', '杉林区', '内门区', '茂林区', '桃源区', '那玛夏区'] },
{ name: '新北市', districts: ['板桥区', '三重区', '中和区', '永和区', '新庄区', '新店区', '树林区', '莺歌区', '三峡区', '淡水区', '汐止区', '瑞芳区', '土城区', '芦洲区', '五股区', '泰山区', '林口区', '八里区', '三芝区', '石门区', '金山区', '万里区', '金山区', '贡寮区', '坪林区', '乌来区', '深坑区', '石碇区', '新店区', '双溪区', '平溪区', '中山区', '大同区', '中正区', '万华区', '信义区', '松山区', '大安区', '南港区', '内湖区', '士林区', '北投区', '文山区'] },
{ name: '台中市', districts: ['中区', '东区', '南区', '西区', '北区', '北屯区', '西屯区', '南屯区', '太平区', '大里区', '雾峰区', '乌日区', '丰原区', '后里区', '石冈区', '东势区', '和平区', '新社区', '潭子区', '大雅区', '神冈区', '大肚区', '沙鹿区', '龙井区', '梧栖区', '清水区', '大甲区', '外埔区', '大安区长'] },
{ name: '台南市', districts: ['中西区', '东区', '南区', '北区', '安平区', '安南区', '永康区', '归仁区', '新化区', '左镇区', '玉井区', '楠西区', '南化区', '仁德区', '关庙区', '龙崎区', '官田区', '麻豆区', '佳里区', '西港区', '七股区', '将军区', '学甲区', '北门区', '新营区', '后壁区', '白河区', '东山区', '六甲区', '下营区', '柳营区', '盐水区', '善化区', '大内区', '山上区', '新市', '安定区'] },
{ name: '桃园市', districts: ['桃园区', '中坜区', '平镇区', '八德区', '杨梅区', '芦竹区', '大溪区', '龙潭区', '龟山区', '大园区', '观音区', '新屋区', '复兴区'] },
{ name: '宜兰县', districts: ['宜兰市', '头城镇', '罗东镇', '苏澳镇', '礁溪乡', '壮围乡', '员山乡', '冬山乡', '五结乡', '三星乡', '大同乡', '南澳乡'] },
{ name: '新竹县', districts: ['竹北市', '竹东镇', '新埔镇', '关西镇', '湖口乡', '新丰乡', '芎林乡', '宝山乡', '北埔乡', '峨眉乡', '尖石乡', '横山乡', '五峰乡'] },
{ name: '苗栗县', districts: ['苗栗市', '苑里镇', '通霄镇', '后龙镇', '竹南镇', '头份市', '造桥乡', '西湖乡', '头屋乡', '公馆乡', '铜锣乡', '三义乡', '西湖乡', '南庄乡', '大湖乡', '卓兰镇', '泰安乡'] },
{ name: '彰化县', districts: ['彰化市', '和美镇', '鹿港镇', '溪湖镇', '员林市', '北斗镇', '田中镇', '二林镇', '永靖乡', '伸港乡', '线西乡', '福兴乡', '秀水乡', '花坛乡', '芬园乡', '大村乡', '埔盐乡', '埔心乡', '溪州乡', '竹塘乡', '社头乡', '二水乡', '田尾乡', '埤头乡', '芳苑乡', '大城乡', '竹塘乡', '溪湖乡', '埤头乡'] },
{ name: '南投县', districts: ['南投市', '埔里镇', '草屯镇', '竹山镇', '集集镇', '名间乡', '鹿谷乡', '中寮乡', '鱼池乡', '国姓乡', '水里乡', '信义乡', '仁爱乡'] },
{ name: '云林县', districts: ['斗六市', '斗南镇', '虎尾镇', '土库镇', '西螺镇', '北港镇', '古坑乡', '大埤乡', '莿桐乡', '林内乡', '二仑乡', '仑背乡', '麦寮乡', '东势乡', '褒忠乡', '台西乡', '元长乡', '四湖乡', '口湖乡', '水林乡'] },
{ name: '嘉义县', districts: ['太保市', '朴子市', '布袋镇', '大林镇', '民雄乡', '溪口乡', '新港乡', '六脚乡', '东石乡', '义竹乡', '鹿草乡', '水上乡', '中埔乡', '竹崎乡', '梅山乡', '番路乡', '大埔乡', '阿里山乡'] },
{ name: '屏东县', districts: ['屏东市', '潮州镇', '东港镇', '恒春镇', '万丹乡', '长治乡', '麟洛乡', '九如乡', '里港乡', '盐埔乡', '高树乡', '万峦乡', '内埔乡', '竹田乡', '新埤乡', '枋寮乡', '枋山乡', '春日乡', '来义乡', '富里乡', '狮子乡', '牡丹乡', '车城乡', '满州乡', '枋寮乡', '三地门乡', '雾台乡'] },
{ name: '台东县', districts: ['台东市', '成功镇', '关山镇', '卑南乡', '鹿野乡', '池上乡', '东河乡', '长滨乡', '太麻里乡', '金峰乡', '大武乡', '绿岛乡', '兰屿乡', '延平乡', '海端乡', '达仁乡'] },
{ name: '花莲县', districts: ['花莲市', '凤林镇', '玉里镇', '新城乡', '吉安乡', '寿丰乡', '秀林乡', '光复乡', '丰滨乡', '瑞穗乡', '富里乡', '万荣乡', '卓溪乡'] },
{ name: '澎湖县', districts: ['马公市', '湖西乡', '白沙乡', '西屿乡', '望安乡', '七美乡'] },
{ name: '金门县', districts: ['金城镇', '金湖镇', '金沙镇', '金宁乡', '烈屿乡', '乌丘乡'] },
{ name: '连江县', districts: ['南竿乡', '北竿乡', '莒光乡', '东引乡'] }
]
},
{
name: '云南省',
cities: [
{ name: '昆明市', districts: ['五华区', '盘龙区', '官渡区', '西山区', '东川区', '呈贡区', '晋宁区', '富民县', '宜良县', '石林彝族自治县', '嵩明县', '禄劝彝族苗族自治县', '寻甸回族彝族自治县'] },
{ name: '曲靖市', districts: ['麒麟区', '沾益区', '马龙区', '宣威市', '富源县', '罗平县', '师宗县', '陆良县', '会泽县'] },
{ name: '玉溪市', districts: ['红塔区', '江川区', '澄江市', '通海县', '华宁县', '易门县', '峨山彝族自治县', '新平彝族傣族自治县', '元江哈尼族彝族傣族自治县'] },
{ name: '保山市', districts: ['隆阳区', '腾冲市', '施甸县', '龙陵县', '昌宁县'] },
{ name: '昭通市', districts: ['昭阳区', '鲁甸县', '巧家县', '盐津县', '大关县', '永善县', '绥江县', '镇雄县', '彝良县', '威信县', '水富市'] },
{ name: '丽江市', districts: ['古城区', '玉龙纳西族自治县', '永胜县', '华坪县', '宁蒗彝族自治县'] },
{ name: '普洱市', districts: ['思茅区', '宁洱哈尼族彝族自治县', '墨江哈尼族自治县', '景东彝族自治县', '景谷傣族彝族自治县', '镇沅彝族哈尼族拉祜族自治县', '江城哈尼族彝族自治县', '孟连傣族拉祜族佤族自治县', '澜沧拉祜族自治县', '西盟佤族自治县'] },
{ name: '临沧市', districts: ['临翔区', '凤庆县', '云县', '永德县', '镇康县', '双江拉祜族佤族布朗族傣族自治县', '耿马傣族佤族自治县', '沧源佤族自治县'] },
{ name: '楚雄彝族自治州', districts: ['楚雄市', '双柏县', '牟定县', '南华县', '姚安县', '大姚县', '永仁县', '元谋县', '武定县', '禄丰市'] },
{ name: '红河哈尼族彝族自治州', districts: ['蒙自市', '个旧市', '开远市', '弥勒市', '建水县', '石屏县', '泸西县', '元阳县', '红河县', '金平苗族瑶族傣族自治县', '绿春县', '屏边苗族自治县', '河口瑶族自治县'] },
{ name: '文山壮族苗族自治州', districts: ['文山市', '砚山县', '西畴县', '麻栗坡县', '马关县', '丘北县', '广南县', '富宁县'] },
{ name: '西双版纳傣族自治州', districts: ['景洪市', '勐海县', '勐腊县'] },
{ name: '大理白族自治州', districts: ['大理市', '漾濞彝族自治县', '祥云县', '宾川县', '弥渡县', '南涧彝族自治县', '巍山彝族回族自治县', '永平县', '云龙县', '洱源县', '剑川县', '鹤庆县'] },
{ name: '德宏傣族景颇族自治州', districts: ['芒市', '瑞丽市', '梁河县', '盈江县', '陇川县'] },
{ name: '怒江傈僳族自治州', districts: ['泸水市', '福贡县', '贡山独龙族怒族自治县', '兰坪白族普米族自治县'] },
{ name: '迪庆藏族自治州', districts: ['香格里拉市', '德钦县', '维西傈僳族自治县'] }
]
},
{
name: '贵州省',
cities: [
{ name: '贵阳市', districts: ['南明区', '云岩区', '花溪区', '乌当区', '白云区', '观山湖区', '开阳县', '息烽县', '修文县', '清镇市'] },
{ name: '六盘水市', districts: ['钟山区', '六枝特区', '水城区', '盘州市'] },
{ name: '遵义市', districts: ['红花岗区', '汇川区', '播州区', '赤水市', '仁怀市', '桐梓县', '绥阳县', '正安县', '道真仡佬族苗族自治县', '务川仡佬族苗族自治县', '凤冈县', '湄潭县', '余庆县', '习水县'] },
{ name: '安顺市', districts: ['西秀区', '平坝区', '普定县', '镇宁布依族苗族自治县', '关岭布依族苗族自治县', '紫云苗族布依族自治县'] },
{ name: '毕节市', districts: ['七星关区', '赫章县', '威宁彝族回族苗族自治县', '纳雍县', '织金县', '黔西县', '金沙县', '大方县'] },
{ name: '铜仁市', districts: ['碧江区', '万山区', '江口县', '玉屏侗族自治县', '石阡县', '思南县', '印江土家族苗族自治县', '德江县', '沿河土家族自治县', '松桃苗族自治县'] },
{ name: '黔东南苗族侗族自治州', districts: ['凯里市', '黄平县', '施秉县', '三穗县', '镇远县', '岑巩县', '天柱县', '锦屏县', '剑河县', '台江县', '黎平县', '榕江县', '从江县', '雷山县', '麻江县', '丹寨县'] },
{ name: '黔南布依族苗族自治州', districts: ['都匀市', '福泉市', '荔波县', '贵定县', '瓮安县', '独山县', '平塘县', '罗甸县', '长顺县', '龙里县', '惠水县', '三都水族自治县'] },
{ name: '黔西南布依族苗族自治州', districts: ['兴义市', '兴仁市', '普安县', '晴隆县', '贞丰县', '望谟县', '册亨县', '安龙县'] }
]
},
{
name: '海南省',
cities: [
{ name: '海口市', districts: ['秀英区', '龙华区', '琼山区', '美兰区'] },
{ name: '三亚市', districts: ['吉阳区', '天涯区', '海棠区', '崖州区'] },
{ name: '三沙市', districts: ['西沙区', '南沙区'] },
{ name: '儋州市', districts: ['那大镇', '和庆镇', '南丰镇', '大成镇', '雅星镇', '兰洋镇', '光村镇', '木棠镇', '海头镇', '峨蔓镇', '王五镇', '白马井镇', '中和镇', '排浦镇', '东成镇'] },
{ name: '五指山市', districts: ['通什镇', '南圣镇', '毛阳镇', '番阳镇', '水满乡', '畅好乡', '毛道乡'] },
{ name: '文昌市', districts: ['文城镇', '重兴镇', '蓬莱镇', '会文镇', '东路镇', '潭牛镇', '东阁镇', '文教镇', '东郊镇', '龙楼镇', '昌洒镇', '翁田镇', '抱罗镇', '冯坡镇', '锦山镇', '铺前镇', '公坡镇'] },
{ name: '琼海市', districts: ['嘉积镇', '万泉镇', '石壁镇', '中原镇', '博鳌镇', '阳江镇', '龙江镇', '潭门镇', '塔洋镇', '长坡镇', '会山镇', '大路镇'] },
{ name: '万宁市', districts: ['万城镇', '龙滚镇', '山根镇', '和乐镇', '后安镇', '大茂镇', '东澳镇', '礼纪镇', '长丰镇', '北大镇', '南桥镇', '三更罗镇', '东兴农场', '东和农场'] },
{ name: '东方市', districts: ['八所镇', '东河镇', '大田镇', '感城镇', '板桥镇', '三家镇', '四更镇', '新龙镇', '天安乡', '江边乡'] },
{ name: '定安县', districts: ['定城镇', '新竹镇', '龙湖镇', '雷鸣镇', '龙门镇', '岭口镇', '翰林镇', '龙河镇', '黄竹镇', '富文镇'] },
{ name: '屯昌县', districts: ['屯城镇', '新兴镇', '枫木镇', '乌坡镇', '南吕镇', '南坤镇', '坡心镇', '西昌镇'] },
{ name: '澄迈县', districts: ['金江镇', '老城镇', '瑞溪镇', '永发镇', '加乐镇', '文儒镇', '中兴镇', '仁兴镇', '福山镇', '桥头镇', '大丰镇', '邦溪镇'] },
{ name: '临高县', districts: ['临城镇', '波莲镇', '东英镇', '博厚镇', '皇桐镇', '多文镇', '和舍镇', '南宝镇', '新盈镇', '调楼镇', '加来镇'] },
{ name: '白沙黎族自治县', districts: ['牙叉镇', '七坊镇', '打安镇', '邦溪镇', '南开乡', '元门乡', '阜龙乡', '细水乡', '青松乡', '金波乡', '荣邦乡'] },
{ name: '昌江黎族自治县', districts: ['石碌镇', '叉河镇', '十月田镇', '乌烈镇', '昌化镇', '海尾镇', '七叉镇', '王下乡'] },
{ name: '乐东黎族自治县', districts: ['抱由镇', '万冲镇', '大安镇', '志仲镇', '千家镇', '九所镇', '利国镇', '黄流镇', '佛罗镇', '尖峰镇', '莺歌海镇', '尖峰岭', '山荣农场'] },
{ name: '陵水黎族自治县', districts: ['椰林镇', '新村镇', '英州镇', '本号镇', '隆广镇', '三才镇', '光坡镇', '文罗镇', '黎安镇', '提蒙乡', '群英乡'] },
{ name: '保亭黎族苗族自治县', districts: ['保城镇', '什玲镇', '加茂镇', '响水镇', '新政镇', '三道镇', '六弓乡', '南林乡', '毛感乡'] },
{ name: '琼中黎族苗族自治县', districts: ['营根镇', '湾岭镇', '黎母山镇', '和平镇', '长征镇', '红毛镇', '中平镇', '吊罗山乡', '上安乡', '什运乡'] }
]
},
{
name: '内蒙古自治区',
cities: [
{ name: '呼和浩特市', districts: ['新城区', '回民区', '玉泉区', '赛罕区', '土默特左旗', '托克托县', '和林格尔县', '清水河县', '武川县'] },
{ name: '包头市', districts: ['东河区', '昆都仑区', '青山区', '石拐区', '白云鄂博矿区', '九原区', '土默特右旗', '固阳县', '达尔罕茂明安联合旗'] },
{ name: '乌海市', districts: ['海勃湾区', '海南区', '乌达区'] },
{ name: '赤峰市', districts: ['红山区', '元宝山区', '松山区', '阿鲁科尔沁旗', '巴林左旗', '巴林右旗', '林西县', '克什克腾旗', '翁牛特旗', '喀喇沁旗', '宁城县', '敖汉旗'] },
{ name: '通辽市', districts: ['科尔沁区', '霍林郭勒市', '科尔沁左翼中旗', '科尔沁左翼后旗', '开鲁县', '库伦旗', '奈曼旗', '扎鲁特旗'] },
{ name: '鄂尔多斯市', districts: ['东胜区', '康巴什区', '达拉特旗', '准格尔旗', '鄂托克前旗', '鄂托克旗', '杭锦旗', '乌审旗', '伊金霍洛旗'] },
{ name: '呼伦贝尔市', districts: ['海拉尔区', '扎赉诺尔区', '满洲里市', '牙克石市', '扎兰屯市', '额尔古纳市', '根河市', '阿荣旗', '莫力达瓦达斡尔族自治旗', '鄂伦春自治旗', '鄂温克族自治旗', '陈巴尔虎旗', '新巴尔虎左旗', '新巴尔虎右旗'] },
{ name: '巴彦淖尔市', districts: ['临河区', '五原县', '磴口县', '乌拉特前旗', '乌拉特中旗', '乌拉特后旗', '杭锦后旗'] },
{ name: '乌兰察布市', districts: ['集宁区', '丰镇市', '卓资县', '化德县', '商都县', '兴和县', '凉城县', '察哈尔右翼前旗', '察哈尔右翼中旗', '察哈尔右翼后旗', '四子王旗'] },
{ name: '兴安盟', districts: ['乌兰浩特市', '阿尔山市', '科尔沁右翼前旗', '科尔沁右翼中旗', '扎赉特旗', '突泉县'] },
{ name: '锡林郭勒盟', districts: ['锡林浩特市', '二连浩特市', '阿巴嘎旗', '苏尼特左旗', '苏尼特右旗', '东乌珠穆沁旗', '西乌珠穆沁旗', '太仆寺旗', '镶黄旗', '正镶白旗', '正蓝旗', '多伦县'] },
{ name: '阿拉善盟', districts: ['阿拉善左旗', '阿拉善右旗', '额济纳旗'] }
]
},
{
name: '广西壮族自治区',
cities: [
{ name: '南宁市', districts: ['兴宁区', '青秀区', '江南区', '西乡塘区', '良庆区', '邕宁区', '武鸣区', '隆安县', '马山县', '上林县', '宾阳县', '横州市'] },
{ name: '柳州市', districts: ['城中区', '鱼峰区', '柳南区', '柳北区', '柳江区', '柳城县', '鹿寨县', '融安县', '融水苗族自治县', '三江侗族自治县'] },
{ name: '桂林市', districts: ['秀峰区', '叠彩区', '象山区', '七星区', '雁山区', '临桂区', '阳朔县', '灵川县', '全州县', '兴安县', '永福县', '灌阳县', '龙胜各族自治县', '资源县', '平乐县', '荔浦市', '恭城瑶族自治县'] },
{ name: '梧州市', districts: ['万秀区', '长洲区', '龙圩区', '苍梧县', '藤县', '蒙山县', '岑溪市'] },
{ name: '北海市', districts: ['海城区', '银海区', '铁山港区', '合浦县'] },
{ name: '防城港市', districts: ['港口区', '防城区', '上思县', '东兴市'] },
{ name: '钦州市', districts: ['钦南区', '钦北区', '灵山县', '浦北县'] },
{ name: '贵港市', districts: ['港北区', '港南区', '覃塘区', '平南县', '桂平市'] },
{ name: '玉林市', districts: ['玉州区', '福绵区', '容县', '陆川县', '博白县', '兴业县', '北流市'] },
{ name: '百色市', districts: ['右江区', '田阳区', '田东县', '德保县', '那坡县', '凌云县', '乐业县', '田林县', '西林县', '隆林各族自治县', '靖西市', '平果市'] },
{ name: '贺州市', districts: ['八步区', '平桂区', '昭平县', '钟山县', '富川瑶族自治县'] },
{ name: '河池市', districts: ['金城江区', '宜州区', '南丹县', '天峨县', '凤山县', '东兰县', '罗城仫佬族自治县', '环江毛南族自治县', '巴马瑶族自治县', '都安瑶族自治县', '大化瑶族自治县'] },
{ name: '来宾市', districts: ['兴宾区', '忻城县', '象州县', '武宣县', '金秀瑶族自治县', '合山市'] },
{ name: '崇左市', districts: ['江州区', '扶绥县', '宁明县', '龙州县', '大新县', '天等县', '凭祥市'] }
]
},
{
name: '西藏自治区',
cities: [
{ name: '拉萨市', districts: ['城关区', '堆龙德庆区', '达孜区', '林周县', '当雄县', '尼木县', '曲水县', '墨竹工卡县'] },
{ name: '日喀则市', districts: ['桑珠孜区', '南木林县', '江孜县', '定日县', '萨迦县', '拉孜县', '昂仁县', '谢通门县', '白朗县', '仁布县', '康马县', '定结县', '仲巴县', '亚东县', '吉隆县', '聂拉木县', '萨嘎县', '岗巴县'] },
{ name: '昌都市', districts: ['卡若区', '江达县', '贡觉县', '类乌齐县', '丁青县', '察雅县', '八宿县', '左贡县', '芒康县', '洛隆县', '边坝县'] },
{ name: '林芝市', districts: ['巴宜区', '工布江达县', '米林县', '墨脱县', '波密县', '察隅县', '朗县'] },
{ name: '山南市', districts: ['乃东区', '扎囊县', '贡嘎县', '桑日县', '琼结县', '曲松县', '措美县', '洛扎县', '加查县', '隆子县', '错那市', '浪卡子县'] },
{ name: '那曲市', districts: ['色尼区', '嘉黎县', '比如县', '聂荣县', '安多县', '申扎县', '索县', '班戈县', '巴青县', '尼玛县', '双湖县'] },
{ name: '阿里地区', districts: ['噶尔县', '普兰县', '札达县', '日土县', '革吉县', '改则县', '措勤县'] }
]
},
{
name: '宁夏回族自治区',
cities: [
{ name: '银川市', districts: ['兴庆区', '西夏区', '金凤区', '永宁县', '贺兰县', '灵武市'] },
{ name: '石嘴山市', districts: ['大武口区', '惠农区', '平罗县'] },
{ name: '吴忠市', districts: ['利通区', '红寺堡区', '盐池县', '同心县', '青铜峡市'] },
{ name: '固原市', districts: ['原州区', '西吉县', '隆德县', '泾源县', '彭阳县'] },
{ name: '中卫市', districts: ['沙坡头区', '中宁县', '海原县'] }
]
},
{
name: '新疆维吾尔自治区',
cities: [
{ name: '乌鲁木齐市', districts: ['天山区', '沙依巴克区', '新市区', '水磨沟区', '头屯河区', '达坂城区', '米东区', '乌鲁木齐县'] },
{ name: '克拉玛依市', districts: ['克拉玛依区', '独山子区', '白碱滩区', '乌尔禾区'] },
{ name: '吐鲁番市', districts: ['高昌区', '鄯善县', '托克逊县'] },
{ name: '哈密市', districts: ['伊州区', '巴里坤哈萨克自治县', '伊吾县'] },
{ name: '昌吉回族自治州', districts: ['昌吉市', '阜康市', '呼图壁县', '玛纳斯县', '奇台县', '吉木萨尔县', '木垒哈萨克自治县'] },
{ name: '博尔塔拉蒙古自治州', districts: ['博乐市', '阿拉山口市', '精河县', '温泉县'] },
{ name: '巴音郭楞蒙古自治州', districts: ['库尔勒市', '轮台县', '尉犁县', '若羌县', '且末县', '焉耆回族自治县', '和静县', '和硕县', '博湖县'] },
{ name: '阿克苏地区', districts: ['阿克苏市', '温宿县', '库车市', '沙雅县', '新和县', '拜城县', '乌什县', '阿瓦提县', '柯坪县'] },
{ name: '克孜勒苏柯尔克孜自治州', districts: ['阿图什市', '阿克陶县', '阿合奇县', '乌恰县'] },
{ name: '喀什地区', districts: ['喀什市', '疏附县', '疏勒县', '英吉沙县', '泽普县', '莎车县', '叶城县', '麦盖提县', '岳普湖县', '伽师县', '巴楚县', '塔什库尔干塔吉克自治县'] },
{ name: '和田地区', districts: ['和田市', '和田县', '墨玉县', '皮山县', '洛浦县', '策勒县', '于田县', '民丰县'] },
{ name: '伊犁哈萨克自治州', districts: ['伊宁市', '奎屯市', '霍尔果斯市', '伊宁县', '察布查尔锡伯自治县', '霍城县', '巩留县', '新源县', '昭苏县', '特克斯县', '尼勒克县'] },
{ name: '塔城地区', districts: ['塔城市', '乌苏市', '额敏县', '沙湾市', '托里县', '裕民县', '和布克赛尔蒙古自治县'] },
{ name: '阿勒泰地区', districts: ['阿勒泰市', '布尔津县', '富蕴县', '福海县', '哈巴河县', '青河县', '吉木乃县'] },
{ name: '石河子市', districts: ['新城街道', '向阳街道', '红山街道', '老街街道', '东城街道', '北泉镇', '石河子总场'] },
{ name: '阿拉尔市', districts: ['幸福路街道', '金银川路街道', '青松路街道', '南口街道', '托喀依乡'] },
{ name: '图木舒克市', districts: ['齐干却勒街道', '前海街道', '永安坝街道', '草湖镇'] },
{ name: '五家渠市', districts: ['军垦路街道', '青湖路街道', '人民路街道', '梧桐镇', '蔡家湖镇'] },
{ name: '铁门关市', districts: ['迎宾街道', '二十九团', '三十团'] },
{ name: '双河市', districts: ['红星路街道', '八十一团', '八十四团'] },
{ name: '可克达拉市', districts: ['幸福路街道', '六十六团', '六十七团'] },
{ name: '昆玉市', districts: ['昆泉镇', '二二四团', '四十七团'] },
{ name: '胡杨河市', districts: ['金山路街道', '一二九团', '一三三团'] },
{ name: '新星市', districts: ['中心团场'] }
]
},
{
name: '上海市',
cities: [
{
name: '上海市',
districts: ['黄浦区', '徐汇区', '长宁区', '静安区', '普陀区', '虹口区', '杨浦区', '闵行区', '宝山区', '嘉定区', '浦东新区', '金山区', '松江区', '青浦区', '奉贤区', '崇明区']
}
]
},
{
name: '天津市',
cities: [
{
name: '天津市',
districts: ['和平区', '河东区', '河西区', '南开区', '河北区', '红桥区', '东丽区', '西青区', '津南区', '北辰区', '武清区', '宝坻区', '滨海新区', '宁河区', '静海区', '蓟州区']
}
]
},
{
name: '重庆市',
cities: [
{
name: '重庆市',
districts: ['渝中区', '大渡口区', '江北区', '沙坪坝区', '九龙坡区', '南岸区', '北碚区', '渝北区', '巴南区', '万州区', '涪陵区', '黔江区', '长寿区', '江津区', '合川区', '永川区', '南川区', '綦江区', '大足区', '璧山区', '铜梁区', '潼南区', '荣昌区', '开州区', '梁平区', '武隆区', '城口县', '丰都县', '垫江县', '忠县', '云阳县', '奉节县', '巫山县', '巫溪县', '石柱土家族自治县', '秀山土家族苗族自治县', '酉阳土家族苗族自治县', '彭水苗族土家族自治县']
}
]
},
// 河北省
{
name: '河北省',
cities: [
{
name: '石家庄市',
districts: ['长安区', '桥西区', '新华区', '井陉矿区', '裕华区', '藁城区', '鹿泉区', '栾城区', '井陉县', '正定县', '行唐县', '灵寿县', '高邑县', '深泽县', '赞皇县', '无极县', '平山县', '元氏县', '赵县', '辛集市', '晋州市', '新乐市']
},
{
name: '唐山市',
districts: ['路南区', '路北区', '古冶区', '开平区', '丰南区', '丰润区', '曹妃甸区', '滦南县', '乐亭县', '迁西县', '玉田县', '遵化市', '迁安市', '滦州市']
},
{
name: '秦皇岛市',
districts: ['海港区', '山海关区', '北戴河区', '抚宁区', '青龙满族自治县', '昌黎县', '卢龙县']
},
{
name: '邯郸市',
districts: ['邯山区', '丛台区', '复兴区', '峰峰矿区', '肥乡区', '永年区', '临漳县', '成安县', '大名县', '涉县', '磁县', '邱县', '鸡泽县', '广平县', '馆陶县', '曲周县', '武安市', '魏县']
},
{
name: '邢台市',
districts: ['桥东区', '桥西区', '邢台县', '临城县', '内丘县', '柏乡县', '隆尧县', '任县', '南和县', '宁晋县', '巨鹿县', '新河县', '广宗县', '平乡县', '威县', '清河县', '临西县', '南宫市', '沙河市']
},
{
name: '保定市',
districts: ['竞秀区', '莲池区', '满城区', '清苑区', '徐水区', '涞水县', '阜平县', '定兴县', '唐县', '高阳县', '容城县', '涞源县', '望都县', '安新县', '易县', '曲阳县', '蠡县', '顺平县', '博野县', '雄县', '涿州市', '定州市', '安国市', '高碑店市']
},
{
name: '张家口市',
districts: ['桥东区', '桥西区', '宣化区', '下花园区', '万全区', '崇礼区', '张北县', '康保县', '沽源县', '尚义县', '蔚县', '阳原县', '怀安县', '怀来县', '涿鹿县', '赤城县']
},
{
name: '承德市',
districts: ['双桥区', '双滦区', '鹰手营子矿区', '承德县', '兴隆县', '平泉市', '滦平县', '隆化县', '丰宁满族自治县', '宽城满族自治县', '围场满族蒙古族自治县']
},
{
name: '沧州市',
districts: ['新华区', '运河区', '沧县', '青县', '东光县', '海兴县', '盐山县', '肃宁县', '南皮县', '吴桥县', '献县', '孟村回族自治县', '泊头市', '任丘市', '黄骅市', '河间市']
},
{
name: '廊坊市',
districts: ['安次区', '广阳区', '固安县', '永清县', '香河县', '大城县', '文安县', '大厂回族自治县', '霸州市', '三河市']
},
{
name: '衡水市',
districts: ['桃城区', '冀州区', '枣强县', '武邑县', '武强县', '饶阳县', '安平县', '故城县', '景县', '阜城县', '深州市']
}
]
},
// 山西省
{
name: '山西省',
cities: [
{
name: '太原市',
districts: ['小店区', '迎泽区', '杏花岭区', '尖草坪区', '万柏林区', '晋源区', '清徐县', '阳曲县', '娄烦县', '古交市']
},
{
name: '大同市',
districts: ['新荣区', '平城区', '云冈区', '云州区', '阳高县', '天镇县', '广灵县', '灵丘县', '浑源县', '左云县']
},
{
name: '阳泉市',
districts: ['城区', '矿区', '郊区', '平定县', '盂县']
},
{
name: '长治市',
districts: ['潞州区', '上党区', '屯留区', '潞城区', '襄垣县', '平顺县', '黎城县', '壶关县', '长子县', '武乡县', '沁县', '沁源县']
},
{
name: '晋城市',
districts: ['城区', '沁水县', '阳城县', '陵川县', '泽州县', '高平市']
},
{
name: '朔州市',
districts: ['朔城区', '平鲁区', '山阴县', '应县', '右玉县', '怀仁市']
},
{
name: '晋中市',
districts: ['榆次区', '太谷区', '榆社县', '左权县', '和顺县', '昔阳县', '寿阳县', '祁县', '平遥县', '灵石县', '介休市']
},
{
name: '运城市',
districts: ['盐湖区', '临猗县', '万荣县', '闻喜县', '稷山县', '新绛县', '绛县', '垣曲县', '夏县', '平陆县', '芮城县', '永济市', '河津市']
},
{
name: '忻州市',
districts: ['忻府区', '定襄县', '五台县', '代县', '繁峙县', '宁武县', '静乐县', '神池县', '五寨县', '岢岚县', '河曲县', '保德县', '偏关县', '原平市']
},
{
name: '临汾市',
districts: ['尧都区', '曲沃县', '翼城县', '襄汾县', '洪洞县', '古县', '安泽县', '浮山县', '吉县', '乡宁县', '大宁县', '隰县', '永和县', '蒲县', '汾西县', '侯马市', '霍州市']
},
{
name: '吕梁市',
districts: ['离石区', '文水县', '交城县', '兴县', '临县', '柳林县', '石楼县', '岚县', '方山县', '中阳县', '交口县', '孝义市', '汾阳市']
}
]
},
// 辽宁省
{
name: '辽宁省',
cities: [
{
name: '沈阳市',
districts: ['和平区', '沈河区', '大东区', '皇姑区', '铁西区', '苏家屯区', '浑南区', '沈北新区', '于洪区', '辽中区', '康平县', '法库县', '新民市']
},
{
name: '大连市',
districts: ['中山区', '西岗区', '沙河口区', '甘井子区', '旅顺口区', '金州区', '普兰店区', '长海县', '瓦房店市', '庄河市']
},
{
name: '鞍山市',
districts: ['铁东区', '铁西区', '立山区', '千山区', '台安县', '岫岩满族自治县', '海城市']
},
{
name: '抚顺市',
districts: ['新抚区', '东洲区', '望花区', '顺城区', '抚顺县', '新宾满族自治县', '清原满族自治县']
},
{
name: '本溪市',
districts: ['平山区', '溪湖区', '明山区', '南芬区', '本溪满族自治县', '桓仁满族自治县']
},
{
name: '丹东市',
districts: ['元宝区', '振兴区', '振安区', '宽甸满族自治县', '东港市', '凤城市']
},
{
name: '锦州市',
districts: ['古塔区', '凌河区', '太和区', '黑山县', '义县', '凌海市', '北镇市']
},
{
name: '营口市',
districts: ['站前区', '西市区', '鲅鱼圈区', '老边区', '盖州市', '大石桥市']
},
{
name: '阜新市',
districts: ['海州区', '新邱区', '太平区', '清河门区', '细河区', '阜新蒙古族自治县', '彰武县']
},
{
name: '辽阳市',
districts: ['白塔区', '文圣区', '宏伟区', '弓长岭区', '太子河区', '辽阳县', '灯塔市']
},
{
name: '盘锦市',
districts: ['双台子区', '兴隆台区', '大洼区', '盘山县']
},
{
name: '铁岭市',
districts: ['银州区', '清河区', '铁岭县', '西丰县', '昌图县', '调兵山市', '开原市']
},
{
name: '朝阳市',
districts: ['双塔区', '龙城区', '朝阳县', '建平县', '喀喇沁左翼蒙古族自治县', '北票市', '凌源市']
},
{
name: '葫芦岛市',
districts: ['连山区', '龙港区', '南票区', '绥中县', '建昌县', '兴城市']
}
]
},
// 吉林省
{
name: '吉林省',
cities: [
{
name: '长春市',
districts: ['南关区', '宽城区', '朝阳区', '二道区', '绿园区', '双阳区', '九台区', '农安县', '榆树市', '德惠市', '公主岭市']
},
{
name: '吉林市',
districts: ['昌邑区', '龙潭区', '船营区', '丰满区', '永吉县', '蛟河市', '桦甸市', '舒兰市', '磐石市']
},
{
name: '四平市',
districts: ['铁西区', '铁东区', '梨树县', '伊通满族自治县', '双辽市']
},
{
name: '辽源市',
districts: ['龙山区', '西安区', '东丰县', '东辽县']
},
{
name: '通化市',
districts: ['东昌区', '二道江区', '通化县', '辉南县', '柳河县', '梅河口市', '集安市']
},
{
name: '白山市',
districts: ['浑江区', '江源区', '抚松县', '靖宇县', '长白朝鲜族自治县', '临江市']
},
{
name: '松原市',
districts: ['宁江区', '前郭尔罗斯蒙古族自治县', '长岭县', '乾安县', '扶余市']
},
{
name: '白城市',
districts: ['洮北区', '镇赉县', '通榆县', '洮南市', '大安市']
},
{
name: '延边朝鲜族自治州',
districts: ['延吉市', '图们市', '敦化市', '珲春市', '龙井市', '和龙市', '汪清县', '安图县']
}
]
},
// 黑龙江省
{
name: '黑龙江省',
cities: [
{
name: '哈尔滨市',
districts: ['道里区', '南岗区', '道外区', '平房区', '松北区', '香坊区', '呼兰区', '阿城区', '双城区', '依兰县', '方正县', '宾县', '巴彦县', '木兰县', '通河县', '延寿县', '尚志市', '五常市']
},
{
name: '齐齐哈尔市',
districts: ['龙沙区', '建华区', '铁锋区', '昂昂溪区', '富拉尔基区', '碾子山区', '梅里斯达斡尔族区', '龙江县', '依安县', '泰来县', '甘南县', '富裕县', '克山县', '克东县', '拜泉县', '讷河市']
},
{
name: '鸡西市',
districts: ['鸡冠区', '恒山区', '滴道区', '梨树区', '城子河区', '麻山区', '鸡东县', '虎林市', '密山市']
},
{
name: '鹤岗市',
districts: ['向阳区', '工农区', '南山区', '兴安区', '东山区', '兴山区', '萝北县', '绥滨县']
},
{
name: '双鸭山市',
districts: ['尖山区', '岭东区', '四方台区', '宝山区', '集贤县', '友谊县', '宝清县', '饶河县']
},
{
name: '大庆市',
districts: ['萨尔图区', '龙凤区', '让胡路区', '红岗区', '大同区', '肇州县', '肇源县', '林甸县', '杜尔伯特蒙古族自治县']
},
{
name: '伊春市',
districts: ['伊美区', '乌翠区', '友好区', '金林区', '汤旺县', '丰林县', '大箐山县', '南岔县', '嘉荫县', '铁力市']
},
{
name: '佳木斯市',
districts: ['向阳区', '前进区', '东风区', '郊区', '桦南县', '桦川县', '汤原县', '抚远市', '同江市', '富锦市']
},
{
name: '七台河市',
districts: ['新兴区', '桃山区', '茄子河区', '勃利县']
},
{
name: '牡丹江市',
districts: ['东安区', '阳明区', '爱民区', '西安区', '东宁市', '绥芬河市', '海林市', '宁安市', '穆棱市', '林口县']
},
{
name: '黑河市',
districts: ['爱辉区', '嫩江市', '北安市', '五大连池市', '逊克县', '孙吴县']
},
{
name: '绥化市',
districts: ['北林区', '望奎县', '兰西县', '青冈县', '庆安县', '明水县', '绥棱县', '安达市', '肇东市', '海伦市']
},
{
name: '大兴安岭地区',
districts: ['加格达奇区', '松岭区', '新林区', '呼中区', '呼玛县', '塔河县', '漠河市']
}
]
},
// 江苏省
{
name: '江苏省',
cities: [
{
name: '南京市',
districts: ['玄武区', '秦淮区', '建邺区', '鼓楼区', '浦口区', '栖霞区', '雨花台区', '江宁区', '六合区', '溧水区', '高淳区']
},
{
name: '无锡市',
districts: ['锡山区', '惠山区', '滨湖区', '梁溪区', '新吴区', '江阴市', '宜兴市']
},
{
name: '徐州市',
districts: ['鼓楼区', '云龙区', '贾汪区', '泉山区', '铜山区', '丰县', '沛县', '睢宁县', '新沂市', '邳州市']
},
{
name: '常州市',
districts: ['天宁区', '钟楼区', '新北区', '武进区', '金坛区', '溧阳市']
},
{
name: '苏州市',
districts: ['姑苏区', '虎丘区', '吴中区', '相城区', '吴江区', '苏州工业园区', '昆山市', '常熟市', '张家港市', '太仓市']
},
{
name: '南通市',
districts: ['崇川区', '港闸区', '通州区', '如东县', '启东市', '如皋市', '海门市', '海安市']
},
{
name: '连云港市',
districts: ['连云区', '海州区', '赣榆区', '东海县', '灌云县', '灌南县']
},
{
name: '淮安市',
districts: ['淮安区', '淮阴区', '清江浦区', '洪泽区', '涟水县', '盱眙县', '金湖县']
},
{
name: '盐城市',
districts: ['亭湖区', '盐都区', '大丰区', '响水县', '滨海县', '阜宁县', '射阳县', '建湖县', '东台市']
},
{
name: '扬州市',
districts: ['广陵区', '邗江区', '江都区', '宝应县', '仪征市', '高邮市']
},
{
name: '镇江市',
districts: ['京口区', '润州区', '丹徒区', '丹阳市', '扬中市', '句容市']
},
{
name: '泰州市',
districts: ['海陵区', '高港区', '姜堰区', '兴化市', '靖江市', '泰兴市']
},
{
name: '宿迁市',
districts: ['宿城区', '宿豫区', '沭阳县', '泗阳县', '泗洪县']
}
]
},
// 浙江省
{
name: '浙江省',
cities: [
{
name: '杭州市',
districts: ['上城区', '下城区', '江干区', '拱墅区', '西湖区', '滨江区', '萧山区', '余杭区', '富阳区', '临安区', '桐庐县', '淳安县', '建德市']
},
{
name: '宁波市',
districts: ['海曙区', '江北区', '北仑区', '镇海区', '鄞州区', '奉化区', '象山县', '宁海县', '余姚市', '慈溪市']
},
{
name: '温州市',
districts: ['鹿城区', '龙湾区', '瓯海区', '洞头区', '永嘉县', '平阳县', '苍南县', '文成县', '泰顺县', '瑞安市', '乐清市']
},
{
name: '嘉兴市',
districts: ['南湖区', '秀洲区', '嘉善县', '海盐县', '海宁市', '平湖市', '桐乡市']
},
{
name: '湖州市',
districts: ['吴兴区', '南浔区', '德清县', '长兴县', '安吉县']
},
{
name: '绍兴市',
districts: ['越城区', '柯桥区', '上虞区', '新昌县', '诸暨市', '嵊州市']
},
{
name: '金华市',
districts: ['婺城区', '金东区', '武义县', '浦江县', '磐安县', '兰溪市', '义乌市', '东阳市', '永康市']
},
{
name: '衢州市',
districts: ['柯城区', '衢江区', '常山县', '开化县', '龙游县', '江山市']
},
{
name: '舟山市',
districts: ['定海区', '普陀区', '岱山县', '嵊泗县']
},
{
name: '台州市',
districts: ['椒江区', '黄岩区', '路桥区', '玉环市', '三门县', '天台县', '仙居县', '温岭市', '临海市']
},
{
name: '丽水市',
districts: ['莲都区', '青田县', '缙云县', '遂昌县', '松阳县', '云和县', '庆元县', '景宁畲族自治县', '龙泉市']
}
]
},
// 安徽省
{
name: '安徽省',
cities: [
{
name: '合肥市',
districts: ['瑶海区', '庐阳区', '蜀山区', '包河区', '长丰县', '肥东县', '肥西县', '庐江县', '巢湖市']
},
{
name: '芜湖市',
districts: ['镜湖区', '弋江区', '鸠江区', '三山区', '芜湖县', '繁昌县', '南陵县', '无为县']
},
{
name: '蚌埠市',
districts: ['龙子湖区', '蚌山区', '禹会区', '淮上区', '怀远县', '五河县', '固镇县']
},
{
name: '淮南市',
districts: ['大通区', '田家庵区', '谢家集区', '八公山区', '潘集区', '凤台县', '寿县']
},
{
name: '马鞍山市',
districts: ['花山区', '雨山区', '博望区', '当涂县', '含山县', '和县']
},
{
name: '淮北市',
districts: ['杜集区', '相山区', '烈山区', '濉溪县']
},
{
name: '铜陵市',
districts: ['铜官区', '义安区', '郊区', '枞阳县']
},
{
name: '安庆市',
districts: ['迎江区', '大观区', '宜秀区', '怀宁县', '枞阳县', '潜山县', '太湖县', '宿松县', '望江县', '岳西县', '桐城市']
},
{
name: '黄山市',
districts: ['屯溪区', '黄山区', '徽州区', '歙县', '休宁县', '黟县', '祁门县']
},
{
name: '滁州市',
districts: ['琅琊区', '南谯区', '来安县', '全椒县', '定远县', '凤阳县', '天长市', '明光市']
},
{
name: '阜阳市',
districts: ['颍州区', '颍东区', '颍泉区', '临泉县', '太和县', '阜南县', '颍上县', '界首市']
},
{
name: '宿州市',
districts: ['埇桥区', '砀山县', '萧县', '灵璧县', '泗县']
},
{
name: '六安市',
districts: ['金安区', '裕安区', '叶集区', '霍邱县', '舒城县', '金寨县', '霍山县']
},
{
name: '亳州市',
districts: ['谯城区', '涡阳县', '蒙城县', '利辛县']
},
{
name: '池州市',
districts: ['贵池区', '东至县', '石台县', '青阳县']
},
{
name: '宣城市',
districts: ['宣州区', '郎溪县', '广德县', '泾县', '绩溪县', '旌德县', '宁国市']
}
]
},
// 福建省
{
name: '福建省',
cities: [
{
name: '福州市',
districts: ['鼓楼区', '台江区', '仓山区', '马尾区', '晋安区', '长乐区', '闽侯县', '连江县', '罗源县', '闽清县', '永泰县', '平潭县']
},
{
name: '厦门市',
districts: ['思明区', '海沧区', '湖里区', '集美区', '同安区', '翔安区']
},
{
name: '莆田市',
districts: ['城厢区', '涵江区', '荔城区', '秀屿区', '仙游县']
},
{
name: '三明市',
districts: ['梅列区', '三元区', '明溪县', '清流县', '宁化县', '大田县', '尤溪县', '沙县', '将乐县', '泰宁县', '建宁县', '永安市']
},
{
name: '泉州市',
districts: ['鲤城区', '丰泽区', '洛江区', '泉港区', '惠安县', '安溪县', '永春县', '德化县', '金门县', '石狮市', '晋江市', '南安市']
},
{
name: '漳州市',
districts: ['芗城区', '龙文区', '云霄县', '漳浦县', '诏安县', '长泰县', '东山县', '南靖县', '平和县', '华安县', '龙海市']
},
{
name: '南平市',
districts: ['延平区', '建阳区', '顺昌县', '浦城县', '光泽县', '松溪县', '政和县', '邵武市', '武夷山市', '建瓯市']
},
{
name: '龙岩市',
districts: ['新罗区', '永定区', '长汀县', '上杭县', '武平县', '连城县', '漳平市']
},
{
name: '宁德市',
districts: ['蕉城区', '霞浦县', '古田县', '屏南县', '寿宁县', '周宁县', '柘荣县', '福安市', '福鼎市']
}
]
},
// 江西省
{
name: '江西省',
cities: [
{
name: '南昌市',
districts: ['东湖区', '西湖区', '青云谱区', '湾里区', '青山湖区', '新建区', '南昌县', '安义县', '进贤县']
},
{
name: '景德镇市',
districts: ['昌江区', '珠山区', '浮梁县', '乐平市']
},
{
name: '萍乡市',
districts: ['安源区', '湘东区', '莲花县', '上栗县', '芦溪县']
},
{
name: '九江市',
districts: ['濂溪区', '浔阳区', '柴桑区', '武宁县', '修水县', '永修县', '德安县', '都昌县', '湖口县', '彭泽县', '瑞昌市', '共青城市', '庐山市']
},
{
name: '新余市',
districts: ['渝水区', '分宜县']
},
{
name: '鹰潭市',
districts: ['月湖区', '余江区', '贵溪市']
},
{
name: '赣州市',
districts: ['章贡区', '南康区', '赣县区', '信丰县', '大余县', '上犹县', '崇义县', '安远县', '龙南县', '定南县', '全南县', '宁都县', '于都县', '兴国县', '会昌县', '寻乌县', '石城县', '瑞金市', '龙南市']
},
{
name: '吉安市',
districts: ['吉州区', '青原区', '吉安县', '吉水县', '峡江县', '新干县', '永丰县', '泰和县', '遂川县', '万安县', '安福县', '永新县', '井冈山市']
},
{
name: '宜春市',
districts: ['袁州区', '奉新县', '万载县', '上高县', '宜丰县', '靖安县', '铜鼓县', '丰城市', '樟树市', '高安市']
},
{
name: '抚州市',
districts: ['临川区', '东乡区', '南城县', '黎川县', '南丰县', '崇仁县', '乐安县', '宜黄县', '金溪县', '资溪县', '广昌县']
},
{
name: '上饶市',
districts: ['信州区', '广丰区', '广信区', '玉山县', '铅山县', '横峰县', '弋阳县', '余干县', '鄱阳县', '万年县', '婺源县', '德兴市']
}
]
},
// 山东省
{
name: '山东省',
cities: [
{
name: '济南市',
districts: ['历下区', '市中区', '槐荫区', '天桥区', '历城区', '长清区', '章丘区', '济阳区', '莱芜区', '钢城区', '平阴县', '商河县']
},
{
name: '青岛市',
districts: ['市南区', '市北区', '黄岛区', '崂山区', '李沧区', '城阳区', '即墨区', '胶州市', '平度市', '莱西市']
},
{
name: '淄博市',
districts: ['淄川区', '张店区', '博山区', '临淄区', '周村区', '桓台县', '高青县', '沂源县']
},
{
name: '枣庄市',
districts: ['市中区', '薛城区', '峄城区', '台儿庄区', '山亭区', '滕州市']
},
{
name: '东营市',
districts: ['东营区', '河口区', '垦利区', '利津县', '广饶县']
},
{
name: '烟台市',
districts: ['芝罘区', '福山区', '牟平区', '莱山区', '蓬莱区', '长岛县', '龙口市', '莱阳市', '莱州市', '蓬莱市', '招远市', '栖霞市', '海阳市']
},
{
name: '潍坊市',
districts: ['潍城区', '寒亭区', '坊子区', '奎文区', '临朐县', '昌乐县', '青州市', '诸城市', '寿光市', '安丘市', '高密市', '昌邑市']
},
{
name: '济宁市',
districts: ['任城区', '兖州区', '微山县', '鱼台县', '金乡县', '嘉祥县', '汶上县', '泗水县', '梁山县', '曲阜市', '邹城市']
},
{
name: '泰安市',
districts: ['泰山区', '岱岳区', '宁阳县', '东平县', '新泰市', '肥城市']
},
{
name: '威海市',
districts: ['环翠区', '文登区', '荣成市', '乳山市']
},
{
name: '日照市',
districts: ['东港区', '岚山区', '五莲县', '莒县']
},
{
name: '临沂市',
districts: ['兰山区', '罗庄区', '河东区', '沂南县', '郯城县', '沂水县', '兰陵县', '费县', '平邑县', '莒南县', '蒙阴县', '临沭县']
},
{
name: '德州市',
districts: ['德城区', '陵城区', '宁津县', '庆云县', '临邑县', '齐河县', '平原县', '夏津县', '武城县', '乐陵市', '禹城市']
},
{
name: '聊城市',
districts: ['东昌府区', '茌平区', '阳谷县', '莘县', '东阿县', '冠县', '高唐县', '临清市']
},
{
name: '滨州市',
districts: ['滨城区', '沾化区', '惠民县', '阳信县', '无棣县', '博兴县', '邹平市']
},
{
name: '菏泽市',
districts: ['牡丹区', '定陶区', '曹县', '单县', '成武县', '巨野县', '郓城县', '鄄城县', '东明县']
}
]
},
// 河南省
{
name: '河南省',
cities: [
{
name: '郑州市',
districts: ['中原区', '二七区', '管城回族区', '金水区', '上街区', '惠济区', '中牟县', '巩义市', '荥阳市', '新密市', '新郑市', '登封市']
},
{
name: '开封市',
districts: ['龙亭区', '顺河回族区', '鼓楼区', '禹王台区', '祥符区', '杞县', '通许县', '尉氏县', '兰考县']
},
{
name: '洛阳市',
districts: ['老城区', '西工区', '瀍河回族区', '涧西区', '吉利区', '洛龙区', '孟津县', '新安县', '栾川县', '嵩县', '汝阳县', '宜阳县', '洛宁县', '伊川县', '偃师市']
},
{
name: '平顶山市',
districts: ['新华区', '卫东区', '石龙区', '湛河区', '宝丰县', '叶县', '鲁山县', '郏县', '舞钢市', '汝州市']
},
{
name: '安阳市',
districts: ['文峰区', '北关区', '殷都区', '龙安区', '安阳县', '汤阴县', '滑县', '内黄县', '林州市']
},
{
name: '鹤壁市',
districts: ['鹤山区', '山城区', '淇滨区', '浚县', '淇县']
},
{
name: '新乡市',
districts: ['红旗区', '卫滨区', '凤泉区', '牧野区', '新乡县', '获嘉县', '原阳县', '延津县', '封丘县', '长垣县', '卫辉市', '辉县市']
},
{
name: '焦作市',
districts: ['解放区', '中站区', '马村区', '山阳区', '修武县', '博爱县', '武陟县', '温县', '沁阳市', '孟州市']
},
{
name: '濮阳市',
districts: ['华龙区', '清丰县', '南乐县', '范县', '台前县', '濮阳县']
},
{
name: '许昌市',
districts: ['魏都区', '建安区', '鄢陵县', '襄城县', '禹州市', '长葛市']
},
{
name: '漯河市',
districts: ['源汇区', '郾城区', '召陵区', '舞阳县', '临颍县']
},
{
name: '三门峡市',
districts: ['湖滨区', '陕州区', '渑池县', '卢氏县', '义马市', '灵宝市']
},
{
name: '南阳市',
districts: ['宛城区', '卧龙区', '南召县', '方城县', '西峡县', '镇平县', '内乡县', '淅川县', '社旗县', '唐河县', '新野县', '桐柏县', '邓州市']
},
{
name: '商丘市',
districts: ['梁园区', '睢阳区', '民权县', '睢县', '宁陵县', '柘城县', '虞城县', '夏邑县', '永城市']
},
{
name: '信阳市',
districts: ['浉河区', '平桥区', '罗山县', '光山县', '新县', '商城县', '固始县', '潢川县', '淮滨县', '息县']
},
{
name: '周口市',
districts: ['川汇区', '淮阳区', '扶沟县', '西华县', '商水县', '沈丘县', '郸城县', '太康县', '鹿邑县', '项城市']
},
{
name: '驻马店市',
districts: ['驿城区', '西平县', '上蔡县', '平舆县', '正阳县', '确山县', '泌阳县', '汝南县', '遂平县', '新蔡县']
},
{
name: '济源市',
districts: ['济源市']
}
]
},
// 湖北省
{
name: '湖北省',
cities: [
{
name: '武汉市',
districts: ['江岸区', '江汉区', '硚口区', '汉阳区', '武昌区', '青山区', '洪山区', '东西湖区', '汉南区', '蔡甸区', '江夏区', '黄陂区', '新洲区']
},
{
name: '黄石市',
districts: ['黄石港区', '西塞山区', '下陆区', '铁山区', '阳新县', '大冶市']
},
{
name: '十堰市',
districts: ['茅箭区', '张湾区', '郧阳区', '郧西县', '竹山县', '竹溪县', '房县', '丹江口市']
},
{
name: '宜昌市',
districts: ['西陵区', '伍家岗区', '点军区', '猇亭区', '夷陵区', '远安县', '兴山县', '秭归县', '长阳土家族自治县', '五峰土家族自治县', '宜都市', '当阳市', '枝江市']
},
{
name: '襄阳市',
districts: ['襄城区', '樊城区', '襄州区', '南漳县', '谷城县', '保康县', '老河口市', '枣阳市', '宜城市']
},
{
name: '鄂州市',
districts: ['梁子湖区', '华容区', '鄂城区']
},
{
name: '荆门市',
districts: ['东宝区', '掇刀区', '京山市', '沙洋县', '钟祥市']
},
{
name: '孝感市',
districts: ['孝南区', '孝昌县', '大悟县', '云梦县', '应城市', '安陆市', '汉川市']
},
{
name: '荆州市',
districts: ['沙市区', '荆州区', '公安县', '监利县', '江陵县', '石首市', '洪湖市', '松滋市']
},
{
name: '黄冈市',
districts: ['黄州区', '团风县', '红安县', '罗田县', '英山县', '浠水县', '蕲春县', '黄梅县', '麻城市', '武穴市']
},
{
name: '咸宁市',
districts: ['咸安区', '嘉鱼县', '通城县', '崇阳县', '通山县', '赤壁市']
},
{
name: '随州市',
districts: ['曾都区', '随县', '广水市']
},
{
name: '恩施土家族苗族自治州',
districts: ['恩施市', '利川市', '建始县', '巴东县', '宣恩县', '咸丰县', '来凤县', '鹤峰县']
},
{
name: '仙桃市',
districts: ['仙桃市']
},
{
name: '潜江市',
districts: ['潜江市']
},
{
name: '天门市',
districts: ['天门市']
},
{
name: '神农架林区',
districts: ['神农架林区']
}
]
},
// 湖南省
{
name: '湖南省',
cities: [
{
name: '长沙市',
districts: ['芙蓉区', '天心区', '岳麓区', '开福区', '雨花区', '望城区', '长沙县', '宁乡市', '浏阳市']
},
{
name: '株洲市',
districts: ['荷塘区', '芦淞区', '石峰区', '天元区', '株洲县', '攸县', '茶陵县', '炎陵县', '醴陵市']
},
{
name: '湘潭市',
districts: ['雨湖区', '岳塘区', '湘潭县', '湘乡市', '韶山市']
},
{
name: '衡阳市',
districts: ['珠晖区', '雁峰区', '石鼓区', '蒸湘区', '南岳区', '衡阳县', '衡南县', '衡山县', '衡东县', '祁东县', '耒阳市', '常宁市']
},
{
name: '邵阳市',
districts: ['双清区', '大祥区', '北塔区', '邵东县', '新邵县', '邵阳县', '隆回县', '洞口县', '绥宁县', '新宁县', '城步苗族自治县', '武冈市']
},
{
name: '岳阳市',
districts: ['岳阳楼区', '云溪区', '君山区', '岳阳县', '华容县', '湘阴县', '平江县', '汨罗市', '临湘市']
},
{
name: '常德市',
districts: ['武陵区', '鼎城区', '安乡县', '汉寿县', '澧县', '临澧县', '桃源县', '石门县', '津市市']
},
{
name: '张家界市',
districts: ['永定区', '武陵源区', '慈利县', '桑植县']
},
{
name: '益阳市',
districts: ['资阳区', '赫山区', '南县', '桃江县', '安化县', '沅江市']
},
{
name: '郴州市',
districts: ['北湖区', '苏仙区', '桂阳县', '宜章县', '永兴县', '嘉禾县', '临武县', '汝城县', '桂东县', '安仁县', '资兴市']
},
{
name: '永州市',
districts: ['零陵区', '冷水滩区', '祁阳县', '东安县', '双牌县', '道县', '江永县', '宁远县', '蓝山县', '新田县', '江华瑶族自治县']
},
{
name: '怀化市',
districts: ['鹤城区', '中方县', '沅陵县', '辰溪县', '溆浦县', '会同县', '麻阳苗族自治县', '新晃侗族自治县', '芷江侗族自治县', '靖州苗族侗族自治县', '通道侗族自治县', '洪江市']
},
{
name: '娄底市',
districts: ['娄星区', '双峰县', '新化县', '冷水江市', '涟源市']
},
{
name: '湘西土家族苗族自治州',
districts: ['吉首市', '泸溪县', '凤凰县', '花垣县', '保靖县', '古丈县', '永顺县', '龙山县']
}
]
},
// 广东省
{
name: '广东省',
cities: [
{
name: '广州市',
districts: ['荔湾区', '越秀区', '海珠区', '天河区', '白云区', '黄埔区', '番禺区', '花都区', '南沙区', '从化区', '增城区']
},
{
name: '深圳市',
districts: ['罗湖区', '福田区', '南山区', '宝安区', '龙岗区', '盐田区', '龙华区', '坪山区', '光明区']
},
{
name: '珠海市',
districts: ['香洲区', '斗门区', '金湾区']
},
{
name: '汕头市',
districts: ['龙湖区', '金平区', '濠江区', '潮阳区', '潮南区', '澄海区', '南澳县']
},
{
name: '佛山市',
districts: ['禅城区', '南海区', '顺德区', '三水区', '高明区']
},
{
name: '韶关市',
districts: ['武江区', '浈江区', '曲江区', '始兴县', '仁化县', '翁源县', '乳源瑶族自治县', '新丰县', '乐昌市', '南雄市']
},
{
name: '河源市',
districts: ['源城区', '紫金县', '龙川县', '连平县', '和平县', '东源县']
},
{
name: '梅州市',
districts: ['梅江区', '梅县区', '大埔县', '丰顺县', '五华县', '平远县', '蕉岭县', '兴宁市']
},
{
name: '惠州市',
districts: ['惠城区', '惠阳区', '博罗县', '惠东县', '龙门县']
},
{
name: '汕尾市',
districts: ['城区', '海丰县', '陆河县', '陆丰市']
},
{
name: '东莞市',
districts: ['东莞市']
},
{
name: '中山市',
districts: ['中山市']
},
{
name: '江门市',
districts: ['蓬江区', '江海区', '新会区', '台山市', '开平市', '鹤山市', '恩平市']
},
{
name: '阳江市',
districts: ['江城区', '阳东区', '阳西县', '阳春市']
},
{
name: '湛江市',
districts: ['赤坎区', '霞山区', '坡头区', '麻章区', '遂溪县', '徐闻县', '廉江市', '雷州市', '吴川市']
},
{
name: '茂名市',
districts: ['茂南区', '电白区', '高州市', '化州市', '信宜市']
},
{
name: '肇庆市',
districts: ['端州区', '鼎湖区', '高要区', '广宁县', '怀集县', '封开县', '德庆县', '四会市']
},
{
name: '清远市',
districts: ['清城区', '清新区', '佛冈县', '阳山县', '连山壮族瑶族自治县', '连南瑶族自治县', '英德市', '连州市']
},
{
name: '潮州市',
districts: ['湘桥区', '潮安区', '饶平县']
},
{
name: '揭阳市',
districts: ['榕城区', '揭东区', '揭西县', '惠来县', '普宁市']
},
{
name: '云浮市',
districts: ['云城区', '云安区', '新兴县', '郁南县', '罗定市']
},
{
name: '顺德区',
districts: ['顺德区']
},
{
name: '南海区',
districts: ['南海区']
},
{
name: '温州市',
districts: ['鹿城区', '龙湾区', '瓯海区', '洞头区', '瑞安市', '乐清市', '永嘉县', '平阳县', '苍南县', '文成县', '泰顺县']
},
{
name: '嘉兴市',
districts: ['南湖区', '秀洲区', '海宁市', '平湖市', '桐乡市', '嘉善县', '海盐县']
},
{
name: '湖州市',
districts: ['吴兴区', '南浔区', '德清县', '长兴县', '安吉县']
}
]
},
{
name: '四川省',
cities: [
{
name: '成都市',
districts: ['锦江区', '青羊区', '金牛区', '武侯区', '成华区', '龙泉驿区', '青白江区', '新都区', '温江区', '双流区', '郫都区', '新津区', '金堂县', '大邑县', '蒲江县', '都江堰市', '彭州市', '邛崃市', '崇州市', '简阳市']
},
{
name: '绵阳市',
districts: ['涪城区', '游仙区', '安州区', '三台县', '盐亭县', '梓潼县', '北川羌族自治县', '平武县', '江油市']
},
{
name: '德阳市',
districts: ['旌阳区', '罗江区', '中江县', '广汉市', '什邡市', '绵竹市']
},
{
name: '自贡市',
districts: ['自流井区', '贡井区', '大安区', '沿滩区', '荣县', '富顺县']
},
{
name: '攀枝花市',
districts: ['东区', '西区', '仁和区', '米易县', '盐边县']
},
{
name: '泸州市',
districts: ['江阳区', '纳溪区', '龙马潭区', '泸县', '合江县', '叙永县', '古蔺县']
},
{
name: '广元市',
districts: ['利州区', '昭化区', '朝天区', '旺苍县', '青川县', '剑阁县', '苍溪县']
},
{
name: '遂宁市',
districts: ['船山区', '安居区', '蓬溪县', '射洪市', '大英县']
},
{
name: '内江市',
districts: ['市中区', '东兴区', '威远县', '资中县', '隆昌市']
},
{
name: '乐山市',
districts: ['市中区', '沙湾区', '五通桥区', '金口河区', '犍为县', '井研县', '夹江县', '沐川县', '峨边彝族自治县', '马边彝族自治县', '峨眉山市']
},
{
name: '资阳市',
districts: ['雁江区', '安岳县', '乐至县']
},
{
name: '宜宾市',
districts: ['翠屏区', '南溪区', '叙州区', '江安县', '长宁县', '高县', '珙县', '筠连县', '兴文县', '屏山县']
},
{
name: '南充市',
districts: ['顺庆区', '高坪区', '嘉陵区', '南部县', '营山县', '蓬安县', '仪陇县', '西充县', '阆中市']
},
{
name: '广安市',
districts: ['广安区', '前锋区', '岳池县', '武胜县', '邻水县', '华蓥市']
},
{
name: '达州市',
districts: ['通川区', '达川区', '宣汉县', '开江县', '大竹县', '渠县', '万源市']
},
{
name: '巴中市',
districts: ['巴州区', '恩阳区', '通江县', '南江县', '平昌县']
},
{
name: '眉山市',
districts: ['东坡区', '彭山区', '仁寿县', '洪雅县', '丹棱县', '青神县']
},
{
name: '雅安市',
districts: ['雨城区', '名山区', '荥经县', '汉源县', '石棉县', '天全县', '芦山县', '宝兴县']
},
{
name: '阿坝藏族羌族自治州',
districts: ['马尔康市', '汶川县', '理县', '茂县', '松潘县', '九寨沟县', '金川县', '小金县', '黑水县', '壤塘县', '阿坝县', '若尔盖县', '红原县']
},
{
name: '甘孜藏族自治州',
districts: ['康定市', '泸定县', '丹巴县', '九龙县', '雅江县', '道孚县', '炉霍县', '甘孜县', '新龙县', '德格县', '白玉县', '石渠县', '色达县', '理塘县', '巴塘县', '乡城县', '稻城县', '得荣县']
},
{
name: '凉山彝族自治州',
districts: ['西昌市', '木里藏族自治县', '盐源县', '德昌县', '会理市', '会东县', '宁南县', '普格县', '布拖县', '金阳县', '昭觉县', '喜德县', '冕宁县', '越西县', '甘洛县', '美姑县', '雷波县']
}
]
},
{
name: '香港特别行政区',
cities: [
{
name: '香港岛',
districts: ['中西区', '湾仔区', '东区', '南区']
},
{
name: '九龙',
districts: ['油尖旺区', '深水埗区', '九龙城区', '黄大仙区', '观塘区']
},
{
name: '新界',
districts: ['北区', '大埔区', '沙田区', '西贡区', '荃湾区', '屯门区', '元朗区', '葵青区', '离岛区']
}
]
},
{
name: '澳门特别行政区',
cities: [
{
name: '澳门半岛',
districts: ['花地玛堂区', '圣安多尼堂区', '大堂区', '望德堂区', '风顺堂区']
},
{
name: '氹仔岛',
districts: ['嘉模堂区']
},
{
name: '路环岛',
districts: ['圣方济各堂区']
},
{
name: '路氹城',
districts: ['路氹填海区']
}
]
}
],
// 三级联动选中状态
selectedProvinceIndex: 0,
selectedCityIndex: 0,
selectedDistrictIndex: 0,
// 当前显示的市和区选项
currentCities: [],
currentDistricts: [],
// 地区搜索相关
regionSearchKeyword: '',
editRegionSearchKeyword: '',
filteredRegionOptions: [],
showSearchResults: false,
3 months ago
newSupply: {
name: '', // 品种
price: '',
minOrder: '',
yolk: '', // 蛋黄字段
yolkIndex: 0, // 蛋黄选项索引
spec: '', // 规格字段
specIndex: 0, // 规格选项索引
region: '', // 【新增】地区字段
grossWeight: '', // 【新增】毛重字段,支持中文
imageUrls: [] // 图片URL数组,支持多张图片
},
newSupplyRegionArray: [], // 新创建货源的省市区数组
editSupplyRegionArray: [], // 编辑货源的省市区数组
3 months ago
editSupply: {
yolkIndex: 0,
specIndex: 0
},
currentImageIndex: 0, // 用于滑动时记录当前图片索引
searchKeyword: '', // 搜索关键词
// 图片缩放相关数据
scale: 1, // 缩放比例
offsetX: 0, // X轴偏移
offsetY: 0, // Y轴偏移
lastDistance: 0, // 上一次两指距离
lastTouchPoint: null, // 上一次触摸点
imageWidth: 375, // 图片原始宽度
imageHeight: 375, // 图片原始高度
minScale: 1, // 最小缩放比例
maxScale: 4, // 最大缩放比例
doubleTapTimeout: null, // 双击超时计时器
doubleTapCount: 0, // 双击计数
// 分页相关数据
pagination: {
published: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
},
pending: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
},
rejected: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
},
draft: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
}
},
// 当前正在加载的状态类型
currentLoadingType: null,
// 图片预览相关状态
showImagePreview: false, // 控制图片预览弹窗显示
previewImageUrls: [], // 预览的图片URL列表
previewImageIndex: 0, // 当前预览图片的索引
// 折叠状态控制
isPublishedExpanded: true, // 已上架货源是否展开
isPendingExpanded: true, // 审核中货源是否展开
isRejectedExpanded: true, // 审核失败货源是否展开
isDraftExpanded: true, // 下架状态货源是否展开
// 自动发布控制
autoPublishAfterEdit: false, // 编辑后是否自动发布(上架)
// 页面加载状态控制
_hasLoadedOnShow: false, // 标记onShow是否已经加载过数据
// 页面滚动锁定状态
pageScrollLock: false, // 控制页面是否锁定滚动
touchMoveBlocked: false, // iOS设备触摸事件阻止
// 授权登录相关状态
showAuthModal: false, // 控制未授权提示弹窗显示
showOneKeyLoginModal: false, // 控制一键登录弹窗显示
pendingUserType: 'seller', // 记录用户即将选择的身份类型
avatarUrl: '/images/default-avatar.png', // 默认头像
partnerstatus: '' // 用户入驻状态,用于显示入驻/未入驻
3 months ago
},
onLoad() {
console.log('卖家页面onLoad开始执行');
// 移除强制登录检查,允许用户浏览货源页面
this.loadSupplies();
// 初始化规格搜索相关数据
this.setData({
specSearchKeyword: '',
editSpecSearchKeyword: '',
filteredSpecOptions: this.data.specOptions,
filteredEditSpecOptions: this.data.specOptions,
// 初始化三级联动地区数据
currentCities: this.data.regionOptions[this.data.selectedProvinceIndex].cities,
currentDistricts: this.data.regionOptions[this.data.selectedProvinceIndex].cities[this.data.selectedCityIndex].districts
3 months ago
});
// 尝试从本地存储加载草稿数据
const draftData = wx.getStorageSync('newSupplyDraft');
if (draftData) {
this.setData({
newSupply: draftData
});
console.log('从本地存储加载了草稿数据');
}
3 months ago
console.log('卖家页面onLoad执行完毕');
},
// 重新登录方法 - 跳转到登录页面
reLogin() {
console.log('执行reLogin方法,跳转到登录页面');
wx.showToast({
title: '请先登录',
icon: 'none',
duration: 2000,
complete: () => {
setTimeout(() => {
wx.switchTab({
url: '/pages/index/index'
});
}, 2000);
}
});
},
// 轮播图切换事件
swiperChange: function (e) {
const current = e.detail.current;
const id = e.currentTarget.dataset.id;
if (!id) {
console.error('swiperChange: 缺少商品ID');
return;
}
console.log(`商品 ${id} 的轮播图切换到第 ${current}`);
// 更新特定商品的当前图片索引
this.updateProductCurrentIndex(id, current);
},
// 更新商品当前图片索引
updateProductCurrentIndex: function (productId, index) {
// 更新所有货源列表中的对应商品
const updateSupplies = (supplies) => {
return supplies.map(supply => {
if (supply.id === productId) {
return {
...supply,
currentImageIndex: index
};
}
return supply;
});
};
this.setData({
supplies: updateSupplies(this.data.supplies),
publishedSupplies: updateSupplies(this.data.publishedSupplies),
pendingSupplies: updateSupplies(this.data.pendingSupplies),
rejectedSupplies: updateSupplies(this.data.rejectedSupplies),
draftSupplies: updateSupplies(this.data.draftSupplies)
});
},
// 切换已上架货源的折叠状态
togglePublishedExpand() {
this.setData({
isPublishedExpanded: !this.data.isPublishedExpanded
});
},
// 切换审核中货源的折叠状态
togglePendingExpand() {
this.setData({
isPendingExpanded: !this.data.isPendingExpanded
});
},
// 切换审核失败货源的折叠状态
toggleRejectedExpand() {
this.setData({
isRejectedExpanded: !this.data.isRejectedExpanded
});
},
// 切换下架状态货源的折叠状态
toggleDraftExpand() {
this.setData({
isDraftExpanded: !this.data.isDraftExpanded
});
},
// 清除搜索
clearSearch() {
this.setData({
searchKeyword: ''
}, () => {
// 重新加载所有数据
this.loadSupplies();
});
},
3 months ago
// 处理搜索输入
onSearchInput(e) {
this.setData({
searchKeyword: e.detail.value
});
},
// 搜索货源
searchSupplies() {
console.log('搜索货源,关键词:', this.data.searchKeyword);
// 根据搜索关键词过滤所有状态的货源
const keyword = this.data.searchKeyword.toLowerCase().trim();
if (!keyword) {
// 如果关键词为空,重新加载所有数据
this.loadSupplies();
return;
}
// 获取所有货源
const allSupplies = this.data.supplies;
// 过滤符合条件的货源
const filteredSupplies = allSupplies.filter(supply => {
// 搜索名称、品种等字段
const name = (supply.name || '').toLowerCase();
const productName = (supply.productName || '').toLowerCase();
const yolk = (supply.yolk || '').toLowerCase();
const spec = (supply.spec || '').toLowerCase();
return name.includes(keyword) ||
productName.includes(keyword) ||
yolk.includes(keyword) ||
spec.includes(keyword);
});
// 将过滤后的货源按照状态分类
const publishedSupplies = filteredSupplies.filter(s => s.status === 'published');
const pendingSupplies = filteredSupplies.filter(s => s.status === 'pending_review');
const rejectedSupplies = filteredSupplies.filter(s => s.status === 'rejected');
const draftSupplies = filteredSupplies.filter(s => s.status === 'draft');
// 更新UI显示
this.setData({
publishedSupplies,
pendingSupplies,
rejectedSupplies,
draftSupplies
});
// 显示搜索结果提示
wx.showToast({
title: `找到${filteredSupplies.length}个货源`,
icon: 'none',
duration: 1500
});
},
// 下拉刷新处理函数
onPullDownRefresh() {
console.log('====== 触发下拉刷新 ======');
// 重新加载所有货源数据
this.loadSupplies()
.then(() => {
console.log('下拉刷新数据加载成功');
wx.showToast({
title: '刷新成功',
icon: 'success',
duration: 1500
});
})
.catch(err => {
console.error('下拉刷新数据加载失败:', err);
wx.showToast({
title: '刷新失败,请重试',
icon: 'none',
duration: 2000
});
})
.finally(() => {
console.log('====== 下拉刷新动画停止 ======');
wx.stopPullDownRefresh();
});
},
onShow() {
console.log('seller页面onShow开始加载')
// 获取用户入驻状态
this.getUserStatus();
3 months ago
// 检查页面是否是初次加载(onLoad已调用loadSupplies)
// 避免在页面初次加载时重复加载数据
if (!this.data._hasLoadedOnShow) {
this.setData({
_hasLoadedOnShow: true
});
// 为了避免onLoad和onShow的重复加载,这里不立即调用
// 而是在短暂延迟后调用,确保不会与onLoad的加载冲突
setTimeout(() => {
this.loadSupplies();
}, 500);
} else {
// 页面不是初次显示,正常加载数据
this.loadSupplies();
}
3 months ago
// 更新自定义tabBar状态
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({
selected: 2
});
}
// 更新全局tab状态
const app = getApp();
app.updateCurrentTab('seller');
},
// 获取用户入驻状态
getUserStatus() {
const openid = wx.getStorageSync('openid');
if (openid) {
API.getUserInfo(openid)
.then(response => {
console.log('获取到的用户信息响应:', response);
// 修复:访问data字段获取用户信息
const userInfo = response.data || {};
console.log('处理后的用户信息:', userInfo);
this.setData({
partnerstatus: userInfo.partnerstatus || ''
});
})
.catch(err => {
console.error('获取用户信息失败:', err);
});
}
},
3 months ago
// 加载货源列表并分类 - 修改为分页加载
loadSupplies() {
console.log('开始加载货源数据 - 分页模式');
// 重置所有分页状态
this.resetAllPagination();
// 并行加载所有类型的货源
return Promise.all([
this.loadSuppliesFromServer('published', 1),
this.loadSuppliesFromServer('pending', 1),
this.loadSuppliesFromServer('rejected', 1),
this.loadSuppliesFromServer('draft', 1)
]).then(results => {
console.log('所有类型货源加载完成');
return results;
}).catch(err => {
console.error('加载货源失败:', err);
throw err;
});
},
// 重置所有分页状态
resetAllPagination() {
this.setData({
'pagination.published.page': 1,
'pagination.published.hasMore': true,
'pagination.published.loading': false,
'pagination.pending.page': 1,
'pagination.pending.hasMore': true,
'pagination.pending.loading': false,
'pagination.rejected.page': 1,
'pagination.rejected.hasMore': true,
'pagination.rejected.loading': false,
'pagination.draft.page': 1,
'pagination.draft.hasMore': true,
'pagination.draft.loading': false,
currentLoadingType: null
});
},
// 搜索货源 - 修改为使用本地数据
searchSupplies() {
console.log('搜索货源,关键词:', this.data.searchKeyword);
const keyword = this.data.searchKeyword.toLowerCase().trim();
if (!keyword) {
// 如果关键词为空,重新加载所有数据
this.loadSupplies();
return;
}
// 从所有货源中搜索
const allSupplies = this.data.supplies;
// 过滤符合条件的货源
const filteredSupplies = allSupplies.filter(supply => {
const name = (supply.name || '').toLowerCase();
const productName = (supply.productName || '').toLowerCase();
const yolk = (supply.yolk || '').toLowerCase();
const spec = (supply.spec || '').toLowerCase();
return name.includes(keyword) ||
productName.includes(keyword) ||
yolk.includes(keyword) ||
spec.includes(keyword);
});
// 将过滤后的货源按照状态分类
const publishedSupplies = filteredSupplies.filter(s => s.status === 'published');
const pendingSupplies = filteredSupplies.filter(s => s.status === 'pending_review' || s.status === 'reviewed');
const rejectedSupplies = filteredSupplies.filter(s => s.status === 'rejected');
const draftSupplies = filteredSupplies.filter(s => s.status === 'draft' || s.status === 'sold_out');
// 更新UI显示
this.setData({
publishedSupplies,
pendingSupplies,
rejectedSupplies,
draftSupplies
});
// 显示搜索结果提示
wx.showToast({
title: `找到${filteredSupplies.length}个货源`,
icon: 'none',
duration: 1500
});
},
// 修改图片URL处理函数
processImageUrls: function (imageUrls) {
if (!imageUrls || !Array.isArray(imageUrls)) {
return [];
}
return imageUrls.map(url => {
if (!url || typeof url !== 'string') return '';
let processedUrl = url.trim();
// 处理占位符URL - 替换为本地默认图片
if (processedUrl.startsWith('placeholder://')) {
console.log('检测到占位符URL,替换为默认图片:', processedUrl);
return '/images/default-product.png'; // 使用本地默认图片
}
// 处理临时文件路径
if (processedUrl.startsWith('http://tmp/') || processedUrl.startsWith('wxfile://')) {
console.log('检测到临时文件路径,保持原样:', processedUrl);
return processedUrl;
}
// 确保HTTP URL格式正确
if (processedUrl.startsWith('//')) {
processedUrl = 'https:' + processedUrl;
} else if (!processedUrl.startsWith('http') && !processedUrl.startsWith('/')) {
// 如果是相对路径但没有斜杠,添加斜杠
processedUrl = '/' + processedUrl;
}
return processedUrl;
}).filter(url => url && url !== '');
},
// 直接从服务器获取货源数据并显示 - 支持分页
loadSuppliesFromServer(type = 'all', page = 1) {
return new Promise((resolve, reject) => {
const openid = wx.getStorageSync('openid');
console.log(`loadSuppliesFromServer - type: ${type}, page: ${page}, openid:`, openid);
if (!openid) {
console.warn('openid不存在,显示空数据状态,允许用户浏览页面');
// 未登录状态下显示空数据,不跳转,允许用户浏览页面
this.setData({
supplies: [],
publishedSupplies: [],
pendingSupplies: [],
rejectedSupplies: [],
draftSupplies: []
});
resolve([]);
return;
}
console.log(`开始从服务器获取${type}类型商品数据,第${page}`);
// 根据类型设置请求参数
let status = [];
let pageSize = 20;
switch (type) {
case 'published':
status = ['published'];
pageSize = this.data.pagination.published.pageSize;
this.setData({
'pagination.published.loading': true,
currentLoadingType: 'published'
});
break;
case 'pending':
status = ['pending_review', 'reviewed'];
pageSize = this.data.pagination.pending.pageSize;
this.setData({
'pagination.pending.loading': true,
currentLoadingType: 'pending'
});
break;
case 'rejected':
status = ['rejected'];
pageSize = this.data.pagination.rejected.pageSize;
this.setData({
'pagination.rejected.loading': true,
currentLoadingType: 'rejected'
});
break;
case 'draft':
status = ['draft', 'sold_out'];
pageSize = this.data.pagination.draft.pageSize;
this.setData({
'pagination.draft.loading': true,
currentLoadingType: 'draft'
});
break;
default:
// 全部加载,不分类型
status = ['all'];
pageSize = 100; // 初始加载时使用较大值
}
const requestData = {
openid: openid,
viewMode: 'seller',
status: status,
page: page,
pageSize: pageSize
};
console.log('请求参数:', requestData);
API.getAllSupplies(requestData)
.then(res => {
console.log(`从服务器获取${type}类型数据响应:`, res);
if (res && res.success && res.products) {
console.log(`从服务器获取到${type}类型商品数据,共`, res.products.length, '条');
// 处理服务器返回的商品数据
const serverSupplies = res.products
.filter(product => product.status !== 'hidden')
.map(serverProduct => {
// 状态映射
const mappedStatus = serverProduct.status;
// 处理图片URL
let imageUrls = this.processImageUrls(serverProduct.imageUrls);
// 处理创建时间
const createdAt = serverProduct.created_at || null;
const formattedCreatedAt = this.formatCreateTime(createdAt);
return {
id: serverProduct.productId,
name: serverProduct.productName,
price: serverProduct.price,
minOrder: serverProduct.quantity,
grossWeight: serverProduct.grossWeight,
yolk: serverProduct.yolk,
spec: serverProduct.specification,
region: serverProduct.region || '未知地区', // 【修复】添加默认地区
serverProductId: serverProduct.productId,
status: mappedStatus,
rejectReason: serverProduct.rejectReason || '',
imageUrls: imageUrls,
created_at: createdAt,
formattedCreatedAt: formattedCreatedAt,
currentImageIndex: 0
};
});
// 根据类型更新数据
this.updateSuppliesByType(type, serverSupplies, res, page);
resolve(serverSupplies);
} else {
console.log(`服务器没有返回${type}类型商品数据或返回格式不正确`);
this.handleNoData(type);
resolve([]);
}
})
.catch(err => {
console.error(`从服务器获取${type}类型数据失败:`, err);
this.handleLoadError(type, err);
reject(err);
})
.finally(() => {
// 重置加载状态
this.resetLoadingState(type);
});
});
},
// 根据类型更新货源数据
updateSuppliesByType(type, newSupplies, response, currentPage) {
const paginationKey = `pagination.${type}`;
// 更新分页信息
const hasMore = currentPage < (response.totalPages || 1);
this.setData({
[`${paginationKey}.hasMore`]: hasMore,
[`${paginationKey}.page`]: currentPage
});
// 更新货源列表
if (currentPage === 1) {
// 第一页,直接替换
this.setData({
[`${type}Supplies`]: newSupplies
});
} else {
// 后续页面,追加数据
const existingSupplies = this.data[`${type}Supplies`] || [];
const updatedSupplies = [...existingSupplies, ...newSupplies];
this.setData({
[`${type}Supplies`]: updatedSupplies
});
}
// 更新总列表(用于搜索等功能)
this.updateAllSupplies();
console.log(`更新${type}类型货源完成,当前数量:`, this.data[`${type}Supplies`].length, '是否有更多:', hasMore);
},
// 更新所有货源列表(用于搜索)
updateAllSupplies() {
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies
];
this.setData({
supplies: allSupplies
});
},
// 处理无数据情况
handleNoData(type) {
const paginationKey = `pagination.${type}`;
this.setData({
[`${paginationKey}.hasMore`]: false,
[`${type}Supplies`]: []
});
},
// 处理加载错误
handleLoadError(type, err) {
const paginationKey = `pagination.${type}`;
this.setData({
[`${paginationKey}.loading`]: false
});
// 检查是否是用户不存在的错误
if (err.message && (err.message.includes('404') || err.message.includes('用户不存在'))) {
console.log('用户不存在,跳转到登录页面');
wx.showToast({
title: '用户不存在,请重新登录',
icon: 'none',
duration: 2000,
success: () => {
wx.removeStorageSync('openid');
wx.removeStorageSync('userInfo');
setTimeout(() => {
wx.switchTab({
url: '/pages/index/index'
});
}, 2000);
}
});
}
},
// 重置加载状态
resetLoadingState(type) {
if (type !== 'all') {
this.setData({
[`pagination.${type}.loading`]: false,
currentLoadingType: null
});
}
},
// 加载更多货源
loadMoreSupplies(type) {
const pagination = this.data.pagination[type];
if (!pagination.hasMore || pagination.loading) {
console.log(`没有更多${type}类型数据或正在加载中`);
return;
}
console.log(`开始加载更多${type}类型数据,当前页码:`, pagination.page);
const nextPage = pagination.page + 1;
this.loadSuppliesFromServer(type, nextPage)
.then(() => {
console.log(`加载更多${type}类型数据成功`);
})
.catch(err => {
console.error(`加载更多${type}类型数据失败:`, err);
wx.showToast({
title: '加载失败,请重试',
icon: 'none',
duration: 2000
});
});
},
// 已上架货源加载更多
onReachPublishedBottom() {
console.log('已上架货源滚动到底部,加载更多');
this.loadMoreSupplies('published');
},
// 审核中货源加载更多
onReachPendingBottom() {
console.log('审核中货源滚动到底部,加载更多');
this.loadMoreSupplies('pending');
},
// 审核失败货源加载更多
onReachRejectedBottom() {
console.log('审核失败货源滚动到底部,加载更多');
this.loadMoreSupplies('rejected');
},
// 下架状态货源加载更多
onReachDraftBottom() {
console.log('下架状态货源滚动到底部,加载更多');
this.loadMoreSupplies('draft');
},
// 从服务器同步最新的商品数据 (现在直接使用服务器数据,不再保存到本地存储)
syncSuppliesFromServer() {
// 调用新的直接从服务器获取数据的方法
console.log('syncSuppliesFromServer: 直接从服务器获取最新数据');
this.loadSuppliesFromServer();
},
// 从本地存储加载货源数据(已废弃,现在直接从服务器获取)
loadSuppliesFromLocal() {
console.log('loadSuppliesFromLocal: 已废弃,现在直接从服务器获取数据');
this.loadSuppliesFromServer();
},
// 同步货源数据到商品列表 - 移除本地存储操作
syncSuppliesToGoods(supplies) {
try {
console.log('开始同步货源数据到商品列表 - 通过服务器同步')
// 直接通知服务器同步已上架商品,不操作本地存储
// 修复:移除supply.status === 'reviewed',reviewed状态不应被视为已上架
const publishedSupplies = supplies.filter(supply =>
supply.status === 'published'
);
if (publishedSupplies.length > 0) {
// 延迟一小段时间,避免与服务器交互过于频繁
setTimeout(() => {
// 这里应该有一个API调用,通知服务器同步商品
// API.syncPublishedSuppliesToGoods(publishedSupplies)
// .then(res => {
// console.log('服务器同步商品成功:', res)
// })
// .catch(err => {
// console.error('服务器同步商品失败:', err)
// })
console.log('已上架商品:', publishedSupplies)
}, 500);
}
} catch (error) {
console.error('同步货源到商品列表过程中发生错误:', error)
}
},
// 显示一键登录弹窗
showOneKeyLogin() {
this.setData({
showAuthModal: false,
showOneKeyLoginModal: true
})
},
// 关闭未授权提示弹窗
closeAuthModal() {
this.setData({ showAuthModal: false })
},
// 关闭一键登录弹窗
closeOneKeyLoginModal() {
this.setData({ showOneKeyLoginModal: false })
},
// 选择头像
onChooseAvatar(e) {
const { avatarUrl } = e.detail
this.setData({
avatarUrl
})
},
// 处理昵称提交
getUserName(e) {
const { nickname } = e.detail.value
const type = 'seller' // 卖家页面固定为卖家类型
if (!nickname) {
wx.showToast({
title: '请输入昵称',
icon: 'none',
duration: 2000
})
return
}
// 创建用户信息对象
const userInfo = {
nickName: nickname,
avatarUrl: this.data.avatarUrl,
gender: 0,
country: '',
province: '',
city: '',
language: 'zh_CN'
}
// 保存用户信息
this.saveUserInfo(userInfo, type)
// 隐藏表单
this.setData({
showUserInfoForm: false
})
// 完成设置
this.finishSetUserType(type)
},
// 取消用户信息表单
cancelUserInfoForm() {
this.setData({
showUserInfoForm: false
})
wx.hideLoading()
},
// 处理手机号授权
async onGetPhoneNumber(e) {
// 打印详细错误信息,方便调试
console.log('getPhoneNumber响应:', e.detail)
// 关闭手机号授权弹窗
this.setData({ showOneKeyLoginModal: false })
// 用户点击拒绝授权
if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
wx.showToast({
title: '需要授权手机号才能使用',
icon: 'none',
duration: 2000
})
return
}
// 处理没有权限的情况
if (e.detail.errMsg === 'getPhoneNumber:fail no permission') {
wx.showToast({
title: '当前环境无法获取手机号权限',
icon: 'none',
duration: 3000
})
console.warn('获取手机号权限失败: 请注意,微信小程序获取手机号功能需要满足以下条件:1. 小程序必须完成微信企业认证;2. 需要在小程序后台配置相应权限;3. 必须使用button组件的open-type="getPhoneNumber"触发。')
return
}
// 检查是否已经登录,避免重复授权
const existingOpenid = wx.getStorageSync('openid')
const existingUserId = wx.getStorageSync('userId')
const existingUserInfo = wx.getStorageSync('userInfo')
if (existingOpenid && existingUserId && existingUserInfo && existingUserInfo.phoneNumber) {
3 months ago
console.log('用户已登录且手机号有效,直接完成身份设置')
// 直接完成身份设置,跳过重复授权
const currentUserType = this.data.pendingUserType || 'seller'
this.finishSetUserType(currentUserType)
return
}
wx.showLoading({
title: '登录中...',
mask: true
})
try {
if (e.detail.errMsg === 'getPhoneNumber:ok') {
// 用户同意授权,实际处理授权流程
console.log('用户同意授权获取手机号')
// 1. 先执行微信登录获取code
const loginRes = await new Promise((resolve, reject) => {
wx.login({
success: resolve,
fail: reject
})
})
if (!loginRes.code) {
throw new Error('获取登录code失败')
}
console.log('获取登录code成功:', loginRes.code)
// 2. 使用code换取openid
const openidRes = await API.getOpenid(loginRes.code)
let openid = null;
let userId = null;
console.log('openidRes完整响应:', JSON.stringify(openidRes));
if (openidRes && typeof openidRes === 'object') {
if (openidRes.data && typeof openidRes.data === 'object') {
console.log('识别到标准服务器返回格式,从data字段提取信息');
openid = openidRes.data.openid || openidRes.data.OpenID || null;
userId = openidRes.data.userId || null;
} else {
console.log('尝试从根对象直接提取openid');
openid = openidRes.openid || openidRes.OpenID || null;
userId = openidRes.userId || null;
}
}
if (!openid) {
console.error('无法从服务器响应中提取openid,完整响应:', JSON.stringify(openidRes));
throw new Error(`获取openid失败: 服务器返回数据格式可能不符合预期,请检查服务器配置。响应数据为: ${JSON.stringify(openidRes)}`);
}
console.log('获取openid成功:', openid)
// 3. 存储openid和session_key
wx.setStorageSync('openid', openid)
if (openidRes && openidRes.session_key) {
wx.setStorageSync('sessionKey', openidRes.session_key)
} else if (openidRes && openidRes.data && openidRes.data.session_key) {
wx.setStorageSync('sessionKey', openidRes.data.session_key)
}
if (userId) {
wx.setStorageSync('userId', userId)
console.log('使用从服务器data字段提取的userId:', userId)
} else if (openidRes && openidRes.userId) {
wx.setStorageSync('userId', openidRes.userId)
console.log('使用服务器根对象中的userId:', openidRes.userId)
} else {
const tempUserId = 'user_' + Date.now()
wx.setStorageSync('userId', tempUserId)
console.log('生成临时userId:', tempUserId)
}
// 4. 上传手机号加密数据到服务器解密
const phoneData = {
...e.detail,
openid: openid
}
console.log('准备上传手机号加密数据到服务器')
const phoneRes = await API.uploadPhoneNumberData(phoneData)
if (!phoneRes || (!phoneRes.success && !phoneRes.phoneNumber)) {
if (phoneRes && phoneRes.phoneNumber) {
console.warn('服务器返回格式可能不符合预期,但成功获取手机号');
} else {
throw new Error('获取手机号失败: ' + (phoneRes && phoneRes.message ? phoneRes.message : '未知错误'))
}
}
const hasPhoneConflict = phoneRes.phoneNumberConflict || false
const isNewPhone = phoneRes.isNewPhone || true
const phoneNumber = phoneRes.phoneNumber || null
const finalPhoneNumber = phoneNumber
3 months ago
console.log('手机号解密结果:', {
phoneNumber: finalPhoneNumber,
hasPhoneConflict: hasPhoneConflict,
isNewPhone: isNewPhone
})
// 5. 创建临时用户信息并保存
const tempUserInfo = {
nickName: '微信用户',
avatarUrl: this.data.avatarUrl,
gender: 0,
country: '',
province: '',
city: '',
language: 'zh_CN',
phoneNumber: finalPhoneNumber
}
const storedUserId = wx.getStorageSync('userId')
const currentUserType = this.data.pendingUserType || 'seller'
console.log('用户身份类型:', currentUserType)
if (this.data.pendingUserType) {
this.setData({ pendingUserType: null })
}
// 保存用户信息并等待上传完成
console.log('开始保存用户信息并上传到服务器...')
const uploadResult = await this.saveUserInfo(tempUserInfo, currentUserType)
console.log('用户信息保存并上传完成')
wx.hideLoading()
if (uploadResult && uploadResult.phoneNumberConflict) {
wx.showToast({
title: '登录成功,但手机号已被其他账号绑定',
icon: 'none',
duration: 3000
})
} else {
wx.showToast({
title: '登录成功,手机号已绑定',
icon: 'success',
duration: 2000
})
}
// 完成设置并跳转
this.finishSetUserType(currentUserType)
} else {
console.log('手机号授权失败:', e.detail.errMsg)
wx.hideLoading()
wx.showToast({
title: '需要授权手机号才能使用',
icon: 'none',
duration: 2000
})
return
}
} catch (error) {
wx.hideLoading()
console.error('登录过程中发生错误:', error)
let errorMsg = '登录失败,请重试'
if (error.message.includes('网络')) {
errorMsg = '网络连接失败,请检查网络后重试'
} else if (error.message.includes('服务器')) {
errorMsg = '服务器连接失败,请稍后重试'
}
wx.showToast({
title: errorMsg,
icon: 'none',
duration: 3000
})
try {
wx.removeStorageSync('openid')
wx.removeStorageSync('sessionKey')
wx.removeStorageSync('userId')
} catch (e) {
console.error('清除临时登录信息失败:', e)
}
}
},
// 保存用户信息
async saveUserInfo(userInfo, type) {
try {
// 获取userId
const userId = wx.getStorageSync('userId')
// 保存用户信息到本地存储
wx.setStorageSync('userInfo', userInfo)
// 更新用户类型信息
let users = wx.getStorageSync('users') || {}
users[userId] = {
...users[userId],
type: type,
userInfo: userInfo,
lastLoginTime: Date.now()
}
wx.setStorageSync('users', users)
console.log('用户信息保存成功:', userInfo)
// 上传用户信息到服务器
return await this.uploadUserInfoToServer(userInfo, userId, type)
} catch (error) {
console.error('保存用户信息失败:', error)
throw error
}
},
// 上传用户信息到服务器
async uploadUserInfoToServer(userInfo, userId, type) {
const openid = wx.getStorageSync('openid')
const uploadData = {
userId: userId,
openid: openid,
...userInfo,
type: type,
timestamp: Date.now()
}
try {
const res = await API.uploadUserInfo(uploadData)
console.log('用户信息上传成功:', res)
// 入驻成功后,将用户类型设置为seller
API.updateUserType('seller');
3 months ago
return res
} catch (err) {
console.error('用户信息上传失败:', err)
return {
success: true,
message: '本地登录成功,服务器连接失败'
}
}
},
// 完成用户类型设置并跳转
finishSetUserType(type) {
const userId = wx.getStorageSync('userId')
// 更新用户类型
let users = wx.getStorageSync('users')
if (typeof users !== 'object' || users === null) {
users = {}
}
if (!users[userId]) {
users[userId] = {}
}
users[userId].type = type
wx.setStorageSync('users', users)
// 打标签
let tags = wx.getStorageSync('tags')
if (typeof tags !== 'object' || tags === null) {
tags = {}
}
tags[userId] = tags[userId] || []
tags[userId] = tags[userId].filter(tag => !tag.startsWith('身份:'))
tags[userId].push(`身份:${type}`)
wx.setStorageSync('tags', tags)
console.log('用户类型设置完成,准备跳转到', type === 'buyer' ? '买家页面' : '卖家页面')
setTimeout(() => {
if (type === 'buyer') {
wx.switchTab({ url: '/pages/buyer/index' })
} else {
// 卖家登录成功后,重新显示创建货源弹窗
// 从本地存储加载保存的表单数据
const savedSupply = wx.getStorageSync('newSupplyDraft') || { name: '', price: '', minOrder: '', yolk: '', spec: '', imageUrls: [] };
3 months ago
this.setData({
showImagePreview: false,
showModal: true,
newSupply: savedSupply
3 months ago
});
this.disablePageScroll();
}
}, 500)
},
// 显示添加货源弹窗
showAddSupply(e) {
console.log('点击创建新货源按钮');
3 months ago
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 从本地存储加载之前保存的货源数据
const savedSupply = wx.getStorageSync('newSupplyDraft') || { name: '', price: '', minOrder: '', yolk: '', spec: '', imageUrls: [] };
// 直接显示创建货源弹窗,无需登录验证
3 months ago
this.setData({
showImagePreview: false,
showModal: true,
newSupply: savedSupply
3 months ago
});
3 months ago
// 锁定页面滚动
this.disablePageScroll();
},
// 隐藏弹窗
hideModal() {
this.setData({
showModal: false,
showImagePreview: false // 确保图片预览弹窗关闭
})
// 恢复页面滚动
this.enablePageScroll()
},
// 隐藏编辑弹窗
hideEditModal() {
this.setData({
showEditModal: false
})
// 恢复页面滚动
this.enablePageScroll()
},
// 禁用页面滚动
disablePageScroll() {
// 获取页面实例并设置样式来禁用滚动
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
if (currentPage) {
currentPage.setData({
pageScrollLock: true
})
}
// iOS设备特殊处理:阻止触摸事件
if (this.isIOS()) {
this.blockTouchMove()
}
},
// 启用页面滚动
enablePageScroll() {
// 获取页面实例并恢复滚动
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
if (currentPage) {
currentPage.setData({
pageScrollLock: false
})
}
// iOS设备特殊处理:恢复触摸事件
if (this.isIOS()) {
this.unblockTouchMove()
}
},
// 输入内容处理
onInput(e) {
const field = e.currentTarget.dataset.field
const value = e.detail.value
const newSupply = this.data.newSupply
newSupply[field] = value
this.setData({ newSupply })
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
},
// 编辑输入处理
onEditInput(e) {
const field = e.currentTarget.dataset.field
const value = e.detail.value
// 创建一个新的对象,而不是直接修改data中的对象
this.setData({
editSupply: {
...this.data.editSupply,
[field]: value
}
})
},
// 新创建货源地区选择处理
onNewSupplyRegionChange(e) {
const regionArray = e.detail.value
const region = regionArray.join(' ')
this.setData({
newSupplyRegionArray: regionArray,
newSupply: {
...this.data.newSupply,
region: region
}
})
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', this.data.newSupply);
},
// 编辑货源地区选择处理
onEditSupplyRegionChange(e) {
const regionArray = e.detail.value
const region = regionArray.join(' ')
this.setData({
editSupplyRegionArray: regionArray,
editSupply: {
...this.data.editSupply,
region: region
}
})
},
3 months ago
// 处理蛋黄选择变更
onYolkChange(e) {
const index = e.detail.value
const yolk = this.data.yolkOptions[index]
this.setData({
'newSupply.yolkIndex': index,
'newSupply.yolk': yolk
})
},
3 months ago
// 处理规格选择变更 - 现在直接打开自定义弹窗
onSpecChange(e) {
// 由于我们使用自定义弹窗,这个函数现在只需要打开弹窗即可
this.openSpecSelectModal({ currentTarget: { dataset: { mode: 'create' } } });
},
3 months ago
// 处理编辑模式下的蛋黄选择变更
onEditYolkChange(e) {
console.warn('此方法已弃用,请使用openYolkSelectModal替代');
},
3 months ago
// 处理编辑模式下的规格选择变更 - 现在直接打开自定义弹窗
onEditSpecChange(e) {
// 由于我们使用自定义弹窗,这个函数现在只需要打开弹窗即可
this.openSpecSelectModal({ currentTarget: { dataset: { mode: 'edit' } } });
},
// 商品名称选择变化处理
3 months ago
onNameChange(e) {
const index = e.detail.value
const productName = this.data.productNameOptions[index]
const newSupply = this.data.newSupply
newSupply.name = productName
this.setData({ newSupply })
},
// 编辑商品名称选择变化处理
onEditNameChange(e) {
console.warn('此方法已弃用,请使用openNameSelectModal替代');
},
// 添加新货源 - 先创建商品再上传图片(修复版)
addSupply() {
// 检查登录状态
const userId = wx.getStorageSync('userId');
const openid = wx.getStorageSync('openid');
const userInfo = wx.getStorageSync('userInfo');
if (!userId || !openid || !userInfo) {
console.log('用户未登录,显示登录提示');
// 登录前保存当前表单数据到本地存储
wx.setStorageSync('newSupplyDraft', this.data.newSupply);
// 用户未登录,显示未授权提示弹窗
wx.showModal({
title: '登录提示',
content: '请先登录再发布商品',
showCancel: true,
confirmText: '去登录',
success: (res) => {
if (res.confirm) {
// 用户点击确定,跳转到登录页面或显示登录弹窗
this.setData({
showAuthModal: true,
pendingUserType: 'seller'
});
}
}
});
return;
}
3 months ago
const { name, price, minOrder, yolk, spec, region, imageUrls } = this.data.newSupply
if (!name || !price || !minOrder || !yolk) {
wx.showToast({ title: '请填写完整信息', icon: 'none', duration: 2000 })
return
}
// 显示加载中提示
wx.showLoading({ title: '正在验证权限...', mask: true })
// 检查用户的partnerstatus是否为approved
API.getUserInfo(openid)
.then(response => {
const userInfoRes = response.data;
console.log('获取用户信息成功:', userInfoRes)
// 检查partnerstatus字段
const partnerStatus = userInfoRes.partnerstatus || 'pending'
console.log('用户合作状态:', partnerStatus)
if (partnerStatus !== 'approved') {
throw new Error('partnerstatus_not_approved')
}
// 第一步:先创建商品(不带图片)
const productData = {
productName: name,
price: price, // 保留原始字符串,不进行数字转换
quantity: Number(minOrder),
grossWeight: this.data.newSupply.grossWeight && this.data.newSupply.grossWeight !== '' ? this.data.newSupply.grossWeight : "",
yolk: yolk,
specification: spec || '',
region: region || '', // 【新增】添加地区字段
rejectReason: '',
imageUrls: [] // 明确设置为空数组
3 months ago
}
console.log('第一步:准备创建商品,数据:', productData)
// 更新加载提示
wx.showLoading({ title: '正在创建商品...', mask: true })
3 months ago
// 调用API创建商品(不带图片)
return API.publishProduct(productData)
})
3 months ago
.then(res => {
console.log('商品创建成功:', res)
// 第二步:如果有图片,上传图片到已创建的商品
if (imageUrls && imageUrls.length > 0) {
wx.showLoading({ title: '正在上传图片...', mask: true })
console.log('开始上传图片到已创建商品,数量:', imageUrls.length)
// 获取创建的商品ID - 从多个可能的位置获取
const productId = res.productId || res.data?.productId || res.product?.productId
if (productId) {
console.log('找到商品ID:', productId)
// 【关键修复】使用专门的方法上传图片到已存在商品
return this.uploadImagesToExistingProduct(productId, imageUrls, openid)
.then(uploadRes => {
console.log('图片上传成功:', uploadRes)
return { ...res, imageUpload: uploadRes }
})
} else {
console.error('无法获取商品ID,响应数据:', res)
throw new Error('无法获取商品ID,无法上传图片')
}
} else {
// 没有图片,直接返回
return res
}
})
.then(finalRes => {
wx.hideLoading()
wx.showToast({
title: imageUrls && imageUrls.length > 0 ? '创建成功,图片已上传' : '创建成功',
duration: 3000
})
// 重置表单
this.setData({
showModal: false,
newSupply: { name: '', price: '', minOrder: '', yolk: '', spec: '', imageUrls: [] }
})
// 清除本地存储的草稿数据
wx.removeStorageSync('newSupplyDraft');
3 months ago
this.enablePageScroll()
// 重新加载数据
this.loadSupplies()
})
.catch(err => {
console.error('商品创建或图片上传失败:', err)
wx.hideLoading()
// 处理权限不足的情况
if (err.message === 'partnerstatus_not_approved') {
3 months ago
wx.showModal({
title: '权限不足',
content: '您的合作伙伴身份尚未通过审核,请等待审核通过后再发布商品',
showCancel: true,
cancelText: '取消',
confirmText: '立即入驻',
success: (res) => {
if (res.confirm) {
// 跳转到入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
})
}
}
3 months ago
})
return
}
// 其他错误处理:所有错误都显示通用提示,不再跳转登录
let errorMsg = '上传服务器失败'
if (err.message && err.message.includes('商品不存在')) {
errorMsg = '商品创建失败,无法上传图片'
3 months ago
}
wx.showModal({
title: '发布失败',
content: errorMsg + '\n\n错误详情: ' + (err.message || JSON.stringify(err)),
showCancel: false,
success: () => {
this.loadSupplies()
}
})
3 months ago
})
},
// 上传商品图片 - 修复版,专门用于为已存在商品上传图片
uploadProductImages(productId, imageUrls) {
return new Promise((resolve, reject) => {
if (!productId) {
reject(new Error('商品ID不能为空'))
return
}
if (!imageUrls || imageUrls.length === 0) {
resolve({ success: true, message: '没有图片需要上传' })
return
}
console.log('开始为已存在商品上传图片,商品ID:', productId, '图片数量:', imageUrls.length)
// 获取openid
const openid = wx.getStorageSync('openid')
if (!openid) {
reject(new Error('用户未登录'))
return
}
// 【关键修复】使用专门的图片上传方法,而不是创建新商品
this.uploadImagesToExistingProduct(productId, imageUrls, openid)
.then(resolve)
.catch(reject)
})
},
// 【修复】上传商品图片 - 确保顺序执行
uploadImagesToExistingProduct(productId, imageUrls, openid) {
return new Promise((resolve, reject) => {
console.log('【图片上传】开始为已存在商品上传图片,商品ID:', productId);
// 【关键修复】顺序上传图片,避免并发问题
const uploadSequentially = async () => {
const results = [];
for (let i = 0; i < imageUrls.length; i++) {
try {
console.log(`顺序上传第${i + 1}/${imageUrls.length}张图片`);
const result = await new Promise((resolveUpload, rejectUpload) => {
const formData = {
productId: productId,
openid: openid,
action: 'add_images_only',
imageIndex: i,
totalImages: imageUrls.length,
isUpdate: 'true',
timestamp: Date.now()
};
wx.uploadFile({
url: API.BASE_URL + '/api/products/upload',
filePath: imageUrls[i],
name: 'images',
formData: formData,
success: (res) => {
if (res.statusCode === 200) {
try {
const data = JSON.parse(res.data);
if (data.success) {
console.log(`${i + 1}张图片上传成功,当前总数:`, data.totalCount);
resolveUpload(data);
} else {
rejectUpload(new Error(data.message || '图片上传失败'));
}
} catch (parseError) {
rejectUpload(new Error('服务器响应格式错误'));
}
} else {
rejectUpload(new Error(`HTTP ${res.statusCode}`));
}
},
fail: (err) => {
rejectUpload(new Error('网络错误: ' + err.errMsg));
}
});
});
results.push(result);
// 添加延迟,避免服务器处理压力过大
if (i < imageUrls.length - 1) {
await new Promise(resolve => setTimeout(resolve, 500));
}
} catch (error) {
console.error(`${i + 1}张图片上传失败:`, error);
// 继续上传其他图片,不中断流程
results.push({ success: false, error: error.message });
}
}
return results;
};
uploadSequentially()
.then(results => {
// 取最后一个成功的结果作为最终状态
const successfulResults = results.filter(r => r && r.success);
if (successfulResults.length > 0) {
const lastResult = successfulResults[successfulResults.length - 1];
resolve({
success: true,
message: `成功上传${successfulResults.length}张图片`,
imageUrls: lastResult.imageUrls || [],
allImageUrls: lastResult.allImageUrls || [],
uploadedCount: successfulResults.length,
totalCount: lastResult.totalCount || successfulResults.length,
results: results
});
} else {
reject(new Error('所有图片上传失败'));
}
})
.catch(error => {
console.error('图片上传失败:', error);
reject(error);
});
});
},
// 准备上架操作:只显示编辑页面,用户点击提交后才执行上架
preparePublishSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 设置自动上架标志为true
this.setData({
autoPublishAfterEdit: true
});
console.log('设置编辑后自动上架标志为true');
// 调用showEditSupply方法显示编辑页面,但不自动执行上架
this.showEditSupply(e, true); // 传递第二个参数表示这是上架操作
},
// 保存编辑后的货源信息
saveEdit() {
const { editSupply, autoPublishAfterEdit } = this.data;
// 验证必填信息
if (!editSupply.name || !editSupply.price || !editSupply.minOrder || !editSupply.yolk) {
wx.showToast({ title: '请填写完整信息', icon: 'none', duration: 2000 });
return;
}
// 显示加载中提示
wx.showLoading({ title: '正在同步...', mask: true });
// 获取openid
const openid = wx.getStorageSync('openid');
if (!openid) {
wx.hideLoading();
wx.showModal({
title: '登录状态异常',
content: '您的登录状态已失效,请重新登录后再尝试保存',
showCancel: false,
success: () => {
wx.showToast({
title: '保存失败,请先登录',
icon: 'none',
duration: 3000
});
this.setData({ showEditModal: false });
this.enablePageScroll();
}
});
return;
}
// 检查用户合作状态
API.getUserInfo(openid)
.then(response => {
const userInfo = response.data;
if (userInfo.partnerstatus !== 'approved') {
wx.hideLoading();
wx.showModal({
title: '权限不足',
content: '您的合作伙伴身份尚未通过审核,无法保存商品',
showCancel: true,
cancelText: '取消',
confirmText: '立即入驻',
success: (res) => {
if (res.confirm) {
// 跳转到入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
})
}
this.setData({ showEditModal: false });
this.enablePageScroll();
}
});
return Promise.reject('partnerstatus not approved');
}
return Promise.resolve();
})
.catch(err => {
if (err !== 'partnerstatus not approved') {
wx.hideLoading();
wx.showToast({
title: '获取用户信息失败',
icon: 'none',
duration: 3000
});
this.setData({ showEditModal: false });
this.enablePageScroll();
}
return Promise.reject(err);
})
.then(() => {
// 【关键修复】准备商品数据 - 确保包含地区字段
const productData = {
productName: editSupply.name,
price: editSupply.price, // 保留原始字符串,不进行数字转换
quantity: Number(editSupply.minOrder),
grossWeight: editSupply.grossWeight !== undefined && editSupply.grossWeight !== null && editSupply.grossWeight !== '' ? editSupply.grossWeight : "",
yolk: editSupply.yolk,
specification: editSupply.spec || '',
region: editSupply.region || '', // 【重要】确保地区字段传递
imageUrls: editSupply.imageUrls || [],
created_at: new Date().toISOString(),
status: autoPublishAfterEdit ? 'pending_review' : ''
};
console.log('【调试】准备提交的商品数据:', {
productData: productData,
hasRegion: !!productData.region,
regionValue: productData.region
});
3 months ago
// 判断是编辑现有商品还是创建新商品
if (editSupply.serverProductId) {
// 编辑现有商品
productData.productId = editSupply.serverProductId;
console.log('【调试】调用API.editProduct,商品ID:', editSupply.serverProductId);
// 【关键修复】使用正确的API调用格式
const requestData = {
openid: openid,
productId: editSupply.serverProductId,
product: {
productName: productData.productName,
price: productData.price,
quantity: productData.quantity,
grossWeight: productData.grossWeight,
yolk: productData.yolk,
specification: productData.specification,
region: productData.region, // 【重要】确保在product对象中传递地区字段
imageUrls: productData.imageUrls
},
status: productData.status || ''
};
3 months ago
console.log('【调试】最终发送的请求数据:', requestData);
3 months ago
// 直接使用wx.request调用,避免API封装层的问题
wx.request({
url: API.BASE_URL + '/api/product/edit',
method: 'POST',
data: requestData,
success: (res) => {
console.log('【调试】编辑商品成功响应:', res);
wx.hideLoading();
this.setData({ showEditModal: false });
this.enablePageScroll();
wx.showToast({ title: '更新成功', duration: 2000 });
// 重新加载数据
setTimeout(() => {
this.loadSupplies();
}, 100);
},
fail: (err) => {
console.error('【调试】编辑商品失败:', err);
wx.hideLoading();
wx.showToast({ title: '保存失败,请重试', icon: 'none', duration: 2000 });
}
});
} else {
// 创建新商品并提交审核
// 调用添加商品接口
wx.request({
url: API.BASE_URL + '/api/product/add',
method: 'POST',
data: productData,
success: (res) => {
console.log('商品创建成功:', res);
wx.hideLoading();
3 months ago
// 关闭编辑弹窗
this.setData({ showEditModal: false });
// 恢复页面滚动
this.enablePageScroll();
3 months ago
wx.showToast({ title: '更新成功,等待审核', duration: 2000 });
// 重新加载商品列表
setTimeout(() => {
this.loadSupplies();
}, 100);
},
fail: (err) => {
console.error('商品创建失败:', err);
wx.hideLoading();
wx.showToast({ title: '创建失败,请重试', icon: 'none', duration: 2000 });
}
});
3 months ago
}
});
},
// 预览图片
previewImage(e) {
const { urls, index } = e.currentTarget.dataset
console.log('准备预览图片,原始URLs:', urls);
console.log('当前预览图片索引:', index);
console.log('当前预览图片原始URL:', urls[index]);
// 修复图片URL格式化问题
const formattedUrls = urls.map(url => {
if (!url) return '';
// 移除URL中的引号
let formattedUrl = url.toString().replace(/['"`]/g, '');
// 确保URL以http://或https://开头,特殊处理wxfile://格式
// 特殊处理占位符URL(以placeholder://协议开头)
const isHttpProtocol = formattedUrl.startsWith('http');
const isWxfileProtocol = formattedUrl.startsWith('wxfile://');
const isPlaceholderUrl = formattedUrl.startsWith('placeholder://');
console.log('previewImage - 原始URL:', url);
console.log('previewImage - 移除引号后的URL:', formattedUrl);
console.log('previewImage - isHttpProtocol:', isHttpProtocol, 'isWxfileProtocol:', isWxfileProtocol, 'isPlaceholderUrl:', isPlaceholderUrl);
// 对于占位符URL,返回空字符串,这样就不会在预览中显示它们
if (isPlaceholderUrl) {
console.log('previewImage - 占位符URL,不参与预览:', formattedUrl);
return '';
}
if (formattedUrl && !isHttpProtocol && !isWxfileProtocol) {
console.warn('previewImage - 图片URL缺少协议,添加https://前缀:', formattedUrl);
formattedUrl = 'https://' + formattedUrl;
} else {
console.log('previewImage - URL已包含有效协议或为wxfile格式,无需添加前缀:', formattedUrl);
}
// 尝试解码可能被编码的URL路径段
try {
// 先检查是否包含%2F等已编码的斜杠
if (formattedUrl.includes('%2F')) {
// 只解码路径部分,保留查询参数
const parts = formattedUrl.split('?');
if (parts.length > 1) {
formattedUrl = decodeURIComponent(parts[0]) + '?' + parts[1];
} else {
formattedUrl = decodeURIComponent(formattedUrl);
}
}
} catch (e) {
console.error('解码URL失败:', e);
}
// 简单验证URL格式
if (formattedUrl && /^https?:\/\/.+\..+/.test(formattedUrl)) {
return formattedUrl;
}
return '';
});
console.log('格式化后的URLs:', formattedUrls);
console.log('当前预览图片格式化后URL:', formattedUrls[index]);
// 锁定页面滚动
this.disablePageScroll();
this.setData({
showImagePreview: true,
previewImageUrls: formattedUrls.filter(url => url), // 过滤掉无效URL
previewImageIndex: parseInt(index)
})
},
// 关闭图片预览
closeImagePreview() {
this.setData({
showImagePreview: false
})
// 恢复页面滚动
this.enablePageScroll();
},
// 切换预览图片
onPreviewImageChange(e) {
this.setData({
previewImageIndex: e.detail.current,
// 切换图片时重置缩放状态
scale: 1,
offsetX: 0,
offsetY: 0
})
},
// 处理图片点击事件
handleImageTap() {
// 清除之前的双击计时器
if (this.data.doubleTapTimeout) {
clearTimeout(this.data.doubleTapTimeout)
this.setData({ doubleTapTimeout: null })
}
// 增加双击计数
const newDoubleTapCount = this.data.doubleTapCount + 1
this.setData({ doubleTapCount: newDoubleTapCount })
// 如果是第一次点击,设置计时器
if (newDoubleTapCount === 1) {
const timer = setTimeout(() => {
// 单击操作:重置缩放
this.resetZoom()
this.setData({ doubleTapCount: 0, doubleTapTimeout: null })
}, 300)
this.setData({ doubleTapTimeout: timer })
} else if (newDoubleTapCount === 2) {
// 双击操作:切换缩放状态
if (this.data.scale > 1) {
this.resetZoom()
} else {
this.zoomToFit(this.data.imageWidth, this.data.imageHeight)
}
this.setData({ doubleTapCount: 0, doubleTapTimeout: null })
}
},
// 处理触摸开始事件
handleTouchStart(e) {
// 清除双击计时器
if (this.data.doubleTapTimeout) {
clearTimeout(this.data.doubleTapTimeout)
this.setData({ doubleTapTimeout: null, doubleTapCount: 0 })
}
// 双指触摸时计算距离
if (e.touches.length === 2) {
const distance = this.calculateDistance(e.touches[0], e.touches[1])
this.setData({ lastDistance: distance })
} else if (e.touches.length === 1) {
// 单指触摸时记录触摸点 - 使用pageX和pageY而非clientX和clientY
const touch = e.touches[0]
this.setData({
3 months ago
lastTouchPoint: {
pageX: touch.pageX,
pageY: touch.pageY
}
})
}
},
// 处理触摸移动事件
handleTouchMove(e) {
// 小程序中阻止冒泡通过catchtap等方式实现
if (e.touches.length === 2) {
// 双指缩放
const currentDistance = this.calculateDistance(e.touches[0], e.touches[1])
const scaleRatio = currentDistance / this.data.lastDistance
let newScale = this.data.scale * scaleRatio
// 限制缩放范围
newScale = Math.max(this.data.minScale, Math.min(this.data.maxScale, newScale))
this.setData({
scale: newScale,
lastDistance: currentDistance
})
} else if (e.touches.length === 1 && this.data.scale > 1 && this.data.lastTouchPoint) {
// 单指移动(仅在缩放后可移动)
const currentTouch = e.touches[0]
// 使用pageX和pageY而非clientX和clientY
const deltaX = currentTouch.pageX - this.data.lastTouchPoint.pageX
const deltaY = currentTouch.pageY - this.data.lastTouchPoint.pageY
let newOffsetX = this.data.offsetX + deltaX
let newOffsetY = this.data.offsetY + deltaY
// 限制拖动范围
const maxOffsetX = (this.data.imageWidth * this.data.scale - this.data.imageWidth) / 2
const maxOffsetY = (this.data.imageHeight * this.data.scale - this.data.imageHeight) / 2
newOffsetX = Math.max(-maxOffsetX, Math.min(maxOffsetX, newOffsetX))
newOffsetY = Math.max(-maxOffsetY, Math.min(maxOffsetY, newOffsetY))
this.setData({
offsetX: newOffsetX,
offsetY: newOffsetY,
lastTouchPoint: {
pageX: currentTouch.pageX,
pageY: currentTouch.pageY
}
})
}
},
// 处理触摸结束事件
handleTouchEnd() {
// 重置触摸点和距离
this.setData({
lastTouchPoint: null,
lastDistance: 0
})
},
// 重置缩放
resetZoom() {
this.setData({
scale: 1,
offsetX: 0,
offsetY: 0
})
},
// 计算两点之间的距离
calculateDistance(touch1, touch2) {
// 在小程序中使用pageX和pageY而非clientX和clientY
const dx = touch1.pageX - touch2.pageX
const dy = touch1.pageY - touch2.pageY
return Math.sqrt(dx * dx + dy * dy)
},
// 缩放图片以适应屏幕
zoomToFit(imageWidth, imageHeight) {
// 假设屏幕宽度为375px
const screenWidth = 375
let newScale = 2
3 months ago
this.setData({ scale: newScale })
},
// 图片加载完成事件
onPreviewImageLoad(e) {
this.setData({
imageWidth: e.detail.width,
imageHeight: e.detail.height
})
},
// 图片加载失败处理 - 增强版
imageError(e) {
const url = e.currentTarget.dataset.src || '未知URL';
const errMsg = e.detail.errMsg || '未知错误';
console.error(`图片加载失败 [${errMsg}]: ${url}`);
// 尝试使用占位图替代
const target = e.currentTarget;
try {
// 在实际运行中,小程序会自动使用fallback-src
// 这里添加日志记录以便追踪
console.log(`为失败图片设置占位图: ${url}`);
} catch (err) {
console.error('设置占位图时出错:', err);
}
// 记录失败的URL到本地,便于调试
try {
const failedUrls = wx.getStorageSync('imageLoadFailures') || [];
if (!failedUrls.includes(url)) {
failedUrls.push({ url, time: new Date().toISOString(), error: errMsg });
// 只保留最近20条记录
if (failedUrls.length > 20) {
failedUrls.shift();
}
wx.setStorageSync('imageLoadFailures', failedUrls);
}
} catch (storageErr) {
console.error('存储失败URL时出错:', storageErr);
}
},
// 图片加载成功处理 - 增强版
imageLoad(e) {
const url = e.currentTarget.dataset.src;
const width = e.detail.width;
const height = e.detail.height;
console.log(`图片加载成功: ${url} (${width}x${height})`);
// 可以在这里添加图片统计逻辑
try {
const successCount = wx.getStorageSync('imageLoadSuccessCount') || 0;
wx.setStorageSync('imageLoadSuccessCount', successCount + 1);
} catch (storageErr) {
console.error('存储成功计数时出错:', storageErr);
}
},
// 显示编辑弹窗 - 修复版
showEditSupply(e, isPublishOperation = false) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 确保图片预览弹窗关闭
this.setData({
showImagePreview: false
});
const id = e.currentTarget.dataset.id;
console.log('显示编辑弹窗,货源ID:', id, '是否上架操作:', isPublishOperation);
if (!id) {
console.error('显示编辑弹窗失败:缺少货源ID');
wx.showToast({ title: '操作失败,缺少货源信息', icon: 'none', duration: 2000 });
return;
}
// 在所有货源列表中查找
let supply = null;
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies
];
supply = allSupplies.find(s => s.id === id);
// 如果没找到,尝试在主列表中查找
if (!supply) {
supply = this.data.supplies.find(s => s.id === id);
}
// 安全检查:确保supply存在
if (!supply) {
console.error('未找到ID为', id, '的货源');
wx.showToast({ title: '未找到该货源', icon: 'none', duration: 2000 });
this.setData({ showEditModal: false });
// 确保页面滚动状态正常
this.enablePageScroll();
this.loadSupplies();
return;
}
// 计算蛋黄和规格的索引值
const yolkIndex = this.data.yolkOptions.indexOf(supply.yolk) >= 0 ? this.data.yolkOptions.indexOf(supply.yolk) : 0;
const specIndex = this.data.specOptions.indexOf(supply.spec) >= 0 ? this.data.specOptions.indexOf(supply.spec) : 0;
3 months ago
// 设置编辑货源数据,显示编辑弹窗
const supplyWithFormattedTime = {
...supply,
formattedCreatedAt: this.formatCreateTime(supply.created_at),
region: supply.region || '', // 【新增】确保地区字段存在
yolkIndex: yolkIndex,
specIndex: specIndex
};
// 解析地区字符串为省市区数组,用于初始化三级下拉框
let editSupplyRegionArray = [];
if (supply.region) {
// 尝试将地区字符串拆分为省市区数组
// 假设地区格式为 "省份 城市 区县"
editSupplyRegionArray = supply.region.split(' ').filter(item => item.trim() !== '');
}
3 months ago
console.log('【调试】编辑弹窗数据设置:', {
supplyRegion: supply.region,
editSupplyRegion: supplyWithFormattedTime.region,
editSupplyRegionArray: editSupplyRegionArray
3 months ago
});
// 如果是上架操作,设置自动上架标志
if (isPublishOperation) {
this.setData({
autoPublishAfterEdit: true
});
console.log('设置编辑后自动上架标志为true');
} else {
this.setData({
autoPublishAfterEdit: false
});
console.log('设置编辑后自动上架标志为false');
}
this.setData({
editSupply: supplyWithFormattedTime,
editSupplyRegionArray: editSupplyRegionArray,
3 months ago
showEditModal: true
});
// 锁定页面滚动
this.disablePageScroll();
// 显示提示信息
wx.showToast({
title: '请编辑信息后点击提交',
icon: 'none',
duration: 2000
});
},
// 上架货源 - 移除本地存储操作
publishSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 确保图片预览弹窗关闭
this.setData({
showImagePreview: false
});
// 登录验证
const userId = wx.getStorageSync('userId');
const openid = wx.getStorageSync('openid');
const userInfo = wx.getStorageSync('userInfo');
if (!userId || !openid || !userInfo) {
wx.showModal({
title: '提示',
content: '请先登录再进行商品上架操作',
showCancel: false,
success: (res) => {
if (res.confirm) {
this.setData({ showAuthModal: true });
}
}
3 months ago
});
return;
}
// 检查用户合作状态
API.getUserInfo(openid)
.then(response => {
const userInfo = response.data;
if (userInfo.partnerstatus !== 'approved') {
wx.hideLoading();
this.enablePageScroll();
wx.showModal({
title: '权限不足',
content: '您的合作状态尚未通过审核,暂时无法进行商品上架操作',
showCancel: true,
cancelText: '取消',
confirmText: '立即入驻',
success: (res) => {
if (res.confirm) {
// 跳转到入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
})
}
}
});
return;
}
const id = e.currentTarget.dataset.id
// 优先使用编辑中的商品数据
let supply = null
// 检查是否存在编辑中的数据
if (this.data.editSupply && this.data.editSupply.id === id) {
supply = { ...this.data.editSupply };
} else {
// 否则从supplies中查找
supply = this.data.supplies.find(s => s.id === id)
}
3 months ago
if (!supply) {
wx.hideLoading();
this.enablePageScroll();
wx.showToast({
title: '货源信息不存在',
icon: 'none',
duration: 2000
});
return;
}
wx.showLoading({ title: '处理中...', mask: true });
// 判断当前货源状态,决定设置什么状态
// 重新提交的商品应该先进入审核中
let newStatus = 'pending_review'; // 默认审核中
if (supply.status === 'reviewed') {
newStatus = 'published'; // 已审核通过的货源可以直接上架
}
3 months ago
// 同步数据到服务器数据库
// 仅当有serverProductId时才同步到服务器
if (supply.serverProductId) {
const openid = wx.getStorageSync('openid');
if (openid) {
// 审核失败、隐藏、审核中或下架的货源重新提交时,调用编辑接口同步商品内容和状态
if (supply.status === 'rejected' || supply.status === 'hidden' || supply.status === 'pending_review' || supply.status === 'sold_out') {
console.log('审核失败、隐藏、审核中或下架货源重新提交,同步商品内容和状态到服务器');
// 准备商品数据,转换为服务器需要的格式
const productData = {
openid: openid,
productId: supply.serverProductId,
product: {
productName: supply.name,
price: supply.price,
quantity: supply.minOrder,
grossWeight: supply.grossWeight || "",
yolk: supply.yolk,
specification: supply.spec,
resubmit: true // 关键参数:告诉服务器这是重新提交审核
},
status: newStatus // 明确传递状态参数,确保变为审核中状态
};
3 months ago
console.log('准备发送商品编辑请求 - URL:', API.BASE_URL + '/api/product/edit');
console.log('准备发送的商品数据:', productData);
// 调用编辑商品接口,该接口会自动设置状态为pending_review
wx.request({
url: API.BASE_URL + '/api/product/edit',
method: 'POST',
data: productData,
success: (res) => {
console.log('商品内容和状态同步成功:', res);
// 重新加载数据以更新UI
this.loadSupplies();
},
fail: (err) => {
console.error('商品内容和状态同步失败:', err);
// 重新加载数据以更新UI
this.loadSupplies();
},
complete: () => {
// 确保在请求完成后隐藏loading并显示提示
try {
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: newStatus === 'published' ? '上架成功' : '重新提交成功,等待审核',
duration: 2000
});
} catch (e) {
console.error('显示提示时出错:', e);
// 确保即使在错误情况下也隐藏loading并恢复滚动
try {
wx.hideLoading();
this.enablePageScroll();
} catch (innerErr) {
console.error('隐藏loading时出错:', innerErr);
}
}
3 months ago
}
});
return; // 异步操作,稍后再继续执行
} else {
// 其他情况只更新状态
wx.request({
url: API.BASE_URL + '/api/product/review',
method: 'POST',
data: {
openid: openid,
productId: supply.serverProductId,
status: newStatus
},
success: () => {
this.loadSupplies();
},
fail: (err) => {
console.error('更新状态失败:', err);
this.loadSupplies();
},
complete: () => {
try {
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: newStatus === 'published' ? '上架成功' : '重新提交成功,等待审核',
duration: 2000
});
} catch (e) {
console.error('显示提示时出错:', e);
// 确保即使在错误情况下也隐藏loading并恢复滚动
try {
wx.hideLoading();
this.enablePageScroll();
} catch (innerErr) {
console.error('隐藏loading时出错:', innerErr);
}
}
3 months ago
}
});
return; // 异步操作,稍后再继续执行
3 months ago
}
} else {
// 没有openid时的处理
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: '登录状态异常,请重新登录',
icon: 'none',
duration: 2000
});
}
} else {
// 如果没有serverProductId,提示用户
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: '无法上架,商品未上传到服务器',
icon: 'none',
duration: 2000
3 months ago
});
}
})
.catch(err => {
console.error('获取用户信息失败:', err);
3 months ago
wx.hideLoading();
this.enablePageScroll();
wx.showToast({
title: '获取用户信息失败',
3 months ago
icon: 'none',
duration: 2000
});
});
},
// 下架货源 - 移除本地存储操作
unpublishSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
const supplyId = e.currentTarget.dataset.id;
console.log('下架商品 - ID:', supplyId);
console.log('当前商品列表长度:', this.data.supplies.length);
console.log('当前已上架商品列表长度:', this.data.publishedSupplies.length);
// 查找对应商品
let supply = this.data.supplies.find(s => s.id === supplyId);
// 如果在主列表中找不到,尝试在已上架商品列表中查找
if (!supply) {
supply = this.data.publishedSupplies.find(s => s.id === supplyId);
console.log('在已上架列表中查找结果:', supply ? '找到' : '未找到');
}
// 如果仍然找不到商品,尝试直接使用传入的ID下架(容错处理)
if (!supply) {
console.warn('未在本地列表中找到商品,但尝试直接下架:', supplyId);
// 禁用页面滚动
this.disablePageScroll();
wx.showLoading({ title: '下架中...', mask: true });
// 直接使用传入的ID尝试下架
API.hideProduct(supplyId)
.then(res => {
console.log('直接下架成功:', res);
wx.hideLoading();
this.enablePageScroll();
wx.showToast({ title: '已下架', icon: 'success', duration: 2000 });
// 清理购物车并重新加载列表
this.cleanUnpublishedFromAllCarts(supplyId);
setTimeout(() => {
this.loadSupplies();
}, 100);
})
.catch(err => {
console.error('直接下架失败:', err);
wx.hideLoading();
this.enablePageScroll();
wx.showToast({ title: '下架失败,请重试', icon: 'none', duration: 2000 });
});
return;
}
// 检查是否有serverProductId,只有上传到服务器的商品才能下架
if (!supply.serverProductId) {
// 没有serverProductId,提示用户
wx.showToast({ title: '无法下架,商品未上传到服务器', icon: 'none', duration: 2000 });
return;
}
// 禁用页面滚动
this.disablePageScroll();
wx.showLoading({ title: '下架中...', mask: true });
// 调用API下架商品
API.hideProduct(supply.serverProductId)
.then(res => {
console.log('服务器下架成功:', res);
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({ title: '已下架', icon: 'success', duration: 2000 });
// 清理所有用户购物车中已下架的商品
this.cleanUnpublishedFromAllCarts(supply.serverProductId);
// 只需要调用一次loadSupplies
setTimeout(() => {
this.loadSupplies();
}, 100);
})
.catch(err => {
console.error('服务器下架失败:', err);
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({ title: '服务器同步失败,请重试', icon: 'none', duration: 3000 });
// 只需要调用一次loadSupplies
setTimeout(() => {
this.loadSupplies();
}, 100);
});
},
// 清理所有用户购物车中已下架的商品 - 移除本地存储操作
cleanUnpublishedFromAllCarts(supplyId) {
try {
console.log('开始清理购物车中的已下架商品:', supplyId)
// 直接通知服务器清理购物车
setTimeout(() => {
API.removeFromAllCarts(supplyId)
.then(res => {
console.log('清理所有购物车中的已下架商品完成:', res)
})
.catch(err => {
console.error('清理服务器购物车失败:', err)
})
}, 0);
} catch (error) {
console.error('清理购物车过程中发生错误:', error)
}
},
// 删除货源(软删除:只在服务器标记为隐藏)
deleteSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 确保图片预览弹窗关闭
this.setData({
showImagePreview: false
});
const id = e.currentTarget.dataset.id
const supply = this.data.supplies.find(s => s.id === id)
if (!supply) {
wx.showToast({ title: '货源不存在', icon: 'none', duration: 2000 })
return
}
// 显示确认弹窗
wx.showModal({
title: '确认删除',
content: '确定要删除该货源吗?删除后将不再显示,但数据会保留。',
success: (res) => {
if (res.confirm) {
wx.showLoading({ title: '删除中...' })
// 确保使用正确的productId格式
let productIdToHide;
// 将id转换为字符串,避免startsWith调用错误
const idStr = String(id);
if (supply.serverProductId) {
productIdToHide = supply.serverProductId;
console.log('使用服务器返回的productId:', productIdToHide);
} else if (idStr.startsWith('product_')) {
productIdToHide = id;
console.log('使用已有的product_前缀ID:', productIdToHide);
} else {
// 如果本地ID不是以product_开头,尝试直接使用
productIdToHide = id;
console.log('使用本地ID作为productId:', productIdToHide);
}
API.deleteProduct(productIdToHide).then(() => {
console.log('服务器标记商品为隐藏成功:', productIdToHide)
wx.hideLoading()
wx.showToast({
title: '删除成功',
icon: 'success',
duration: 2000
})
// 手动加载数据更新UI
this.loadSupplies()
}).catch(error => {
console.error('服务器标记商品为隐藏失败:', error);
console.error('错误详情:', JSON.stringify(error));
wx.hideLoading()
// 手动加载数据更新UI
this.loadSupplies()
// 提供更详细的错误信息
let errorMsg = '服务器操作失败';
if (error.message && error.message.includes('连接失败')) {
errorMsg = '无法连接服务器,请检查网络连接后重试';
} else if (error.message && error.message.includes('商品不存在')) {
errorMsg = '该商品在服务器上可能已不存在';
}
wx.showToast({
title: errorMsg,
icon: 'none',
duration: 3000
})
})
}
}
})
},
// 格式化创建时间为 年/月/日 时:分 格式
formatCreateTime: function (timeValue) {
// 添加详细日志记录传入的参数
console.log('formatCreateTime - 输入值:', timeValue, '类型:', typeof timeValue);
if (!timeValue) {
console.log('formatCreateTime - 输入为空,返回"无"');
return '无';
}
try {
// 首先尝试直接创建Date对象
let date = new Date(timeValue);
// 如果日期无效,且输入是字符串,尝试将其转换为数字,再创建Date对象
if (isNaN(date.getTime()) && typeof timeValue === 'string') {
console.log('formatCreateTime - 尝试将字符串转换为数字');
const numericTime = Number(timeValue);
// 只有当转换后的数字不是NaN时才使用新的Date对象
if (!isNaN(numericTime)) {
date = new Date(numericTime);
}
}
console.log('formatCreateTime - Date对象:', date, '时间戳:', date.getTime());
// 检查日期是否有效
if (isNaN(date.getTime())) {
console.log('formatCreateTime - 日期无效,返回"无"');
return '无';
}
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const formattedTime = `${year}/${month}/${day} ${hours}:${minutes}`;
console.log('formatCreateTime - 格式化结果:', formattedTime);
return formattedTime;
} catch (error) {
console.error('时间格式化错误:', error);
return '无';
}
},
// 格式化时间为北京时间(UTC+8)并转换为 年-月-日-时:分 格式
formatTimeToBeijing: function (timeValue) {
if (!timeValue) {
return '无';
}
try {
// 创建Date对象
const date = new Date(timeValue);
// 检查日期是否有效
if (isNaN(date.getTime())) {
return '无';
}
// 使用Date对象的方法直接获取UTC时间,然后加8小时计算北京时间
const utcYear = date.getUTCFullYear();
const utcMonth = date.getUTCMonth();
const utcDate = date.getUTCDate();
const utcHours = date.getUTCHours() + 8; // 直接加8小时
// 创建北京时间Date对象
const beijingTime = new Date(Date.UTC(utcYear, utcMonth, utcDate, utcHours, date.getUTCMinutes()));
// 格式化时间,使用连字符分隔
const year = beijingTime.getFullYear();
const month = (beijingTime.getMonth() + 1).toString().padStart(2, '0');
const day = beijingTime.getDate().toString().padStart(2, '0');
const hours = beijingTime.getHours().toString().padStart(2, '0');
const minutes = beijingTime.getMinutes().toString().padStart(2, '0');
// 返回格式:年-月-日-时:分
return `${year}-${month}-${day}-${hours}:${minutes}`;
} catch (error) {
console.error('北京时间格式化错误:', error);
return '无';
}
},
// 显示审核失败原因弹窗
showRejectReason: function (e) {
// 阻止事件冒泡
if (e && e.stopPropagation) {
e.stopPropagation();
}
const id = e.currentTarget.dataset.id;
console.log('显示审核失败原因,货源ID:', id);
// 在所有货源列表中查找
let supply = null;
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies
];
supply = allSupplies.find(s => s.id === id);
// 如果没找到,尝试在主列表中查找
if (!supply) {
supply = this.data.supplies.find(s => s.id === id);
}
if (!supply) {
console.error('未找到ID为', id, '的货源');
wx.showToast({ title: '未找到该货源', icon: 'none', duration: 2000 });
return;
}
console.log('找到货源信息:', supply);
// 锁定页面滚动
this.disablePageScroll();
// 设置当前显示的货源和失败原因
this.setData({
currentRejectSupply: supply,
rejectReason: supply.rejectReason || '暂无详细的审核失败原因,请联系客服了解详情。',
showRejectReasonModal: true
});
},
// 关闭审核失败原因弹窗
closeRejectReasonModal: function () {
console.log('关闭审核失败原因弹窗');
this.setData({
showRejectReasonModal: false
// 注意:这里不立即清空 currentRejectSupply,确保后续操作能使用
});
},
3 months ago
// 打开规格选择弹窗
openSpecSelectModal: function (e) {
const mode = e.currentTarget.dataset.mode || 'create';
const currentSpec = mode === 'create' ? this.data.newSupply.spec : this.data.editSupply.spec;
const specOptions = this.data.specOptions;
let selectedIndex = -1;
3 months ago
// 查找当前选中规格的索引
if (currentSpec) {
selectedIndex = specOptions.indexOf(currentSpec);
}
3 months ago
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
3 months ago
this.setData({
showSpecSelectModal: true,
currentSpecMode: mode,
modalSpecSearchKeyword: '',
filteredModalSpecOptions: specOptions,
selectedModalSpecIndex: selectedIndex,
showTabBar: false // 隐藏底部tab-bar
});
},
3 months ago
// 关闭规格选择弹窗
closeSpecSelectModal: function () {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
3 months ago
this.setData({
showSpecSelectModal: false,
modalSpecSearchKeyword: '',
selectedModalSpecIndex: -1,
showTabBar: true // 显示底部tab-bar
});
},
3 months ago
// 弹窗中规格搜索输入
onModalSpecSearchInput: function (e) {
const keyword = e.detail.value;
const specOptions = this.data.specOptions;
let filteredOptions = specOptions;
3 months ago
if (keyword) {
filteredOptions = specOptions.filter(option => {
return option.toLowerCase().includes(keyword.toLowerCase());
});
}
3 months ago
this.setData({
modalSpecSearchKeyword: keyword,
filteredModalSpecOptions: filteredOptions,
selectedModalSpecIndex: -1 // 搜索时重置选择
});
},
3 months ago
// 清除弹窗中的规格搜索关键词
clearModalSpecSearch: function () {
this.setData({
modalSpecSearchKeyword: '',
filteredModalSpecOptions: this.data.specOptions,
selectedModalSpecIndex: -1
});
},
// 双击检测变量
lastTapTime: {},
tapCount: {},
// 通用双击检测函数
handleDoubleTap: function (e, type, callback) {
const currentTime = Date.now();
const tapKey = `${type}-${e.currentTarget.dataset.index}`;
const lastTap = this.lastTapTime[tapKey] || 0;
const tapInterval = currentTime - lastTap;
if (tapInterval < 300 && tapInterval > 0) {
// 双击事件触发,执行确认选择
callback();
} else {
// 单击事件触发,执行选择操作
this.lastTapTime[tapKey] = currentTime;
setTimeout(() => {
delete this.lastTapTime[tapKey];
}, 300);
}
},
3 months ago
// 弹窗中选择规格
onModalSpecSelect: function (e) {
const index = e.currentTarget.dataset.index;
const selectedSpec = this.data.filteredModalSpecOptions[index];
this.setData({
selectedModalSpecIndex: index,
modalSpecSearchKeyword: selectedSpec // 自动填充搜索框为当前选择的规格
});
// 检测双击
this.handleDoubleTap(e, 'spec', () => {
this.confirmSpecSelection();
});
3 months ago
},
3 months ago
// 确认规格选择
confirmSpecSelection: function () {
if (this.data.selectedModalSpecIndex === -1) {
wx.showToast({
title: '请选择规格',
icon: 'none'
});
return;
}
3 months ago
const selectedSpec = this.data.filteredModalSpecOptions[this.data.selectedModalSpecIndex];
const specOptions = this.data.specOptions;
const originalIndex = specOptions.indexOf(selectedSpec);
3 months ago
// 根据当前模式更新对应的规格信息
if (this.data.currentSpecMode === 'create') {
const newSupply = this.data.newSupply;
newSupply.spec = selectedSpec;
newSupply.specIndex = originalIndex;
3 months ago
this.setData({
newSupply: newSupply
3 months ago
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
} else if (this.data.currentSpecMode === 'edit') {
this.setData({
'editSupply.spec': selectedSpec,
'editSupply.specIndex': originalIndex
});
}
3 months ago
// 关闭弹窗
this.closeSpecSelectModal();
3 months ago
// 恢复页面滚动
this.enablePageScroll();
// 延迟清空数据,确保操作完成
setTimeout(() => {
this.setData({
currentRejectSupply: null,
rejectReason: ''
});
}, 500);
},
// 编辑审核失败的货源
editRejectedSupply: function () {
// 先保存当前货源数据,再关闭弹窗
const currentRejectSupply = this.data.currentRejectSupply;
if (!currentRejectSupply || !currentRejectSupply.id) {
wx.showToast({ title: '货源信息不存在', icon: 'none', duration: 2000 });
return;
}
// 关闭失败原因弹窗
this.closeRejectReasonModal();
// 延迟一小段时间确保弹窗完全关闭
setTimeout(() => {
// 模拟点击编辑按钮的事件对象
const mockEvent = {
stopPropagation: function () { },
currentTarget: {
dataset: {
id: currentRejectSupply.id
}
}
};
// 调用显示编辑弹窗的方法
this.showEditSupply(mockEvent);
}, 100);
},
// 重新提交审核失败的货源
resubmitRejectedSupply: function () {
// 先保存当前货源数据,再关闭弹窗
const currentRejectSupply = this.data.currentRejectSupply;
if (!currentRejectSupply || !currentRejectSupply.id) {
wx.showToast({ title: '货源信息不存在', icon: 'none', duration: 2000 });
return;
}
// 关闭失败原因弹窗
this.closeRejectReasonModal();
// 延迟一小段时间确保弹窗完全关闭
setTimeout(() => {
// 模拟点击上架按钮的事件对象
const mockEvent = {
stopPropagation: function () { },
currentTarget: {
dataset: {
id: currentRejectSupply.id
}
}
};
// 设置自动上架标志
this.setData({ autoPublishAfterEdit: true });
// 调用上架方法
this.preparePublishSupply(mockEvent);
}, 100);
},
// 选择图片方法 - 修复添加照片功能
chooseImage: function (e) {
const type = e.currentTarget.dataset.type; // 获取操作类型:new或edit
let currentImages = [];
// 根据类型获取当前已选择的图片列表
if (type === 'new') {
currentImages = this.data.newSupply.imageUrls || [];
} else {
currentImages = this.data.editSupply.imageUrls || [];
}
// 计算还能选择的图片数量
const maxCount = 5 - currentImages.length;
if (maxCount <= 0) {
wx.showToast({
title: '最多只能上传5张图片',
icon: 'none',
duration: 2000
});
return;
}
// 调用微信小程序的图片选择API
wx.chooseImage({
count: maxCount,
sizeType: ['compressed'], // 压缩图片以减小尺寸
sourceType: ['album', 'camera'], // 可以从相册选择或拍照
success: (res) => {
// 获取选择的图片临时文件路径
const tempFilePaths = res.tempFilePaths;
// 合并已选择的图片和新选择的图片
const updatedImages = [...currentImages, ...tempFilePaths];
// 根据类型更新数据
if (type === 'new') {
const newSupply = this.data.newSupply;
newSupply.imageUrls = updatedImages;
3 months ago
this.setData({
newSupply: newSupply
3 months ago
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
} else {
this.setData({
'editSupply.imageUrls': updatedImages
});
}
console.log(`成功选择了${tempFilePaths.length}张图片,当前共${updatedImages.length}`);
},
fail: (err) => {
console.error('选择图片失败:', err);
if (err.errMsg !== 'chooseImage:fail cancel') { // 排除用户主动取消的情况
wx.showToast({
title: '选择图片失败,请重试',
icon: 'none',
duration: 2000
});
}
}
});
},
// 格式化创建时间
formatCreateTime: function (timeValue) {
console.log('formatCreateTime - 输入值:', timeValue, '类型:', typeof timeValue);
if (!timeValue) {
console.log('formatCreateTime - 输入为空,返回"无"');
return '无';
}
try {
// 处理 ISO 8601 格式的字符串 (如: 2025-10-20T08:21:06.000Z)
let date;
if (typeof timeValue === 'string') {
// 直接使用 ISO 字符串创建 Date 对象
date = new Date(timeValue);
// 如果日期无效,尝试其他解析方式
if (isNaN(date.getTime())) {
// 尝试移除可能的额外字符
const cleanTime = timeValue.replace(/[^\d\-T:.]/g, '');
date = new Date(cleanTime);
}
} else if (typeof timeValue === 'number') {
// 如果是时间戳
date = new Date(timeValue);
} else {
// 其他情况尝试直接创建
date = new Date(timeValue);
}
console.log('formatCreateTime - 解析后的Date对象:', date);
// 检查日期是否有效
if (isNaN(date.getTime())) {
console.log('formatCreateTime - 日期无效,返回"无"');
return '无';
}
// 获取本地时间(考虑时区)
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const formattedTime = `${year}/${month}/${day} ${hours}:${minutes}`;
console.log('formatCreateTime - 格式化结果:', formattedTime);
return formattedTime;
} catch (error) {
console.error('时间格式化错误:', error);
return timeValue; // 出错时返回原始值
}
},
/**
* 删除图片
*/
deleteImage: function (e) {
const index = e.currentTarget.dataset.index;
const type = e.currentTarget.dataset.type || 'new'; // 默认处理new类型
if (type === 'new') {
const newSupply = this.data.newSupply;
const imageUrls = newSupply.imageUrls;
3 months ago
imageUrls.splice(index, 1);
newSupply.imageUrls = imageUrls;
3 months ago
this.setData({
newSupply: newSupply
3 months ago
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
} else {
const imageUrls = this.data.editSupply.imageUrls;
imageUrls.splice(index, 1);
this.setData({
'editSupply.imageUrls': imageUrls
});
}
console.log(`成功删除${type}类型第${index}张图片`);
},
/**
* iOS设备检测
*/
isIOS() {
const systemInfo = wx.getSystemInfoSync()
return systemInfo.platform === 'ios'
},
/**
* 阻止触摸移动事件iOS专用
*/
blockTouchMove() {
// 添加全局触摸事件监听器
this.touchMoveHandler = (e) => {
e.preventDefault()
e.stopPropagation()
}
// 在页面根元素上阻止触摸移动
this.setData({
touchMoveBlocked: true
})
},
/**
* 恢复触摸移动事件iOS专用
*/
unblockTouchMove() {
this.touchMoveHandler = null
// 移除触摸事件阻止
this.setData({
touchMoveBlocked: false
})
},
// 处理创建货源弹窗中的规格搜索输入
onSpecSearchInput(e) {
const keyword = e.detail.value.toLowerCase().trim();
this.setData({
specSearchKeyword: keyword
});
// 过滤规格选项
this.filterSpecOptions(keyword, 'create');
},
// 处理编辑货源弹窗中的规格搜索输入
onEditSpecSearchInput(e) {
const keyword = e.detail.value.toLowerCase().trim();
this.setData({
editSpecSearchKeyword: keyword
});
// 过滤规格选项
this.filterSpecOptions(keyword, 'edit');
},
// 过滤规格选项的通用函数
filterSpecOptions(keyword, type) {
const specOptions = this.data.specOptions;
let filteredOptions = specOptions;
3 months ago
if (keyword) {
filteredOptions = specOptions.filter(option => {
return option.toLowerCase().includes(keyword);
});
3 months ago
// 如果有匹配的规格选项,自动填充第一个匹配项
if (filteredOptions.length > 0) {
if (type === 'create') {
const firstMatchIndex = specOptions.indexOf(filteredOptions[0]);
this.setData({
'newSupply.spec': filteredOptions[0],
'newSupply.specIndex': firstMatchIndex
});
} else if (type === 'edit') {
const firstMatchIndex = specOptions.indexOf(filteredOptions[0]);
this.setData({
'editSupply.spec': filteredOptions[0],
'editSupply.specIndex': firstMatchIndex
});
}
}
} else {
// 当关键词为空时,重置规格选择
if (type === 'create') {
this.setData({
'newSupply.spec': '',
'newSupply.specIndex': 0
});
} else if (type === 'edit') {
this.setData({
'editSupply.spec': '',
'editSupply.specIndex': 0
});
}
}
3 months ago
if (type === 'create') {
this.setData({
filteredSpecOptions: filteredOptions
});
} else if (type === 'edit') {
this.setData({
filteredEditSpecOptions: filteredOptions
});
}
},
// 清除规格搜索关键词
clearSpecSearch() {
this.setData({
specSearchKeyword: '',
filteredSpecOptions: this.data.specOptions,
'newSupply.spec': '', // 重置规格选择
'newSupply.specIndex': 0 // 重置规格索引
});
},
// 清除编辑弹窗中的规格搜索关键词
clearEditSpecSearch() {
this.setData({
editSpecSearchKeyword: '',
filteredEditSpecOptions: this.data.specOptions,
'editSupply.spec': '', // 重置规格选择
'editSupply.specIndex': 0 // 重置规格索引
});
},
// 打开创建货源的地区选择弹窗
openCreateRegionModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
// 重置三级联动选择和搜索
this.setData({
currentRegionMode: 'create',
regionSearchKeyword: '',
editRegionSearchKeyword: '',
filteredRegionOptions: [],
showSearchResults: false,
selectedProvinceIndex: 0,
selectedCityIndex: 0,
selectedDistrictIndex: 0,
currentCities: this.data.regionOptions[0].cities,
currentDistricts: this.data.regionOptions[0].cities[0].districts,
showRegionSelectModal: true,
showTabBar: false // 隐藏底部tab-bar
});
},
// 打开编辑货源的地区选择弹窗
openEditRegionModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
// 重置三级联动选择和搜索
this.setData({
currentRegionMode: 'edit',
regionSearchKeyword: '',
editRegionSearchKeyword: '',
filteredRegionOptions: [],
showSearchResults: false,
selectedProvinceIndex: 0,
selectedCityIndex: 0,
selectedDistrictIndex: 0,
currentCities: this.data.regionOptions[0].cities,
currentDistricts: this.data.regionOptions[0].cities[0].districts,
showRegionSelectModal: true,
showTabBar: false // 隐藏底部tab-bar
});
},
// 关闭地区选择弹窗
closeRegionModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
this.setData({
showRegionSelectModal: false,
showTabBar: true, // 显示底部tab-bar
showSearchResults: false // 隐藏搜索结果
});
},
// 地区搜索输入处理
onRegionSearchInput(e) {
const keyword = e.detail.value.trim();
const mode = this.data.currentRegionMode;
// 更新搜索关键词
this.setData({
[mode === 'create' ? 'regionSearchKeyword' : 'editRegionSearchKeyword']: keyword
});
// 过滤地区选项
this.filterRegionOptions(keyword);
},
// 地区搜索框聚焦
onRegionSearchFocus() {
this.setData({
showSearchResults: true
});
},
// 清除地区搜索
clearRegionSearch() {
const mode = this.data.currentRegionMode;
this.setData({
[mode === 'create' ? 'regionSearchKeyword' : 'editRegionSearchKeyword']: '',
filteredRegionOptions: [],
showSearchResults: false
});
},
// 过滤地区选项
filterRegionOptions(keyword) {
if (!keyword) {
this.setData({
filteredRegionOptions: []
});
return;
}
const regionOptions = this.data.regionOptions;
const filtered = [];
// 遍历所有省市区进行匹配
regionOptions.forEach((province, provinceIndex) => {
// 匹配省份
if (province.name.includes(keyword)) {
filtered.push({
region: province.name,
provinceIndex,
cityIndex: 0,
districtIndex: 0
});
}
// 匹配城市
province.cities.forEach((city, cityIndex) => {
const fullCityName = `${province.name} ${city.name}`;
if (city.name.includes(keyword) || fullCityName.includes(keyword)) {
filtered.push({
region: fullCityName,
provinceIndex,
cityIndex,
districtIndex: 0
});
}
// 匹配区县
city.districts.forEach((district, districtIndex) => {
const fullRegionName = `${province.name} ${city.name} ${district}`;
if (district.includes(keyword) || fullRegionName.includes(keyword)) {
filtered.push({
region: fullRegionName,
provinceIndex,
cityIndex,
districtIndex
});
}
});
});
});
this.setData({
filteredRegionOptions: filtered
});
},
// 选择搜索结果
selectSearchRegion(e) {
const { region, provinceIndex, cityIndex, districtIndex } = e.currentTarget.dataset;
// 更新三级联动选择状态
const province = this.data.regionOptions[provinceIndex];
const city = province.cities[cityIndex];
this.setData({
selectedProvinceIndex: parseInt(provinceIndex),
selectedCityIndex: parseInt(cityIndex),
selectedDistrictIndex: parseInt(districtIndex),
currentCities: province.cities,
currentDistricts: city.districts,
showSearchResults: false // 隐藏搜索结果
});
},
// 处理省份选择变化
onProvinceChange(e) {
const index = e.detail.value;
const province = this.data.regionOptions[index];
this.setData({
selectedProvinceIndex: index,
selectedCityIndex: 0,
selectedDistrictIndex: 0,
currentCities: province.cities,
currentDistricts: province.cities[0].districts
});
},
// 处理城市选择变化
onCityChange(e) {
const index = e.detail.value;
const cities = this.data.currentCities;
const province = this.data.regionOptions[this.data.selectedProvinceIndex];
this.setData({
selectedCityIndex: index,
selectedDistrictIndex: 0,
currentDistricts: province.cities[index].districts
});
},
// 处理地区选择变化
onDistrictChange(e) {
this.setData({
selectedDistrictIndex: e.detail.value
});
},
// 处理三级联动选择器变化
onRegionChange(e) {
const value = e.detail.value;
const provinceIndex = value[0];
const cityIndex = value[1];
const districtIndex = value[2];
const province = this.data.regionOptions[provinceIndex];
const city = province.cities[cityIndex];
// 更新选择状态
this.setData({
selectedProvinceIndex: provinceIndex,
selectedCityIndex: cityIndex,
selectedDistrictIndex: districtIndex,
currentCities: province.cities,
currentDistricts: city.districts
});
},
// 确认地区选择
confirmRegionSelection() {
const province = this.data.regionOptions[this.data.selectedProvinceIndex];
const city = province.cities[this.data.selectedCityIndex];
const district = city.districts[this.data.selectedDistrictIndex];
// 组合完整的地区信息
const selectedRegion = `${province.name} ${city.name} ${district}`;
const mode = this.data.currentRegionMode;
if (mode === 'create') {
this.setData({
'newSupply.region': selectedRegion
});
} else if (mode === 'edit') {
this.setData({
'editSupply.region': selectedRegion
});
}
this.closeRegionModal();
},
3 months ago
/**
* 阻止触摸移动事件用于WXML绑定
*/
preventTouchMove(e) {
// iOS设备上阻止触摸事件冒泡和默认行为
if (this.isIOS() && this.data.touchMoveBlocked) {
e.preventDefault()
e.stopPropagation()
return false
}
},
/**
* 输入框触摸事件处理防止iOS抖动
*/
onInputTouchStart(e) {
// 阻止输入框触摸事件冒泡到页面
if (this.isIOS()) {
e.stopPropagation()
}
},
/**
* 输入框触摸移动事件处理防止iOS抖动
*/
onInputTouchMove(e) {
// 完全阻止输入框区域的触摸移动事件
if (this.isIOS()) {
e.preventDefault()
e.stopPropagation()
return false
}
},
/**
* 弹窗触摸开始事件处理增强iOS触摸锁定
*/
onModalTouchStart(e) {
// 在iOS设备上阻止弹窗区域的触摸事件冒泡到页面
if (this.isIOS()) {
e.stopPropagation()
}
},
/**
* 弹窗触摸移动事件处理增强iOS触摸锁定
*/
onModalTouchMove(e) {
// 完全阻止弹窗区域的触摸移动事件传播到页面
if (this.isIOS()) {
e.preventDefault()
e.stopPropagation()
return false
}
},
3 months ago
// 商品名称选择弹窗相关函数
openNameSelectModal() {
// 设置当前选中的索引
let currentName = '';
if (this.data.showEditModal && this.data.editSupply.name) {
currentName = this.data.editSupply.name;
} else {
currentName = this.data.newSupply.name;
}
const index = currentName ? this.data.productNameOptions.indexOf(currentName) : -1;
3 months ago
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
3 months ago
this.setData({
showNameSelectModal: true,
selectedNameIndex: index >= 0 ? index : -1,
showTabBar: false // 隐藏底部tab-bar
});
},
3 months ago
closeNameSelectModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
3 months ago
this.setData({
showNameSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
},
3 months ago
onNameSelect(e) {
const index = e.currentTarget.dataset.index;
this.setData({
selectedNameIndex: index
});
// 检测双击
this.handleDoubleTap(e, 'name', () => {
this.confirmNameSelection();
});
3 months ago
},
3 months ago
confirmNameSelection() {
if (this.data.selectedNameIndex >= 0) {
const selectedName = this.data.productNameOptions[this.data.selectedNameIndex];
3 months ago
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
3 months ago
// 根据当前是编辑还是创建模式,更新对应的对象
if (this.data.showEditModal) {
this.setData({
'editSupply.name': selectedName,
showNameSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
} else {
const newSupply = this.data.newSupply;
newSupply.name = selectedName;
this.setData({
newSupply: newSupply,
showNameSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
}
}
},
3 months ago
// 蛋黄选择弹窗相关函数
openYolkSelectModal() {
// 设置当前选中的索引
let currentYolk = '';
if (this.data.showEditModal && this.data.editSupply.yolk) {
currentYolk = this.data.editSupply.yolk;
} else {
currentYolk = this.data.newSupply.yolk;
}
const index = currentYolk ? this.data.yolkOptions.indexOf(currentYolk) : -1;
3 months ago
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
3 months ago
this.setData({
showYolkSelectModal: true,
selectedYolkIndex: index >= 0 ? index : -1,
showTabBar: false // 隐藏底部tab-bar
});
},
3 months ago
closeYolkSelectModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
3 months ago
this.setData({
showYolkSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
},
3 months ago
onYolkSelect(e) {
const index = e.currentTarget.dataset.index;
this.setData({
selectedYolkIndex: index
});
// 检测双击
this.handleDoubleTap(e, 'yolk', () => {
this.confirmYolkSelection();
});
3 months ago
},
3 months ago
confirmYolkSelection() {
if (this.data.selectedYolkIndex >= 0) {
const selectedYolk = this.data.yolkOptions[this.data.selectedYolkIndex];
3 months ago
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
3 months ago
// 根据当前是编辑还是创建模式,更新对应的对象
if (this.data.showEditModal) {
this.setData({
'editSupply.yolk': selectedYolk,
'editSupply.yolkIndex': this.data.selectedYolkIndex,
showYolkSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
} else {
const newSupply = this.data.newSupply;
newSupply.yolk = selectedYolk;
newSupply.yolkIndex = this.data.selectedYolkIndex;
this.setData({
newSupply: newSupply,
showYolkSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
}
}
},
// 联系客服
contactCustomerService() {
wx.showModal({
title: '客服电话',
content: '123456',
showCancel: true,
cancelText: '取消',
confirmText: '拨打',
success: (res) => {
if (res.confirm) {
wx.makePhoneCall({
phoneNumber: '123456',
success: () => {
console.log('拨打电话成功');
},
fail: (err) => {
console.error('拨打电话失败', err);
wx.showToast({
title: '拨打电话失败',
icon: 'none'
});
}
});
}
}
});
},
// 入驻申请
applyForSettlement() {
const openid = wx.getStorageSync('openid');
if (openid) {
API.getUserInfo(openid)
.then(response => {
console.log('获取到的用户信息:', response);
const userInfo = response.data;
const partnerstatus = userInfo.partnerstatus || '';
if (partnerstatus === 'approved') {
// 如果已经审核通过,显示提示
wx.showToast({
title: '您已成功入驻',
icon: 'success',
duration: 2000
});
} else if (partnerstatus === 'reviewfailed') {
// 审核失败状态,进入审核失败页面
wx.navigateTo({
url: '/pages/settlement/index'
});
} else {
// 其他状态进入入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
});
}
})
.catch(err => {
console.error('获取用户信息失败:', err);
// 获取失败时,默认进入入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
});
});
} else {
// 未登录时,直接进入入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
});
}
3 months ago
}
})