Files
2026-10-07 14:55:06 +08:00

216 lines
5.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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()
})
}
})