|
|
@@ -1,38 +1,47 @@
|
|
|
<template>
|
|
|
- <div class="p-2">
|
|
|
- <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
|
|
- :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
- <div v-show="showSearch" class="mb-[10px] bg-white p-[20px] rounded-[4px] flex justify-between items-center shadow-sm" style="background-color: #fff; padding: 20px; border-radius: 4px; box-shadow: 0 1px 4px rgba(0,21,41,.08);">
|
|
|
- <div class="text-[18px] font-bold text-[#303133]" style="font-size: 18px; font-weight: bold; color: #303133;">门店管理</div>
|
|
|
- <div class="flex items-center gap-[10px]" style="display: flex; gap: 10px; align-items: center;">
|
|
|
- <el-input v-model="queryParams.storeOrContact" placeholder="搜索门店名称/联系人" prefix-icon="Search"
|
|
|
- style="width: 250px" clearable @keyup.enter="handleQuery" @clear="handleQuery" />
|
|
|
- <el-cascader v-model="searchRegionValue" :options="areaOptions" placeholder="所属城市"
|
|
|
- style="width: 150px" clearable @change="handleSearchAreaChange" />
|
|
|
- <el-select v-model="queryParams.station" placeholder="所属站点" style="width: 150px" clearable @change="handleQuery">
|
|
|
- <el-option v-for="site in searchSiteOptions" :key="site.value" :label="site.label" :value="site.value" />
|
|
|
- </el-select>
|
|
|
- <el-select v-model="queryParams.status" placeholder="状态" style="width: 120px" clearable @change="handleQuery">
|
|
|
- <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
- </el-select>
|
|
|
- <el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['system:store:add']">新增门店</el-button>
|
|
|
+ <div class="page-container">
|
|
|
+ <el-card shadow="never" class="table-card">
|
|
|
+ <template #header>
|
|
|
+ <div class="card-header">
|
|
|
+ <div class="header-left">
|
|
|
+ <span class="title">门店管理</span>
|
|
|
+ </div>
|
|
|
+ <div class="header-right">
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.storeOrContact"
|
|
|
+ placeholder="搜索门店名称/联系人"
|
|
|
+ class="search-input"
|
|
|
+ prefix-icon="Search"
|
|
|
+ clearable
|
|
|
+ @keyup.enter="handleQuery"
|
|
|
+ />
|
|
|
+ <el-cascader
|
|
|
+ v-model="searchRegionValue"
|
|
|
+ :options="areaOptions"
|
|
|
+ placeholder="所属城市"
|
|
|
+ class="region-select"
|
|
|
+ clearable
|
|
|
+ @change="handleSearchAreaChange"
|
|
|
+ />
|
|
|
+ <el-select v-model="queryParams.station" placeholder="所属站点" class="station-select" clearable @change="handleQuery" :disabled="!queryParams.area">
|
|
|
+ <el-option v-for="site in searchSiteOptions" :key="site.value" :label="site.label" :value="site.value" />
|
|
|
+ </el-select>
|
|
|
+ <el-select v-model="queryParams.status" placeholder="状态" class="status-select" clearable @change="handleQuery">
|
|
|
+ <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ <el-button type="primary" icon="Plus" @click="handleAdd" v-hasPermi="['system:store:add']">新增门店</el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </transition>
|
|
|
-
|
|
|
- <el-card shadow="never">
|
|
|
+ </template>
|
|
|
|
|
|
- <el-table v-loading="loading" border :data="storeList" @selection-change="handleSelectionChange">
|
|
|
- <el-table-column type="selection" width="55" align="center" />
|
|
|
- <el-table-column label="门店信息" align="left" width="300">
|
|
|
+ <el-table v-loading="loading" :data="storeList" style="width: 100%" :header-cell-style="{ background: '#f8f9fb', color: '#606266' }">
|
|
|
+ <el-table-column label="门店信息" min-width="240">
|
|
|
<template #default="scope">
|
|
|
- <div class="store-info" style="display: flex; align-items: center; gap: 10px;">
|
|
|
- <div class="store-logo">
|
|
|
- <image-preview :src="scope.row.logoUrl" :width="50" :height="50" />
|
|
|
- </div>
|
|
|
- <div class="store-details" style="display: flex; flex-direction: column; gap: 6px;">
|
|
|
- <div class="store-name" style="font-size: 14px; font-weight: 500; color: #303133;">{{ scope.row.name }}</div>
|
|
|
- <div class="store-categories" style="display: flex; gap: 6px;">
|
|
|
+ <div class="store-info-box">
|
|
|
+ <image-preview :src="scope.row.logoUrl" :width="50" :height="50" class="store-logo" />
|
|
|
+ <div class="store-desc">
|
|
|
+ <div class="name">{{ scope.row.name }}</div>
|
|
|
+ <div class="tags">
|
|
|
<el-tag size="small" type="warning" effect="plain" v-if="scope.row.tenantName">{{ scope.row.tenantName }}</el-tag>
|
|
|
<el-tag size="small" type="success" effect="plain" v-if="scope.row.tenantCatergoriesName">{{ scope.row.tenantCatergoriesName }}</el-tag>
|
|
|
</div>
|
|
|
@@ -40,94 +49,106 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="资质认证" align="center" width="100">
|
|
|
- <template #default="scope">
|
|
|
- <image-preview v-if="scope.row.businessLicenseUrl" :src="scope.row.businessLicenseUrl" :width="40" :height="40" />
|
|
|
- <span v-else>-</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="服务项目" align="center" width="200">
|
|
|
+
|
|
|
+ <el-table-column label="服务项目" min-width="180">
|
|
|
<template #default="scope">
|
|
|
- <div class="services">
|
|
|
- <el-tag v-for="service in scope.row.services" :key="service" size="small"
|
|
|
- style="margin-right: 5px; margin-bottom: 5px">
|
|
|
+ <div class="service-tags">
|
|
|
+ <el-tag v-for="service in scope.row.services" :key="service" size="small" effect="light" class="service-tag">
|
|
|
{{ getServiceName(service) }}
|
|
|
</el-tag>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="归属站点" align="center" width="150">
|
|
|
- <template #default="scope">
|
|
|
- <div>{{ scope.row.siteName }}</div>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="服务单" align="center" width="150">
|
|
|
+
|
|
|
+ <el-table-column label="资质认证" align="center" width="100">
|
|
|
<template #default="scope">
|
|
|
- <div>{{ scope.row.serviceOrder }}</div>
|
|
|
+ <image-preview v-if="scope.row.businessLicenseUrl" :src="scope.row.businessLicenseUrl" :width="40" :height="40" />
|
|
|
+ <span v-else>-</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="营业时间" align="center" width="150">
|
|
|
+
|
|
|
+ <el-table-column label="归属区域/站点" min-width="150">
|
|
|
<template #default="scope">
|
|
|
- <div>{{ formatTime(scope.row.startBusinessTime) }}-{{ formatTime(scope.row.endBusinessTime) }}</div>
|
|
|
+ <div class="region-info">
|
|
|
+ <div class="region-name">{{ getRegionNameBySite(scope.row.site) }}</div>
|
|
|
+ <div class="site-name">
|
|
|
+ <el-icon><Location /></el-icon>
|
|
|
+ <span>{{ scope.row.siteName }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="门店地址" align="center" width="300">
|
|
|
+
|
|
|
+ <el-table-column label="服务单" align="center" width="100" prop="serviceOrder" sortable />
|
|
|
+
|
|
|
+ <el-table-column label="营业时间" align="center" width="140">
|
|
|
<template #default="scope">
|
|
|
- <div>{{ getFullAddress(scope.row) }}</div>
|
|
|
+ <span class="time-text">{{ formatTime(scope.row.startBusinessTime) }},{{ formatTime(scope.row.endBusinessTime) }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="联系方式" align="left" width="180">
|
|
|
+
|
|
|
+ <el-table-column label="联系方式" min-width="160">
|
|
|
<template #default="scope">
|
|
|
- <div style="display: flex; flex-direction: column; gap: 6px;">
|
|
|
- <div style="display: flex; align-items: center; gap: 6px; color: #606266; font-size: 14px;">
|
|
|
- <el-icon size="16"><User /></el-icon>
|
|
|
- <span>{{ scope.row.contact }}</span>
|
|
|
+ <div class="contact-info">
|
|
|
+ <div class="contact-item">
|
|
|
+ <el-icon><User /></el-icon><span>{{ scope.row.contact }}</span>
|
|
|
</div>
|
|
|
- <div style="display: flex; align-items: center; gap: 6px; color: #409eff; font-size: 14px;">
|
|
|
- <el-icon size="16"><Phone /></el-icon>
|
|
|
- <span>{{ scope.row.contactNumber }}</span>
|
|
|
+ <div class="contact-item phone">
|
|
|
+ <el-icon><Phone /></el-icon><span>{{ scope.row.contactNumber }}</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="有效期至" align="center" width="120">
|
|
|
+
|
|
|
+ <el-table-column label="门店地址" prop="detailAddress" min-width="200" show-overflow-tooltip>
|
|
|
<template #default="scope">
|
|
|
- <div>{{ parseTime(scope.row.validity, '{y}-{m}-{d}') }}</div>
|
|
|
+ {{ getFullAddress(scope.row) }}
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="状态" align="center" width="100">
|
|
|
+
|
|
|
+ <el-table-column label="状态" align="center" width="90">
|
|
|
<template #default="scope">
|
|
|
<template v-for="item in statusList" :key="item.value">
|
|
|
- <el-tag v-if="scope.row.status === item.value" :type="item.style">{{ item.label }}</el-tag>
|
|
|
+ <el-tag v-if="scope.row.status === item.value" :type="item.style" size="small" effect="light">
|
|
|
+ {{ item.label }}
|
|
|
+ </el-tag>
|
|
|
</template>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
|
|
+
|
|
|
+ <el-table-column label="操作" align="right" width="180" fixed="right">
|
|
|
<template #default="scope">
|
|
|
- <el-tooltip content="详情" placement="top">
|
|
|
- <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- <el-tooltip content="修改" placement="top">
|
|
|
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
|
|
|
- v-hasPermi="['system:store:edit']"></el-button>
|
|
|
- </el-tooltip>
|
|
|
- <el-dropdown @command="(command: string) => handleCommand(command, scope.row)" v-hasPermi="['system:store:edit']">
|
|
|
- <el-button link type="primary" icon="More"></el-button>
|
|
|
- <template #dropdown>
|
|
|
- <el-dropdown-menu>
|
|
|
- <el-dropdown-item command="handleRenew" icon="Calendar">续期</el-dropdown-item>
|
|
|
- <el-dropdown-item command="handleBan" icon="CircleClose" v-if="scope.row.status === 1">禁用</el-dropdown-item>
|
|
|
- <el-dropdown-item command="handleEnable" icon="CircleCheck" v-if="scope.row.status === 2">启用</el-dropdown-item>
|
|
|
- </el-dropdown-menu>
|
|
|
- </template>
|
|
|
- </el-dropdown>
|
|
|
+ <div class="op-btns">
|
|
|
+ <el-button link type="primary" @click="handleDetail(scope.row)" v-hasPermi="['system:store:query']">详情</el-button>
|
|
|
+ <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:store:edit']">编辑</el-button>
|
|
|
+ <el-dropdown trigger="click" @command="(cmd) => handleCommand(cmd, scope.row)">
|
|
|
+ <el-button link type="primary" class="more-btn">
|
|
|
+ 更多<el-icon class="el-icon--right"><arrow-down /></el-icon>
|
|
|
+ </el-button>
|
|
|
+ <template #dropdown>
|
|
|
+ <el-dropdown-menu>
|
|
|
+ <el-dropdown-item command="handleRenew" v-hasPermi="['system:store:renew']">续期</el-dropdown-item>
|
|
|
+ <el-dropdown-item v-if="scope.row.status === 1" command="handleBan" class="delete-item" v-hasPermi="['system:store:disable']">禁用</el-dropdown-item>
|
|
|
+ <el-dropdown-item v-if="scope.row.status === 2" command="handleEnable" v-hasPermi="['system:store:enable']">启用</el-dropdown-item>
|
|
|
+ </el-dropdown-menu>
|
|
|
+ </template>
|
|
|
+ </el-dropdown>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
|
|
|
- <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
|
|
- v-model:limit="queryParams.pageSize" @pagination="getList" />
|
|
|
+ <div class="pagination-container">
|
|
|
+ <pagination
|
|
|
+ v-show="total > 0"
|
|
|
+ v-model:total="total"
|
|
|
+ v-model:page="queryParams.pageNum"
|
|
|
+ v-model:limit="queryParams.pageSize"
|
|
|
+ @pagination="getList"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
</el-card>
|
|
|
+
|
|
|
<!-- 添加或修改门店管理对话框 -->
|
|
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body>
|
|
|
<el-form ref="storeFormRef" :model="form" :rules="rules" label-width="120px">
|
|
|
@@ -148,31 +169,35 @@
|
|
|
</el-checkbox-group>
|
|
|
</el-form-item>
|
|
|
<el-form-item label="商户分类" prop="tenantCatergories">
|
|
|
- <PageSelect v-model="form.tenantCatergories"
|
|
|
+ <PageSelect
|
|
|
+ v-model="form.tenantCatergories"
|
|
|
:options="tenantCategoriesList.map(item => ({ value: item.id, label: item.name }))"
|
|
|
- :total="tenantCategoriesTotal" :pageSize="10" placeholder="请选择商户分类"
|
|
|
- @page-change="handleTenantCategoriesPageChange" @visible-change="handleTenantCategoriesVisibleChange" />
|
|
|
+ :total="tenantCategoriesTotal"
|
|
|
+ :pageSize="10"
|
|
|
+ placeholder="请选择商户分类"
|
|
|
+ @page-change="handleTenantCategoriesPageChange"
|
|
|
+ @visible-change="handleTenantCategoriesVisibleChange"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="所属品牌" prop="tenantId">
|
|
|
- <PageSelect v-model="form.tenantId"
|
|
|
- :options="brandList.map(item => ({ value: item.tenantId, label: item.name }))" :total="brandTotal"
|
|
|
- :pageSize="10" placeholder="请选择所属品牌" @page-change="handleBrandPageChange"
|
|
|
- @visible-change="handleBrandSelectVisibleChange" />
|
|
|
+ <PageSelect
|
|
|
+ v-model="form.tenantId"
|
|
|
+ :options="brandList.map(item => ({ value: item.tenantId, label: item.name }))"
|
|
|
+ :total="brandTotal"
|
|
|
+ :pageSize="10"
|
|
|
+ placeholder="请选择所属品牌"
|
|
|
+ @page-change="handleBrandPageChange"
|
|
|
+ @visible-change="handleBrandSelectVisibleChange"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="营业时间" prop="startBusinessTime">
|
|
|
<el-row :gutter="10">
|
|
|
<el-col :span="10">
|
|
|
- <el-time-picker clearable v-model="form.startBusinessTime" format="HH:mm" value-format="HH:mm" placeholder="开始时间"
|
|
|
- style="width: 100%">
|
|
|
- </el-time-picker>
|
|
|
- </el-col>
|
|
|
- <el-col :span="4" style="text-align: center; line-height: 40px">
|
|
|
- 至
|
|
|
+ <el-time-picker clearable v-model="form.startBusinessTime" format="HH:mm" value-format="HH:mm" placeholder="开始时间" style="width: 100%" />
|
|
|
</el-col>
|
|
|
+ <el-col :span="4" style="text-align: center; line-height: 32px">至</el-col>
|
|
|
<el-col :span="10">
|
|
|
- <el-time-picker clearable v-model="form.endBusinessTime" format="HH:mm" value-format="HH:mm" placeholder="结束时间"
|
|
|
- style="width: 100%">
|
|
|
- </el-time-picker>
|
|
|
+ <el-time-picker clearable v-model="form.endBusinessTime" format="HH:mm" value-format="HH:mm" placeholder="结束时间" style="width: 100%" />
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</el-form-item>
|
|
|
@@ -183,20 +208,17 @@
|
|
|
<el-input v-model="form.contactNumber" placeholder="请输入联系电话" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="有效期至" prop="validity">
|
|
|
- <el-date-picker clearable v-model="form.validity" type="date" value-format="YYYY-MM-DD" placeholder="请选择有效期至"
|
|
|
- style="width: 100%">
|
|
|
- </el-date-picker>
|
|
|
+ <el-date-picker clearable v-model="form.validity" type="date" value-format="YYYY-MM-DD" placeholder="请选择有效期至" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
<el-row :gutter="10">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="所在区域" prop="regionId">
|
|
|
- <el-cascader v-model="regionValue" :options="areaOptions" placeholder="选择区域" style="width: 100%"
|
|
|
- @change="handleAreaChange" />
|
|
|
+ <el-cascader v-model="regionValue" :options="areaOptions" placeholder="选择区域" style="width: 100%" @change="handleAreaChange" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="归属站点" prop="site">
|
|
|
- <el-select v-model="form.site" placeholder="选择站点" :disabled="!form.regionId">
|
|
|
+ <el-select v-model="form.site" placeholder="选择站点" :disabled="!form.regionId" style="width: 100%">
|
|
|
<el-option v-for="site in siteOptions" :key="site.value" :label="site.label" :value="site.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
@@ -205,8 +227,7 @@
|
|
|
<el-form-item label="详细地址">
|
|
|
<el-row :gutter="10" style="margin-bottom: 10px">
|
|
|
<el-col :span="24">
|
|
|
- <el-cascader v-model="addressCascaderValue" :options="regionData" placeholder="选择省市区"
|
|
|
- style="width: 100%" />
|
|
|
+ <el-cascader v-model="addressCascaderValue" :options="regionData" placeholder="选择省市区" style="width: 100%" />
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-input v-model="form.detailAddress" type="textarea" placeholder="输入详细地址" rows="3" style="width: 100%" />
|
|
|
@@ -229,8 +250,8 @@
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
|
|
<el-button @click="cancel">取 消</el-button>
|
|
|
+ <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
@@ -302,8 +323,8 @@
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button type="primary" @click="submitRenew" :loading="renewLoading">确 定</el-button>
|
|
|
<el-button @click="renewDialog.visible = false">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitRenew" :loading="renewLoading">确 定</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
@@ -327,22 +348,15 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
const storeList = ref<StoreVO[]>([]);
|
|
|
const buttonLoading = ref(false);
|
|
|
const loading = ref(true);
|
|
|
-const showSearch = ref(true);
|
|
|
-const ids = ref<Array<string | number>>([]);
|
|
|
-const single = ref(true);
|
|
|
-const multiple = ref(true);
|
|
|
const total = ref(0);
|
|
|
|
|
|
-const queryFormRef = ref<ElFormInstance>();
|
|
|
const storeFormRef = ref<ElFormInstance>();
|
|
|
-const brandSelectRef = ref<any>(null);
|
|
|
|
|
|
const searchRegionValue = ref<any[]>([]); // 搜索的区域值
|
|
|
const searchSiteOptions = ref<any[]>([]); // 搜索的站点选项
|
|
|
|
|
|
/** 处理搜索区域选择变化 */
|
|
|
const handleSearchAreaChange = (value: any[]) => {
|
|
|
- // 清空级联站点
|
|
|
queryParams.value.station = undefined;
|
|
|
|
|
|
if (value && value.length > 0) {
|
|
|
@@ -358,10 +372,9 @@ const handleSearchAreaChange = (value: any[]) => {
|
|
|
queryParams.value.area = undefined;
|
|
|
searchSiteOptions.value = [];
|
|
|
}
|
|
|
- handleQuery();
|
|
|
+ // 移除 handleQuery(); 只选城市不发送请求
|
|
|
};
|
|
|
|
|
|
-// 新增的响应式变量
|
|
|
const regionValue = ref<any[]>([]);
|
|
|
const province = ref('');
|
|
|
const city = ref('');
|
|
|
@@ -381,8 +394,6 @@ const areaStationList = ref<SysAreaStationOnStoreVo[]>([]); // 区域站点列
|
|
|
const areaOptions = ref<any[]>([]); // 所在区域树形选项
|
|
|
const siteOptions = ref<any[]>([]); // 归属站点选项
|
|
|
|
|
|
-
|
|
|
-
|
|
|
const dialog = reactive<DialogOption>({
|
|
|
visible: false,
|
|
|
title: ''
|
|
|
@@ -428,7 +439,6 @@ const getOrderList = async () => {
|
|
|
/** 详情按钮操作 */
|
|
|
const handleDetail = async (row: StoreVO) => {
|
|
|
const res = await getStore(row.id);
|
|
|
- // 合并列表里的关联数据,以便能够展示名称等额外字段
|
|
|
detailData.value = { ...row, ...res.data };
|
|
|
activeTab.value = 'basic';
|
|
|
orderQueryParams.storeId = row.id;
|
|
|
@@ -467,7 +477,7 @@ const handleCommand = (command: string, row: StoreVO) => {
|
|
|
/** 续期按钮操作 */
|
|
|
const handleRenew = (row: StoreVO) => {
|
|
|
renewForm.id = row.id;
|
|
|
- renewForm.to = ''; // 清空之前的选择
|
|
|
+ renewForm.to = '';
|
|
|
renewDialog.visible = true;
|
|
|
};
|
|
|
|
|
|
@@ -500,7 +510,6 @@ const handleBan = async (row: StoreVO) => {
|
|
|
proxy?.$modal.msgSuccess("禁用成功");
|
|
|
getList();
|
|
|
} catch (err) {
|
|
|
- // 取消确认或请求失败
|
|
|
} finally {
|
|
|
loading.value = false;
|
|
|
}
|
|
|
@@ -515,7 +524,6 @@ const handleEnable = async (row: StoreVO) => {
|
|
|
proxy?.$modal.msgSuccess("启用成功");
|
|
|
getList();
|
|
|
} catch (err) {
|
|
|
- // 取消确认或请求失败
|
|
|
} finally {
|
|
|
loading.value = false;
|
|
|
}
|
|
|
@@ -551,46 +559,20 @@ const data = reactive<PageData<StoreForm, SysStorePageBo>>({
|
|
|
area: undefined,
|
|
|
station: undefined,
|
|
|
status: undefined,
|
|
|
- params: {
|
|
|
- }
|
|
|
+ params: {}
|
|
|
},
|
|
|
rules: {
|
|
|
- id: [
|
|
|
- { required: true, message: "序号不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- businessLicense: [
|
|
|
- { required: true, message: "营业执照不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- name: [
|
|
|
- { required: true, message: "门店名称不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- tenantCatergories: [
|
|
|
- { required: true, message: "商户分类不能为空", trigger: "change" }
|
|
|
- ],
|
|
|
- startBusinessTime: [
|
|
|
- { required: true, message: "开始营业时间不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- endBusinessTime: [
|
|
|
- { required: true, message: "结束营业时间不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- contact: [
|
|
|
- { required: true, message: "联系人不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- contactNumber: [
|
|
|
- { required: true, message: "联系电话不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- validity: [
|
|
|
- { required: true, message: "有效期至不能为空", trigger: "blur" }
|
|
|
- ],
|
|
|
- tenantId: [
|
|
|
- { required: true, message: "租户编号不能为空", trigger: "change" }
|
|
|
- ],
|
|
|
- regionId: [
|
|
|
- { required: true, message: "所在区域不能为空", trigger: "change" }
|
|
|
- ],
|
|
|
- site: [
|
|
|
- { required: true, message: "归属站点不能为空", trigger: "change" }
|
|
|
- ],
|
|
|
+ businessLicense: [{ required: true, message: "营业执照不能为空", trigger: "blur" }],
|
|
|
+ name: [{ required: true, message: "门店名称不能为空", trigger: "blur" }],
|
|
|
+ tenantCatergories: [{ required: true, message: "商户分类不能为空", trigger: "change" }],
|
|
|
+ startBusinessTime: [{ required: true, message: "开始营业时间不能为空", trigger: "blur" }],
|
|
|
+ endBusinessTime: [{ required: true, message: "结束营业时间不能为空", trigger: "blur" }],
|
|
|
+ contact: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
|
|
|
+ contactNumber: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
|
|
|
+ validity: [{ required: true, message: "有效期至不能为空", trigger: "blur" }],
|
|
|
+ tenantId: [{ required: true, message: "所属品牌不能为空", trigger: "change" }],
|
|
|
+ regionId: [{ required: true, message: "所在区域不能为空", trigger: "change" }],
|
|
|
+ site: [{ required: true, message: "归属站点不能为空", trigger: "change" }],
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -614,7 +596,6 @@ const cancel = () => {
|
|
|
/** 表单重置 */
|
|
|
const reset = () => {
|
|
|
form.value = { ...initFormData };
|
|
|
- // 重置新增的变量
|
|
|
regionValue.value = [];
|
|
|
province.value = '';
|
|
|
city.value = '';
|
|
|
@@ -633,24 +614,6 @@ const handleQuery = () => {
|
|
|
getList();
|
|
|
}
|
|
|
|
|
|
-/** 重置按钮操作 */
|
|
|
-const resetQuery = () => {
|
|
|
- searchRegionValue.value = [];
|
|
|
- searchSiteOptions.value = [];
|
|
|
- queryParams.value.storeOrContact = undefined;
|
|
|
- queryParams.value.area = undefined;
|
|
|
- queryParams.value.station = undefined;
|
|
|
- queryParams.value.status = undefined;
|
|
|
- handleQuery();
|
|
|
-}
|
|
|
-
|
|
|
-/** 多选框选中数据 */
|
|
|
-const handleSelectionChange = (selection: StoreVO[]) => {
|
|
|
- ids.value = selection.map(item => item.id);
|
|
|
- single.value = selection.length != 1;
|
|
|
- multiple.value = !selection.length;
|
|
|
-}
|
|
|
-
|
|
|
/** 新增按钮操作 */
|
|
|
const handleAdd = () => {
|
|
|
reset();
|
|
|
@@ -659,13 +622,11 @@ const handleAdd = () => {
|
|
|
}
|
|
|
|
|
|
/** 修改按钮操作 */
|
|
|
-const handleUpdate = async (row?: StoreVO) => {
|
|
|
+const handleUpdate = async (row: StoreVO) => {
|
|
|
reset();
|
|
|
- const _id = row?.id || ids.value[0]
|
|
|
- const res = await getStore(_id);
|
|
|
+ const res = await getStore(row.id);
|
|
|
Object.assign(form.value, res.data);
|
|
|
|
|
|
- // 预填商户分类名,防止PageSelect组件在点击前显示为空或ID
|
|
|
if (res.data.tenantCatergories && (res.data as any).tenantCatergoriesName) {
|
|
|
tenantCategoriesList.value = [{
|
|
|
id: res.data.tenantCatergories,
|
|
|
@@ -673,7 +634,6 @@ const handleUpdate = async (row?: StoreVO) => {
|
|
|
}];
|
|
|
tenantCategoriesTotal.value = 1;
|
|
|
}
|
|
|
- // 预填品牌名
|
|
|
if (res.data.tenantId && (res.data as any).tenantName) {
|
|
|
brandList.value = [{
|
|
|
tenantId: res.data.tenantId,
|
|
|
@@ -739,22 +699,6 @@ const submitForm = () => {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-/** 删除按钮操作 */
|
|
|
-const handleDelete = async (row?: StoreVO) => {
|
|
|
- const _ids = row?.id || ids.value;
|
|
|
- await proxy?.$modal.confirm('是否确认删除门店管理编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
|
|
|
- await delStore(_ids);
|
|
|
- proxy?.$modal.msgSuccess("删除成功");
|
|
|
- await getList();
|
|
|
-}
|
|
|
-
|
|
|
-/** 导出按钮操作 */
|
|
|
-const handleExport = () => {
|
|
|
- proxy?.download('system/store/export', {
|
|
|
- ...queryParams.value
|
|
|
- }, `store_${new Date().getTime()}.xlsx`)
|
|
|
-}
|
|
|
-
|
|
|
/** 获取经纬度 */
|
|
|
const getGeolocation = () => {
|
|
|
if ('geolocation' in navigator) {
|
|
|
@@ -767,18 +711,10 @@ const getGeolocation = () => {
|
|
|
(error) => {
|
|
|
let errorMessage = '获取位置失败';
|
|
|
switch (error.code) {
|
|
|
- case error.PERMISSION_DENIED:
|
|
|
- errorMessage = '用户拒绝了地理定位请求';
|
|
|
- break;
|
|
|
- case error.POSITION_UNAVAILABLE:
|
|
|
- errorMessage = '位置信息不可用';
|
|
|
- break;
|
|
|
- case error.TIMEOUT:
|
|
|
- errorMessage = '获取位置超时';
|
|
|
- break;
|
|
|
- case error.UNKNOWN_ERROR:
|
|
|
- errorMessage = '未知错误';
|
|
|
- break;
|
|
|
+ case error.PERMISSION_DENIED: errorMessage = '用户拒绝了地理定位请求'; break;
|
|
|
+ case error.POSITION_UNAVAILABLE: errorMessage = '位置信息不可用'; break;
|
|
|
+ case error.TIMEOUT: errorMessage = '获取位置超时'; break;
|
|
|
+ case error.UNKNOWN_ERROR: errorMessage = '未知错误'; break;
|
|
|
}
|
|
|
proxy?.$modal.msgError(errorMessage);
|
|
|
}
|
|
|
@@ -791,19 +727,10 @@ const getGeolocation = () => {
|
|
|
/** 获取品牌列表 */
|
|
|
const getBrandList = async (pageNum = 1, keyword = '', append = false) => {
|
|
|
brandLoading.value = true;
|
|
|
- // 确保参数格式正确,直接传递数字类型的pageNum
|
|
|
- const res = await listOnStore({ pageNum: pageNum, pageSize: 10 });
|
|
|
+ const res = await listOnStore({ pageNum, pageSize: 10 });
|
|
|
if (res.code === 200) {
|
|
|
- if (append) {
|
|
|
- // 追加模式,用于分页加载
|
|
|
- brandList.value = [...brandList.value, ...res.rows];
|
|
|
- } else {
|
|
|
- // 替换模式,用于初始加载或搜索
|
|
|
- brandList.value = res.rows;
|
|
|
- }
|
|
|
- // 存储总数
|
|
|
+ brandList.value = append ? [...brandList.value, ...res.rows] : res.rows;
|
|
|
brandTotal.value = res.total || 0;
|
|
|
- console.log('总数', brandTotal.value);
|
|
|
}
|
|
|
brandLoading.value = false;
|
|
|
};
|
|
|
@@ -812,7 +739,6 @@ const getBrandList = async (pageNum = 1, keyword = '', append = false) => {
|
|
|
const getServiceList = async () => {
|
|
|
try {
|
|
|
const res = await listAllService();
|
|
|
- // 转换数据格式,适配checkbox组件
|
|
|
serviceList.value = res.data || res;
|
|
|
} catch (error) {
|
|
|
console.error('获取服务项目列表失败:', error);
|
|
|
@@ -825,13 +751,7 @@ const getAreaStationList = async () => {
|
|
|
const res = await listAreaStationOnStore();
|
|
|
const data = res.data || res;
|
|
|
areaStationList.value = data;
|
|
|
-
|
|
|
- // 分离所在区域数据(type为0或1)
|
|
|
- const areaData = data.filter((item: any) => item.type === 0 || item.type === 1);
|
|
|
- // 构建树形结构
|
|
|
- areaOptions.value = buildTree(areaData, 0);
|
|
|
-
|
|
|
- // 初始化站点数据为空
|
|
|
+ areaOptions.value = buildTree(data.filter((item: any) => item.type === 0 || item.type === 1), 0);
|
|
|
siteOptions.value = [];
|
|
|
} catch (error) {
|
|
|
console.error('获取区域站点列表失败:', error);
|
|
|
@@ -851,15 +771,10 @@ const buildTree = (data: any[], parentId: any): any[] => {
|
|
|
|
|
|
/** 处理所在区域选择变化 */
|
|
|
const handleAreaChange = (value: any[]) => {
|
|
|
- // 清空归属站点选择
|
|
|
form.value.site = undefined;
|
|
|
-
|
|
|
if (value && value.length > 0) {
|
|
|
- // 获取最后一级的id
|
|
|
const areaId = value[value.length - 1];
|
|
|
- // 更新regionId
|
|
|
form.value.regionId = areaId;
|
|
|
- // 过滤出parentId等于areaId的站点
|
|
|
siteOptions.value = areaStationList.value
|
|
|
.filter((item: any) => item.type === 2 && String(item.parentId) === String(areaId))
|
|
|
.map((item: any) => ({
|
|
|
@@ -867,7 +782,6 @@ const handleAreaChange = (value: any[]) => {
|
|
|
label: item.name
|
|
|
}));
|
|
|
} else {
|
|
|
- // 如果没有选择区域,清空站点选项和regionId
|
|
|
form.value.regionId = undefined;
|
|
|
siteOptions.value = [];
|
|
|
}
|
|
|
@@ -886,109 +800,44 @@ const getTenantCategoriesList = async (pageNum = 1) => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-/** 处理品牌页面切换 */
|
|
|
-const handleBrandPageChange = (page: number) => {
|
|
|
- // 确保page是数字类型
|
|
|
- const pageNum = Number(page);
|
|
|
- currentPage.value = pageNum;
|
|
|
- getBrandList(pageNum, brandKeyword.value, false);
|
|
|
-};
|
|
|
-
|
|
|
-/** 处理商户分类分页 */
|
|
|
-const handleTenantCategoriesPageChange = (page: number) => {
|
|
|
- // 确保page是数字类型
|
|
|
- const pageNum = Number(page);
|
|
|
- getTenantCategoriesList(pageNum);
|
|
|
-};
|
|
|
-
|
|
|
-/** 处理商户分类选择框可见性变化 */
|
|
|
-const handleTenantCategoriesVisibleChange = (visible: boolean) => {
|
|
|
- if (visible) {
|
|
|
- getTenantCategoriesList(1);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-/** 远程搜索方法 */
|
|
|
-const remoteMethod = (query: string) => {
|
|
|
- brandKeyword.value = query;
|
|
|
- currentPage.value = 1;
|
|
|
- getBrandList(1, query, false);
|
|
|
-};
|
|
|
-
|
|
|
-/** 处理品牌选择框显示状态变化 */
|
|
|
+const handleBrandPageChange = (page: number) => { getBrandList(Number(page), brandKeyword.value, false); };
|
|
|
+const handleTenantCategoriesPageChange = (page: number) => { getTenantCategoriesList(Number(page)); };
|
|
|
+const handleTenantCategoriesVisibleChange = (visible: boolean) => { if (visible) getTenantCategoriesList(1); };
|
|
|
const handleBrandSelectVisibleChange = (visible: boolean) => {
|
|
|
brandSelectVisible.value = visible;
|
|
|
if (visible) {
|
|
|
- // 选择框显示时,重置页码并重新加载数据
|
|
|
currentPage.value = 1;
|
|
|
getBrandList(1, brandKeyword.value, false);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-// 监听省市区选择变化,不追加到详细地址,直接存储到区域编码中
|
|
|
-watch(
|
|
|
- addressCascaderValue,
|
|
|
- (newValue) => {
|
|
|
- if (newValue && newValue.length > 0) {
|
|
|
- form.value.areaCode = newValue.join(',');
|
|
|
- } else {
|
|
|
- form.value.areaCode = undefined;
|
|
|
- }
|
|
|
- },
|
|
|
- { deep: true }
|
|
|
-);
|
|
|
+watch(addressCascaderValue, (newValue) => {
|
|
|
+ form.value.areaCode = newValue && newValue.length > 0 ? newValue.join(',') : undefined;
|
|
|
+}, { deep: true });
|
|
|
|
|
|
-/** 获取服务项目名称 */
|
|
|
const getServiceName = (serviceId: number): string => {
|
|
|
const service = serviceList.value.find(item => item.id === serviceId);
|
|
|
return service ? service.name : String(serviceId);
|
|
|
};
|
|
|
|
|
|
-/** 获取状态列表 */
|
|
|
const getStatusList = async () => {
|
|
|
try {
|
|
|
const res: any = await listStoreStatus();
|
|
|
- // 兼容可能的不同响应体结构
|
|
|
statusList.value = res.data || res.rows || res;
|
|
|
} catch (error) {
|
|
|
console.error('获取状态列表失败:', error);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-/** 格式化时间为时分 */
|
|
|
const formatTime = (time: string | number): string => {
|
|
|
if (!time) return '';
|
|
|
-
|
|
|
- // 如果已经是 HH:mm 格式,直接返回
|
|
|
- if (typeof time === 'string' && /^\d{2}:\d{2}$/.test(time)) {
|
|
|
- return time;
|
|
|
- }
|
|
|
-
|
|
|
- // 如果是 HH:mm:ss 格式,截取前5位
|
|
|
- if (typeof time === 'string' && /^\d{2}:\d{2}:\d{2}$/.test(time)) {
|
|
|
- return time.substring(0, 5);
|
|
|
- }
|
|
|
-
|
|
|
- // 处理时间戳或日期字符串
|
|
|
- let date: Date;
|
|
|
- if (typeof time === 'string' && !time.includes('-') && !time.includes('T')) {
|
|
|
- // 尝试补全日期以使 Date 能够解析某些纯时间字符串,或者如果上面正则没匹配到则直接返回
|
|
|
- return time;
|
|
|
- } else {
|
|
|
- date = new Date(time);
|
|
|
- }
|
|
|
-
|
|
|
- // 检查是否是有效日期
|
|
|
- if (isNaN(date.getTime())) return String(time);
|
|
|
-
|
|
|
- // 格式化为 HH:mm
|
|
|
- const hours = date.getHours().toString().padStart(2, '0');
|
|
|
- const minutes = date.getMinutes().toString().padStart(2, '0');
|
|
|
-
|
|
|
- return `${hours}:${minutes}`;
|
|
|
+ if (typeof time === 'string' && /^\d{2}:\d{2}$/.test(time)) return time;
|
|
|
+ if (typeof time === 'string' && /^\d{2}:\d{2}:\d{2}$/.test(time)) return time.substring(0, 5);
|
|
|
+ let date = (typeof time === 'string' && !time.includes('-') && !time.includes('T')) ? null : new Date(time);
|
|
|
+ if (!date || isNaN(date.getTime())) return String(time);
|
|
|
+ return `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
|
|
|
};
|
|
|
|
|
|
-/** 获取完整门店地址:{省}{市}{区} {详细地址} */
|
|
|
const getFullAddress = (row: any): string => {
|
|
|
let areaText = '';
|
|
|
if (row.areaCode) {
|
|
|
@@ -998,6 +847,30 @@ const getFullAddress = (row: any): string => {
|
|
|
return areaText ? `${areaText} ${row.detailAddress || ''}` : (row.detailAddress || '');
|
|
|
};
|
|
|
|
|
|
+/** 根据站点ID获取区域全称(向上遍历树形关系) */
|
|
|
+const getRegionNameBySite = (siteId: string | number): string => {
|
|
|
+ if (!siteId || areaStationList.value.length === 0) return '正在加载...';
|
|
|
+
|
|
|
+ const site = areaStationList.value.find(item => String(item.id) === String(siteId));
|
|
|
+ if (!site) return '未知区域';
|
|
|
+
|
|
|
+ let parentNames: string[] = [];
|
|
|
+ let currentParentId = site.parentId;
|
|
|
+
|
|
|
+ // 向上遍历直到父级ID为0或没找到父级
|
|
|
+ while (currentParentId && String(currentParentId) !== '0') {
|
|
|
+ const parent = areaStationList.value.find(item => String(item.id) === String(currentParentId));
|
|
|
+ if (parent) {
|
|
|
+ parentNames.unshift(parent.name);
|
|
|
+ currentParentId = parent.parentId;
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return parentNames.length > 0 ? parentNames.join('/') : '顶级区域';
|
|
|
+};
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getList();
|
|
|
getBrandList();
|
|
|
@@ -1007,58 +880,151 @@ onMounted(() => {
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
-<style scoped>
|
|
|
-.brand-pagination {
|
|
|
- margin-top: 10px;
|
|
|
- padding-top: 10px;
|
|
|
- border-top: 1px solid #ebeef5;
|
|
|
- text-align: center;
|
|
|
+<style scoped lang="scss">
|
|
|
+.page-container {
|
|
|
+ padding: 20px;
|
|
|
+ background-color: #f5f7f9;
|
|
|
+ min-height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.table-card {
|
|
|
+ border: none;
|
|
|
+ border-radius: 8px;
|
|
|
+
|
|
|
+ :deep(.el-card__header) {
|
|
|
+ padding: 20px 24px;
|
|
|
+ border-bottom: 1px solid #f0f0f0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-.custom-pagination {
|
|
|
+.card-header {
|
|
|
display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
align-items: center;
|
|
|
- justify-content: center;
|
|
|
- gap: 10px;
|
|
|
- font-size: 14px;
|
|
|
}
|
|
|
|
|
|
-.page-arrow {
|
|
|
- cursor: pointer;
|
|
|
- color: #606266;
|
|
|
- user-select: none;
|
|
|
- padding: 2px 8px;
|
|
|
- transition: color 0.3s;
|
|
|
+.header-left {
|
|
|
+ .title {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.header-right {
|
|
|
+ display: flex;
|
|
|
+ gap: 12px;
|
|
|
+
|
|
|
+ .search-input { width: 200px; }
|
|
|
+ .region-select, .station-select, .status-select { width: 140px; }
|
|
|
+
|
|
|
+ :deep(.el-input__wrapper) {
|
|
|
+ background-color: #f4f5f7;
|
|
|
+ box-shadow: none;
|
|
|
+ border: 1px solid transparent;
|
|
|
+
|
|
|
+ &:hover, &.is-focus {
|
|
|
+ border-color: #409eff;
|
|
|
+ background-color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.store-info-box {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 12px;
|
|
|
+
|
|
|
+ .store-desc {
|
|
|
+ .name {
|
|
|
+ font-weight: 600;
|
|
|
+ color: #333;
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+ .tags {
|
|
|
+ display: flex;
|
|
|
+ gap: 4px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.service-tags {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 4px;
|
|
|
}
|
|
|
|
|
|
-.page-arrow:hover:not(.disabled) {
|
|
|
- color: #409eff;
|
|
|
+.region-info {
|
|
|
+ .region-name {
|
|
|
+ font-weight: 500;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+ .site-name {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #909399;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 4px;
|
|
|
+ margin-top: 2px;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-.page-arrow.disabled {
|
|
|
- color: #c0c4cc;
|
|
|
- cursor: not-allowed;
|
|
|
+.contact-info {
|
|
|
+ .contact-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 4px;
|
|
|
+ font-size: 13px;
|
|
|
+ color: #606266;
|
|
|
+
|
|
|
+ &.phone {
|
|
|
+ color: #409eff;
|
|
|
+ margin-top: 2px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-icon { font-size: 14px; }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-.page-number {
|
|
|
- cursor: pointer;
|
|
|
+.time-text, .count-text {
|
|
|
+ font-weight: 500;
|
|
|
color: #606266;
|
|
|
- padding: 2px 8px;
|
|
|
- transition: all 0.3s;
|
|
|
}
|
|
|
|
|
|
-.page-number:hover {
|
|
|
- color: #409eff;
|
|
|
+.status-tag {
|
|
|
+ border: none;
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
|
|
|
-.page-number.active {
|
|
|
- color: #409eff;
|
|
|
- font-weight: bold;
|
|
|
+.op-btns {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 12px;
|
|
|
}
|
|
|
|
|
|
-.total-text {
|
|
|
- margin-left: 15px;
|
|
|
- font-size: 12px;
|
|
|
- color: #909399;
|
|
|
+.delete-item {
|
|
|
+ color: #f56c6c !important;
|
|
|
+ &:hover {
|
|
|
+ color: #f56c6c !important;
|
|
|
+ background-color: #fef0f0 !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.pagination-container {
|
|
|
+ margin-top: 24px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-table) {
|
|
|
+ --el-table-border-color: #f0f0f0;
|
|
|
+
|
|
|
+ th.el-table__cell {
|
|
|
+ font-weight: 600;
|
|
|
+ }
|
|
|
+
|
|
|
+ td.el-table__cell {
|
|
|
+ padding: 12px 0;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|