代码合并

This commit is contained in:
2026-03-28 18:19:42 +08:00
3 changed files with 644 additions and 454 deletions

View File

@@ -226,9 +226,27 @@ export const useCartsStore = defineStore("carts", () => {
const isLinkFinshed = ref(false); const isLinkFinshed = ref(false);
// 当前购物车数据(现在 getAllGoodsList 能直接访问) // 当前购物车数据(现在 getAllGoodsList 能直接访问)
const list = useStorage<any[]>("carts", []); const list = useStorage<any[]>(
// 历史订单数据(现在 getAllGoodsList 能直接访问),不从本地缓存获取,改为从接口获取 "carts",
const oldOrder = ref<any>({ [],
localStorage,
{
serializer: {
read: (rawValue) => {
// 没有值时直接返回默认空数组
if (!rawValue) return []
try {
return JSON.parse(rawValue)
} catch {
return []
}
},
write: (value) => JSON.stringify(value),
},
}
)
// 历史订单数据(现在 getAllGoodsList 能直接访问)
const oldOrder = useStorage<any>("Instead_olold_order", {
detailMap: [], detailMap: [],
originAmount: 0 originAmount: 0
}); });

View File

@@ -3,14 +3,25 @@
<div> <div>
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left"> <el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left">
<el-form-item label="门店名称" prop="shopName"> <el-form-item label="门店名称" prop="shopName">
<el-input v-model.trim="form.shopName" placeholder="请输入门店名称" style="width: 500px"></el-input> <el-input
v-model.trim="form.shopName"
placeholder="请输入门店名称"
style="width: 500px"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="连锁店扩展店名"> <el-form-item label="连锁店扩展店名">
<el-input v-model.trim="form.chainName" placeholder="请输入连锁店扩展店名" style="width: 500px"></el-input> <el-input
v-model.trim="form.chainName"
placeholder="请输入连锁店扩展店名"
style="width: 500px"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="门店logo"> <el-form-item label="门店logo">
<div class="img_box"> <div class="img_box">
<single-image-upload style="width: 80px; height: 80px" v-model="form.logo"></single-image-upload> <single-image-upload
style="width: 80px; height: 80px"
v-model="form.logo"
></single-image-upload>
</div> </div>
</el-form-item> </el-form-item>
<!-- <el-form-item label="门店照片"> <!-- <el-form-item label="门店照片">
@@ -27,14 +38,22 @@
<el-form-item label="门店收款码"> <el-form-item label="门店收款码">
<div class="img_box"> <div class="img_box">
<canvas ref="canvas" id="QRCode_header" style="width: 80px; height: 80px"></canvas> <canvas ref="canvas" id="QRCode_header" style="width: 80px; height: 80px"></canvas>
<el-button size="small" plain v-if="form.paymentQrcode" @click="downloadCanvas(form.paymentQrcode)"> <el-button
size="small"
plain
v-if="form.paymentQrcode"
@click="downloadCanvas(form.paymentQrcode)"
>
下载 下载
</el-button> </el-button>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="微信二维码"> <el-form-item label="微信二维码">
<div class="img_box"> <div class="img_box">
<single-image-upload style="width: 80px; height: 80px" v-model="form.shopQrcode"></single-image-upload> <single-image-upload
style="width: 80px; height: 80px"
v-model="form.shopQrcode"
></single-image-upload>
</div> </div>
</el-form-item> </el-form-item>
<!-- <el-form-item label="店铺小程序码"> <!-- <el-form-item label="店铺小程序码">
@@ -52,6 +71,21 @@
<el-radio value="after">餐饮版先下单后支付</el-radio> <el-radio value="after">餐饮版先下单后支付</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item
label="是否允许用户自行支付"
prop="isUserPay"
v-if="form.registerType === 'after'"
>
<div class="column">
<div class="center" style="display: flex; align-items: center; gap: 14px">
<el-switch v-model="form.isUserPay" :active-value="1" :inactive-value="0"></el-switch>
<div class="tips" style="font-size: 14px; color: #999">
关闭后用户将不能自行支付
</div>
</div>
</div>
</el-form-item>
<el-form-item label="就餐模式「多选」" prop="eatModel"> <el-form-item label="就餐模式「多选」" prop="eatModel">
<el-checkbox-group v-model="form.eatModel"> <el-checkbox-group v-model="form.eatModel">
<el-checkbox value="dine-in">堂食自取</el-checkbox> <el-checkbox value="dine-in">堂食自取</el-checkbox>
@@ -65,7 +99,11 @@
</el-radio-group> </el-radio-group>
</el-form-item> --> </el-form-item> -->
<el-form-item label="联系电话" prop="phone"> <el-form-item label="联系电话" prop="phone">
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" style="width: 500px"></el-input> <el-input
v-model.trim="form.phone"
placeholder="请输入联系电话"
style="width: 500px"
></el-input>
</el-form-item> </el-form-item>
<!-- <el-form-item label="外卖起送金额"> <!-- <el-form-item label="外卖起送金额">
<el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right" <el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right"
@@ -91,30 +129,62 @@
<div style="color: #999">准确的定位便于用户导航到店铺</div> <div style="color: #999">准确的定位便于用户导航到店铺</div>
</el-form-item> </el-form-item>
<el-form-item label="门店详细地址"> <el-form-item label="门店详细地址">
<el-input type="textarea" v-model.trim="form.address" placeholder="请输入门店详细地址" style="width: 500px"></el-input> <el-input
type="textarea"
v-model.trim="form.address"
placeholder="请输入门店详细地址"
style="width: 500px"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="营业时间"> <el-form-item label="营业时间">
<div class="u-flex gap-2" style="width: 50%"> <div class="u-flex gap-2" style="width: 50%">
<el-select v-model="form.businessStartDay" placeholder="周几开始"> <el-select v-model="form.businessStartDay" placeholder="周几开始">
<el-option :value="item.label" :label="item.label" v-for="item in weeks" :key="item.value"></el-option> <el-option
:value="item.label"
:label="item.label"
v-for="item in weeks"
:key="item.value"
></el-option>
</el-select> </el-select>
<el-select v-model="form.businessEndDay" placeholder="周几结束"> <el-select v-model="form.businessEndDay" placeholder="周几结束">
<el-option :value="item.label" :label="item.label" v-for="item in weeks" :key="item.value"></el-option> <el-option
:value="item.label"
:label="item.label"
v-for="item in weeks"
:key="item.value"
></el-option>
</el-select> </el-select>
<el-time-picker placeholder="起始时间" v-model="startTime" :picker-options="{ <el-time-picker
placeholder="起始时间"
v-model="startTime"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59', selectableRange: '00:00:00 - 23:59:59',
format: 'HH:mm', format: 'HH:mm',
}" format="HH:mm" value-format="HH:mm"></el-time-picker> }"
<el-time-picker placeholder="结束时间" v-model="endTime" :picker-options="{ format="HH:mm"
value-format="HH:mm"
></el-time-picker>
<el-time-picker
placeholder="结束时间"
v-model="endTime"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59', selectableRange: '00:00:00 - 23:59:59',
}" format="HH:mm" value-format="HH:mm"></el-time-picker> }"
format="HH:mm"
value-format="HH:mm"
></el-time-picker>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="桌位费/位/元"> <el-form-item label="桌位费/位/元">
<el-input-number :disabled="!!form.isTableFee" v-model="form.tableFee" :min="0" /> <el-input-number :disabled="!!form.isTableFee" v-model="form.tableFee" :min="0" />
<!-- <el-checkbox v-model="form.isTableFee" :label="1">免餐位费</el-checkbox> --> <!-- <el-checkbox v-model="form.isTableFee" :label="1">免餐位费</el-checkbox> -->
<el-switch class="u-m-l-10" v-model.trim="form.isTableFee" :active-value="1" :inactive-value="0" <el-switch
active-text="免餐位费"></el-switch> class="u-m-l-10"
v-model.trim="form.isTableFee"
:active-value="1"
:inactive-value="0"
active-text="免餐位费"
></el-switch>
</el-form-item> </el-form-item>
<!-- <el-form-item label="是否开启8折活动"> <!-- <el-form-item label="是否开启8折活动">
<el-switch v-model.trim="form.isOpenYhq" active-value="true" inactive-value="false"></el-switch> <el-switch v-model.trim="form.isOpenYhq" active-value="true" inactive-value="false"></el-switch>
@@ -148,42 +218,68 @@
</el-time-picker> </el-time-picker>
</el-form-item> --> </el-form-item> -->
<el-form-item label="店铺简介"> <el-form-item label="店铺简介">
<el-input type="textarea" v-model.trim="form.detail" placeholder="请输入店铺简介" style="width: 500px"></el-input> <el-input
type="textarea"
v-model.trim="form.detail"
placeholder="请输入店铺简介"
style="width: 500px"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="台桌预订短信"> <el-form-item label="台桌预订短信">
<el-input type="textarea" v-model.trim="form.bookingSms" placeholder="请输入台桌预订短信" <el-input
style="width: 500px"></el-input> type="textarea"
v-model.trim="form.bookingSms"
placeholder="请输入台桌预订短信"
style="width: 500px"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="电子围栏" prop="isOrderFence"> <el-form-item label="电子围栏" prop="isOrderFence">
<div class="column"> <div class="column">
<div class="center" style="display: flex; align-items: center; gap: 14px"> <div class="center" style="display: flex; align-items: center; gap: 14px">
<el-switch v-model="form.isOrderFence" :active-value="1" :inactive-value="0"></el-switch> <el-switch
v-model="form.isOrderFence"
:active-value="1"
:inactive-value="0"
></el-switch>
<div class="tips" style="font-size: 14px; color: #999"> <div class="tips" style="font-size: 14px; color: #999">
开启后用户只能在店铺附近xx公里内点餐 开启后用户只能在店铺附近xx公里内点餐
</div> </div>
</div> </div>
<div class="center" v-if="form.isOrderFence == 1"> <div class="center" v-if="form.isOrderFence == 1">
<el-input v-model="form.orderFenceDistance" placeholder="请输入" <el-input
@input="(e) => (form.orderFenceDistance = filterNumberInput(e))" style="width: 250px" v-model="form.orderFenceDistance"
input-style="text-align: center;"> placeholder="请输入"
@input="(e) => (form.orderFenceDistance = filterNumberInput(e))"
style="width: 250px"
input-style="text-align: center;"
>
<template #prepend>限制</template> <template #prepend>限制</template>
<template #append>公里</template> <template #append>公里</template>
</el-input> </el-input>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="上菜时间(分钟)" prop="isServeTimeControl"> <el-form-item label="上菜时间(分钟)" prop="isServeTimeControl">
<div class="column"> <div class="column">
<div class="center" style="display: flex; align-items: center; gap: 14px"> <div class="center" style="display: flex; align-items: center; gap: 14px">
<el-switch v-model="form.isServeTimeControl" :active-value="1" :inactive-value="0"></el-switch> <el-switch
v-model="form.isServeTimeControl"
:active-value="1"
:inactive-value="0"
></el-switch>
<div class="tips" style="font-size: 14px; color: #999"> <div class="tips" style="font-size: 14px; color: #999">
起菜到上菜的时间间隔开启后会有超时提示 起菜到上菜的时间间隔开启后会有超时提示
</div> </div>
</div> </div>
<div class="center" v-if="form.isServeTimeControl == 1"> <div class="center" v-if="form.isServeTimeControl == 1">
<el-input v-model="form.serveTime" placeholder="请输入" <el-input
@input="(e) => (form.serveTime = filterNumberInput(e))" style="width: 250px" v-model="form.serveTime"
input-style="text-align: center;"> placeholder="请输入"
@input="(e) => (form.serveTime = filterNumberInput(e))"
style="width: 250px"
input-style="text-align: center;"
>
<template #prepend>限制</template> <template #prepend>限制</template>
<template #append>分钟</template> <template #append>分钟</template>
</el-input> </el-input>
@@ -208,11 +304,24 @@
</el-form> </el-form>
</div> </div>
<ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress> <ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress>
<el-dialog v-model="showUpload" :close-on-click-modal="false" append-to-body width="500px" <el-dialog
@close="showUpload = false"> v-model="showUpload"
<el-upload :before-remove="handleBeforeRemove" :on-success="handleSuccess" :on-error="handleError" :close-on-click-modal="false"
:file-list="fileList" :headers="headers" :action="qiNiuUploadApi" :limit="1" list-type="picture" append-to-body
class="upload-demo"> width="500px"
@close="showUpload = false"
>
<el-upload
:before-remove="handleBeforeRemove"
:on-success="handleSuccess"
:on-error="handleError"
:file-list="fileList"
:headers="headers"
:action="qiNiuUploadApi"
:limit="1"
list-type="picture"
class="upload-demo"
>
<el-button size="small" type="primary">点击上传</el-button> <el-button size="small" type="primary">点击上传</el-button>
<template #tip> <template #tip>
<div style="display: block" class="el-upload__tip">请勿上传违法文件且文件不超过15M</div> <div style="display: block" class="el-upload__tip">请勿上传违法文件且文件不超过15M</div>
@@ -341,6 +450,14 @@ export default {
mounted() { mounted() {
this.tbShopInfo(); this.tbShopInfo();
}, },
watch: {
"form.registerType"(val) {
console.log(val);
if (val === "before") {
this.form.isUserPay = 1;
}
},
},
methods: { methods: {
chooseAddressConfirm(e) { chooseAddressConfirm(e) {
console.log(e); console.log(e);

View File

@@ -2,7 +2,12 @@
<div class="app-container"> <div class="app-container">
<el-tabs v-model="tableArea.tabsSel" type="card" @tab-click="tabClick"> <el-tabs v-model="tableArea.tabsSel" type="card" @tab-click="tabClick">
<el-tab-pane label="全部" name="" /> <el-tab-pane label="全部" name="" />
<el-tab-pane v-for="item in tableArea.tabs" :key="item.id" :label="item.name" :name="`${item.id}`"> <el-tab-pane
v-for="item in tableArea.tabs"
:key="item.id"
:label="item.name"
:name="`${item.id}`"
>
<template #label> <template #label>
<div class=""> <div class="">
<span> <span>
@@ -23,18 +28,13 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<div class="" style="display: flex;"> <div class="">
<el-button icon="plus" @click="addEaraShow()">添加区域</el-button> <el-button icon="plus" @click="addEaraShow()">添加区域</el-button>
<el-button type="primary" icon="plus" @click="addTableShow()">添加台桌</el-button> <el-button type="primary" icon="plus" @click="addTableShow()">添加台桌</el-button>
<el-button type="danger" icon="Setting" @click="clearTabDialogRef.show()">清台设置</el-button> <el-button type="danger" icon="Setting" @click="clearTabDialogRef.show()">清台设置</el-button>
<el-button type="primary" icon="download" @click="showDownloadTableCode"> <el-button type="primary" icon="download" @click="showDownloadTableCode">
下载桌台码 下载桌台码
</el-button> </el-button>
<!-- 批量导入 -->
<importData :type="5" @close="init" />
<!-- <el-button icon="Upload" @click="importDataRef.show()">
批量导入
</el-button> -->
<!-- <el-button type="primary" icon="download" @click="downloadShopCpde"> <!-- <el-button type="primary" icon="download" @click="downloadShopCpde">
下载店铺码 下载店铺码
</el-button> --> </el-button> -->
@@ -42,9 +42,12 @@
<div class="u-flex u-p-b-15 u-font-14 u-m-t-16"> <div class="u-flex u-p-b-15 u-font-14 u-m-t-16">
<div v-for="(item, key) in status" :key="key" class="state u-m-r-24"> <div v-for="(item, key) in status" :key="key" class="state u-m-r-24">
<span class="dot" :style="{ <span
class="dot"
:style="{
backgroundColor: status[key] ? status[key].type : '', backgroundColor: status[key] ? status[key].type : '',
}" /> }"
/>
{{ item.label }} {{ item.label }}
</div> </div>
</div> </div>
@@ -52,9 +55,14 @@
<!-- 列表 --> <!-- 列表 -->
<div class="head-container"> <div class="head-container">
<div v-loading="loading" class="table_list"> <div v-loading="loading" class="table_list">
<div v-for="item in tableList" :key="item.id" class="item" :style="{ <div
v-for="item in tableList"
:key="item.id"
class="item"
:style="{
'background-color': status[item.status] ? status[item.status].type : '', 'background-color': status[item.status] ? status[item.status].type : '',
}"> }"
>
<div class="new-top flex u-row-between"> <div class="new-top flex u-row-between">
<div class="u-flex u-flex-1 u-p-r-10"> <div class="u-flex u-flex-1 u-p-r-10">
<span class="name u-line-1" style="max-width: 50px"> <span class="name u-line-1" style="max-width: 50px">
@@ -88,18 +96,19 @@
<div v-if="item.status == 'subscribe' && item.bookingInfo"> <div v-if="item.status == 'subscribe' && item.bookingInfo">
<div class="row row1" style="align-items: flex-start"> <div class="row row1" style="align-items: flex-start">
<span style="font-size: 14px; color: #333"> <span style="font-size: 14px; color: #333">
{{ item.bookingInfo.createUserName }}{{ {{ item.bookingInfo.createUserName }}{{ item.bookingInfo.bookingPerson }}{{
item.bookingInfo.bookingPerson item.bookingInfo.gender == 1 ? "先生" : "女士"
}}{{ item.bookingInfo.gender == 1 ? "先生" : "女士" }} }}
</span> </span>
<div class="state" style=" <div
font-size: 12px; class="state"
color: #666; style="font-size: 12px; color: #666; display: flex; align-items: center"
display: flex; >
align-items: center; <img
"> style="width: 16px; height: 16px; filter: contrast(0.5)"
<img style="width: 16px; height: 16px; filter: contrast(0.5)" src="@/assets/images/perpole.png" src="@/assets/images/perpole.png"
alt="" /> alt=""
/>
{{ item.bookingInfo.bookingTime.substring(11, 19) }} {{ item.bookingInfo.bookingTime.substring(11, 19) }}
</div> </div>
@@ -112,47 +121,68 @@
</div> </div>
<div v-else class="u-font-18 font-600 total-price"> <div v-else class="u-font-18 font-600 total-price">
<span v-if="item.status == 'using'" class="cur-pointer" @click="diancanShow(item, 'isAddGoods')"> <span
¥{{ item.totalAmount || 0 }}{{ item.productNum }} v-if="item.status == 'unsettled'"
class="cur-pointer"
@click="diancanShow(item, 'isAddGoods')"
>
¥{{ item.orderAmount || 0 }}
<!-- {{ item.productNum }} -->
</span> </span>
<!-- <span v-else class="color-fff">|</span> --> <!-- <span v-else class="color-fff">|</span> -->
</div> </div>
<div class="row btn-group" style="margin-top: 10px"> <div class="row btn-group" style="margin-top: 10px">
<template v-if="item.status == 'subscribe'"> <template v-if="item.status == 'subscribe'">
<el-button type="success" :disabled="!item.tableId || item.status === 'closed'" <el-button
@click="markStatus(item, -1)"> type="success"
:disabled="!item.tableId || item.status === 'closed'"
@click="markStatus(item, -1)"
>
取消预约 取消预约
</el-button> </el-button>
</template> </template>
<template v-if=" <template
item.status == 'subscribe' && v-if="
item.bookingInfo && item.status == 'subscribe' && item.bookingInfo && item.bookingInfo.status == 20
item.bookingInfo.status == 20 "
"> >
<el-button type="success" :disabled="!item.tableId || item.status === 'closed'" <el-button
@click="markStatus(item, 10)"> type="success"
:disabled="!item.tableId || item.status === 'closed'"
@click="markStatus(item, 10)"
>
到店 到店
</el-button> </el-button>
</template> </template>
<template v-if=" <template
v-if="
item.status == 'idle' || item.status == 'idle' ||
(item.status == 'subscribe' && (item.status == 'subscribe' &&
item.bookingInfo && item.bookingInfo &&
item.bookingInfo.status == 10) item.bookingInfo.status == 10)
"> "
<el-button type="primary" :disabled="!item.tableCode || item.status === 'closed'" >
@click="diancanShow(item)"> <el-button
type="primary"
:disabled="!item.tableCode || item.status === 'closed'"
@click="diancanShow(item)"
>
点餐 点餐
</el-button> </el-button>
</template> </template>
<template v-else-if="item.status != 'idle' && item.status != 'subscribe'"> <template v-else-if="item.status != 'idle' && item.status != 'subscribe'">
<template v-if="item.status == 'using'"> <template v-if="item.status == 'using'">
<el-button :disabled="!item.tableId || item.status === 'closed'" <el-button
@click="diancanShow(item, 'isAddGoods')"> :disabled="!item.tableId || item.status === 'closed'"
@click="diancanShow(item, 'isAddGoods')"
>
加菜 加菜
</el-button> </el-button>
<el-button type="danger" :disabled="!item.tableId || item.status === 'closed'" <el-button
@click="diancanShow(item, 'isPayOrder')"> type="danger"
:disabled="!item.tableId || item.status === 'closed'"
@click="diancanShow(item, 'isPayOrder')"
>
结账 结账
</el-button> </el-button>
</template> </template>
@@ -160,10 +190,13 @@
<el-button type="info" disabled>已关台</el-button> <el-button type="info" disabled>已关台</el-button>
</template> </template>
<template v-else-if="item.status == 'cleaning'"> <template v-else-if="item.status == 'cleaning'">
<el-button type="info" :style="{ <el-button
type="info"
:style="{
backgroundColor: status[item.status].type, backgroundColor: status[item.status].type,
borderColor: status[item.status].type, borderColor: status[item.status].type,
}"> }"
>
清理中 清理中
</el-button> </el-button>
</template> </template>
@@ -173,19 +206,28 @@
</template> </template>
</div> </div>
</div> </div>
<div class="u-flex u-col-bottom bottom u-row-between color-666" <div
:class="{ 'opacity-0': item.status == 'closed' }"> class="u-flex u-col-bottom bottom u-row-between color-666"
:class="{ 'opacity-0': item.status == 'closed' }"
>
<div class="u-flex u-col-center"> <div class="u-flex u-col-center">
<img style="width: 16px; height: 16px; filter: contrast(0.5)" src="@/assets/images/perpole.png" <img
alt="" /> style="width: 16px; height: 16px; filter: contrast(0.5)"
src="@/assets/images/perpole.png"
alt=""
/>
<span class="u-m-t-4 u-font-12 u-m-l-2"> <span class="u-m-t-4 u-font-12 u-m-l-2">
{{ item.useNum || 0 }}/{{ item.maxCapacity }} {{ item.personNum || 0 }}/{{ item.maxCapacity }}
</span> </span>
</div> </div>
<div v-if="item.status == 'using'" class="u-flex"> <div v-if="item.status == 'unsettled'" class="u-flex">
<img style="width: 16px; height: 16px; filter: contrast(0.5)" src="@/assets/images/shalou.png" alt="" /> <img
style="width: 16px; height: 16px; filter: contrast(0.5)"
src="@/assets/images/shalou.png"
alt=""
/>
<span class="u-m-t-4 u-font-12"> <span class="u-m-t-4 u-font-12">
{{ formatTime(item.durationTime) }} {{ formatTime(item.orderCreateTime) }}
</span> </span>
</div> </div>
</div> </div>
@@ -223,7 +265,7 @@ import bindCode from "./components/bind-table-code.vue";
import downloadTableCode from "./components/downloadTableCode.vue"; import downloadTableCode from "./components/downloadTableCode.vue";
import clearTabDialog from "./components/clearTabDialog.vue"; import clearTabDialog from "./components/clearTabDialog.vue";
const clearTabDialogRef = ref(null) const clearTabDialogRef = ref(null);
const envName = import.meta.env.VITE_APP_NAME; const envName = import.meta.env.VITE_APP_NAME;
@@ -240,15 +282,28 @@ function showDownloadTableCode() {
} }
let loading = ref(false); let loading = ref(false);
//工具方法
function formatTime(milliseconds) { const nowTime = ref(new Date().getTime());
console.log(milliseconds);
if (!milliseconds) { // 实时更新当前时间(循环执行)
return ""; function updateTime() {
nowTime.value = new Date().getTime();
requestAnimationFrame(updateTime);
} }
updateTime(); // 启动
// 工具方法
function formatTime(str) {
if (!str) return "";
const targetTime = new Date(str).getTime();
const milliseconds = nowTime.value - targetTime;
if (milliseconds <= 0) return "已结束";
const days = Math.floor(milliseconds / (1000 * 60 * 60 * 24)); const days = Math.floor(milliseconds / (1000 * 60 * 60 * 24));
const hours = Math.floor((milliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const hours = Math.floor((milliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutes = Math.floor((milliseconds % (1000 * 60 * 60)) / (1000 * 60)); const minutes = Math.floor((milliseconds % (1000 * 60 * 60)) / (1000 * 60));
return `${days ? days + "天" : ""} ${hours ? hours + "时" : ""} ${minutes + "分"}`; return `${days ? days + "天" : ""} ${hours ? hours + "时" : ""} ${minutes + "分"}`;
} }