refactor(activityManagement): 清理未使用的文本文件并优化表格组件
- 删除 activityManagement 目录下已不再使用的三个文本文件
- 为 banner 管理页面的所有表格列添加 resizable 属性以支持列宽调整
- 优化 ReceiveRecord 组件中的日期选择器和表格列配置
- 为 ActivityOrderList 组件添加下单时间筛选功能
- 重构 ActivityInfo 组件布局,使用 div 替换 NCard 并优化空状态显示
- 修复多个组件中的代码格式和模板语法一致性
| | |
| | | })) |
| | | |
| | | const strategyColumns = [ |
| | | { title: '策略名称', key: 'name', minWidth: 200 }, |
| | | { title: '优惠券数量', key: 'couponCount', width: 120 }, |
| | | { title: '策略名称', key: 'name', minWidth: 400 }, |
| | | // { title: '优惠券数量', key: 'couponCount', width: 120 }, |
| | | ] |
| | | |
| | | const strategyData = computed(() => { |
| | |
| | | }) |
| | | |
| | | const userColumns = [ |
| | | { title: '用户群', key: 'group', width: 200 }, |
| | | { title: '策略名称', key: 'name', minWidth: 200 }, |
| | | { title: '用户数量', key: 'userCount', width: 120 }, |
| | | { title: '用户群', key: 'group', width: 400 }, |
| | | { title: '策略名称', key: 'name', minWidth: 400 }, |
| | | // { title: '用户数量', key: 'userCount', width: 120 }, |
| | | ] |
| | | |
| | | const userData = computed(() => { |
| | |
| | | </script> |
| | | |
| | | <template> |
| | | <n-spin :show="loading"> |
| | | <NSpin :show="loading"> |
| | | <div class="flex flex-col gap-12px"> |
| | | <!-- 基础信息 --> |
| | | <n-card class="rounded-6px" :bordered="false" size="medium"> |
| | | <div class="head">基础信息</div> |
| | | <div class="info-grid mt-16px"> |
| | | <div class="info-item"> |
| | | <span class="label">活动名称:</span> |
| | | <span class="value">{{ basicInfo.name }}</span> |
| | | <!-- 基础信息 --> |
| | | <div class="box"> |
| | | <div class="head"> |
| | | 基础信息 |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">活动类型:</span> |
| | | <span class="value">{{ basicInfo.type }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">活动时间:</span> |
| | | <span class="value">{{ basicInfo.time }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">是否开启活动总限额:</span> |
| | | <span class="value">{{ basicInfo.hasLimit }}</span> |
| | | </div> |
| | | <div class="info-item col-span-2"> |
| | | <span class="label">限额策略:</span> |
| | | <span class="value">{{ basicInfo.limitStrategy }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3 items-start"> |
| | | <span class="label shrink-0">活动说明:</span> |
| | | <span class="value">{{ basicInfo.desc }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3 items-start"> |
| | | <span class="label shrink-0">活动封面图:</span> |
| | | <div class="w-182px h-120px bg-[#F2F3F5] rounded-4px"> |
| | | <n-image |
| | | v-if="basicInfo.cover" |
| | | :src="basicInfo.cover" |
| | | object-fit="cover" |
| | | class="rounded-4px border border-[#E5E5E5]" |
| | | fallback-src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/ab6c7ff4-403a-4a2c-9ebf-310c023dc20f.png" |
| | | /> |
| | | <div class="info-grid mt-16px"> |
| | | <div class="info-item"> |
| | | <span class="label">活动名称:</span> |
| | | <span class="value">{{ basicInfo.name }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">活动类型:</span> |
| | | <span class="value">{{ basicInfo.type }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">活动时间:</span> |
| | | <span class="value">{{ basicInfo.time }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">是否开启活动总限额:</span> |
| | | <span class="value">{{ basicInfo.hasLimit }}</span> |
| | | </div> |
| | | <div class="info-item col-span-2"> |
| | | <span class="label">限额策略:</span> |
| | | <span class="value">{{ basicInfo.limitStrategy }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3 items-start"> |
| | | <span class="label shrink-0">活动说明:</span> |
| | | <span class="value">{{ basicInfo.desc }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3 items-start"> |
| | | <span class="label shrink-0">活动封面图:</span> |
| | | <div class="w-182px h-120px bg-[#F2F3F5] rounded-4px"> |
| | | <NImage |
| | | v-if="basicInfo.cover" |
| | | :src="basicInfo.cover" |
| | | object-fit="cover" |
| | | class="rounded-4px border border-[#E5E5E5]" |
| | | fallback-src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/ab6c7ff4-403a-4a2c-9ebf-310c023dc20f.png" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </n-card> |
| | | |
| | | <!-- 活动策略 1 --> |
| | | <n-card class="rounded-6px" :bordered="false" size="medium"> |
| | | <div class="head">活动策略</div> |
| | | <div class="mt-16px"> |
| | | <n-data-table |
| | | :columns="strategyColumns" |
| | | :data="strategyData" |
| | | :bordered="false" |
| | | /> |
| | | </div> |
| | | </n-card> |
| | | |
| | | <!-- 发放用户 --> |
| | | <n-card class="rounded-6px" :bordered="false" size="medium"> |
| | | <div class="head">发放用户</div> |
| | | <div class="mt-16px"> |
| | | <n-data-table |
| | | :columns="userColumns" |
| | | :data="userData" |
| | | :bordered="false" |
| | | /> |
| | | </div> |
| | | </n-card> |
| | | |
| | | <!-- 通知方式 --> |
| | | <n-card class="rounded-6px" :bordered="false" size="medium"> |
| | | <div class="head">通知方式</div> |
| | | <div class="mt-16px"> |
| | | <div class="sub-title mb-12px">微信消息通知</div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">触达时机:</span> |
| | | <span class="value">{{ wechatNotify.trigger }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期时间通知:</span> |
| | | <span class="value">{{ wechatNotify.expire }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">券生效通知:</span> |
| | | <span class="value">{{ wechatNotify.effect }}</span> |
| | | </div> |
| | | <!-- 活动策略 1 --> |
| | | <div class="box"> |
| | | <div class="head"> |
| | | 活动策略 |
| | | </div> |
| | | |
| | | <div class="sub-title mt-32px mb-12px">短信通知</div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">触达时机:</span> |
| | | <span class="value">{{ smsNotify.trigger }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期时间通知:</span> |
| | | <span class="value">{{ smsNotify.expire }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">券生效通知:</span> |
| | | <span class="value">{{ smsNotify.effect }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3"> |
| | | <span class="label">短信通知屏蔽时间:</span> |
| | | <span class="value">{{ smsNotify.blockTime }}</span> |
| | | </div> |
| | | <div class="mt-16px"> |
| | | <NDataTable |
| | | :columns="strategyColumns" |
| | | :data="strategyData" |
| | | :bordered="false" |
| | | :style="strategyData.length === 0 ? { minHeight: '262px' } : {}" |
| | | :pagination="false" |
| | | > |
| | | <template #empty> |
| | | <div class="flex-center"> |
| | | <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"> |
| | | </div> |
| | | </template> |
| | | </NDataTable> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="sub-title mt-32px mb-12px">小程序弹窗通知</div> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">触达时机:</span> |
| | | <span class="value">{{ miniProgramNotify.trigger }}</span> |
| | | <!-- 发放用户 --> |
| | | <div class="box"> |
| | | <div class="head"> |
| | | 发放用户 |
| | | </div> |
| | | <div class="mt-16px"> |
| | | <NDataTable |
| | | :columns="userColumns" |
| | | :data="userData" |
| | | :bordered="false" |
| | | :style="userData.length === 0 ? { minHeight: '262px' } : {}" |
| | | :pagination="false" |
| | | > |
| | | <template #empty> |
| | | <div class="flex-center"> |
| | | <img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }"> |
| | | </div> |
| | | </template> |
| | | </NDataTable> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 通知方式 --> |
| | | <div class="box"> |
| | | <div class="head"> |
| | | 通知方式 |
| | | </div> |
| | | <div class="mt-16px"> |
| | | <div class="sub-title mb-12px"> |
| | | 微信消息通知 |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">弹窗标题:</span> |
| | | <span class="value">{{ miniProgramNotify.title }}</span> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">触达时机:</span> |
| | | <span class="value">{{ wechatNotify.trigger }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期时间通知:</span> |
| | | <span class="value">{{ wechatNotify.expire }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">券生效通知:</span> |
| | | <span class="value">{{ wechatNotify.effect }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">按钮文案:</span> |
| | | <span class="value">{{ miniProgramNotify.buttonText }}</span> |
| | | |
| | | <div class="sub-title mt-32px mb-12px"> |
| | | 短信通知 |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">券生效通知:</span> |
| | | <span class="value">{{ miniProgramNotify.effect }}</span> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">触达时机:</span> |
| | | <span class="value">{{ smsNotify.trigger }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期时间通知:</span> |
| | | <span class="value">{{ smsNotify.expire }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">券生效通知:</span> |
| | | <span class="value">{{ smsNotify.effect }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3"> |
| | | <span class="label">短信通知屏蔽时间:</span> |
| | | <span class="value">{{ smsNotify.blockTime }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">生效toast文案:</span> |
| | | <span class="value">{{ miniProgramNotify.effectToast }}</span> |
| | | |
| | | <div class="sub-title mt-32px mb-12px"> |
| | | 小程序弹窗通知 |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期时间通知:</span> |
| | | <span class="value">{{ miniProgramNotify.expire }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期toast文案:</span> |
| | | <span class="value">{{ miniProgramNotify.expireToast }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">是否开启浮窗:</span> |
| | | <span class="value">{{ miniProgramNotify.enableFloat }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">浮窗优先级:</span> |
| | | <span class="value">{{ miniProgramNotify.floatPriority }}</span> |
| | | </div> |
| | | <div class="info-item col-span-3"> |
| | | <span class="label">跳转链接:</span> |
| | | <span class="value">{{ miniProgramNotify.linkUrl }}</span> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <span class="label">弹窗标题:</span> |
| | | <span class="value">{{ miniProgramNotify.title }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">按钮文案:</span> |
| | | <span class="value">{{ miniProgramNotify.buttonText }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">券生效通知:</span> |
| | | <span class="value">{{ miniProgramNotify.effect }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">生效toast文案:</span> |
| | | <span class="value">{{ miniProgramNotify.effectToast }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期时间通知:</span> |
| | | <span class="value">{{ miniProgramNotify.expire }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">到期toast文案:</span> |
| | | <span class="value">{{ miniProgramNotify.expireToast }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">是否开启浮窗:</span> |
| | | <span class="value">{{ miniProgramNotify.enableFloat }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">浮窗优先级:</span> |
| | | <span class="value">{{ miniProgramNotify.floatPriority }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">跳转链接:</span> |
| | | <span class="value">{{ miniProgramNotify.linkUrl }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </n-card> |
| | | </div> |
| | | </n-spin> |
| | | </NSpin> |
| | | </template> |
| | | |
| | | <style scoped lang="scss"> |
| | | :deep(.n-card__content) { |
| | | padding: 16px 24px; |
| | | } |
| | | .head { |
| | | font-family: PingFang SC; |
| | | font-size: 16px; |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | line-height: 24px; |
| | | letter-spacing: normal; |
| | | color: #171f26; |
| | | position: relative; |
| | |
| | | border-radius: 3px; |
| | | background: #0068ff; |
| | | } |
| | | } |
| | | |
| | | .box { |
| | | background-color: #fff; |
| | | border-radius: 6px; |
| | | padding: 16px 24px; |
| | | } |
| | | |
| | | .info-grid { |
| | |
| | | |
| | | .sub-title{ |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | line-height: 20px; |
| | | color: #171F26; |
| | | font-weight: 500; |
| | | line-height: 20px; |
| | | color: #171F26; |
| | | } |
| | | |
| | | :deep(.n-data-table .n-data-table-th) { |
| | |
| | | channel: null, |
| | | city: null, |
| | | status: null, |
| | | orderTime: null, |
| | | }) |
| | | |
| | | const loading = ref(false) |
| | |
| | | channel: null, |
| | | city: null, |
| | | status: null, |
| | | orderTime: null, |
| | | } |
| | | currentPage.value = 1 |
| | | getList() |
| | |
| | | } |
| | | |
| | | function handleDetail(row: any) { |
| | | message.info('点击了详情: ' + row.id) |
| | | message.info(`点击了详情: ${row.id}`) |
| | | } |
| | | |
| | | async function getList() { |
| | |
| | | |
| | | for (let i = 0; i < pageSize.value; i++) { |
| | | const idx = (currentPage.value - 1) * pageSize.value + i + 1 |
| | | if (idx > 1000) break |
| | | if (idx > 1000) |
| | | break |
| | | |
| | | mockData.push({ |
| | | id: `mock-${idx}`, |
| | |
| | | } |
| | | list.value = mockData |
| | | total.value = 1000 |
| | | } finally { |
| | | } |
| | | finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | |
| | | </NSelect> |
| | | ), |
| | | }, |
| | | { |
| | | label: '下单时间', |
| | | path: 'orderTime', |
| | | render: () => <n-date-picker format="yyyy/MM/dd" v-model:value={searchModel.value.orderTime} type="daterange" clearable actions={[]} close-on-select={true} />, |
| | | }, |
| | | ]) |
| | | |
| | | const columns = computed<DataTableColumns<any>>(() => [ |
| | | { type: 'selection', width: 40 }, |
| | | { title: '订单编号', key: 'orderNo', width: 100, align: 'left' }, |
| | | { title: '下单时间', key: 'orderTime', width: 150, align: 'left' }, |
| | | { title: '订单来源', key: 'source', width: 120, align: 'left' }, |
| | | { title: '乘车时间', key: 'rideTime', width: 150, align: 'left' }, |
| | | { title: '下单用户昵称', key: 'userName', width: 120, align: 'left' }, |
| | | { title: '下单用户手机', key: 'userPhone', width: 120, align: 'left' }, |
| | | { title: '起点', key: 'startPoint', width: 150, align: 'left', ellipsis: true }, |
| | | { title: '终点', key: 'endPoint', width: 150, align: 'left', ellipsis: true }, |
| | | { title: '订单金额', key: 'orderAmount', width: 100, align: 'left' }, |
| | | { title: '优惠金额', key: 'discountAmount', width: 100, align: 'left' }, |
| | | { type: 'selection', width: 50, resizable: true }, |
| | | { title: '订单编号', key: 'orderNo', width: 100, resizable: true }, |
| | | { title: '下单时间', key: 'orderTime', width: 150, resizable: true }, |
| | | { title: '订单来源', key: 'source', width: 120, resizable: true }, |
| | | { title: '乘车时间', key: 'rideTime', width: 150, resizable: true }, |
| | | { title: '下单用户昵称', key: 'userName', width: 120, resizable: true }, |
| | | { title: '下单用户手机', key: 'userPhone', width: 120, resizable: true }, |
| | | { title: '起点', key: 'startPoint', width: 150, resizable: true, ellipsis: true }, |
| | | { title: '终点', key: 'endPoint', width: 150, resizable: true, ellipsis: true }, |
| | | { title: '订单金额', key: 'orderAmount', width: 100, resizable: true }, |
| | | { title: '优惠金额', key: 'discountAmount', width: 100, resizable: true }, |
| | | { |
| | | title: '操作', |
| | | key: 'actions', |
| | | width: 80, |
| | | fixed: 'right', |
| | | align: 'left', |
| | | render: (row) => { |
| | | return <NButton text type="primary" onClick={() => handleDetail(row)}>详情</NButton> |
| | | }, |
| | |
| | | <template> |
| | | <div class="orderListCard roboTaxi"> |
| | | <div class="roboTaxi-form-card"> |
| | | <n-form |
| | | <NForm |
| | | :model="searchModel" |
| | | label-placement="left" |
| | | inline |
| | | :show-feedback="false" |
| | | > |
| | | <SearchPanel> |
| | | <n-gi v-for="item in filterItems" :key="item.path"> |
| | | <n-form-item :label="item.label" :path="item.path"> |
| | | <NGi v-for="item in filterItems" :key="item.path" class="n-grid-item"> |
| | | <NFormItem :label="item.label" :path="item.path"> |
| | | <component :is="item.render" /> |
| | | </n-form-item> |
| | | </n-gi> |
| | | </NFormItem> |
| | | </NGi> |
| | | <template #action> |
| | | <NButton @click="handleReset">重置</NButton> |
| | | <NButton type="primary" @click="handleSearch">查询</NButton> |
| | | <NButton @click="handleReset"> |
| | | 重置 |
| | | </NButton> |
| | | <NButton type="primary" @click="handleSearch"> |
| | | 查询 |
| | | </NButton> |
| | | </template> |
| | | </SearchPanel> |
| | | </n-form> |
| | | </NForm> |
| | | </div> |
| | | |
| | | <n-card class="flex-1 robotaxi-table-card" :bordered="false"> |
| | | <NCard class="flex-1 robotaxi-table-card" :bordered="false"> |
| | | <template #header> |
| | | <div class="flex items-center gap-16px"> |
| | | <div class="flex gap-2px items-center"> |
| | |
| | | }) |
| | | }} |
| | | </span> |
| | | <NButton @click="handleBatchExport" |
| | | >批量导出订单</NButton |
| | | > |
| | | <NButton @click="handleBatchExport"> |
| | | 批量导出订单 |
| | | </NButton> |
| | | </div> |
| | | <!-- <NButton @click="handleBatchExport">批量导出订单</NButton> --> |
| | | <div class="label"> |
| | | <span class="mr-16px" |
| | | >订单金额合计: <span class="value">{{ orderTotal }}元</span> |
| | | <span class="mr-16px">订单金额合计: <span class="value">{{ orderTotal }}元</span> |
| | | </span> |
| | | <span |
| | | >优惠金额合计: <span class="value">{{ discountTotal }}元</span> |
| | | <span>优惠金额合计: <span class="value">{{ discountTotal }}元</span> |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <div class="flex-1 flex flex-col h-full"> |
| | | <n-data-table |
| | | <NDataTable |
| | | class="flex-1" |
| | | :columns="columns" |
| | | :data="list" |
| | |
| | | :bordered="false" |
| | | :scroll-x="1400" |
| | | :row-key="(row) => row.id" |
| | | @update:checked-row-keys="handleCheck" |
| | | flex-height |
| | | @update:checked-row-keys="handleCheck" |
| | | /> |
| | | <Pagination |
| | | :count="total" |
| | |
| | | @change="handlePageChange" |
| | | /> |
| | | </div> |
| | | </n-card> |
| | | </NCard> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | |
| | | for (let i = 0; i < pageSize.value; i++) { |
| | | const idx = (currentPage.value - 1) * pageSize.value + i + 1 |
| | | if (idx > 1000) break |
| | | if (idx > 1000) |
| | | break |
| | | |
| | | mockData.push({ |
| | | id: `mock-${idx}`, |
| | |
| | | } |
| | | list.value = mockData |
| | | total.value = 1000 |
| | | } finally { |
| | | } |
| | | finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | |
| | | { |
| | | label: '领取时间', |
| | | path: 'time', |
| | | render: () => <NDatePicker |
| | | v-model:value={searchModel.value.time} |
| | | type="datetimerange" clearable |
| | | actions={[]} |
| | | close-on-select={true} |
| | | start-placeholder="开始时间" |
| | | end-placeholder="结束时间" |
| | | separator="-" |
| | | />, |
| | | render: () => ( |
| | | <NDatePicker |
| | | v-model:value={searchModel.value.time} |
| | | type="datetimerange" |
| | | clearable |
| | | actions={[]} |
| | | close-on-select={true} |
| | | start-placeholder="开始时间" |
| | | end-placeholder="结束时间" |
| | | separator="-" |
| | | /> |
| | | ), |
| | | }, |
| | | { |
| | | label: '领取人', |
| | |
| | | label: '状态', |
| | | path: 'status', |
| | | render: () => ( |
| | | <NSelect v-model:value={searchModel.value.status} |
| | | options={statusOptions} |
| | | placeholder="请选择" |
| | | clearable |
| | | max-tag-count="responsive" |
| | | <NSelect |
| | | v-model:value={searchModel.value.status} |
| | | options={statusOptions} |
| | | placeholder="请选择" |
| | | clearable |
| | | max-tag-count="responsive" |
| | | onUpdate:show={(value: boolean) => isStatusSelectOpen.value = value} |
| | | > |
| | | {{ |
| | | {{ |
| | | arrow: () => ( |
| | | <img |
| | | src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png" |
| | |
| | | ]) |
| | | |
| | | const columns = computed<DataTableColumns<any>>(() => [ |
| | | { type: 'selection' }, |
| | | { title: '领取时间', key: 'time', align: 'left' }, |
| | | { title: '领取人', key: 'receiver', align: 'left' }, |
| | | { title: '领取人电话', key: 'phone', align: 'left' }, |
| | | { title: '领取数量', key: 'count', align: 'left' }, |
| | | { title: '到期时间', key: 'expireTime', align: 'left' }, |
| | | { type: 'selection', width: 50, resizable: true }, |
| | | { title: '领取时间', key: 'time', resizable: true }, |
| | | { title: '领取人', key: 'receiver', resizable: true }, |
| | | { title: '领取人电话', key: 'phone', resizable: true }, |
| | | { title: '领取数量', key: 'count', resizable: true }, |
| | | { title: '到期时间', key: 'expireTime', resizable: true }, |
| | | { |
| | | title: '状态', |
| | | key: 'status', |
| | | align: 'left', |
| | | resizable: true, |
| | | render: (row) => { |
| | | let type: 'default' | 'success' | 'warning' | 'error' | 'info' | 'primary' = 'default' |
| | | switch (row.status) { |
| | |
| | | <template> |
| | | <div class="recordCard roboTaxi"> |
| | | <div class="roboTaxi-form-card"> |
| | | <n-form |
| | | <NForm |
| | | :model="searchModel" |
| | | label-placement="left" |
| | | inline |
| | | :show-feedback="false" |
| | | > |
| | | <SearchPanel> |
| | | <n-gi v-for="item in filterItems" :key="item.path"> |
| | | <n-form-item :label="item.label" :path="item.path"> |
| | | <NGi v-for="item in filterItems" :key="item.path"> |
| | | <NFormItem :label="item.label" :path="item.path"> |
| | | <component :is="item.render" /> |
| | | </n-form-item> |
| | | </n-gi> |
| | | </NFormItem> |
| | | </NGi> |
| | | <template #action> |
| | | <NButton @click="handleReset">重置</NButton> |
| | | <NButton type="primary" @click="handleSearch">查询</NButton> |
| | | <NButton @click="handleReset"> |
| | | 重置 |
| | | </NButton> |
| | | <NButton type="primary" @click="handleSearch"> |
| | | 查询 |
| | | </NButton> |
| | | </template> |
| | | </SearchPanel> |
| | | </n-form> |
| | | </NForm> |
| | | </div> |
| | | |
| | | <n-card class="flex-1 robotaxi-table-card" :bordered="false"> |
| | | <NCard class="flex-1 robotaxi-table-card" :bordered="false"> |
| | | <template #header> |
| | | <div class="flex gap-2 items-center"> |
| | | <span |
| | |
| | | </span> |
| | | |
| | | <NButton |
| | | @click="handleBatchDelete" |
| | | :disabled="checkedRowKeys.length === 0" |
| | | >批量删除</NButton |
| | | @click="handleBatchDelete" |
| | | > |
| | | 批量删除 |
| | | </NButton> |
| | | </div> |
| | | </template> |
| | | <div class="flex-1 flex flex-col h-full"> |
| | | <n-data-table |
| | | <NDataTable |
| | | class="flex-1" |
| | | :columns="columns" |
| | | :data="list" |
| | |
| | | :bordered="false" |
| | | :scroll-x="1000" |
| | | :row-key="(row) => row.id" |
| | | @update:checked-row-keys="handleCheck" |
| | | flex-height |
| | | @update:checked-row-keys="handleCheck" |
| | | /> |
| | | <Pagination |
| | | :count="total" |
| | |
| | | @change="handlePageChange" |
| | | /> |
| | | </div> |
| | | </n-card> |
| | | </NCard> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | label: '状态', |
| | | path: 'status', |
| | | render: () => ( |
| | | <n-select |
| | | v-model:value={searchForm.value.status} |
| | | options={statusOptions as any} |
| | | placeholder="请选择状态" |
| | | onUpdate:show={(value: boolean) => isStatusSelectOpen.value = value} |
| | | clearable > |
| | | {{ |
| | | <n-select |
| | | v-model:value={searchForm.value.status} |
| | | options={statusOptions as any} |
| | | placeholder="请选择状态" |
| | | onUpdate:show={(value: boolean) => isStatusSelectOpen.value = value} |
| | | clearable |
| | | > |
| | | {{ |
| | | arrow: () => ( |
| | | <img |
| | | src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png" |
| | | class={`arrow-icon ${isStatusSelectOpen.value ? 'arrow-icon--open' : ''}`} |
| | | class={`arrow-icon ${isStatusSelectOpen.value ? 'arrow-icon--open' : ''}`} |
| | | style={{ width: '16px', height: '16px' }} |
| | | alt="arrow" |
| | | /> |
| | |
| | | </div> |
| | | ), |
| | | }} |
| | | </n-select> |
| | | </n-select> |
| | | ), |
| | | }, |
| | | ]) |
| | |
| | | { |
| | | type: 'selection', |
| | | width: 50, |
| | | resizable: true, |
| | | }, |
| | | { |
| | | title: '广告图', |
| | | key: 'bannerPictures', |
| | | width: 120, |
| | | resizable: true, |
| | | render: (row) => { |
| | | let url = '' |
| | | try { |
| | |
| | | title: '广告标题', |
| | | key: 'bannerTitle', |
| | | width: 120, |
| | | resizable: true, |
| | | }, |
| | | // { |
| | | // title: '排序', |
| | |
| | | title: '显示时间', |
| | | key: 'time', |
| | | width: 300, |
| | | resizable: true, |
| | | render: (row) => { |
| | | return `${row.startTime} 至 ${row.endTime}` |
| | | }, |
| | |
| | | title: '状态', |
| | | key: 'status', |
| | | width: 100, |
| | | resizable: true, |
| | | render: (row) => { |
| | | const statusMap = { |
| | | 0: { text: '未开始', type: 'warning' as const }, |
| | |
| | | title: '上架状态', |
| | | key: 'bannerStatus', |
| | | width: 100, |
| | | resizable: true, |
| | | render: (row) => { |
| | | return ( |
| | | <n-switch |
| | |
| | | key: 'jumpTarget', |
| | | width: 200, |
| | | ellipsis: true, |
| | | resizable: true, |
| | | render: (row) => { |
| | | if (row.jumpType === 2) { |
| | | const name = row.appletName || '小程序' |
| | |
| | | title: '创建时间', |
| | | key: 'createTime', |
| | | width: 180, |
| | | resizable: true, |
| | | render: row => row.createTime ? dayjs(row.createTime).format('YYYY/MM/DD HH:mm') : '-', |
| | | }, |
| | | { |
| | |
| | | positiveText: '确定', |
| | | negativeText: '取消', |
| | | maskClosable: false, |
| | | autoFocus: false, |
| | | autoFocus: false, |
| | | onPositiveClick: async () => { |
| | | const { error, code } = await deleteBanner(row.id) as any |
| | | if (!error && code === 200) { |
| | |
| | | positiveText: '确定', |
| | | negativeText: '取消', |
| | | maskClosable: false, |
| | | autoFocus: false, |
| | | autoFocus: false, |
| | | onPositiveClick: async () => { |
| | | // 并发删除 |
| | | try { |
| | |
| | | </n-form-item> |
| | | </n-gi> |
| | | <template #action> |
| | | <n-button @click="handleReset"> 重置 </n-button> |
| | | <n-button type="primary" @click="handleSearch"> 查询 </n-button> |
| | | <n-button @click="handleReset"> |
| | | 重置 |
| | | </n-button> |
| | | <n-button type="primary" @click="handleSearch"> |
| | | 查询 |
| | | </n-button> |
| | | </template> |
| | | </SearchPanel> |
| | | </n-form> |
| | |
| | | src="/src/assets/element-img/no-data.png" |
| | | style="width: 123px; height: 125px" |
| | | @error="(e: any) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }" |
| | | /> |
| | | > |
| | | </div> |
| | | </template> |
| | | </n-data-table> |