ソースを参照

收货地址路由更换

Xiao_123 4 ヶ月 前
コミット
6aacee1263

+ 1 - 1
src/views/mall/components/confirm_order/addressSelection.vue

@@ -39,7 +39,7 @@
 <script setup>
   import { computed, ref } from 'vue';
   import { isEmpty1 } from '@/utils/is'
-  import addressPage from '@/views/mall/user/address'
+  import addressPage from '@/views/recruit/personal/PersonalCenter/shippingAddress/index.vue'
   import Snackbar from '@/plugins/snackbar'
   const props = defineProps({
     modelValue: {

+ 1 - 1
src/views/mall/components/details/order/addressSelection.vue

@@ -39,7 +39,7 @@
 <script setup>
   import { computed, ref } from 'vue';
   import { isEmpty1 } from '@/utils/is'
-  import addressPage from '@/views/mall/user/address'
+  import addressPage from '@/views/recruit/personal/PersonalCenter/shippingAddress/index.vue'
   import Snackbar from '@/plugins/snackbar'
   const props = defineProps({
     modelValue: {

+ 0 - 218
src/views/mall/user/address/index.vue

@@ -1,218 +0,0 @@
-<template>
-  <CtTable
-    class="mt-3"
-    :items="items"
-    :headers="headers"
-    :loading="false"
-    :elevation="0"
-    :isTools="true"
-    :showPage="false"
-    :showSelect="props.showSelect"
-    selectStrategy="single"
-    itemKey="id"
-    @add="handleAdd"
-    @selected="handleSelected"
-  >
-    <template #actions="{ item }">
-      <v-btn color="primary" @click.stop="handleEdit(item)" variant="text">编辑</v-btn>
-      <v-btn color="error" @click.stop="handleDelete(item)" variant="text">删除</v-btn>
-      <v-btn v-if="!item.defaultStatus" color="success" @click.stop="handleSetDefault(item)" variant="text">设为默认</v-btn>
-    </template>
-  </CtTable>
-
-  <CtDialog :visible="showDialog" titleClass="text-h6" :footer="true" :widthType="3" :title="isAdd ? '新增收货地址' : '编辑收货地址'" @submit="handleSubmit" @close="handleClose">
-    <CtForm ref="CtFormRef" :items="formItems">
-      <template #areaId="{ item }">
-        <div class="d-flex" style="width: 100%;">
-          <div class="mt-2" style="color: #777; width: 100px;">省市区 *</div>
-          <el-cascader
-            ref="cascaderAddr"
-            v-model="item.value"
-            size="large"
-            clearable
-            class="mb-5"
-            placeholder="省市区 *"
-            style="flex: 1;"
-            :props="{ value: 'id', label: 'name', emitPath: false }"
-            :options="item.items"
-            @change="handleChangeArea(item)"
-            @clear="item.labelValue = ''"
-          ></el-cascader>
-        </div>
-      </template>
-      <template #defaultStatus="{ item }">
-        <div class="d-flex align-center">
-          <span class="color-666 mr-5">设为默认地址</span>
-          <v-switch v-model="item.value" hide-details color="primary"></v-switch>
-        </div>
-      </template>
-    </CtForm>
-  </CtDialog>
-</template>
-
-<script setup>
-defineOptions({ name: 'mall-user-address-index' })
-import { ref } from 'vue'
-import { getMallUserAddressList, deleteMallUserAddress, createMallUserAddress, updateMallUserAddress } from '@/api/mall/address'
-import Confirm from '@/plugins/confirm'
-import { getDict } from '@/hooks/web/useDictionaries'
-import Snackbar from '@/plugins/snackbar'
-const props = defineProps({
-  showSelect: {
-    type: Boolean,
-    default: false,
-  }
-})
-
-const isAdd = ref(true)
-const editId = ref(null)
-const showDialog = ref(false)
-const items = ref([])
-const headers = [
-  { title: '收货人', key: 'name', sortable: false },
-  { title: '联系电话', key: 'mobile', sortable: false },
-  { title: '所在地区', key: 'areaName', sortable: false },
-  { title: '详细地址', key: 'detailAddress', sortable: false },
-  { title: '是否默认', key: 'defaultStatus', sortable: false, value: item => item.defaultStatus ? '是' : '否' },
-  { title: '操作', key: 'actions', sortable: false }
-]
-const cascaderAddr = ref()
-const CtFormRef = ref()
-const formItems = ref({
-  options: [
-    {
-      type: 'text',
-      key: 'name',
-      value: null,
-      default: localStorage.getItem('baseInfo') ? JSON.parse(localStorage.getItem('baseInfo')).name : '',
-      hide: false,
-      label: '收货人姓名 *',
-      rules: [v => !!v || '请输入收货人姓名'],
-    },
-    {
-      type: 'text',
-      key: 'mobile',
-      value: null,
-      default: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')).phone : '',
-      label: '收货人联系电话 *',
-      outlined: true,
-      rules: [v => !!v || '请填写收货人联系电话']
-    },
-    {
-      slotName: 'areaId',
-      key: 'areaId',
-      labelValue: '',
-      value: null,
-      default: null,
-      items: []
-    },
-    {
-      type: 'textarea',
-      key: 'detailAddress',
-      value: '',
-      default: null,
-      label: '详细地址 *',
-      rules: [ v => !!v || '请填写详细地址' ]
-    },
-    {
-      slotName: 'defaultStatus',
-      key: 'defaultStatus',
-      value: false,
-      default: false,
-    } 
-  ]
-})
-getDict('areaTreeData', null, 'areaTreeData').then(({ data }) => {
-  data = data?.length && data || []
-  formItems.value.options.find(e => e.key === 'areaId').items = data
-})
-
-const singleSelectObj = ref([])
-const handleSelected = (e) => {
-  singleSelectObj.value = e?.length ? items.value.find(item => item.id === e[0]) : null
-}
-
-const getSelected = () => {
-  return singleSelectObj.value
-}
-
-// 获取地址列表
-const getAddressList = async () => {
-  const data = await getMallUserAddressList()
-  items.value = data
-}
-getAddressList()
-
-// 新增
-const handleAdd = () => {
-  formItems.value.options.forEach(e => e.value = e.default)
-  showDialog.value = true
-  isAdd.value = true
-}
-
-// 地区选择
-const handleChangeArea = (item) => {
-  const node = cascaderAddr.value.getCheckedNodes() ? cascaderAddr.value.getCheckedNodes()[0] : null
-  if (!node) return
-  item.labelValue = node.pathLabels.join(' ')
-}
-
-// 设置为默认地址
-const handleSetDefault = async (item) => {
-  Confirm('系统提示', '是否确定设置该地址为默认收货地址?').then(async () => {
-    await updateMallUserAddress({ ...item, defaultStatus: true })
-    Snackbar.success('设置成功')
-    await getAddressList()
-  })
-}
-
-// 编辑
-const handleEdit = (item) => {
-  isAdd.value = false
-  editId.value = item.id
-  formItems.value.options.forEach(e => e.value = item[e.key])
-  showDialog.value = true
-}
-
-// 提交
-const handleClose = () => {
-  showDialog.value = false
-  editId.value = null
-}
-
-const handleSubmit = async () => {
-  const { valid } = await CtFormRef.value.formRef.validate()
-  if (!valid) return
-  const obj = {}
-  formItems.value.options.forEach(e => {
-    if (e.key === 'areaId') {
-      obj.areaId = e.value
-      obj.areaName = e.labelValue
-    } else obj[e.key] = e.value
-  })
-  if (!obj.areaId && !obj.areaName) return Snackbar.warning('请将必填项填写完整')
-  try {
-    isAdd.value ? await createMallUserAddress(obj) : await updateMallUserAddress(obj)
-    Snackbar.success(isAdd.value ? '新增成功' : '编辑成功')
-    handleClose()
-    getAddressList()
-  } catch {}
-}
-
-// 删除
-const handleDelete = (item) => {
-  Confirm('系统提示', '是否确认删除该收货地址?').then(async () => {
-    await deleteMallUserAddress(item.id)
-    Snackbar.success('删除成功')
-    await getAddressList()
-  })
-}
-
-defineExpose({
-  getSelected
-})
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 0 - 19
src/views/mall/user/cart/index.vue

@@ -1,19 +0,0 @@
-<!-- 我的-购物车 -->
-<template>
-  <div>
-    <cart
-      :showNavbar="false"
-      :defaultWidth="false"
-      :showOrder="false"
-      :elevation="0"
-    ></cart>
-  </div>
-</template>
-
-<script setup>
-defineOptions({name: 'mall-user-cart'})
-import cart from '@/views/mall/cart/index.vue'
-
-</script>
-<style lang="scss" scoped>
-</style>

+ 0 - 52
src/views/mall/user/order/commentForm.vue

@@ -1,52 +0,0 @@
-<template>
-  <div v-for="(val, index) in orderList" :key="val.id">
-    <GoodsItem :item="val" :showHover="false" :showLine="false" />
-    <div class="d-flex align-center my-3">
-      <span>商品质量</span>
-      <v-rating :length="5" :size="34" v-model="commentList[index].descriptionScores" color="warning" active-color="warning" />
-    </div>
-    <div class="d-flex align-center my-3">
-      <span>服务态度</span>
-      <v-rating :length="5" :size="34" v-model="commentList[index].benefitScores" color="warning" active-color="warning" />
-    </div>
-    <v-textarea v-model="commentList[index].content" rows="3" color="primary" clearable counter label="宝贝满足你的期待吗?说说你的使用心得,分享给想买的他们吧~" />
-    <Imgs v-model="commentList[index].picUrls" limit="9"></Imgs>
-    <v-checkbox v-model="commentList[index].anonymous" color="primary" hide-details label="匿名评论"></v-checkbox>
-    <v-divider v-if="index !== orderList.length - 1" color="error" class="my-3"></v-divider>
-  </div>
-</template>
-
-<script setup>
-defineOptions({ name: 'mall-user-order-commentForm' })
-import { ref, onMounted } from 'vue'
-import { getMallOrderDetail } from '@/api/mall/user'
-import Snackbar from '@/plugins/snackbar'
-import GoodsItem from '../../components/GoodsItem/index.vue'
-
-const props = defineProps({ orderId: [String, Number] })
-
-const commentList = ref([])
-const orderList = ref([])
-
-onMounted(async () => {
-  if (!props.orderId) return Snackbar.warning('请重新选择订单')
-  const data = await getMallOrderDetail(props.orderId)
-  orderList.value = data.items
-  commentList.value = data.items.map(e => {
-    return {
-      orderItemId: e.id,
-      anonymous: false,
-      benefitScores: 5,
-      descriptionScores: 5,
-      picUrls: [],
-      content: ''
-    }
-  })
-})
-
-defineExpose({ commentList })
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 0 - 102
src/views/mall/user/order/detail.vue

@@ -1,102 +0,0 @@
-<template>
-  <div>
-    <Navbar class="mb-3" />
-    <div class="default-width pb-5">
-      <v-banner color="primary" :text="formatOrderStatusDescription(order)" style="background-color: #00897B; color: #fff;"></v-banner>
-
-      <v-row no-gutters class="mt-3">
-        <v-col span="6">
-          <!-- 订单信息 -->
-          <v-card class="pa-5">
-            <h3>订单信息</h3>
-            <v-divider class="my-3"></v-divider>
-            <div class="font-size-15 color-666">
-              <p>订单编号:{{ order.no }}</p>
-              <p class="my-3">下单时间:{{ timesTampChange(order.createTime) }}</p>
-              <p>支付时间:{{ timesTampChange(order.payTime) }}</p>
-              <p class="mt-3">支付方式:{{ order.payChannelName }}</p>
-              <p class="mt-3">订单备注:{{ order.userRemark }}</p>
-            </div>
-          </v-card>
-        </v-col>
-        <v-col span="6" class="ml-3">
-          <!-- 物流信息 -->
-          <v-card class="pa-5" style="height: 100%">
-            <h3>物流信息</h3>
-            <v-divider class="my-3"></v-divider>
-            <div class="font-size-15 color-666">
-              <p>收货地址:{{ order.receiverName }},{{ order.receiverMobile }},{{ order.receiverAreaName }} {{ order.receiverDetailAddress }}</p>
-              <p class="my-3">物流公司:{{ order.logisticsName }}</p>
-              <p>运单号:{{ order.logisticsNo }}</p>
-            </div>
-          </v-card>
-        </v-col>
-      </v-row>
-
-      <!-- 商品列表 -->
-      <v-card class="my-3 pa-5">
-        <h3 class="mb-3">商品列表</h3>
-        <v-divider></v-divider>
-
-        <CtTable
-          class="mt-3"
-          :items="order.items"
-          :headers="headers"
-          :loading="false"
-          :elevation="0"
-          :isTools="false"
-          :showPage="false"
-          itemKey="id"
-        >
-          <template #picUrl="{ item }">
-            <v-img :src="item.picUrl" width="90" height="90"></v-img>
-          </template>
-          <template #spuName="{ item }">
-            <span class="color-primary cursor-pointer" @click="handleToGoodsDetail(item)">{{ item.spuName }}</span>
-          </template>
-        </CtTable>
-        <div class="text-end color-primary mr-3 mt-5 font-size-20">
-          共{{ order.productCount }}件商品,合计:¥{{ fen2yuan(order.payPrice) }}
-        </div>
-      </v-card>
-    </div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({ name: 'mall-user-order-detail'})
-import { ref, onMounted } from 'vue'
-import { useRouter } from 'vue-router'
-import { getMallOrderDetail } from '@/api/mall/user'
-import Snackbar from '@/plugins/snackbar'
-import Navbar from '../../components/navbar.vue'
-import { timesTampChange } from '@/utils/date'
-import { fen2yuan, formatOrderStatusDescription } from '@/hooks/web/useGoods'
-
-const router = useRouter()
-const { id } = router.currentRoute.value.params
-const order = ref({})
-
-const headers = [
-  { title: '', key: 'picUrl', sortable: false },
-  { title: '商品名称', key: 'spuName', sortable: false },
-  { title: '规格', key: 'contactAddress', sortable: false, value: item => item.properties.map((property) => property.valueName).join(' ') },
-  { title: '单价', key: 'price', sortable: false, value: item => '¥' + fen2yuan(item.price) },
-  { title: '数量', key: 'count', sortable: false }
-]
-
-onMounted(async () =>{
-  if (!id) return Snackbar.error('订单不存在')
-  const data = await getMallOrderDetail(id)
-  order.value = data
-})
-
-// 跳转商品详情
-const handleToGoodsDetail = (item) => {
-  window.open(`/mall/goodsDetail/${item.spuId}`)
-}
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 0 - 201
src/views/mall/user/order/index.vue

@@ -1,201 +0,0 @@
-<template>
-  <div>
-    <v-tabs v-model="tab" align-tabs="start" color="primary" :bg-color="props.tabListBg ? '#f7f8fa': '#fff'" @update:modelValue="queryParams.pageNo = 1, getOrderPage()">
-      <v-tab v-for="(val, i) in tabList" :key="i" :value="val.value">{{ val.title }}</v-tab>
-    </v-tabs>
-    <div v-if="orderList.length" class="mt-3">
-      <div v-for="val in orderList" :key="val.id" class="order-item mb-3">
-        <div class="order-item-header px-5">
-          <div style="width: 40%;">
-            <span>订单号:{{ val.no }}</span>
-            <span class="ml-5">{{ timesTampChange(val.createTime) }}</span>
-          </div>
-          <div class="text-end color-warning" :class="formatOrderColor(val)" style="flex: 1">
-            {{ formatOrderStatus(val) }}
-          </div>
-        </div>
-        <!-- 商品列表 -->
-        <GoodsItem v-for="k in val.items" :key="k.id" :item="k" />
-        <!-- 操作按钮 -->
-        <div class="text-end pa-3 font-size-13 color-666">
-          <div>共{{ val.productCount }}件商品,合计:¥{{ fen2yuan(val.payPrice) }}</div>
-          <v-btn class="mt-2" variant="tonal" rounded="xl" @click.stop="handleDetail(val)">查看详情</v-btn>
-          <v-btn v-if="val.buttons.includes('confirm')" class="mt-2 ml-3" variant="tonal" color="success" rounded="xl" @click.stop="handleConfirm(val)">确认收货</v-btn>
-          <!-- <v-btn v-if="val.buttons.includes('comment')" class="mt-2" variant="tonal" rounded="xl" @click.stop="handleComment(val)">评价</v-btn> -->
-          <!-- <v-btn v-if="val.buttons.includes('express')" class="mt-2" variant="tonal" rounded="xl">查看物流</v-btn> -->
-          <v-btn v-if="val.buttons.includes('cancel')" class="mt-2 ml-3" variant="tonal" rounded="xl" @click.stop="handleCancel(val)">取消订单</v-btn>
-          <v-btn v-if="val.buttons.includes('delete')" class="mt-2 ml-3" variant="tonal" color="error" rounded="xl" @click.stop="handleDelete(val)">删除订单</v-btn>
-          <v-btn v-if="val.buttons.includes('pay')" class="mt-2 ml-3" variant="tonal" color="primary" rounded="xl" @click.stop="handlePay(val)">继续支付</v-btn>
-        </div>
-      </div>
-      <CtPagination :total="total" :page="queryParams.pageNo" :limit="queryParams.pageSize" @handleChange="handleChangePage"></CtPagination>
-    </div>
-    <Empty v-else :elevation="false" :message="tab === -1 ? '暂无订单' : '暂无' + tabList.find(e => e.value === tab).title + '订单'"></Empty>
-  </div>
-
-  <!-- <CtDialog :visible="showDialog" titleClass="text-h6" :footer="true" :widthType="3" title="商品评论" @submit="handleSubmit" @close="handleClose">
-    <CommentForm ref="commentFormRef" v-if="showDialog" :orderId="commentOrderId" />
-  </CtDialog> -->
-  <!-- 支付 -->
-  <CtDialog :visible="showPay" titleClass="text-h6" :widthType="3" title="收银台" :footer="false" @close="payCancel">
-    <pay ref="payRef" :id="payOrderId" @paySuccess="paySuccess"></pay>
-  </CtDialog>
-</template>
-
-<script setup>
-defineOptions({ name: 'mall-user-order-index'})
-import { ref } from 'vue'
-import { getMallOrderPage, receiveOrder, deleteTradeOrder, cancelTradeOrder, createOrderItemComment } from '@/api/mall/user'
-import { timesTampChange } from '@/utils/date'
-import { fen2yuan, handleOrderButtons, formatOrderStatus, formatOrderColor } from '@/hooks/web/useGoods'
-import Confirm from '@/plugins/confirm'
-import Snackbar from '@/plugins/snackbar'
-import GoodsItem from '../../components/GoodsItem/index.vue'
-import CommentForm from './commentForm.vue'
-import pay from '@/views/mall/components/details/order/pay.vue'
-import { useRoute } from 'vue-router'; const route = useRoute()
-import { useRouter } from 'vue-router'; const router = useRouter()
-
-const props = defineProps({
-  tabListBg: {
-    type: Boolean,
-    default: true
-  },
-})
-
-const tab = ref(route?.query?.tab ? (route.query.tab)-0 : -1)
-const tabList = [
-  { title: '全部', value: -1 },
-  { title: '待付款', value: 0 },
-  { title: '待发货', value: 10 },
-  { title: '待收货', value: 20 },
-  { title: '已完成', value: 30 },
-  { title: '已取消', value: 40 },
-  // { title: '待评价', value: 30 }
-]
-const total = ref(0)
-const queryParams = ref({
-  pageNo: 1,
-  pageSize: 10
-})
-
-// 获取订单列表
-const orderList = ref([])
-const getOrderPage = async () => {
-  queryParams.value.status = tab.value
-  if (tab.value === -1) delete queryParams.value.status
-  if (tab.value === 30) queryParams.value.commentStatus = false
-
-  const result = await getMallOrderPage(queryParams.value)
-
-  result.list.forEach(order => handleOrderButtons(order))
-  orderList.value = result.list
-  total.value = result.total
-}
-getOrderPage()
-
-// 分页
-const handleChangePage = (e) => {
-  queryParams.value.pageNo = e
-  getOrderPage()
-}
-
-// 查看详情
-const handleDetail = ({ id }) => {
-  window.open(`/mall/order/detail/${id}`)
-}
-
-// 删除订单
-const handleDelete = async ({ id }) => {
-  Confirm('系统提示', '是否确认删除该订单?').then(async () => {
-    await deleteTradeOrder(id)
-    Snackbar.success('删除成功')
-    await getOrderPage()
-  })
-}
-
-// 取消订单
-const handleCancel = async ({ id }) => {
-  Confirm('系统提示', '是否确认取消该订单?').then(async () => {
-    await cancelTradeOrder(id)
-    Snackbar.success('取消成功')
-    await getOrderPage()
-  })
-}
-
-// 商品评论
-// const showDialog = ref(false)
-// const commentOrderId = ref(null) // 订单id
-// const commentFormRef = ref()
-// const handleComment = (val) => {
-//   commentOrderId.value = val.id
-//   showDialog.value = true
-// }
-// const handleClose = () => {
-//   commentOrderId.value = null
-//   showDialog.value = false
-// }
-// const handleSubmit = async () => {
-//   const commentList = commentFormRef.value.commentList
-//   for (const comment of commentList) {
-//     await createOrderItemComment(comment)
-//   }
-//   Snackbar.success('评论成功')
-//   handleClose()
-//   getOrderPage()
-// }
-
-// // 收货成功后提示去评论
-// const handlePromptComment = (id) => {
-//   Confirm('确认收货成功', '是否前往评价?', { sureText: '立即评价', cancelText: '关闭' }).then(() => {
-//     handleComment({ id })
-//   })
-// }
-
-// 确认收货
-const handleConfirm = ({ id }) => {
-  if (!id) return
-  Confirm('系统提示', '是否确认收货?').then(async () => {
-    await receiveOrder(id)
-    Snackbar.success('收货成功')
-    queryParams.value.pageNo = 1
-    await getOrderPage()
-    handlePromptComment(id) // 收货成功后提示去评论
-  })
-}
-
-const showPay = ref(false)
-const payOrderId  = ref('')
-const handlePay = (val) => {
-  if (!payOrderId) return Snackbar.success('订单错误!')
-  payOrderId.value = val.payOrderId
-  showPay.value = true
-}
-// 
-const payCancel = () => {
-  Snackbar.warning('您已取消支付!')
-  showPay.value = false
-  // router.push('/recruit/personal/personalCenter/tradeOrder?key=1')
-}
-const paySuccess = (e) => {
-  // Snackbar.success('支付成功!')
-  // showPay.value = false
-  // getOrderPage()
-  router.push({ path: '/mall/payOver', query: { price: e.price }})
-}
-
-</script>
-
-<style scoped lang="scss">
-.order-item {
-  border: 1px solid #dbdbdb;
-  &-header {
-    display: flex;
-    background-color: #f2f4f7;
-    height: 36px;
-    line-height: 36px;
-    font-size: 13px;
-    color: #666;
-  }
-}
-</style>

+ 1 - 1
src/views/mall/user/prize/index.vue

@@ -39,7 +39,7 @@
 <script setup>
 defineOptions({ name: 'mall-user-prize-index' })
 import { ref, computed } from 'vue'
-import SelectAddress from '@/views/mall/user/address'
+import SelectAddress from '@/views/recruit/personal/PersonalCenter/shippingAddress/index.vue'
 import Snackbar from '@/plugins/snackbar'
 import { getLuckLotteryRecordPage, luckyLotteryRecordReceive } from '@/api/mall/prize'