初步完成

main
Lufaneng 1 year ago
parent e5073badd3
commit c15d8164d4

@ -17,7 +17,7 @@
>
<template #title>
<el-icon v-if="item.meta.title === '门店管理'">
<OfficeBuilding />
<Notebook />
</el-icon>
<span> {{ item.meta.title }}</span>
</template>
@ -40,8 +40,9 @@
<User />
</el-icon>
<el-icon v-if="item.meta.title === '门店审核'">
<Notebook />
<Tickets />
</el-icon>
<el-icon v-if="item.meta.title === '企业审核'"><Memo /></el-icon>
<span>{{ item.meta.title }}</span>
</el-menu-item>
</template>
@ -56,12 +57,17 @@ import { routes } from '@/router/index'
import { useUserStore } from '@/stores/user'
const isAdmin =
useUserStore().userInfo?.jurisdictions &&
useUserStore().userInfo?.jurisdictions?.findIndex((item) => item.code === 'superadmin') !== -1
console.log(useUserStore().userInfo)
console.log(isAdmin)
const filterRoute = (arr) => {
const arr1 = JSON.parse(JSON.stringify(arr))
let tempArr = []
tempArr = arr.filter((item) => !item.meta?.needAdmin)
arr.forEach((item) => {
tempArr = arr1.filter((item) => !item.meta?.needAdmin)
arr1.forEach((item) => {
if (item.children && item.children.length > 0) {
item.children = filterRoute(item.children)
}
@ -70,6 +76,9 @@ const filterRoute = (arr) => {
}
const asideRouter = isAdmin ? routes : filterRoute(routes)
console.log('asideRouter', asideRouter)
console.log('routes', routes)
console.log(filterRoute(routes))
const route = useRoute()
</script>

@ -10,18 +10,18 @@ export const routes = [
{
path: '/',
component: Layout,
redirect: '/WorkbenchPage',
redirect: '/BusinessManage/StoreManage',
children: [
{
path: 'WorkbenchPage',
name: 'WorkbenchPage',
component: () => import('@/views/WorkbenchPage/index.vue'),
meta: { title: '工作台' },
},
// {
// path: 'WorkbenchPage',
// name: 'WorkbenchPage',
// component: () => import('@/views/WorkbenchPage/index.vue'),
// meta: { title: '工作台' },
// },
{
path: 'BusinessManage',
name: 'BusinessManage',
redirect: '/BusinessManage/EnterpriseManage',
redirect: '/BusinessManage/StoreManage',
meta: { title: '门店管理' },
children: [
{
@ -48,7 +48,7 @@ export const routes = [
path: 'CustomerManage',
name: 'CustomerManage',
component: () => import('@/views/CustomerManage/index.vue'),
meta: { title: 'C端管理' },
meta: { title: 'C端管理', needAdmin: true },
},
{
path: 'StoreReview',

@ -118,7 +118,7 @@ const delImage = (item) => {
style="width: 100%; height: 100%"
:src="item"
show-progress
:preview-src-list="images"
:preview-src-list="[item]"
fit="cover"
/>
<div class="closeBox" @click="delImage(item)">

@ -133,12 +133,20 @@ const set_main_image = (val) => {
</el-select>
</el-form-item>
<el-form-item prop="main_image" label="门店主图">
<img
<div class="main_image_box" v-if="formField.main_image">
<!-- <img :src="formField.main_image" alt="" /> -->
<el-image
ref="imageRef"
style="width: 100%; height: 100%"
:src="formField.main_image"
alt=""
class="main_image_box"
v-if="formField.main_image"
show-progress
:preview-src-list="[formField.main_image]"
fit="cover"
/>
<div class="closeBox" @click="formField.main_image = ''">
<el-icon size="20"><CircleClose /></el-icon>
</div>
</div>
<UploadFile v-else @on-success="set_main_image"></UploadFile>
</el-form-item>
<el-form-item prop="longitude" label="经度">
@ -183,5 +191,16 @@ const set_main_image = (val) => {
.main_image_box {
width: 370px;
height: 130px;
position: relative;
img {
width: 100%;
height: 100%;
}
.closeBox {
position: absolute;
right: 0;
top: 0;
cursor: pointer;
}
}
</style>

@ -66,9 +66,13 @@
<el-table-column align="center" label="驳回原因" prop="review_note" show-overflow-tooltip />
<el-table-column align="center" label="操作" width="120">
<template #default="{ row }">
<el-button link type="primary" @click="edit(row)"> </el-button>
<el-button v-if="row.status != 1" link type="primary" @click="edit(row)">
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(row)"> </el-button>
<el-button v-if="row.status != 1" link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>

@ -1,43 +1,54 @@
<template>
<div>
<div class="title">
C端管理
</div>
<el-form ref="searchFormRef" class="form" :inline="true" label-width="98px" :model="queryParams">
<el-form-item label="个人名称" prop="configName">
<el-input clearable placeholder="请输入" style="width: 220px;" v-model="queryParams.configName" @keyup.enter="handleQuery" />
<div class="title">C端管理</div>
<el-form
ref="searchFormRef"
class="form"
:inline="true"
label-width="98px"
:model="queryParams"
>
<el-form-item label="姓名" prop="name">
<el-input
clearable
placeholder="请输入"
style="width: 220px"
v-model="queryParams.name"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label-width="100px">
<el-button icon="Search" type="primary" @keyup.enter.prevent="handleQuery" @keydown.enter.prevent>
搜索
</el-button>
<el-button icon="RefreshRight" @click="resetQuery">
重置
</el-button>
<el-button icon="Search" type="primary" @click="handleQuery"> </el-button>
<el-button icon="RefreshRight" @click="resetQuery"> </el-button>
</el-form-item>
</el-form>
<div style="margin-bottom: 20px;">
<el-button icon="Plus" type="primary" @click="add">
新建
</el-button>
<div style="margin-bottom: 20px">
<el-button icon="Plus" type="primary" @click="add"> </el-button>
</div>
<div ref="tableContainerEl" class="table_border table">
<el-table ref="tableRef" :data="tableData" v-loading="loading" header-row-class-name="table-header">
<el-table-column align="center" label="账号名称" prop="name" />
<el-table
ref="tableRef"
:data="tableData"
v-loading="loading"
header-row-class-name="table-header"
>
<el-table-column align="center" label="姓名" prop="name" />
<el-table-column align="center" label="地址详情" prop="name" />
<el-table-column align="center" label="手机号码" prop="name" />
<el-table-column align="center" label="咨询类型" prop="name" />
<el-table-column align="center" label="邮箱" prop="name" />
<el-table-column align="center" label="注册日期" prop="name">
<el-table-column align="center" label="手机号码" prop="phone" />
<el-table-column align="center" label="邮箱" prop="email" />
<el-table-column align="center" label="地址" prop="address" />
<el-table-column align="center" label="咨询类型" prop="appointment_type" />
<el-table-column align="center" label="需求补充" prop="remark" />
<el-table-column align="center" label="日期" prop="appointment_time">
<template #default="{ row }">
<span>{{ row.updateTime && dayjs(row.updateTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
<span>{{
row.appointment_time &&
dayjs(row.appointment_time * 1000).format('YYYY-MM-DD HH:mm:ss')
}}</span>
</template>
</el-table-column>
<el-table-column align="center" label="备注" prop="name" />
<el-table-column align="center" label="操作">
<!-- <el-table-column align="center" label="操作">
<template #default="{ row }">
<el-button link type="primary" @click="edit(row)">
修改
@ -47,21 +58,33 @@
删除
</el-button>
</template>
</el-table-column>
</el-table-column> -->
</el-table>
</div>
<pagination v-show="total > 0" :total="total" v-model:limit="queryParams.limit" v-model:page="queryParams.page" @pagination="getList" />
<pagination
v-show="total > 0"
:total="total"
v-model:limit="queryParams.limit"
v-model:page="queryParams.page"
@pagination="getList"
/>
<HandleDialog v-if="isShowDialog" :type="rowType" :row="currentRow" @closed="isShowDialog = false" @on-success="getList" />
<HandleDialog
v-if="isShowDialog"
:type="rowType"
:row="currentRow"
@closed="isShowDialog = false"
@on-success="getList"
/>
</div>
</template>
<script setup>
import { useTableRPC } from '@/utils/hook';
import { useTableRPC } from '@/utils/hook'
import HandleDialog from './HandleDialog.vue'
import dayjs from 'dayjs';
import RPC from '@/utils/rpc';
import dayjs from 'dayjs'
import RPC from '@/utils/rpc'
const rowType = ref('')
const currentRow = ref(null)
@ -76,16 +99,28 @@ const edit = (row) => {
currentRow.value = row
}
const { loading, tableData, tableRef, searchFormRef, total, queryParams, getList, handleQuery, resetQuery, handleDelete, isShowDialog, maxHeight, tableContainerEl } = useTableRPC({
queryParams: {
},
remoteDataFn: '/underpainting/list',
const {
loading,
tableData,
tableRef,
searchFormRef,
total,
queryParams,
getList,
handleQuery,
resetQuery,
handleDelete,
isShowDialog,
maxHeight,
tableContainerEl,
} = useTableRPC({
queryParams: {},
remoteDataFn: '/appointment/list',
deleteConfig: {
remote: '/underpainting/delete',
remote: '/appointment/delete',
key: 'id',
message(row) {
return `确认删除 “${row.underpainting_name}`
return `确认删除 “${row.name}`
},
},
})

@ -56,9 +56,13 @@
<el-table-column align="center" label="驳回原因" prop="review_note" show-overflow-tooltip />
<el-table-column align="center" label="操作">
<template #default="{ row }">
<el-button link type="primary" @click="edit(row)"> </el-button>
<el-button v-if="row.status != 1" link type="primary" @click="edit(row)">
修改
</el-button>
<el-button link type="danger" @click="handleDelete(row)"> </el-button>
<el-button v-if="row.status != 1" link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -118,13 +122,13 @@ const {
} = useTableRPC({
queryParams: {},
remoteDataFn: '/enterprise/list',
// deleteConfig: {
// remote: '/underpainting/delete',
// key: 'id',
// message(row) {
// return ` ${row.underpainting_name}`
// },
// },
deleteConfig: {
remote: '/enterprise/delete',
key: 'id',
message(row) {
return `确认删除 “${row.company_name}`
},
},
})
getList()

@ -18,146 +18,222 @@ const emit = defineEmits(['closed', 'onSuccess'])
const dialogVisible = ref(false)
const isAdd = computed(() => props.type === 'add')
onMounted(() => {
dialogVisible.value = true
})
const formRef = ref(null)
const formField = ref({})
const formRules = reactive({
store_name: [{ required: true, message: '不可为空', trigger: 'change' }],
latitude: [{ required: true, message: '不可为空', trigger: 'change' }],
longitude: [{ required: true, message: '不可为空', trigger: 'change' }],
})
const loading = ref(false)
const showMapSelector = ref(false)
const loading = ref(true)
function closed() {
emit('closed')
}
const submitForm = async () => {
await formRef.value.validate()
const params = { store: { ...formField.value }, category_ids: formField.value.category_ids }
RPC.post('/store/create', params)
}
const store = ref({})
const categories = ref([])
if (!isAdd.value) {
formField.value = props.row
}
const chooseCoordinates = () => {
showMapSelector.value = true
RPC.post('/store/detail', { id: props.row.id })
.then((res) => {
console.log(res)
store.value = res.store || {}
categories.value =
res.categories?.map((item) => {
return {
...item,
images: item.images ? JSON.parse(item.images) : [],
}
}) || []
})
.finally(() => {
loading.value = false
})
RPC.post('/store/detail', { id: props.row.id })
const activeTab = ref(0)
</script>
<template>
<el-dialog
align-center
:title="isAdd ? '新增' : '修改'"
title="详情"
width="80%"
v-model="dialogVisible"
@closed="closed"
:close-on-click-modal="false"
>
<el-form
ref="formRef"
label-position="right"
label-suffix=":"
:model="formField"
:rules="formRules"
v-loading="loading"
label-width="100"
>
<el-form-item prop="store_name" label="门店名称">
<el-input placeholder="请输入" v-model="formField.store_name" />
</el-form-item>
<el-form-item prop="address" label="详细地址">
<el-input placeholder="请输入" v-model="formField.address" />
</el-form-item>
<el-form-item prop="location" label="地址">
<el-input placeholder="请输入" v-model="formField.location" />
</el-form-item>
<el-form-item prop="business_hours" label="工作时间">
<el-input placeholder="请输入" v-model="formField.business_hours" />
</el-form-item>
<el-form-item prop="contact_phone" label="联系电话">
<el-input placeholder="请输入" v-model="formField.contact_phone" />
</el-form-item>
<el-form-item prop="tags" label="分类标签">
<el-input placeholder="请输入,多个以,分隔" v-model="formField.tags" />
</el-form-item>
<el-form-item prop="category_ids" label="分类">
<el-select
clearable
default-first-option
filterable
multiple
placeholder="请选择"
v-model="formField.category_ids"
>
<el-option
v-for="item in categoryList"
:key="item.id"
:label="item.name"
:value="item.id"
<div v-loading="loading">
<div class="title">基本信息</div>
<div class="storeBox">
<div class="item">
<div class="key">门店名称</div>
<div class="value">{{ store.store_name }}</div>
</div>
<div class="item">
<div class="key">地址详情</div>
<div class="value">{{ store.address }}</div>
</div>
<div class="item">
<div class="key">地区</div>
<div class="value">{{ store.location }}</div>
</div>
<div class="item">
<div class="key">工作时间</div>
<div class="value">{{ store.business_hours }}</div>
</div>
<div class="item">
<div class="key">联系电话</div>
<div class="value">{{ store.contact_phone }}</div>
</div>
<div class="item">
<div class="key">分类标签</div>
<div class="value">{{ store.tags }}</div>
</div>
<div class="item">
<div class="key">门店主图</div>
<div class="value">
<div class="main_image_box" v-if="store.main_image">
<el-image
ref="imageRef"
style="width: 100%; height: 100%"
:src="store.main_image"
show-progress
:preview-src-list="[store.main_image]"
fit="cover"
/>
</el-select>
</el-form-item>
<el-form-item prop="main_image" label="门店主图">
<img
:src="formField.main_image"
<!-- <img :src="store.main_image" alt="" /> -->
</div>
</div>
</div>
<div class="item">
<div class="key">经度</div>
<div class="value">{{ store.longitude }}</div>
</div>
<div class="item">
<div class="key">纬度</div>
<div class="value">{{ store.latitude }}</div>
</div>
</div>
<div class="title">分类信息</div>
<div class="categoriesBox" v-if="categories.length > 0">
<div class="tabBox">
<div
class="tabItem"
:class="{ selected: activeTab === index }"
v-for="(item, index) in categories"
@click="activeTab = index"
>
{{ item.name }}
</div>
</div>
<div class="line">
<div class="key">视频</div>
<div class="value">
<video
controls
muted
:src="categories[activeTab]?.video"
alt=""
class="main_image_box"
v-if="formField.main_image"
/>
<UploadFile v-else @on-success="set_main_image"></UploadFile>
</el-form-item>
<el-form-item prop="longitude" label="经度">
<el-input-number
style="width: 200px"
:controls="false"
placeholder="请输入"
v-model="formField.longitude"
class="video_box"
v-if="categories[activeTab]?.video"
/>
</el-form-item>
<el-form-item prop="latitude" label="纬度">
<el-input-number
style="width: 200px"
:controls="false"
placeholder="请输入"
v-model="formField.latitude"
</div>
</div>
<div class="line">
<div class="key">图片</div>
<div class="value">
<div class="imgBox" v-for="item in categories[activeTab]?.images" :key="item">
<el-image
ref="imageRef"
style="width: 100%; height: 100%"
:src="item"
show-progress
:preview-src-list="[item]"
fit="cover"
/>
</el-form-item>
<el-form-item prop="" label="">
<el-button type="primary" @click="chooseCoordinates"></el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed"> </el-button>
</div>
</template>
</el-dialog>
<!-- 地图坐标选择器 -->
<MapSelector
v-model="showMapSelector"
:longitude="formField.longitude"
:latitude="formField.latitude"
@confirm="handleCoordinateConfirm"
/>
</template>
<style lang="scss" scoped>
.main_image_box {
width: 100%;
height: 100px;
img {
width: auto;
height: auto;
max-width: 100%;
max-height: 100%;
}
}
.title {
font-size: 16px;
font-weight: 700;
margin-bottom: 10px;
}
.storeBox {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.item {
width: 32%;
display: flex;
align-items: center;
margin-bottom: 10px;
.key {
width: 70px;
flex-shrink: 0;
margin-right: 10px;
font-weight: 700;
}
}
}
.categoriesBox {
.tabBox {
display: flex;
margin-bottom: 10px;
align-items: center;
.tabItem {
font-weight: 600;
padding: 5px 10px;
margin-right: 10px;
cursor: pointer;
&.selected {
color: #006eff;
}
}
}
.line {
display: flex;
align-items: center;
margin-bottom: 10px;
.key {
font-weight: 700;
width: 60px;
margin-right: 10px;
flex-shrink: 0;
}
.value {
flex: 1;
display: flex;
flex-wrap: wrap;
.video_box {
width: 370px;
height: 130px;
}
.imgBox {
width: 100px;
height: 100px;
margin-right: 10px;
margin-bottom: 10px;
}
}
}
}
</style>

Loading…
Cancel
Save