初步完成

main
Lufaneng 1 year ago
parent e5073badd3
commit c15d8164d4

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

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

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

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

@ -66,9 +66,13 @@
<el-table-column align="center" label="驳回原因" prop="review_note" show-overflow-tooltip /> <el-table-column align="center" label="驳回原因" prop="review_note" show-overflow-tooltip />
<el-table-column align="center" label="操作" width="120"> <el-table-column align="center" label="操作" width="120">
<template #default="{ row }"> <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> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

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

@ -18,146 +18,222 @@ const emit = defineEmits(['closed', 'onSuccess'])
const dialogVisible = ref(false) const dialogVisible = ref(false)
const isAdd = computed(() => props.type === 'add')
onMounted(() => { onMounted(() => {
dialogVisible.value = true dialogVisible.value = true
}) })
const formRef = ref(null) const loading = ref(true)
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)
function closed() { function closed() {
emit('closed') emit('closed')
} }
const submitForm = async () => { const store = ref({})
await formRef.value.validate() const categories = ref([])
const params = { store: { ...formField.value }, category_ids: formField.value.category_ids }
RPC.post('/store/create', params)
}
if (!isAdd.value) { RPC.post('/store/detail', { id: props.row.id })
formField.value = props.row .then((res) => {
} console.log(res)
store.value = res.store || {}
const chooseCoordinates = () => { categories.value =
showMapSelector.value = true 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> </script>
<template> <template>
<el-dialog <el-dialog
align-center align-center
:title="isAdd ? '新增' : '修改'" title="详情"
width="80%" width="80%"
v-model="dialogVisible" v-model="dialogVisible"
@closed="closed" @closed="closed"
:close-on-click-modal="false" :close-on-click-modal="false"
> >
<el-form <div v-loading="loading">
ref="formRef" <div class="title">基本信息</div>
label-position="right" <div class="storeBox">
label-suffix=":" <div class="item">
:model="formField" <div class="key">门店名称</div>
:rules="formRules" <div class="value">{{ store.store_name }}</div>
v-loading="loading" </div>
label-width="100" <div class="item">
> <div class="key">地址详情</div>
<el-form-item prop="store_name" label="门店名称"> <div class="value">{{ store.address }}</div>
<el-input placeholder="请输入" v-model="formField.store_name" /> </div>
</el-form-item> <div class="item">
<el-form-item prop="address" label="详细地址"> <div class="key">地区</div>
<el-input placeholder="请输入" v-model="formField.address" /> <div class="value">{{ store.location }}</div>
</el-form-item> </div>
<el-form-item prop="location" label="地址"> <div class="item">
<el-input placeholder="请输入" v-model="formField.location" /> <div class="key">工作时间</div>
</el-form-item> <div class="value">{{ store.business_hours }}</div>
<el-form-item prop="business_hours" label="工作时间"> </div>
<el-input placeholder="请输入" v-model="formField.business_hours" /> <div class="item">
</el-form-item> <div class="key">联系电话</div>
<el-form-item prop="contact_phone" label="联系电话"> <div class="value">{{ store.contact_phone }}</div>
<el-input placeholder="请输入" v-model="formField.contact_phone" /> </div>
</el-form-item> <div class="item">
<el-form-item prop="tags" label="分类标签"> <div class="key">分类标签</div>
<el-input placeholder="请输入,多个以,分隔" v-model="formField.tags" /> <div class="value">{{ store.tags }}</div>
</el-form-item> </div>
<el-form-item prop="category_ids" label="分类"> <div class="item">
<el-select <div class="key">门店主图</div>
clearable <div class="value">
default-first-option <div class="main_image_box" v-if="store.main_image">
filterable <el-image
multiple ref="imageRef"
placeholder="请选择" style="width: 100%; height: 100%"
v-model="formField.category_ids" :src="store.main_image"
> show-progress
<el-option :preview-src-list="[store.main_image]"
v-for="item in categoryList" fit="cover"
:key="item.id"
:label="item.name"
:value="item.id"
/> />
</el-select> <!-- <img :src="store.main_image" alt="" /> -->
</el-form-item> </div>
<el-form-item prop="main_image" label="门店主图"> </div>
<img </div>
:src="formField.main_image" <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="" alt=""
class="main_image_box" class="video_box"
v-if="formField.main_image" v-if="categories[activeTab]?.video"
/>
<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"
/> />
</el-form-item> </div>
<el-form-item prop="latitude" label="纬度"> </div>
<el-input-number <div class="line">
style="width: 200px" <div class="key">图片</div>
:controls="false" <div class="value">
placeholder="请输入" <div class="imgBox" v-for="item in categories[activeTab]?.images" :key="item">
v-model="formField.latitude" <el-image
ref="imageRef"
style="width: 100%; height: 100%"
:src="item"
show-progress
:preview-src-list="[item]"
fit="cover"
/> />
</el-form-item> </div>
<el-form-item prop="" label=""> </div>
<el-button type="primary" @click="chooseCoordinates"></el-button> </div>
</el-form-item> </div>
</el-form> </div>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="closed"> </el-button> <el-button @click="closed"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<!-- 地图坐标选择器 -->
<MapSelector
v-model="showMapSelector"
:longitude="formField.longitude"
:latitude="formField.latitude"
@confirm="handleCoordinateConfirm"
/>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.main_image_box { .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; width: 370px;
height: 130px; height: 130px;
} }
.imgBox {
width: 100px;
height: 100px;
margin-right: 10px;
margin-bottom: 10px;
}
}
}
}
</style> </style>

Loading…
Cancel
Save