首页 > 编程语言 >小程序-收货地址管理模块实现

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

时间:2024-05-24 19:54:12浏览次数:14  
标签:const form 收货 -- 地址 模块 address id

页面结构代码:

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>
              <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

删除成功

标签:const,form,收货,--,地址,模块,address,id
From: https://blog.csdn.net/weixin_57334661/article/details/139150525

相关文章

  • 【Muduo】网络库各模块和交互流程简介
    Muduo是由陈硕大佬个人开发的C++网络库,最近在剖析其源码,在此做一些归纳整理。Channel模块内含向Poller中注册的文件描述符fd,封装了感兴趣的事件events、Poller返回的发生的事件revents,和一组能够根据fd发生的事件revents进行回调的回调函数callbacks共有两种Channel,一种是......
  • OFDM 802.11a的FPGA实现(二十二)DAC模块(含代码)
    目录1.前言2.实现思路3.verilog代码4.MoselSim仿真完整工程链接(含verilog和Matlab代码):OFDM802.11a的xilinxFPGA实现1.前言上一节完成了MUC模块,实现了对MAC层进行数据交互,以及控制物理层各个模块的工作。现在还剩下最后一个DAC模块,作用是将时域的输出按照前导码、sig......
  • 从MASM全局标识符谈模块化开发
      博主学习的第一个编程语言是C语言(跟谭教授学的),当时时就疑惑一个问题,为什么要将源码分成多个文件,每个文件编译成目标文件(obj)文件后,再通过连接程序(link)将多个目标文件连接成单个执行文件。后来通过更深入的开发一些规模稍大一点的软件,及了解计算机的发展历史后,逐渐清晰起来:......
  • 使用python uiautomation模块,结合多线程快速寻找控件
    文章目录1.形式一2.形式二1.形式一该方法使用多线程进行搜索,主线程不会等待所有子线程返回结果后再继续执行,而是在获取队列中第一个结果后立即继续执行。优势在于一旦有子线程找到结果,主线程就能立即继续执行;劣势在于未找到结果的子线程会持续搜索,直到达到设定的最大......
  • BOSHIDA AC/DC电源模块:适用于各种功率需求的电子设备
    BOSHIDAAC/DC电源模块:适用于各种功率需求的电子设备AC/DC电源模块是一种广泛应用于不同电子设备中的电源转换模块。它具有输出稳定、高效率、可靠性强等特点,适用于各种功率需求的电子设备。在本文中,我们将探讨AC/DC电源模块的工作原理、优点以及在不同应用领域的应用。 首先......
  • Java 9的模块化系统(JPMS):探讨Java 9引入的模块化系统,并解释其对Java生态的影响
    Java9模块化系统(JPMS)简介Java9模块系统,也被称为Java平台模块系统(JPMS),它是Java9的核心特性之一,用于改进Java的大型应用的封装性和可维护性。 JPMS的主要功能如下: 模块化代码:JPMS允许你将代码库划分为不同的模块,在没有显示声明的情况下,模块内部的类......
  • docker如何确定dockerd的地址
    introdocker这个命令行工具本身通常是接触容器的第一关:示例中一般会使用docker来制作(build)镜像/运行(run)容器。但是docker这个可执行程序本身并没有太复杂的逻辑,它更多的是提供了一个类似于bash这种和人类用户更友好的命令/子命令,真正的workhorse是dockerd进程(当然,也可能是do......
  • 51单片机:PCA模块的PWM模式
    1、PWM功能引脚切换 2、配置PCA控制寄存器 3、配置PCA模式寄存器,选择时钟源 4、计数寄存器清零5、配置PCA模块模式模式控制寄存器6、配置PCA模块PWM模式控制寄存器7、配置比较值8、控制寄存器配置CR开始计数以6位PWM为例计数值CL[5:0]与CCAPnL[5:0]比较,小于输出低......
  • [Python] pipe模块
    一.概述我们都知道在Linux下执行命令ls|sort-r会将排序后的结果进行输出,它是先获取目录数据,管道符|将ls的输出作为后一个命令的输入,最终得到反向排序的结果。Python和其他大多数语言一样,处理数据的时候通常是将数据作为参数传入。但是有没有像Linux管道符那样优雅的输出呢?有......
  • 前端获取ip 地址和当前城市信息
    获取ip地址 fetch('https://api.ipify.org?format=json')  .then(response=>response.json())  .then(json=>console.log(json.ip)) 获取当前城市信息 varxhttp=newXMLHttpRequest(); xhttp.onreadystatechange=function(){  if(this......