小程序-收货地址管理模块实现

页面结构代码:

address-form.vue --->新建地址和修改地址页面

html 复制代码
<template>
  <view class="content">
    <form>
      <!-- 表单内容 -->
      <view class="form-item">
        <text class="label">收货人</text>
        <input class="input" placeholder="请填写收货人姓名" v-model="form.receiver" />
      </view>
      <view class="form-item">
        <text class="label">手机号码</text>
        <input class="input" placeholder="请填写收货人手机号码" v-model="form.contact" />
      </view>
      <view class="form-item">
        <text class="label">所在地区</text>
        <picker
          @change="onRegionChange"
          class="picker"
          mode="region"
          :value="form.fullLocation.split(' ')"
        >
          <view v-if="form.fullLocation">{{ form.fullLocation }}</view>
          <view v-else class="placeholder">请选择省/市/区(县)</view>
        </picker>
      </view>
      <view class="form-item">
        <text class="label">详细地址</text>
        <input class="input" placeholder="街道、楼牌号等信息" v-model="form.address" />
      </view>
      <view class="form-item">
        <label class="label">设为默认地址</label>
        <switch
          @change="onSwitchChange"
          class="switch"
          color="#27ba9b"
          :checked="form.isDefault === 1"
        />
      </view>
    </form>
  </view>
  <!-- 提交按钮 -->
  <button class="button" @tap="onSubmit">保存并使用</button>
</template>

address.vue ---> 地址列表页面

html 复制代码
<template>
  <view class="viewport">
    <!-- 地址列表 -->
    <scroll-view class="scroll-view" scroll-y>
      <view v-if="true" class="address">
        <view class="address-list">
          <!-- 收货地址项 -->
          <view class="item" v-for="item in addressList" :key="item.id">
            <view class="item-content">
              <view class="user">
                {{ item.receiver }}
                <text class="contact">{{ item.contact }}</text>
                <text v-if="item.isDefault" class="badge">默认</text>
              </view>
              <view class="locate">{{ item.fullLocation }} {{ item.address }}</view>
              <navigator
                class="edit"
                hover-class="none"
                :url="`/pagesMember/address-form/address-form?id=${item.id}`"
              >
                修改
              </navigator>
            </view>
          </view>
        </view>
      </view>
      <view v-else class="blank">暂无收货地址</view>
    </scroll-view>
    <!-- 添加按钮 -->
    <view class="add-btn">
      <navigator hover-class="none" url="/pagesMember/address-form/address-form">
        新建地址
      </navigator>
    </view>
  </view>
</template>

form表单: address-form.vue

// 表单数据

const form = ref({

receiver: '', // 收货人

contact: '', // 联系方式

fullLocation: '', // 省市区(前端展示)

provinceCode: '', // 省份编码(后端参数)

cityCode: '', // 城市编码(后端参数)

countyCode: '', // 区/县编码(后端参数)

address: '', // 详细地址

isDefault: 0, // 默认地址,1为是,0为否

})

1、添加地址

实现思路:封装 API 接口 --> 定义参数类型 --> 点击保存调用接口 --> 成功提示 --> 返回上一页

封装接口:address.ts

/**

* 添加收货地址

* @param data 请求参数

* @returns

*/

export const postMemberAddressAPI = (data: AddressParams) => {

return http({

method: 'POST',

url: '/member/address',

data,

})

}

定义参数类型 :address.d.ts

/** 添加收货地址: 请求参数 */

export type AddressParams = {

/** 收货人姓名 */

receiver: string

/** 联系方式 */

contact: string

/** 省份编码 */

provinceCode: string

/** 城市编码 */

cityCode: string

/** 区/县编码 */

countyCode: string

/** 详细地址 */

address: string

/** 默认地址,1为是,0为否 */

isDefault: number

}

点击保存按钮调用接口 --> 成功提示 --> 返回上一页: address-form.vue

// 保存并使用按钮

const onSubmit = async () => {

// 新建地址请求

await postMemberAddressAPI(form.value)

// 返回上一页

uni.navigateBack()

// 成功提示

uni.showToast({ icon: 'success', title: '添加成功' })

}

2、地址列表

实现思路:封装 API 接口 --> 初始化调用 --> 渲染列表

封装 API 接口:address.ts

/**

* 获取收货地址列表

* @returns

*/

