完善功能

This commit is contained in:
wangxiaowei
2026-03-13 16:00:38 +08:00
parent 1552642e38
commit 2af8b24b50
17 changed files with 1091 additions and 197 deletions

BIN
dist.zip Normal file

Binary file not shown.

26
src/api/wxcode.ts Normal file
View 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 })
}

View 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>

View File

@ -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>>()
// 是否显示编辑框

View 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>

View File

@ -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: '——',

View File

@ -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>

View File

@ -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: '',

View File

@ -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

View File

@ -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">

View File

@ -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)

View 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>

View 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>

View 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>

View 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
View 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
View 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>