跳至主要內容

地址列表

起凡大约 10 分钟起凡商城地址地址列表小程序

地址列表

地址列表页面
地址列表页面

后端

建表

-- auto-generated definition
create table address
(
    id           varchar(36)  not null
        primary key,
    created_time datetime(6)  not null,
    edited_time  datetime(6)  not null,
    creator_id   varchar(36)  not null,
    editor_id    varchar(36)  not null,
    latitude     double       not null,
    longitude    double       not null,
    address      varchar(255) not null,
    province     varchar(255) not null,
    city         varchar(255) not null,
    district     varchar(255) not null,
    phone_number varchar(255) not null,
    real_name    varchar(255) not null,
    top          tinyint(1)   not null,
    details      varchar(255) not null
);

实体类

@Entity
@GenEntity
public interface Address extends BaseEntity {

  @GenField(value = "维度", order = 0, type = ItemType.INPUT_NUMBER)
  double latitude();

  @GenField(value = "经度", order = 1, type = ItemType.INPUT_NUMBER)
  double longitude();

  @GenField(value = "地址信息", order = 2)
  String address();

  @GenField(value = "地址详情", order = 3)
  String details();

  @GenField(value = "省份", order = 4)
  String province();

  @GenField(value = "城市", order = 5)
  String city();

  @GenField(value = "区县", order = 6)
  String district();

  @GenField(value = "电话", order = 7)
  String phoneNumber();

  @GenField(value = "姓名", order = 8)
  String realName();

  @GenField(value = "是否置顶", order = 9)
  boolean top();
}

生成代码

请参照开发流程

用户地址查询/设置默认地址

创建一个只包含地址表所有标量字段的抓取器,用于在查询时仅获取基本属性,不加载关联对象或深度嵌套的属性, 不需要使用COMPLEX_FETCHER.

public interface AddressRepository extends JRepository<Address, String> {

  AddressTable addressTable = AddressTable.$;
  AddressFetcher COMPLEX_FETCHER = AddressFetcher.$.allScalarFields()
      .creator(UserFetcher.$.phone().nickname())
      .editor(UserFetcher.$.phone().nickname());
  AddressFetcher SIMPLE_FETCHER = AddressFetcher.$.allScalarFields();;

// 忽略...
}






 



小程序端

地址展示

<template>
  <div class="address-list-page">
    <!-- 遍历地址列表并使用 address-row 组件展示地址 -->
    <address-row
      class="address"
      :key="address.id"
      :address="address"
      v-for="address in addressList"
    >
    </address-row>
  </div>
</template>

地址删除和编辑跳转

<address-row>组件中,有一个名为#operation的插槽(slot),用于地址行内的操作部分。这个插槽内包含了两个操作按钮:删除和编辑。

  1. 删除按钮:

    • 使用了<Del>组件,并添加了类名"delete"以便于样式定制。
    • 监听了点击事件@click="handleDelete(address.id)",当用户点击删除按钮时,会触发handleDelete方法并将当前地址ID作为参数传入,用于执行删除指定地址的操作。
  2. 编辑按钮:

    • 使用了一个假设存在的<edit>组件,并添加了类名"edit"。
    • 该编辑按钮的点击事件绑定了一个函数表达式@click="switchPage(`/pages/address/address-save?id=${address.id}`)",当用户点击时,将会调用switchPage函数并跳转到地址编辑页面,同时将地址ID作为查询参数传递给目标页面,方便用户编辑指定地址的信息。
<template>
  <div class="address-list-page">
    <address-row
      class="address"
      :key="address.id"
      :address="address"
      v-for="address in addressList"
    >
    <!-- 地址详情组件的插槽 -->
      <template #operation>
        <!-- 有两个操作按钮,删除和编辑 -->
        <div class="operations">
          <Del class="delete" @click="handleDelete(address.id)"></Del>
          <edit
            class="edit"
            @click="switchPage(`/pages/address/address-save?id=${address.id}`)"
          ></edit>
        </div>
      </template>
    </address-row>
  </div>
</template>








 
 
 
 
 
 
 
 
 
 
 



新增地址跳转

<template>
  <div class="address-list-page">
    <!-- 忽略... -->
    <div class="add-address" @click="switchPage('/pages/address/address-save')">
      <div class="btn">
        <plus></plus>
        添加收货地址
      </div>
    </div>
  </div>
</template>



 
 
 
 
 
 
 

地址复制和默认

地址列表中长按地址行时显示操作菜单的功能,用户可以选择不同的操作对地址进行处理

  1. 监听@longpress="showActionSheet(address)"事件,在用户长按某个地址行时触发showActionSheet方法,并将当前地址作为参数传递, 随后从底部弹出菜单。

  2. <nut-action-sheet>组件:

    • 使用v-model:visible="show"绑定动作菜单的可见性状态,当show值为true时显示动作菜单,否则隐藏。
    • 绑定:menu-items="actions"属性,这里的actions是定义好的一系列操作选项,如“复制地址”、“设为默认”等。
    • 监听@choose="handleActionChoose"事件,当用户从动作菜单中选择一项操作后触发handleActionChoose方法,这个方法会根据选择项的值执行相应的操作。
<template>
  <div class="address-list-page">
    <address-row
      class="address"
      :key="address.id"
      :address="address"
      v-for="address in addressList"
      @longpress="showActionSheet(address)"
    >
    <!-- 忽略... -->
    </address-row>
    <!-- 忽略... -->
    <nut-action-sheet
      v-model:visible="show"
      :menu-items="actions"
      @choose="handleActionChoose"
    />
  </div>
</template>