214 lines
5.4 KiB
JavaScript
214 lines
5.4 KiB
JavaScript
// 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) {
|
|
app.globalData.user = data.data.user
|
|
wx.showToast({ title: '保存成功', icon: 'success' })
|
|
} else {
|
|
wx.showToast({ title: data.msg || '保存失败', icon: 'none' })
|
|
}
|
|
})
|
|
.catch(() => {
|
|
wx.showToast({ title: '网络请求失败', icon: 'none' })
|
|
})
|
|
.finally(() => {
|
|
wx.hideLoading()
|
|
})
|
|
}
|
|
}) |