export const getMemberAddressAPI = () => {

return http<AddressItem[]>({

method: 'GET',

url: '/member/address',

})

}

初始化调用:address.vue

<script setup lang="ts">

import { getMemberAddressAPI } from '@/services/address'

import type { AddressItem } from '@/types/address'

import { onShow } from '@dcloudio/uni-app'

import { ref } from 'vue'

// 获取收货地址列表数据

const addressList = ref<AddressItem>()

const getMemberAddressData = async () => {

const res = await getMemberAddressAPI()

console.log(res)

addressList.value = res.result

}

// 页面展示 -- 初始化调用

onShow(() => {

getMemberAddressData()

})

</script>

渲染列表:

3、修改地址

封装 API 接口 --> 是否有地址 id ? (有) --->初始化调用 --> 表单数据回显

封装 API 接口:address.ts

/**

* 获取收货地址详情 用于回显修改表单上用户地址详情的数据

* @param id 地址id(路径参数)

* @returns

*/

export const getMemberAddressByIdAPI = (id: string) => {

return http<AddressItem>({

method: 'GET',

url: `/member/address/${id}`,

})

}

/**

* 修改收货地址

* @param id 地址id(路径)

* @param data 表单数据(请求体参数)

* @returns

*/

export const putMemberAddressByAPI = (id: string, data: AddressParams) => {

return http({

method: 'PUT',

url: `/member/address/${id}`,

data,

})

}

address-form.vue: 是否有地址 id ? 有id - 修改地址 没用id - 新建地址

如果是修改地址的话,回显表单数据到页面

// 获取页面参数

const query = defineProps<{

id?: string

}>()

// 获取收货地址详情数据 并回显表单数据到修改地址页面

const getMemberAddressByIdData = async () => {

if (query.id) {

const res = await getMemberAddressByIdAPI(query.id)

// 把数据合并到表单中 即回显表单数据

Object.assign(form.value, res.result)

}

}

// 保存并使用按钮 修改或者新建地址按钮

const onSubmit = async () => {

if (query.id) {

// 修改地址请求

await putMemberAddressByAPI(query.id, form.value)

} else {

// 新建地址请求

await postMemberAddressAPI(form.value)

}

// 返回上一页

uni.navigateBack()

// 成功提示

uni.showToast({ icon: 'success', title: query.id ? '修改成功' : '添加成功' })

}

初始化调用:

// 页面加载 回显调用函数 - 回显数据

onLoad(() => {

getMemberAddressByIdData()

})

修改成功

4、删除地址

实现思路:使用 uni-swipe-action 侧滑组件 --> 绑定删除事件 --> 二次确认删除 --> 调用删除地址API

<uni-swipe-action class="address-list">

<!-- 收货地址项 -->

<uni-swipe-action-item class="item" v-for="item in addressList" :key="item.id">

<view class="item-content">

<view class="user">

{{ item.receiver }}

<text class="contact">{{ item.contact }}</text>

<text v-if="item.isDefault" class="badge">默认</text>

</view>

<view class="locate">{{ item.fullLocation }} {{ item.address }}</view>

<navigator

class="edit"

hover-class="none"

:url="`/pagesMember/address-form/address-form?id=${item.id}`"

>

修改

</navigator>

</view>

<!-- 右侧插槽 -->

<template #right>

<button class="delete-button" @tap="onDeleteAddress(item.id)">删除</button>

</template>

</uni-swipe-action-item>

</uni-swipe-action>

封装删除接口 API --> address.ts

/**

* 删除收货地址

* @param id 地址id(路径参数)

* @returns

*/

export const deleteMemberAddressByIdAPI = (id: string) => {

return http({

method: 'DELETE',

url: `/member/address/${id}`

})

}

绑定删除事件 --> 二次确认删除 --> 调用删除地址API address.vue

删除成功

相关推荐
郭wes代码32 分钟前
Cmd命令大全(万字详细版)
python·算法·小程序
LIKEYYLL1 小时前
GNU Octave:特性、使用案例、工具箱、环境与界面
服务器·gnu
云云3212 小时前
搭建云手机平台的技术要求?
服务器·线性代数·安全·智能手机·矩阵
云云3212 小时前
云手机有哪些用途?云手机选择推荐
服务器·线性代数·安全·智能手机·矩阵
cominglately2 小时前
centos单机部署seata
linux·运维·centos
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse2 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux3 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8243 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维3 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs