当前位置: 首页 > news >正文

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

页面结构代码:

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

<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   --->  地址列表页面

<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><navigatorclass="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

删除成功

http://www.lryc.cn/news/351533.html

相关文章:

  • 【星海随笔】微信小程序(三)
  • pip(包管理器) for Python
  • Ubuntu上安装Maven
  • java中使用svnkit实现文件的版本管理
  • 了解 Linux 网络卡绑定:提高网络性能与冗余性
  • 2024年618购物狂欢节即将来袭!精选五款超值入手数码好物!
  • 中国AI独角兽资本大冒险
  • 项目十二:简单的python基础爬虫训练
  • OpenGL学习入门及开发环境搭建
  • three.js能实现啥效果?看过来,这里都是它的菜(08)
  • SpringBoot(九)之整合mybatis
  • 【实战教程】使用Spring AOP和自定义注解监控接口调用
  • 算法学习之:Raft-分布式一致性/共识算法
  • 彩色进度条(C语言版本)
  • C#和C++有什么区别?
  • 微信小程序报错:notifyBLECharacteristicValueChange:fail:nodescriptor的解决办法
  • 富格林:可信攻略阻止遭遇欺诈
  • 搭建淘宝扭蛋机小程序:技术选型与最佳实践
  • 【线性回归】梯度下降
  • GMSL图像采集卡,适用于无人车、自动驾驶、自主机器、数据采集等场景,支持定制
  • docker不删除容器更改其挂载目录
  • K8s Service 背后是怎么工作的?
  • ClickHouse配置与使用
  • 将某一个 DIV 块全屏展示
  • K8S集群再搭建
  • 工具-博客搭建
  • 贪心算法:合并区间
  • DFA 算法
  • Web(数字媒体)期末作业
  • 展现金融科技前沿力量,ATFX于哥伦比亚金融博览会绽放光彩