完善功能
This commit is contained in:
26
src/api/wxcode.ts
Normal file
26
src/api/wxcode.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 渠道列表
|
||||
export function apiWxcodeLists(params: any) {
|
||||
return request.get({ url: '/wxcode/lists', params })
|
||||
}
|
||||
|
||||
// 添加渠道
|
||||
export function apiWxcodeAdd(params: any) {
|
||||
return request.post({ url: '/wxcode/add', params })
|
||||
}
|
||||
|
||||
// 编辑渠道
|
||||
export function apiWxcodeEdit(params: any) {
|
||||
return request.post({ url: '/wxcode/edit', params })
|
||||
}
|
||||
|
||||
// 删除渠道
|
||||
export function apiWxcodeDelete(params: any) {
|
||||
return request.post({ url: '/wxcode/delete', params })
|
||||
}
|
||||
|
||||
// 渠道详情
|
||||
export function apiWxcodeDetail(params: any) {
|
||||
return request.get({ url: '/wxcode/detail', params })
|
||||
}
|
||||
38
src/views/order/order_group/details.vue
Normal file
38
src/views/order/order_group/details.vue
Normal file
@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<div class="article-edit">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-page-header :content="$route.meta.title" @back="$router.back()" />
|
||||
</el-card>
|
||||
|
||||
<el-form ref="formRef" label-width="120px">
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">订单详情</div>
|
||||
<el-form-item label="订单编号"> {{ order.order_sn }} </el-form-item>
|
||||
<el-form-item label="茶室"> {{ order.store_name }} </el-form-item>
|
||||
<el-form-item label="包间"> {{ order.room_name || '一' }} </el-form-item>
|
||||
<el-form-item label="用户昵称"> {{ order.room_name || '一' }} </el-form-item>
|
||||
<el-form-item label="用户手机号"> {{ order.mobile }} </el-form-item>
|
||||
<el-form-item label="支付金额"> {{ order.order_amount }} </el-form-item>
|
||||
<el-form-item label="支付方式"> {{ order.pay_way == 1 ? '平台余额' : '微信支付' }} </el-form-item>
|
||||
<el-form-item label="订单状态"> {{ orderStatusMap[order.order_status] ?? order.order_status
|
||||
}}</el-form-item>
|
||||
<el-form-item label="创建时间"> {{ order.dtime }}</el-form-item>
|
||||
</el-card>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
const route = useRoute()
|
||||
const order = JSON.parse(route.query.params as string)
|
||||
|
||||
const orderStatusMap: Record<string, string> = {
|
||||
0: '未支付',
|
||||
1: '已支付',
|
||||
2: '已取消',
|
||||
3: '已使用',
|
||||
4: '使用中',
|
||||
5: '已完成',
|
||||
6: '已退款',
|
||||
}
|
||||
</script>
|
||||
@ -56,8 +56,18 @@
|
||||
<el-table-column label="创建时间" prop="dtime" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['order_group/edit']" type="primary" link @click="handleEdit(row)">
|
||||
<!-- <el-button v-perms="['order_group/edit']" type="primary" link @click="handleEdit(row)">
|
||||
查看
|
||||
</el-button> -->
|
||||
<el-button v-perms="['order_group/details']" type="primary" link>
|
||||
<router-link :to="{
|
||||
path: getRoutePath('order_group/details'),
|
||||
query: {
|
||||
params: JSON.stringify(row)
|
||||
}
|
||||
}">
|
||||
查看
|
||||
</router-link>
|
||||
</el-button>
|
||||
<!-- <el-button
|
||||
v-perms="['order_group/delete']"
|
||||
@ -86,6 +96,7 @@ import { apiOrderGroupLists, apiOrderGroupDelete } from '@/api/order_group'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
import { getRoutePath } from '@/router'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
|
||||
107
src/views/order/order_store/details.vue
Normal file
107
src/views/order/order_store/details.vue
Normal file
@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<div class="article-edit">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-page-header :content="$route.meta.title" @back="$router.back()" />
|
||||
</el-card>
|
||||
|
||||
<el-form ref="formRef" label-width="120px">
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">订单编号和状态</div>
|
||||
<el-form-item label="订单编号"> {{ order.order_sn }} </el-form-item>
|
||||
<el-form-item label="订单状态">
|
||||
{{ orderStatusMap[order.order_status] ?? order.order_status }}
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">用户信息</div>
|
||||
<el-form-item label="昵称"> {{ order.nickname || '一' }} </el-form-item>
|
||||
<el-form-item label="手机号"> {{ order.mobile }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">预定信息</div>
|
||||
<el-form-item label="预定茶室"> {{ order.store_name }} </el-form-item>
|
||||
<el-form-item label="预定包间"> {{ order.room_name }} </el-form-item>
|
||||
<el-form-item label="预定日期"> {{ order.day_time }} </el-form-item>
|
||||
<el-form-item label="预定小时数"> {{ order.hours }} </el-form-item>
|
||||
<el-form-item label="预定时间段"> {{ order.timeslot }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">价格信息</div>
|
||||
<el-form-item label="包间单价"> {{ order.room_price }} </el-form-item>
|
||||
<el-form-item label="包间总价"> {{ order.room_all_price }} </el-form-item>
|
||||
<el-form-item label="优惠券价格"> {{ order.coupon_price }} </el-form-item>
|
||||
<el-form-item label="团购优惠价"> {{ order.group_price }} </el-form-item>
|
||||
<el-form-item label="会员优惠价"> {{ order.member_price }} </el-form-item>
|
||||
<el-form-item label="使用会员优惠价"> {{ order.is_member_price == 1 ? '是' : '否' }} </el-form-item>
|
||||
<el-form-item label="平台服务费"> {{ order.service_price }} </el-form-item>
|
||||
<el-form-item label="实付价格"> {{ order.order_amount }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">续单信息</div>
|
||||
<el-form-item label="是否续单"> {{ order.is_renewal == 1 ? '是' : '否' }} </el-form-item>
|
||||
<el-form-item label="续订时间"> {{ order.renew_dtime }} </el-form-item>
|
||||
<el-form-item label="续订小时"> {{ order.renew_hour }} </el-form-item>
|
||||
<el-form-item label="续费金额"> {{ order.renew_price }} </el-form-item>
|
||||
<el-form-item label="续费金额"> {{ order.renew_price }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">支付内容</div>
|
||||
<el-form-item label="支付方式">
|
||||
{{ payWayMap[order.pay_way] ?? order.pay_way }}
|
||||
</el-form-item>
|
||||
<el-form-item label="支付状态">
|
||||
{{ order.pay_status == 1 ? '已支付' : '未支付' }}
|
||||
</el-form-item>
|
||||
<el-form-item label="支付时间"> {{ order.pay_time }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">备注</div>
|
||||
<el-form-item label="备注"> {{ order.remark || '一' }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">其它信息</div>
|
||||
<el-form-item label="是否释放"> {{ order.is_release == 1 ? '是' : '否' }} </el-form-item>
|
||||
<el-form-item label="是否转让"> {{ order.is_transfer == 1 ? '是' : '否' }} </el-form-item>
|
||||
<el-form-item label="是否已下发门锁"> {{ order.is_lockpwd == 1 ? '是' : '否' }} </el-form-item>
|
||||
</el-card>
|
||||
</el-form>
|
||||
|
||||
<!-- <footer-btns>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</footer-btns> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('is_teacup,pay_way,order_status,pay_status')
|
||||
|
||||
const route = useRoute()
|
||||
const order = JSON.parse(route.query.params as string)
|
||||
|
||||
const payWayMap: Record<string, string> = {
|
||||
0: '——',
|
||||
1: '余额支付',
|
||||
2: '微信支付',
|
||||
3: '门店支付',
|
||||
4: '管理员添加',
|
||||
}
|
||||
|
||||
const orderStatusMap: Record<string, string> = {
|
||||
0: '未支付',
|
||||
1: '预约单',
|
||||
2: '消费中',
|
||||
3: '已完结',
|
||||
4: '已取消',
|
||||
5: '已退款',
|
||||
}
|
||||
</script>
|
||||
@ -68,61 +68,26 @@
|
||||
<div>会员优惠价: {{ row.member_price }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否使用会员优惠价" prop="is_member_price" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.is_member_price == 1 ? '是' : '否' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="实付价格" prop="order_amount" show-overflow-tooltip />
|
||||
<el-table-column label="平台服务费" prop="service_price" show-overflow-tooltip />
|
||||
<el-table-column label="备注" prop="remark" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.remark || '一' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="是否释放" prop="is_release" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.is_release == 1 ? '是' : '否' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否续单" prop="is_renewal" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.is_renewal == 1 ? '是' : '否' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="转让单" prop="is_transfer" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.is_transfer == 1 ? '是' : '否' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="续订时间" prop="renew_dtime" show-overflow-tooltip />
|
||||
<el-table-column label="续订小时" prop="renew_hour" show-overflow-tooltip />
|
||||
<el-table-column label="续费金额" prop="renew_price" show-overflow-tooltip />
|
||||
<el-table-column label="支付方式" prop="pay_way" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
{{ payWayMap[row.pay_way] ?? row.pay_way }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="实付价格" prop="order_amount" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="订单状态" prop="order_status" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
{{ orderStatusMap[row.order_status] ?? row.order_status }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="支付状态" prop="pay_status" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.is_lockpwd == 1 ? '已支付' : '未支付' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否已下发门锁" prop="is_lockpwd" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.is_lockpwd == 1 ? '是' : '否' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['order_store/edit']" type="primary" link @click="handleEdit(row)">
|
||||
查看
|
||||
<el-button v-perms="['order_store/details']" type="primary" link>
|
||||
<router-link :to="{
|
||||
path: getRoutePath('order_store/details'),
|
||||
query: {
|
||||
params: JSON.stringify(row)
|
||||
}
|
||||
}">
|
||||
查看
|
||||
</router-link>
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -144,6 +109,7 @@ import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
import store from '@/stores'
|
||||
import { getRoutePath } from '@/router'
|
||||
|
||||
const payWayMap: Record<string, string> = {
|
||||
0: '——',
|
||||
|
||||
@ -4,68 +4,112 @@
|
||||
<el-page-header :content="$route.meta.title" @back="$router.back()" />
|
||||
</el-card>
|
||||
|
||||
<el-card class="mt-4 !border-none" shadow="never">
|
||||
<el-descriptions title="订单编号">
|
||||
<el-descriptions-item label="订单编号">123</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-form ref="formRef" label-width="120px">
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">订单编号和状态</div>
|
||||
<el-form-item label="订单编号"> {{ order.order_sn }} </el-form-item>
|
||||
<el-form-item label="订单状态">
|
||||
<dict-value :options="dictData.order_status" :value="order.order_status" />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="茶艺师信息">
|
||||
<el-descriptions-item label="手机号">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="昵称">18100000000</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">茶艺师</div>
|
||||
<el-form-item label="名称"> {{ order.nickname }} </el-form-item>
|
||||
<el-form-item label="手机号"> {{ order.mobile }} </el-form-item>
|
||||
<el-form-item label="收入"> {{ order.team_income_price }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="用户信息">
|
||||
<el-descriptions-item label="手机号">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="昵称">18100000000</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">用户信息</div>
|
||||
<el-form-item label="昵称"> {{ order.user_nickname }} </el-form-item>
|
||||
<el-form-item label="手机号"> {{ order.user_mobile }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="服务方式">
|
||||
<el-descriptions-item label="服务日期">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="服务时间">18100000000</el-descriptions-item>
|
||||
<el-descriptions-item label="服务方式">18100000000</el-descriptions-item>
|
||||
<el-descriptions-item label="服务地址">18100000000</el-descriptions-item>
|
||||
<el-descriptions-item label="使用茶具">18100000000</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">服务方式</div>
|
||||
<el-form-item label="服务日期"> {{ order.day_time }} </el-form-item>
|
||||
<el-form-item label="服务时间"> {{ order.start_time }} - {{ order.end_time }} </el-form-item>
|
||||
<el-form-item label="服务方式"> {{ getServerTypeLabel(order.server_type) }} </el-form-item>
|
||||
<el-form-item label="服务地址"> {{ order.address }} </el-form-item>
|
||||
<el-form-item label="使用茶具">
|
||||
<dict-value :options="dictData.is_teacup" :value="order.is_teacup" />
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="服务价格">
|
||||
<el-descriptions-item label="茶具价格">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="服务单价">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="服务总价">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="车马费单价">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="车马费总价">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="优惠券金额">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="茶叶金额">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="实付金额">kooriookami</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">服务价格</div>
|
||||
<el-form-item label="茶具价格"> {{ order.teacup_price }} </el-form-item>
|
||||
<el-form-item label="服务单价"> {{ order.server_price }} </el-form-item>
|
||||
<el-form-item label="服务总价"> {{ order.server_all_price }} </el-form-item>
|
||||
<el-form-item label="车马费单价"> {{ order.mileage_price }} </el-form-item>
|
||||
<el-form-item label="车马费总价"> {{ order.mileage_server_price }} </el-form-item>
|
||||
<el-form-item label="优惠券金额"> {{ order.coupon_price }} </el-form-item>
|
||||
<el-form-item label="茶叶金额"> {{ order.tea_price }} </el-form-item>
|
||||
<el-form-item label="实付金额"> {{ order.order_amount }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="续费信息">
|
||||
<el-descriptions-item label="续费时长">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="续费金额">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="续单茶叶金额">kooriookami</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">出行状态</div>
|
||||
<el-form-item label="接单时间"> {{ order.take_order_time }} </el-form-item>
|
||||
<el-form-item label="出发时间"> {{ order.travel_time }} </el-form-item>
|
||||
<el-form-item label="到达时间"> {{ order.arrival_time }} </el-form-item>
|
||||
<el-form-item label="是否打卡"> {{ order.is_img > 0 ? '已打卡' : '未打卡' }} </el-form-item>
|
||||
<el-form-item label="打卡时间"> {{ order.img_time }} </el-form-item>
|
||||
<el-form-item label="打卡照片">
|
||||
<el-image v-if="order.img" style="width: 60px; height: 60px;" :src="order.img"
|
||||
:preview-src-list="[order.img]" fit="cover" preview-teleported />
|
||||
<span v-else class="text-gray-400">无图片</span>
|
||||
</el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="支付内容">
|
||||
<el-descriptions-item label="支付方式">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="支付状态">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="支付时间">kooriookami</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">续费信息</div>
|
||||
<el-form-item label="续费时长"> {{ order.renew_hour }} </el-form-item>
|
||||
<el-form-item label="续费金额"> {{ order.renew_price }} </el-form-item>
|
||||
<el-form-item label="续单茶叶金额"> {{ order.renew_tea_price }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="退款内容">
|
||||
<el-descriptions-item label="退款时间">kooriookami</el-descriptions-item>
|
||||
<el-descriptions-item label="支付时间">kooriookami</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">支付内容</div>
|
||||
<el-form-item label="支付方式">
|
||||
<dict-value :options="dictData.pay_way" :value="order.pay_way" />
|
||||
</el-form-item>
|
||||
<el-form-item label="支付状态">
|
||||
<dict-value :options="dictData.pay_status" :value="order.pay_status" />
|
||||
</el-form-item>
|
||||
<el-form-item label="支付时间"> {{ order.pay_time }} </el-form-item>
|
||||
</el-card>
|
||||
|
||||
<el-descriptions title="茶艺师收入">
|
||||
<el-descriptions-item label="茶艺师收入">kooriookami</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<el-descriptions title="订单状态">
|
||||
<el-descriptions-item label="订单状态">kooriookami</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div class="font-medium mb-7">退款内容</div>
|
||||
<el-form-item label="退款金额"> {{ order.refund_time }} </el-form-item>
|
||||
<el-form-item label="退款时间"> {{ order.refund_price }} </el-form-item>
|
||||
</el-card>
|
||||
</el-form>
|
||||
|
||||
<!-- <footer-btns>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</footer-btns> -->
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('is_teacup,pay_way,order_status,pay_status')
|
||||
|
||||
const route = useRoute()
|
||||
const order = JSON.parse(route.query.params as string)
|
||||
|
||||
// 获取服务方式标签
|
||||
const getServerTypeLabel = (value: number | string) => {
|
||||
const serverTypeMap: Record<number | string, string> = {
|
||||
1: '到店服务',
|
||||
2: '上门服务',
|
||||
3: '全部'
|
||||
}
|
||||
return serverTypeMap[value] || value
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
</el-form-item> -->
|
||||
|
||||
<el-form-item label="服务日期" prop="day_time">
|
||||
<daterange-picker v-model:startTime="queryParams.day_time" v-model:endTime="queryParams.day_time"
|
||||
<daterange-picker v-model:startTime="queryParams.start" v-model:endTime="queryParams.end"
|
||||
value-format="YYYY-MM-DD" clearable />
|
||||
</el-form-item>
|
||||
|
||||
@ -82,62 +82,14 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<!-- <el-table-column label="服务" prop="mobile" show-overflow-tooltip width="400">
|
||||
<template #default="{ row }">
|
||||
<div>服务日期: {{ row.day_time }}</div>
|
||||
<div>服务时间: {{ row.start_time }} - {{ row.end_time }}</div>
|
||||
<div>服务方式: {{ getServerTypeLabel(row.server_type) }}</div>
|
||||
<div>服务地址: {{ row.address }}</div>
|
||||
<div class="flex items-center">使用茶具: <dict-value :options="dictData.is_teacup"
|
||||
:value="row.is_teacup" />
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="用户信息" prop="mobile" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<div>用户手机号: {{ row.user_mobile }}</div>
|
||||
<div>用户昵称: {{ row.user_nickname }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column label="服务价格" prop="teacup_price" show-overflow-tooltip width="200">
|
||||
<template #default="{ row }">
|
||||
<div>茶具价格: {{ row.teacup_price }}</div>
|
||||
<div>服务单价: {{ row.server_price }}</div>
|
||||
<div>服务总价: {{ row.server_all_price }}</div>
|
||||
<div>车马费单价: {{ row.mileage_price }}</div>
|
||||
<div>车马费总价: {{ row.server_all_price }}</div>
|
||||
<div>优惠券金额: {{ row.coupon_price }}</div>
|
||||
<div>茶叶金额: {{ row.tea_price }}</div>
|
||||
<div>实付金额: {{ row.order_amount }}</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- <el-table-column label="续费信息" prop="renew_hour" show-overflow-tooltip width="200">
|
||||
<template #default="{ row }">
|
||||
<div>续费时长: {{ row.renew_hour || '一' }}</div>
|
||||
<div>续费金额: {{ row.renew_price || '一' }}</div>
|
||||
<div>续单茶叶金额: {{ row.renew_tea_price || '一' }}</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- <el-table-column label="支付内容" prop="pay_way" show-overflow-tooltip width="200">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">支付方式:
|
||||
<dict-value :options="dictData.pay_way" :value="row.pay_way" />
|
||||
</div>
|
||||
<div class="flex items-center">支付状态:
|
||||
<dict-value :options="dictData.pay_status" :value="row.pay_status" />
|
||||
</div>
|
||||
<div class="flex items-center">支付时间: {{ row.pay_time }}</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
|
||||
<!-- <el-table-column label="退款内容" prop="pay_way" show-overflow-tooltip width="200">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">退款时间: {{ row.refund_time || '一' }}</div>
|
||||
<div class="flex items-center">退款金额: {{ row.refund_price || '一' }}</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
|
||||
<!-- <el-table-column label="茶艺师收入" prop="team_income_price" show-overflow-tooltip width="100" /> -->
|
||||
<el-table-column label="实付价格" prop="order_amount" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="订单状态" prop="order_status">
|
||||
<template #default="{ row }">
|
||||
@ -150,28 +102,13 @@
|
||||
<div>服务方式: {{ getServerTypeLabel(row.server_type) }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<!-- <el-table-column label="出行状态" prop="take_order_time" show-overflow-tooltip width="200">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">接单时间: {{ row.take_order_time }}</div>
|
||||
<div class="flex items-center">出发时间: {{ row.travel_time }}</div>
|
||||
<div class="flex items-center">到达时间: {{ row.arrival_time }}</div>
|
||||
<div class="flex items-center">是否打卡: {{ row.is_img > 0 ? '已打卡' : '未打卡' }}</div>
|
||||
<div class="flex items-center">打开时间: {{ row.img_time }}</div>
|
||||
<div class="flex items-center">打卡照片:
|
||||
<el-image v-if="row.img" style="width: 60px; height: 60px;" :src="row.img"
|
||||
:preview-src-list="[row.img]" fit="cover" preview-teleported />
|
||||
<span v-else class="text-gray-400">无图片</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['order_teamaster/details']" type="primary" link>
|
||||
<router-link :to="{
|
||||
path: getRoutePath('order_teamaster/details'),
|
||||
query: {
|
||||
id: row.id
|
||||
params: JSON.stringify(row)
|
||||
}
|
||||
}">
|
||||
查看
|
||||
@ -222,6 +159,8 @@ const queryParams = reactive({
|
||||
nickname: '',
|
||||
img: '',
|
||||
day_time: '',
|
||||
start: '',
|
||||
end: '',
|
||||
server_type: '',
|
||||
is_teacup: '',
|
||||
pay_way: '',
|
||||
|
||||
@ -69,8 +69,17 @@
|
||||
<el-input v-model="formData.longitude" clearable placeholder="请输入经度" />
|
||||
</el-form-item>
|
||||
<el-form-item label="纬度" prop="latitude">
|
||||
<el-input v-model="formData.latitude" clearable placeholder="请输入纬度" />
|
||||
<div class="flex items-center w-full">
|
||||
<el-input v-model="formData.latitude" clearable placeholder="请输入纬度" class="flex-1 min-w-0" />
|
||||
<a href="http://jingweidu.757dy.com/" target="open" class="ml-2 flex items-center">
|
||||
<el-icon>
|
||||
<Location />
|
||||
</el-icon>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</el-form-item>
|
||||
|
||||
<!-- <el-form-item label="使用说明" prop="textarea1">
|
||||
<editor class="flex-1" v-model="formData.textarea1" :height="500" />
|
||||
</el-form-item>
|
||||
@ -273,12 +282,6 @@ const formRules = reactive<any>({
|
||||
message: '请输入纬度',
|
||||
}
|
||||
],
|
||||
is_lock: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择门锁',
|
||||
}
|
||||
],
|
||||
shop_status: [
|
||||
{
|
||||
required: true,
|
||||
@ -290,24 +293,7 @@ const formRules = reactive<any>({
|
||||
required: true,
|
||||
message: '请输入归属人',
|
||||
}
|
||||
],
|
||||
lock_no: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入门锁编号',
|
||||
validator: (rule: any, value: any, callback: any) => {
|
||||
// 只有当门锁存在时才校验必填
|
||||
if (Number(formData.is_lock) === 1) {
|
||||
if (!value) {
|
||||
callback(new Error('请输入门锁编号'))
|
||||
return
|
||||
}
|
||||
}
|
||||
callback()
|
||||
},
|
||||
trigger: ['blur', 'change']
|
||||
}
|
||||
],
|
||||
]
|
||||
})
|
||||
|
||||
// 省市区选择回调,获取省市区名称和地区ID
|
||||
|
||||
@ -66,7 +66,7 @@
|
||||
<el-table-column label="操作" width="200" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<div v-if="row.operation_type == 1">
|
||||
<el-button type="primary" link>
|
||||
<el-button v-perms="['tea_room/lists']" type="primary" link>
|
||||
<router-link :to="{
|
||||
path: getRoutePath('tea_room/lists'),
|
||||
query: {
|
||||
@ -76,6 +76,17 @@
|
||||
包间
|
||||
</router-link>
|
||||
</el-button>
|
||||
<!--
|
||||
<el-button type="primary" link>
|
||||
<router-link :to="{
|
||||
path: getRoutePath('tea_room/lists'),
|
||||
query: {
|
||||
id: row.id
|
||||
}
|
||||
}">
|
||||
包间
|
||||
</router-link>
|
||||
</el-button> -->
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
|
||||
@ -6,10 +6,10 @@
|
||||
<el-form-item label="头像" prop="avatar">
|
||||
<material-picker v-model="formData.avatar" :limit="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="用户昵称" prop="nickname">
|
||||
<el-input v-model="formData.nickname" clearable placeholder="请输入用户昵称" />
|
||||
<el-form-item label="用户名称" prop="nickname">
|
||||
<el-input v-model="formData.nickname" clearable placeholder="请输入用户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="用户名称" prop="name">
|
||||
<el-form-item label="用户昵称" prop="name">
|
||||
<el-input v-model="formData.name" clearable placeholder="请输入用户昵称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="账户余额" prop="user_money">
|
||||
@ -18,7 +18,7 @@
|
||||
<el-form-item label="本人照片" prop="image">
|
||||
<material-picker v-model="formData.image" :limit="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="出生日期" prop="image">
|
||||
<el-form-item label="出生日期" prop="both">
|
||||
<el-date-picker v-model="formData.both" type="date" placeholder="请选择" />
|
||||
</el-form-item>
|
||||
<el-form-item label="体重" prop="weight">
|
||||
@ -34,7 +34,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="兴趣爱好" prop="hobby_introduce">
|
||||
<editor class="flex-1" v-model="formData.hobby_introduce" :height="500" />
|
||||
<editor class="flex-1" v-model="formData.hobby_introduce" :height="300" />
|
||||
</el-form-item>
|
||||
<el-form-item label="用户账号" prop="account">
|
||||
<el-input v-model="formData.account" clearable placeholder="请输入用户账号" />
|
||||
@ -210,6 +210,7 @@ const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
let data = { ...formData, }
|
||||
data.avatar = removeImageUrlPrefix(data.avatar)
|
||||
data.image = removeImageUrlPrefix(data.image)
|
||||
|
||||
mode.value == 'edit'
|
||||
? await apiTeamasterUserEdit(data)
|
||||
|
||||
128
src/views/training/store/edit.vue
Normal file
128
src/views/training/store/edit.vue
Normal file
@ -0,0 +1,128 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit"
|
||||
@close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
|
||||
<!-- <el-form-item label="分类" prop="type_id">
|
||||
<el-select class="flex-1" v-model="formData.type_id" clearable placeholder="请选择">
|
||||
<el-option v-for="(item, index) in dictData.type_id" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input v-model="formData.title" clearable placeholder="请输入标题" />
|
||||
</el-form-item>
|
||||
<el-form-item label="创建人" prop="admin_name">
|
||||
<el-input v-model="formData.admin_name" clearable placeholder="请输入创建人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="封面图" prop="image">
|
||||
<material-picker v-model="formData.image" :limit="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="详情" prop="content">
|
||||
<editor class="flex-1" v-model="formData.content" :height="500" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select class="flex-1" v-model="formData.status" clearable placeholder="请选择">
|
||||
<el-option label="禁用" :value="0" />
|
||||
<el-option label="启用" :value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="trainingEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiTrainingAdd, apiTrainingEdit, apiTrainingDetail } from '@/api/training'
|
||||
import { removeImageUrlPrefix } from '@/utils/util'
|
||||
import type { PropType } from 'vue'
|
||||
|
||||
defineProps({
|
||||
dictData: {
|
||||
type: Object as PropType<Record<string, any[]>>,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑茶室培训' : '新增茶室培训'
|
||||
})
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
type_id: 2, // 1茶艺师 2茶室(商家)
|
||||
title: '',
|
||||
admin_name: '',
|
||||
image: '',
|
||||
video: '',
|
||||
content: '',
|
||||
status: '',
|
||||
dtime: '',
|
||||
})
|
||||
|
||||
|
||||
// 表单验证
|
||||
const formRules = reactive<any>({
|
||||
|
||||
})
|
||||
|
||||
|
||||
// 获取详情
|
||||
const setFormData = async (data: Record<any, any>) => {
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await apiTrainingDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
let data = { ...formData, }
|
||||
data.image = removeImageUrlPrefix(data.image)
|
||||
|
||||
mode.value == 'edit'
|
||||
? await apiTrainingEdit(data)
|
||||
: await apiTrainingAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
//打开弹窗
|
||||
const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
// 关闭回调
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
||||
157
src/views/training/store/index.vue
Normal file
157
src/views/training/store/index.vue
Normal file
@ -0,0 +1,157 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<!-- <el-form-item label="1茶艺师 2茶室" prop="type_id">
|
||||
<el-select class="w-[280px]" v-model="queryParams.type_id" clearable placeholder="请选择1茶艺师 2茶室">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option
|
||||
v-for="(item, index) in dictData.type_id"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input class="w-[280px]" v-model="queryParams.title" clearable placeholder="请输入标题" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="作者昵称" prop="admin_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.admin_name" clearable placeholder="请输入作者昵称" />
|
||||
</el-form-item> -->
|
||||
<!-- <el-form-item label="详情" prop="content">
|
||||
<el-input class="w-[280px]" v-model="queryParams.content" clearable placeholder="请输入详情" />
|
||||
</el-form-item> -->
|
||||
<!-- <el-form-item label="0禁用 1启用" prop="status">
|
||||
<el-select class="w-[280px]" v-model="queryParams.status" clearable placeholder="请选择0禁用 1启用">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option
|
||||
v-for="(item, index) in dictData."
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['training/store/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['training/store/delete']" :disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="分类" prop="type_id">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.type_id" :value="row.type_id" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="标题" prop="title" show-overflow-tooltip />
|
||||
<el-table-column label="创建人" prop="admin_name" show-overflow-tooltip />
|
||||
<el-table-column label="封面图" prop="image" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<div><el-image style="width:50px;height:50px;" :src="row.image" /></div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" prop="status">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.status == 0 ? '禁用' : '启用' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" prop="dtime" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['training/store/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['training/store/delete']" type="danger" link
|
||||
@click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="trainingLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiTrainingLists, apiTrainingDelete } from '@/api/training'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
type_id: 2,
|
||||
title: '',
|
||||
admin_name: '',
|
||||
content: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('type_id')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiTrainingLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(data)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiTrainingDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
130
src/views/training/teamaster/edit.vue
Normal file
130
src/views/training/teamaster/edit.vue
Normal file
@ -0,0 +1,130 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit"
|
||||
@close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
|
||||
<!-- <el-form-item label="分类" prop="type_id">
|
||||
<el-select class="flex-1" v-model="formData.type_id" clearable placeholder="请选择">
|
||||
<el-option v-for="(item, index) in dictData.type_id" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input v-model="formData.title" clearable placeholder="请输入标题" />
|
||||
</el-form-item>
|
||||
<el-form-item label="创建人" prop="admin_name">
|
||||
<el-input v-model="formData.admin_name" clearable placeholder="请输入创建人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="封面图" prop="image">
|
||||
<material-picker v-model="formData.image" :limit="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="详情" prop="content">
|
||||
<editor class="flex-1" v-model="formData.content" :height="500" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select class="flex-1" v-model="formData.status" clearable placeholder="请选择">
|
||||
<el-option label="禁用" :value="0" />
|
||||
<el-option label="启用" :value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="trainingEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiTrainingAdd, apiTrainingEdit, apiTrainingDetail } from '@/api/training'
|
||||
import { removeImageUrlPrefix } from '@/utils/util'
|
||||
import type { PropType } from 'vue'
|
||||
|
||||
defineProps({
|
||||
dictData: {
|
||||
type: Object as PropType<Record<string, any[]>>,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑茶艺师培训' : '新增茶艺师培训'
|
||||
})
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
type_id: 1, // 1茶艺师 2茶室(商家)
|
||||
title: '',
|
||||
admin_name: '',
|
||||
image: '',
|
||||
video: '',
|
||||
content: '',
|
||||
status: '',
|
||||
dtime: '',
|
||||
})
|
||||
|
||||
|
||||
// 表单验证
|
||||
const formRules = reactive<any>({
|
||||
|
||||
})
|
||||
|
||||
|
||||
// 获取详情
|
||||
const setFormData = async (data: Record<any, any>) => {
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await apiTrainingDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
let data = { ...formData, }
|
||||
data.image = removeImageUrlPrefix(data.image)
|
||||
|
||||
mode.value == 'edit'
|
||||
? await apiTrainingEdit(data)
|
||||
: await apiTrainingAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
//打开弹窗
|
||||
const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
// 关闭回调
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
||||
127
src/views/training/teamaster/index.vue
Normal file
127
src/views/training/teamaster/index.vue
Normal file
@ -0,0 +1,127 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input class="w-[280px]" v-model="queryParams.title" clearable placeholder="请输入标题" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['teamaster/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['teamaster/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="分类" prop="type_id">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.type_id" :value="row.type_id" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="标题" prop="title" show-overflow-tooltip />
|
||||
<el-table-column label="创建人" prop="admin_name" show-overflow-tooltip />
|
||||
<el-table-column label="封面图" prop="image" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<div><el-image style="width:50px;height:50px;" :src="row.image" /></div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" prop="status">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.status == 0 ? '禁用' : '启用' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" prop="dtime" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['teamaster/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['teamaster/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="trainingLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiTrainingLists, apiTrainingDelete } from '@/api/training'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
type_id: 1,
|
||||
title: '',
|
||||
admin_name: '',
|
||||
content: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('type_id')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiTrainingLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(data)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiTrainingDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
113
src/views/wxcode/edit.vue
Normal file
113
src/views/wxcode/edit.vue
Normal file
@ -0,0 +1,113 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit"
|
||||
@close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
|
||||
<!-- <el-form-item label="图片地址" prop="url">
|
||||
<el-input v-model="formData.url" clearable placeholder="请输入图片地址" />
|
||||
</el-form-item> -->
|
||||
<el-form-item label="场景值" prop="type">
|
||||
<el-input v-model="formData.type" clearable placeholder="请输入场景数值:1电梯、2充电宝"
|
||||
:disabled="Number(formData.id) > 0 ? true : false" />
|
||||
</el-form-item>
|
||||
<el-form-item label="场景名称" prop="name">
|
||||
<el-input v-model="formData.name" clearable placeholder="请输入场景名称:电梯、充电宝" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="formData.status" clearable placeholder="请选择">
|
||||
<el-option label="启用" :value="1"></el-option>
|
||||
<el-option label="禁用" :value="0"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="wxcodeEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiWxcodeAdd, apiWxcodeEdit, apiWxcodeDetail } from '@/api/wxcode'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import type { PropType } from 'vue'
|
||||
defineProps({
|
||||
dictData: {
|
||||
type: Object as PropType<Record<string, any[]>>,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑渠道' : '新增渠道'
|
||||
})
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
url: '',
|
||||
type: '',
|
||||
name: '',
|
||||
status: '',
|
||||
})
|
||||
|
||||
|
||||
// 表单验证
|
||||
const formRules = reactive<any>({
|
||||
|
||||
})
|
||||
|
||||
|
||||
// 获取详情
|
||||
const setFormData = async (data: Record<any, any>) => {
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await apiWxcodeDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
const data = { ...formData, }
|
||||
mode.value == 'edit'
|
||||
? await apiWxcodeEdit(data)
|
||||
: await apiWxcodeAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
//打开弹窗
|
||||
const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
// 关闭回调
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
||||
110
src/views/wxcode/index.vue
Normal file
110
src/views/wxcode/index.vue
Normal file
@ -0,0 +1,110 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['wxcode/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['wxcode/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="图片" prop="url" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<el-image style="width:50px;height:50px;" :src="row.url" :preview-src-list="[row.url]"
|
||||
preview-teleported />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="场景值" prop="type" show-overflow-tooltip />
|
||||
<el-table-column label="场景名称" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="创建时间" prop="dtime" show-overflow-tooltip />
|
||||
<el-table-column label="状态" prop="status" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.status == 1 ? 'success' : 'danger'">
|
||||
{{ row.status == 1 ? '启用' : '禁用' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['wxcode/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['wxcode/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="wxcodeLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiWxcodeLists, apiWxcodeDelete } from '@/api/wxcode'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiWxcodeLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(data)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiWxcodeDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
Reference in New Issue
Block a user