// pages/mine/addressedit.js const API = require('../../utils/api.js') Page({ data: { addresses: [], editData: { _index: -1, label: '', province: '', city: '', district: '', address: '', postcode: '', isDefault: false }, isEditing: false }, onLoad() { this.initAddressData() }, // 列表初值取自全局用户对象;「我的」页不再持有地址,本页是唯一入口 initAddressData() { const app = getApp() const user = app.globalData.user || {} const addresses = user.addresses || [] this.setData({ // 深拷一份,编辑过程中不污染全局对象,落库成功后才回写 addresses: addresses.map(item => ({ ...item })), isEditing: false, editData: this.emptyEditData() }) }, emptyEditData() { return { _index: -1, label: '', province: '', city: '', district: '', address: '', postcode: '', isDefault: false } }, onAddAddress() { this.setData({ isEditing: true, // 第一条地址自动设为默认,免得多一步勾选 editData: { ...this.emptyEditData(), isDefault: this.data.addresses.length === 0 } }) wx.setNavigationBarTitle({ title: '新增地址' }) }, onEditAddress(e) { const index = e.currentTarget.dataset.index const item = this.data.addresses[index] this.setData({ isEditing: true, editData: { _index: index, label: item.label || '', province: item.province || '', city: item.city || '', district: item.district || '', address: item.address || '', // 本页没有邮编输入项,但要原样带过去,避免编辑一次就把它清掉 postcode: item.postcode || '', isDefault: item.isDefault || false } }) wx.setNavigationBarTitle({ title: '编辑地址' }) }, onBackToList() { this.setData({ isEditing: false, editData: this.emptyEditData() }) wx.setNavigationBarTitle({ title: '邮寄地址' }) }, onDeleteAddress(e) { const index = e.currentTarget.dataset.index wx.showModal({ title: '提示', content: '确定删除该地址吗?', success: (res) => { if (!res.confirm) return const addresses = this.data.addresses.slice() addresses.splice(index, 1) // 删掉的是默认地址时顺位补一个,保证列表里始终有默认 if (addresses.length > 0 && !addresses.some(a => a.isDefault)) { addresses[0].isDefault = true } this.setData({ addresses }) this.persist(addresses) } }) }, onSetDefault(e) { const index = e.currentTarget.dataset.index const addresses = this.data.addresses.map((item, i) => ({ ...item, isDefault: i === index })) this.setData({ addresses }) this.persist(addresses) }, onRegionChange(e) { const region = e.detail.value this.setData({ 'editData.province': region[0] || '', 'editData.city': region[1] || '', 'editData.district': region[2] || '' }) }, onFieldInput(e) { const field = e.currentTarget.dataset.field this.setData({ [`editData.${field}`]: e.detail.value }) }, onDefaultChange(e) { this.setData({ 'editData.isDefault': e.detail.value }) }, onSaveEdit() { const editData = this.data.editData if (!editData.label.trim()) { wx.showToast({ title: '请输入地址标签', icon: 'none' }) return } if (!editData.province || !editData.city || !editData.district) { wx.showToast({ title: '请选择所在地区', icon: 'none' }) return } if (!editData.address.trim()) { wx.showToast({ title: '请输入详细地址', icon: 'none' }) return } const addresses = this.data.addresses.slice() const newItem = { label: editData.label.trim(), province: editData.province, city: editData.city, district: editData.district, address: editData.address.trim(), postcode: editData.postcode.trim(), isDefault: editData.isDefault } if (editData.isDefault) { addresses.forEach(item => { item.isDefault = false }) } if (editData._index >= 0) { addresses[editData._index] = newItem } else { if (addresses.length === 0) { newItem.isDefault = true } addresses.push(newItem) } this.setData({ addresses }) this.onBackToList() this.persist(addresses) }, // 地址是即时生效的(删除 / 设默认 / 表单保存都直接落库), // 成功后回写全局对象:「我的」页与下单页读的都是它 persist(addresses) { const app = getApp() const user = app.globalData.user if (!user || !user._id) { wx.showToast({ title: '请先登录', icon: 'none' }) return } wx.showLoading({ title: '保存中...' }) API.user.update({ _id: user._id, addresses }) .then((data) => { if (data.code === 0) { // 与 profileedit 同一处坑:/user/update 的响应不含 security.token, // 整替会抹掉本机 token,security 必须保留本地那份 app.globalData.user = { ...user, ...data.data.user, security: user.security || {} } wx.showToast({ title: '保存成功', icon: 'success' }) } else { wx.showToast({ title: data.msg || '保存失败', icon: 'none' }) } }) .catch(() => { wx.showToast({ title: '网络请求失败', icon: 'none' }) }) .finally(() => { wx.hideLoading() }) } })