소스 검색

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

lifanagju_citu 4 달 전
부모
커밋
1e5b7f8947

+ 1 - 1
src/layout/company/navBar.vue

@@ -21,7 +21,7 @@
           <div class="d-flex align-center px-3 border-right cursor-pointer commonHover" @click="router.push('/recruit/enterprise/membershipPackage?key=1')">
             <div>剩余M豆:{{ enterpriseUserAccount?.balance ? enterpriseUserAccount?.balance / 100 : 0 }}个</div>
           </div>
-          <svg-icon v-if="baseInfo?.vipFlag" name="vip" size="30" class="ml-3"></svg-icon>
+          <svg-icon v-if="baseInfo?.vipFlag && Date.now() < baseInfo?.vipExpireDate" name="vip" size="30" class="ml-3"></svg-icon>
           
           <!-- 头像用户名 -->
           <div class="d-flex align-center" v-if="showBall">

+ 4 - 1
src/layout/enterprise.vue

@@ -36,6 +36,7 @@ import side from './company/side.vue'
 import { useRouter, useRoute } from 'vue-router'
 import { watch, ref, computed } from 'vue'
 import { useSystem } from '@/store/system'
+import { useUserStore } from '@/store/user'
 
 const router = useRouter()
 const route = useRoute()
@@ -84,11 +85,13 @@ const isInWhiteList = (url, whiteList)=> {
 //   breadcrumbs.value = arr
 // }
 
+const user = useUserStore()
 watch(
   () => route.matched,
-  (val) => {    
+  async (val) => {
     // getTitle(val, route.fullPath)
     system.setBreadcrumbs(val, route.fullPath)
+    await user.getEnterpriseInfo(true)
   },
   { immediate: true },
   { deep: true }

+ 2 - 3
src/layout/index.vue

@@ -17,7 +17,7 @@
 
 <script setup>
 defineOptions({ name: 'personal-layout-index' })
-import { onMounted } from 'vue'
+import { onMounted, watch } from 'vue'
 import NavBar from './personal/navBar.vue'
 import Footers from './personal/footer.vue'
 import Slider from './personal/slider.vue'
@@ -39,7 +39,6 @@ const footerWhiteList = [
   '/mall/pointExchange/records'
 ]
 const router = useRouter()
-
 const sharedState = useSharedState()
 
 const layoutClick = () => {
@@ -71,7 +70,7 @@ onMounted(async () => {
   z-index: 999;
 }
 .content {
-  min-height: calc(100vh - (48px + 225px));
+  min-height: calc(100vh - 256px);
   margin-top: 50px;
 }
 </style>

+ 1 - 1
src/layout/personal/navBar.vue

@@ -8,7 +8,7 @@
       <div class="innerBox d-flex justify-space-between">
         <div>
           <div class="nav-logo mr-3 mt-1 cursor-pointer d-flex align-center" @click="router.push('/recruitHome')">
-            <v-img src="../../assets/logo.png"  aspect-ratio="16/9" cover :width="90" style="height: 40px"></v-img>
+            <v-img src="../../assets/logo.png"  aspect-ratio="16/9" cover :width="97" style="height: 40px"></v-img>
             <span class="ml-2" style="margin-top: 6px;" :class="{'active-route' : route.path === '/recruitHome'}">首页</span>
           </div>
           <!-- <div class="nav-city">

+ 14 - 0
src/router/modules/recruit.js

@@ -158,6 +158,20 @@ const recruit = [
       },
     ]
   },
+  {
+    path: '/mall/order/detail/:id',
+    component: Layout,
+    children: [
+      {
+        path: '/mall/order/detail/:id',
+        component: () => import('@/views/recruit/personal/PersonalCenter/tradeOrder/components/detail.vue'),
+        name: 'mallOrderDetail',
+        meta: {
+          title: '商城订单详情'
+        }
+      }
+    ]
+  },
   {
     path: '/pointsExchange',
     component: Layout,

+ 1 - 0
src/utils/date.js

@@ -89,6 +89,7 @@ export const  convertTimestampsToDayRange = (timestamps) => {
  * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
  * @returns {string} 返回拼接后的时间字符串
  */
+import dayjs from 'dayjs';
 export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
   // 日期不存在,则返回空
   if (!date) {

+ 1 - 1
src/version.js

@@ -1,2 +1,2 @@
 // 版本号
-export const vue_version = 'v25.01.03.1816'
+export const vue_version = 'v25.01.06.1904'

+ 2 - 2
src/views/mall/components/details.vue

@@ -38,10 +38,10 @@
             <div v-if="showActivePrices" :class="{'activePrices': showActivePrices}" class="right pa-3 mt-3">
               <div>优惠大赠送!</div>
               <div>购买一份人力资源薪酬报告,可获赠一张超值酒店住宿房券!!!先到先得,赠完为止。</div>
-              <div class="cursor-pointer">
+              <!-- <div class="cursor-pointer">
                 <v-icon>mdi-help-circle-outline</v-icon>
                 <span class="text-decoration-underline">查看赠送活动详情</span>
-              </div>
+              </div> -->
             </div>
           </div>
           <!-- 销量 -->

+ 28 - 13
src/views/mall/components/prizeDraw.vue

@@ -1,23 +1,28 @@
 <template>
   <div class="prizeDrawBox">
-    <div class="text-end cursor-pointer color-666" @click="emit('success')">
-      <v-btn color="primary" variant="tonal" append-icon="mdi-pan-right">我的奖品</v-btn>
-    </div>
     <div class="d-flex flex-column align-center">
-      <div class="numberBox mb-5">恭喜您获得房券抽奖机会</div>
+      <div class="numberBox mb-5">房券抽奖</div>
       <gridPage v-if="props.type === '1'" :lotteryId="props.lotteryId" :disabled="disabled" @end="endCallback"></gridPage>
       <slotMachinePage v-if="props.type === '2'" :lotteryId="props.lotteryId" height="120" :disabled="disabled" @end="endCallback"></slotMachinePage>
 
-      <CtDialog :visible="showDialog" titleClass="text-h6" :footer="false" :widthType="3" title="抽奖详情" @close="showDialog = false">
-        <div class="d-flex align-center flex-column">
-          <svg-icon name="submit" size="300"></svg-icon>
-          <p v-for="(k, i) in prizeData" :key="i" class="mb-3">{{ k.prize.prompt }}</p>
-          <div class="my-10">
-            <v-btn color="primary" variant="outlined" width="120" @click="showDialog = false">取 消</v-btn>
-            <v-btn color="primary" width="120" class="ml-5" @click.stop="emit('success')">前往领取</v-btn>
+      <v-card min-height="300" width="600" class="mt-5 pa-5">
+        <div v-if="showDialog">
+          <p v-for="(k, i) in prizeData" :key="i">{{ k.prize.prompt }}</p>
+          <p>凭此房券在规定有效期内可享受免费住宿一晚。</p>
+          <p class="mb-5">请提供收货地址,以便安排房券派送。</p>
+
+          <!-- 收货地址 -->
+          <div>
+            <v-radio-group v-model="addressSelect" color="primary">
+              <v-radio v-for="val in address" :key="val.id" :label="val.id === 9999 ? val.label : (val.name + ',' + val.mobile + ',' + val.areaName + val.detailAddress)" :value="val.id"></v-radio>
+            </v-radio-group>
+            <v-text-field v-if="addressSelect === 9999" v-model="newAddress" label="新地址" placeholder="示例:张三,13800138000,北京市朝阳区望京街道望京街道" color="primary"></v-text-field>
+            <div class="text-center mt-3">
+              <v-btn color="primary" class="elevation-5" width="180" @click.stop="handleSubmit">确 认</v-btn>
+            </div>
           </div>
         </div>
-      </CtDialog>
+      </v-card>
     </div>
   </div>
 </template>
@@ -28,6 +33,7 @@ import gridPage from './prizeDraw/grid.vue'
 import slotMachinePage from './prizeDraw/slotMachine.vue'
 import { ref } from 'vue'
 import { getLuckLotteryRecordByOrderId } from '@/api/mall/prize'
+import { getMallUserAddressList } from '@/api/mall/address'
 import Snackbar from '@/plugins/snackbar'
 
 const emit = defineEmits(['success'])
@@ -40,14 +46,21 @@ const props = defineProps({
   }
 })
 
+const newAddress = ref('')
+const addressSelect = ref()
 const disabled = ref(false)
 
-// 获取中奖记录
+// 获取中奖记录、收货地址
+const address = ref([])
 const prizeData = ref({})
 const getRecord = async () => {
   const data = await getLuckLotteryRecordByOrderId(props.orderId)
   prizeData.value = data || []
   if (!data || !data.length) disabled.value = true
+
+  const addressData = await getMallUserAddressList()
+  address.value = [...addressData, { id: 9999, label: '使用新地址' }] || []
+  if (addressData && addressData.length) addressSelect.value = addressData[0].id
 }
 if (props.orderId) getRecord()
 
@@ -57,6 +70,8 @@ const endCallback = () => {
   showDialog.value = true
   disabled.value = true
 }
+
+const handleSubmit = async () => {}
 </script>
 
 <style scoped lang="scss">

+ 0 - 4
src/views/mall/home/index.vue

@@ -1,8 +1,5 @@
 <template>
   <div style="min-width: 1184px;" class="white-bgc">
-    <!-- 导航栏 -->
-    <Navbar />
-
     <div id="contentBox" ref="scrollBox" class="pt-3">
       <div class="default-width pb-5">
         <!-- 轮播图 -->
@@ -40,7 +37,6 @@
 <script setup>
 defineOptions({ name: 'mall-home-index'})
 import { ref, onMounted } from 'vue'
-import Navbar from '../components/navbar.vue'
 import HotGoods from './components/hotGoods.vue'
 import PointExchange from './pointExchange'
 import loginPage from '@/views/common/loginDialog.vue'

+ 1 - 3
src/views/mall/payOver/index.vue

@@ -1,7 +1,6 @@
 <!--  -->
 <template>
-  <Navbar class="mb-3" />
-  <v-card class="default-width my-3">
+  <v-card class="default-width my-3 mt-16">
     <showText :class="showPrizeDraw ? '' : 'mb-15'"></showText>
 
     <!-- 抽奖 -->
@@ -12,7 +11,6 @@
 <script setup>
 defineOptions({name: 'payOver-index'})
 import { ref } from 'vue'
-import Navbar from '../components/navbar.vue'
 import showText from './components/show.vue'
 import prizeDraw from '@/views/mall/components/prizeDraw.vue'
 import { useRoute, useRouter } from 'vue-router'

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

@@ -102,7 +102,6 @@ const handleChangePage = (e) => {
 
 // 查看详情
 const handleDetail = ({ id }) => {
-  // router.push(`/mall/user/order/detail/${id}`)
   window.open(`/mall/user/order/detail/${id}`)
 }
 

+ 0 - 5
src/views/publicRecruitment/index.vue

@@ -3,15 +3,11 @@
   <div class="py-3" :class="customClass">
     <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#fff" @update:model-value="getPositionList">
       <v-tab :value="1">{{ $t('publicRecruitment.myRecommendation') }}</v-tab>
-      <!-- <v-tab :value="2">{{ $t('publicRecruitment.withdrawalRecords') }}</v-tab> -->
     </v-tabs>
     <div class="mt-3">
       <div v-if="tab === 1">
         <myRecommendation></myRecommendation>
       </div>
-      <!-- <div v-if="tab === 2" class="pa-3 white-bgc" style="border-radius: 5px;">
-        <myRegistration></myRegistration>
-      </div> -->
     </div>
   </div>
 </template>
@@ -20,7 +16,6 @@
 defineOptions({name: 'personal-myPublicRecruitment-index'})
 import { ref } from 'vue'
 import myRecommendation from './myRecommendation.vue'
-// import myRegistration from './myRegistration.vue'
 
 defineProps({
   customClass: {

+ 8 - 9
src/views/publicRecruitment/myRecommendation.vue

@@ -26,23 +26,15 @@
 defineOptions({name: 'defineOptions-name'})
 import { ref } from 'vue'
 import { getDict } from '@/hooks/web/useDictionaries'
-import { useUserStore } from '@/store/user'
 import { 
   getHireJobCvRelCount, 
   getHireJobCvRelPage
 } from '@/api/publicRecruitment'
 import TablePage from './components/table.vue'
 // import bountyDisplay from './components/bountyDisplay.vue'
+import { useUserStore } from '@/store/user'
 
 const active = ref(0)
-
-// 更新账户信息
-const store = useUserStore()
-const updateAccountInfo = async () => {
-  await store.getUserAccountInfo()
-}
-updateAccountInfo()
-
 // 数据统计
 const statisticsList = ref([])
 const getData = async () => {
@@ -96,6 +88,13 @@ const handleStatisticsItem = (item, index) => {
   query.value.status = item.value
   getTableList()
 }
+
+// 更新账户信息
+const store = useUserStore()
+const updateAccountInfo = async () => {
+  await store.getUserAccountInfo()
+}
+updateAccountInfo()
 </script>
 
 <style lang="scss" scoped>

+ 3 - 4
src/views/recruit/personal/PersonalCenter/index.vue

@@ -50,10 +50,8 @@
 defineOptions({ name: 'person-center'})
 import { computed } from 'vue'
 import { getCurrentLocaleLang } from '@/utils/lang.js'
-import { useUserStore } from '@/store/user'
 import personCenterRoute from '@/router/modules/components/recruit/personCenter'
-
-const userStore = useUserStore()
+import { useUserStore } from '@/store/user'
 
 // 左侧菜单列表
 const list = computed(() => {
@@ -78,8 +76,9 @@ const getList = (arr, obj = []) => {
     obj.push(data)
   })
   return obj
-} 
+}
 
+const userStore = useUserStore()
 // 更新账户信息
 const updateAccountInfo = async () => {
   await userStore.getUserAccountInfo()

+ 52 - 0
src/views/recruit/personal/PersonalCenter/tradeOrder/components/commentForm.vue

@@ -0,0 +1,52 @@
+<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>

+ 100 - 0
src/views/recruit/personal/PersonalCenter/tradeOrder/components/detail.vue

@@ -0,0 +1,100 @@
+<template>
+  <div class="mt-16">
+    <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 { 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>

+ 200 - 0
src/views/recruit/personal/PersonalCenter/tradeOrder/dynamic/mallOrder.vue

@@ -0,0 +1,200 @@
+<template>
+  <div class="mt-3">
+    <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 '@/views/mall/components/GoodsItem/index.vue'
+// import CommentForm from '../components/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
+}
+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>

+ 68 - 0
src/views/recruit/personal/PersonalCenter/tradeOrder/dynamic/rechargeVip.vue

@@ -0,0 +1,68 @@
+<template>
+  <CtTable
+    class="mt-3"
+    :items="dataList"
+    :headers="headers"
+    :loading="false"
+    :elevation="0"
+    :isTools="false"
+    :showPage="true"
+    :total="total"
+    :page-info="query"
+    itemKey="id"
+    @pageHandleChange="handleChangePage"
+  >
+  </CtTable>
+</template>
+
+<script setup>
+defineOptions({name: 'tradingOrder'})
+import { getUserTradeOrder } from '@/api/recruit/personal/personalCenter'
+import { ref } from 'vue'
+import { timesTampChange } from '@/utils/date'
+import { getDict } from '@/hooks/web/useDictionaries'
+
+const total = ref(0)
+const query = ref({
+  pageNo: 1,
+  pageSize: 10
+})
+const dataList = ref([])
+
+// 支付渠道
+const channelData = ref([])
+const getPayChannelCode = async () => {
+  const { data } = await getDict('pay_channel_code')
+  channelData.value = data
+}
+getPayChannelCode()
+
+
+const headers = [
+  { title: '商品名称', key: 'spuName', sortable: false },
+  { title: '价格', key: 'price', sortable: false, value: item => item.price / 100 + '元' },
+  { title: '是否已支付', key: 'payStatus', sortable: false, value: item => item.payStatus ? '已支付' : '未支付' },
+  { title: '支付订单编号', key: 'payOrderId', sortable: false },
+  { title: '支付渠道', key: 'payChannelCode', value: item => channelData.value.find(e => e.value === item.payChannelCode)?.label, sortable: false },
+  { title: '订单支付时间', key: 'payTime', value: item =>  timesTampChange(item.payTime), sortable: false },
+  { title: '退款订单编号', key: 'payReFundId', sortable: false },
+  { title: '退款金额', key: 'refundPrice', sortable: false, value: item => item.refundPrice && item.refundPrice > 0 ? item.refundPrice / 100 + '元' : '' },
+  { title: '退款时间', key: 'refundTime', value: item =>  timesTampChange(item.refundTime), sortable: false },
+  { title: '更新时间', key: 'updateTime', value: item =>  timesTampChange(item.updateTime), sortable: false },
+]
+
+const getData = async () => {
+  const res = await getUserTradeOrder(query.value)
+  dataList.value = res.list
+  total.value = res.total
+}
+getData()
+
+const handleChangePage = (e) => {
+  query.value.pageNo = e
+  getData()
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 15 - 69
src/views/recruit/personal/PersonalCenter/tradeOrder/index.vue

@@ -1,83 +1,29 @@
 <!--  -->
 <template>
-  <div class="white-bgc pa-3 ma-3">
-    <!-- <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa" @update:model-value="handleChangeTab">
-      <v-tab :value="0">{{ '交易订单' }}</v-tab>
-    </v-tabs> -->
-    <CtTable
-      class="mt-3"
-      :items="dataList"
-      :headers="headers"
-      :loading="false"
-      :elevation="0"
-      :isTools="false"
-      :showPage="true"
-      :total="total"
-      :page-info="query"
-      itemKey="id"
-      @pageHandleChange="handleChangePage"
-    >
-    </CtTable>
+  <div class="white-bgc pa-3">
+    <v-tabs v-model="tab" align-tabs="start" color="primary" bg-color="#f7f8fa" @update:model-value="handleChangeTab">
+      <v-tab v-for="k in items" :key="k.value" :value="k.value">{{ k.label }}</v-tab>
+    </v-tabs>
+    <component :is="items[tab].path" />
   </div>
 </template>
 
 <script setup>
 defineOptions({name: 'tradingOrder'})
-import { getUserTradeOrder } from '@/api/recruit/personal/personalCenter'
-import { ref } from 'vue'
-import { timesTampChange } from '@/utils/date'
-import { getDict } from '@/hooks/web/useDictionaries'
+import { ref, shallowRef } from 'vue'
+import RechargeVipOrder from './dynamic/rechargeVip.vue'
+import MallOrder from './dynamic/mallOrder.vue'
 
-// const tab = ref(0)
-const total = ref(0)
-const query = ref({
-  pageNo: 1,
-  pageSize: 10
-})
-const dataList = ref([])
-
-// 支付渠道
-const channelData = ref([])
-const getPayChannelCode = async () => {
-  const { data } = await getDict('pay_channel_code')
-  channelData.value = data
-}
-getPayChannelCode()
-
-
-const headers = [
-  { title: '商品名称', key: 'spuName', sortable: false },
-  { title: '价格', key: 'price', sortable: false, value: item => item.price / 100 + '元' },
-  { title: '是否已支付', key: 'payStatus', sortable: false, value: item => item.payStatus ? '已支付' : '未支付' },
-  { title: '支付订单编号', key: 'payOrderId', sortable: false },
-  { title: '支付渠道', key: 'payChannelCode', value: item => channelData.value.find(e => e.value === item.payChannelCode)?.label, sortable: false },
-  { title: '订单支付时间', key: 'payTime', value: item =>  timesTampChange(item.payTime), sortable: false },
-  { title: '退款订单编号', key: 'payReFundId', sortable: false },
-  { title: '退款金额', key: 'refundPrice', sortable: false, value: item => item.refundPrice && item.refundPrice > 0 ? item.refundPrice / 100 + '元' : '' },
-  { title: '退款时间', key: 'refundTime', value: item =>  timesTampChange(item.refundTime), sortable: false },
-  { title: '更新时间', key: 'updateTime', value: item =>  timesTampChange(item.updateTime), sortable: false },
-]
-
-const getData = async () => {
-  const res = await getUserTradeOrder(query.value)
-  dataList.value = res.list
-  total.value = res.total
-}
-getData()
-
-const handleChangePage = (e) => {
-  query.value.pageNo = e
-  getData()
-}
+const tab = ref(0)
+const items = shallowRef([
+  { label: '余额充值、购买会员订单', value: 0, path: RechargeVipOrder },
+  // { label: '商城交易订单', value: 1, path: MallOrder }
+])
 
 // 切换
-// const handleChangeTab = () => {
-//   query.value.pageNo = 1
-//   query.value.type = tab.value
-//   getData()
-// }
+const handleChangeTab = () => {
+}
 
-// const headers = ref([orderHeaders.value])
 </script>
 <style lang="scss" scoped>
 </style>

+ 1 - 2
src/views/recruit/personal/home/components/advertisement/preferred.vue

@@ -77,7 +77,7 @@
           </div>
           <div class="job-class">
             <div class="job-title">工作经验</div>
-            <p class="font-size-14">{{ k.job.expName }}</p>
+            <p class="font-size-14">{{ k.job.expName || '不限' }}</p>
           </div>
           <div class="job-class">
             <div class="job-title">职位更新</div>
@@ -233,7 +233,6 @@ h2 {
       width: 20.5%;
       overflow: hidden;
       margin-right: 5%;
-      // color: #333;
       font-size: 15px;
       font-weight: 600;
     }