parent
552513a534
commit
96310a0deb
@ -0,0 +1,88 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-upload
|
||||||
|
class="pic-uploader-component"
|
||||||
|
:action="http.adornUrl('/admin/file/upload/element')"
|
||||||
|
accept=".png,.jpg,.jpeg,.gif"
|
||||||
|
:headers="{Authorization: $cookie.get('Authorization')}"
|
||||||
|
:show-file-list="false"
|
||||||
|
:on-success="handleUploadSuccess"
|
||||||
|
:before-upload="beforeAvatarUpload"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
v-if="value"
|
||||||
|
alt=""
|
||||||
|
:src="resourcesUrl + value"
|
||||||
|
class="pic"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
v-else
|
||||||
|
class="el-icon-plus pic-uploader-icon"
|
||||||
|
/>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import $cookie from 'vue-cookies'
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
const emit = defineEmits(['update:modelValue'])
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const props = defineProps({
|
||||||
|
value: {
|
||||||
|
default: '',
|
||||||
|
type: String
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const resourcesUrl = import.meta.env.VITE_APP_RESOURCES_URL
|
||||||
|
/**
|
||||||
|
* 图片上传
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const handleUploadSuccess = (response, file) => {
|
||||||
|
emit('update:modelValue', file.response.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 限制图片上传大小
|
||||||
|
*/
|
||||||
|
const beforeAvatarUpload = (file) => {
|
||||||
|
const isLt2M = file.size / 1024 / 1024 < 2
|
||||||
|
const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg'
|
||||||
|
if (!isJPG) {
|
||||||
|
ElMessage.error('上传图片只能是jpeg/jpg/png/gif 格式!')
|
||||||
|
}
|
||||||
|
if (!isLt2M) {
|
||||||
|
ElMessage.error('上传图片大小不能超过 2MB!')
|
||||||
|
}
|
||||||
|
return isLt2M && isJPG
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.pic-uploader-component :deep(.el-upload) {
|
||||||
|
border: 1px dashed #d9d9d9;
|
||||||
|
border-radius: 6px;
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
.pic-uploader-icon {
|
||||||
|
font-size: 28px;
|
||||||
|
color: #8c939d;
|
||||||
|
width: 178px;
|
||||||
|
height: 178px;
|
||||||
|
line-height: 178px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.pic {
|
||||||
|
width: 178px;
|
||||||
|
height: 178px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pic-uploader-component :deep(.el-upload:hover) {
|
||||||
|
border-color: #409EFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -0,0 +1,226 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
title="选择商品"
|
||||||
|
:modal="false"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-table
|
||||||
|
ref="prodTableRef"
|
||||||
|
v-loading="dataListLoading"
|
||||||
|
:data="dataList"
|
||||||
|
border
|
||||||
|
style="width: 100%;"
|
||||||
|
@selection-change="selectChangeHandle"
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
v-if="isSingle"
|
||||||
|
width="50"
|
||||||
|
header-align="center"
|
||||||
|
align="center"
|
||||||
|
>
|
||||||
|
<template #default="scope">
|
||||||
|
<div>
|
||||||
|
<el-radio
|
||||||
|
v-model="singleSelectProdId"
|
||||||
|
:label="scope.row.prodId"
|
||||||
|
@change="getSelectProdRow(scope.row)"
|
||||||
|
>
|
||||||
|
|
||||||
|
</el-radio>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
v-if="!isSingle"
|
||||||
|
type="selection"
|
||||||
|
header-align="center"
|
||||||
|
align="center"
|
||||||
|
width="50"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="prodName"
|
||||||
|
header-align="center"
|
||||||
|
align="center"
|
||||||
|
label="产品名称"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
align="center"
|
||||||
|
width="140"
|
||||||
|
label="产品图片"
|
||||||
|
>
|
||||||
|
<template #default="scope">
|
||||||
|
<img
|
||||||
|
alt=""
|
||||||
|
:src="scope.row.pic"
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<el-pagination
|
||||||
|
:current-page="pageIndex"
|
||||||
|
:page-sizes="[10, 20, 50, 100]"
|
||||||
|
:page-size="pageSize"
|
||||||
|
:total="totalPage"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
@size-change="sizeChangeHandle"
|
||||||
|
@current-change="currentChangeHandle"
|
||||||
|
/>
|
||||||
|
<template #footer>
|
||||||
|
<span>
|
||||||
|
<el-button @click="visible = false">取消</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="submitProds()"
|
||||||
|
>确定</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
const emit = defineEmits(['refreshSelectProds'])
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const props = defineProps({
|
||||||
|
isSingle: {
|
||||||
|
default: false,
|
||||||
|
type: Boolean
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const visible = ref(false)
|
||||||
|
const dataForm = reactive({
|
||||||
|
product: ''
|
||||||
|
})
|
||||||
|
const singleSelectProdId = ref(0)
|
||||||
|
const selectProds = ref([])
|
||||||
|
const dataList = ref([])
|
||||||
|
const pageIndex = ref(1)
|
||||||
|
const pageSize = ref(10)
|
||||||
|
const totalPage = ref(0)
|
||||||
|
const dataListLoading = ref(false)
|
||||||
|
const dataListSelections = ref([])
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getDataList()
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取数据列表
|
||||||
|
*/
|
||||||
|
const init = (selectProdParam) => {
|
||||||
|
selectProds.value = selectProdParam
|
||||||
|
visible.value = true
|
||||||
|
dataListLoading.value = true
|
||||||
|
if (selectProds.value) {
|
||||||
|
selectProds.value?.forEach(row => {
|
||||||
|
dataListSelections.value.push(row)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
const prodTableRef = ref(null)
|
||||||
|
const getDataList = () => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/prod/prod/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
|
current: pageIndex.value,
|
||||||
|
size: pageSize.value
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prodName: dataForm.prodName
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataList.value = data.records
|
||||||
|
totalPage.value = data.total
|
||||||
|
dataListLoading.value = false
|
||||||
|
if (selectProds.value) {
|
||||||
|
nextTick(() => {
|
||||||
|
selectProds.value?.forEach(row => {
|
||||||
|
const index = dataList.value?.findIndex((prodItem) => prodItem.prodId === row.prodId)
|
||||||
|
prodTableRef.value?.toggleRowSelection(dataList.value[index])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 每页数
|
||||||
|
* @param val
|
||||||
|
*/
|
||||||
|
const sizeChangeHandle = (val) => {
|
||||||
|
pageSize.value = val
|
||||||
|
pageIndex.value = 1
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 当前页
|
||||||
|
* @param val
|
||||||
|
*/
|
||||||
|
const currentChangeHandle = (val) => {
|
||||||
|
pageIndex.value = val
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 单选商品事件
|
||||||
|
* @param row
|
||||||
|
*/
|
||||||
|
const getSelectProdRow = (row) => {
|
||||||
|
dataListSelections.value = [row]
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 多选点击事件
|
||||||
|
* @param selection
|
||||||
|
*/
|
||||||
|
const selectChangeHandle = (selection) => {
|
||||||
|
dataList.value?.forEach((tableItem) => {
|
||||||
|
const selectedProdIndex = selection.findIndex((selectedProd) => {
|
||||||
|
if (!selectedProd) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return selectedProd.prodId === tableItem.prodId
|
||||||
|
})
|
||||||
|
const dataSelectedProdIndex = dataListSelections.value?.findIndex((dataSelectedProd) => dataSelectedProd.prodId === tableItem.prodId)
|
||||||
|
if (selectedProdIndex > -1 && dataSelectedProdIndex === -1) {
|
||||||
|
dataListSelections.value.push(tableItem)
|
||||||
|
} else if (selectedProdIndex === -1 && dataSelectedProdIndex > -1) {
|
||||||
|
dataListSelections.value.splice(dataSelectedProdIndex, 1)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 确定事件
|
||||||
|
*/
|
||||||
|
const submitProds = () => {
|
||||||
|
if (!dataListSelections.value.length) {
|
||||||
|
ElMessage({
|
||||||
|
message: '请选择商品',
|
||||||
|
type: 'error',
|
||||||
|
duration: 1000,
|
||||||
|
onClose: () => {}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const prods = []
|
||||||
|
dataListSelections.value.forEach(item => {
|
||||||
|
const prodIndex = prods.findIndex((prod) => prod.prodId === item.prodId)
|
||||||
|
if (prodIndex === -1) {
|
||||||
|
prods.push({ prodId: item.prodId, prodName: item.prodName, pic: item.pic })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
emit('refreshSelectProds', prods)
|
||||||
|
dataListSelections.value = []
|
||||||
|
visible.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
<template>
|
||||||
|
<div class="components-add-or-upload">
|
||||||
|
<el-tooltip
|
||||||
|
v-if="props.tinymceUploadType === 'prod'"
|
||||||
|
content="内容"
|
||||||
|
placement="top"
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="clickUpload()"
|
||||||
|
>
|
||||||
|
<el-icon><UploadFilled /></el-icon>
|
||||||
|
上传图片
|
||||||
|
</el-button>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
v-else
|
||||||
|
:style="{ background: props.color, borderColor: props.color }"
|
||||||
|
type="primary"
|
||||||
|
@click="clickUpload()"
|
||||||
|
>
|
||||||
|
<el-icon><UploadFilled /></el-icon>
|
||||||
|
上传图片
|
||||||
|
</el-button>
|
||||||
|
<!-- 弹窗, 新增图片 -->
|
||||||
|
<!-- <elx-imgbox-->
|
||||||
|
<!-- v-if="elxImgboxVisible"-->
|
||||||
|
<!-- ref="elxImgboxRef"-->
|
||||||
|
<!-- @refresh-pic="refreshPic"-->
|
||||||
|
<!-- />-->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
// const emit = defineEmits(['successCBK'])
|
||||||
|
const props = defineProps({
|
||||||
|
color: {
|
||||||
|
type: String,
|
||||||
|
default: '#155bd4'
|
||||||
|
},
|
||||||
|
tinymceUploadType: {
|
||||||
|
default: '',
|
||||||
|
type: String
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const elxImgboxVisible = ref(false)
|
||||||
|
// const maxNum = ref(15) // 可选择的最大图片数量
|
||||||
|
const imgUrls = ref([])
|
||||||
|
// const resourcesUrl = import.meta.env.VITE_APP_RESOURCES_URL
|
||||||
|
// const elxImgboxRef = ref()
|
||||||
|
// const dialogVisible = ref()
|
||||||
|
/**
|
||||||
|
* 打开图片选择窗
|
||||||
|
*/
|
||||||
|
const clickUpload = () => {
|
||||||
|
imgUrls.value = ''
|
||||||
|
elxImgboxVisible.value = true
|
||||||
|
// nextTick(() => {
|
||||||
|
// elxImgboxRef.value?.init(0, maxNum.value)
|
||||||
|
// })
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 接收回调的图片数据
|
||||||
|
*/
|
||||||
|
// const refreshPic = imagePath => {
|
||||||
|
// const imageArray = imagePath.split(',')
|
||||||
|
// const data = []
|
||||||
|
// imageArray.forEach(img => {
|
||||||
|
// data.push(resourcesUrl + img)
|
||||||
|
// })
|
||||||
|
// imgUrls.value = ''
|
||||||
|
// dialogVisible.value = false
|
||||||
|
// emit('successCBK', data)
|
||||||
|
// }
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.components-add-or-upload{
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,253 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-index-img">
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="!dataForm.imgId ? '新增' : '修改'"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="dataFormRef"
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
label-width="100px"
|
||||||
|
>
|
||||||
|
<el-form-item
|
||||||
|
label="轮播图片"
|
||||||
|
prop="imgUrl"
|
||||||
|
>
|
||||||
|
<pic-upload v-model="dataForm.imgUrl" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="顺序"
|
||||||
|
prop="seq"
|
||||||
|
:rules="[
|
||||||
|
{ required: false, pattern: /\s\S+|S+\s|\S/, message: '请输入正确的顺序', trigger: 'blur' }
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<el-input v-model="dataForm.seq" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="状态"
|
||||||
|
prop="status"
|
||||||
|
>
|
||||||
|
<el-radio-group v-model="dataForm.status">
|
||||||
|
<el-radio :label="0">
|
||||||
|
禁用
|
||||||
|
</el-radio>
|
||||||
|
<el-radio :label="1">
|
||||||
|
正常
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="类型">
|
||||||
|
<el-radio-group
|
||||||
|
v-model="dataForm.type"
|
||||||
|
@change="deleteRelation"
|
||||||
|
>
|
||||||
|
<el-radio :label="-1">
|
||||||
|
无
|
||||||
|
</el-radio>
|
||||||
|
<el-radio :label="0">
|
||||||
|
商品
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
<div v-if="dataForm.relation!=null">
|
||||||
|
<el-card
|
||||||
|
:body-style="{ padding: '0px' }"
|
||||||
|
style="height: 160px;width: 120px"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
alt=""
|
||||||
|
:src="card.pic"
|
||||||
|
style="height:104px;width:100%"
|
||||||
|
>
|
||||||
|
<div class="card-prod-bottom">
|
||||||
|
<span class="card-prod-name">{{ card.name }}</span>
|
||||||
|
<el-button
|
||||||
|
type="text"
|
||||||
|
class="card-prod-name-button"
|
||||||
|
@click="deleteRelation"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
<div v-if="dataForm.relation==null">
|
||||||
|
<el-button
|
||||||
|
v-if=" dataForm.type == 0"
|
||||||
|
@click="addProd"
|
||||||
|
>
|
||||||
|
选择商品
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="onSubmit()"
|
||||||
|
>
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 商品选择弹窗-->
|
||||||
|
<prods-select
|
||||||
|
v-if="prodsSelectVisible"
|
||||||
|
ref="prodsSelectRef"
|
||||||
|
:is-single="true"
|
||||||
|
@refresh-select-prods="selectCouponProds"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { Debounce } from '@/utils/debounce'
|
||||||
|
const emit = defineEmits(['refreshDataList'])
|
||||||
|
const dataForm = ref({
|
||||||
|
status: 1,
|
||||||
|
des: '',
|
||||||
|
imgUrl: '',
|
||||||
|
seq: 0,
|
||||||
|
imgId: 0,
|
||||||
|
type: -1,
|
||||||
|
relation: null
|
||||||
|
})
|
||||||
|
const dataRule = reactive({
|
||||||
|
imgUrl: [
|
||||||
|
{ required: true, message: '轮播图片不能为空', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
// 关联数据
|
||||||
|
const card = ref({
|
||||||
|
id: 0,
|
||||||
|
pic: '',
|
||||||
|
name: '',
|
||||||
|
realData: {
|
||||||
|
prod: [],
|
||||||
|
shop: [],
|
||||||
|
activity: []
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
const prodsSelectVisible = ref(false)
|
||||||
|
const visible = ref(false)
|
||||||
|
const dataFormRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 获取分类数据
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const init = (id) => {
|
||||||
|
visible.value = true
|
||||||
|
dataForm.value.imgId = id || 0
|
||||||
|
if (dataForm.value.imgId) {
|
||||||
|
// 获取产品数据
|
||||||
|
http({
|
||||||
|
url: http.adornUrl(`/admin/indexImg/info/${dataForm.value.imgId}`),
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataForm.value = data
|
||||||
|
if (data.relation) {
|
||||||
|
card.value.pic = data.pic
|
||||||
|
card.value.name = data.prodName
|
||||||
|
card.value.id = data.relation
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
nextTick(() => {
|
||||||
|
dataFormRef.value?.resetFields()
|
||||||
|
dataForm.value.imgUrl = ''
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单提交
|
||||||
|
*/
|
||||||
|
const onSubmit = Debounce(() => {
|
||||||
|
dataFormRef.value?.validate((valid) => {
|
||||||
|
if (!valid) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const param = dataForm.value
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/indexImg'),
|
||||||
|
method: param.imgId ? 'put' : 'post',
|
||||||
|
data: http.adornData(param)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
visible.value = false
|
||||||
|
emit('refreshDataList', page)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* 删除关联数据
|
||||||
|
*/
|
||||||
|
const deleteRelation = () => {
|
||||||
|
dataForm.value.relation = null
|
||||||
|
}
|
||||||
|
|
||||||
|
const prodsSelectRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 打开选择商品
|
||||||
|
*/
|
||||||
|
const addProd = () => {
|
||||||
|
prodsSelectVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
prodsSelectRef.value?.init(card.value.realData.prod)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 添加指定商品
|
||||||
|
*/
|
||||||
|
const selectCouponProds = (prods) => {
|
||||||
|
card.value.realData.prods = prods
|
||||||
|
if (prods.length) {
|
||||||
|
const selectProd = prods[0]
|
||||||
|
dataForm.value.relation = selectProd.prodId
|
||||||
|
card.value.pic = selectProd.pic
|
||||||
|
card.value.name = selectProd.prodName
|
||||||
|
card.value.id = selectProd.prodId
|
||||||
|
} else {
|
||||||
|
card.value = {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
//card样式
|
||||||
|
.card-prod-bottom {
|
||||||
|
position: relative;
|
||||||
|
text-align: left;
|
||||||
|
.card-prod-name {
|
||||||
|
margin: auto;
|
||||||
|
padding: 0 6px;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 118px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.card-prod-name-button {
|
||||||
|
position: absolute;
|
||||||
|
top: 24px;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -0,0 +1,177 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-prod">
|
||||||
|
<avue-crud
|
||||||
|
ref="crudRef"
|
||||||
|
:page="page"
|
||||||
|
:data="dataList"
|
||||||
|
:table-loading="dataListLoading"
|
||||||
|
:option="tableOption"
|
||||||
|
@search-change="onSearch"
|
||||||
|
@selection-change="selectionChange"
|
||||||
|
@on-load="getDataList"
|
||||||
|
>
|
||||||
|
<template #menu-left>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:indexImg:save')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click.stop="onAddOrUpdate()"
|
||||||
|
>
|
||||||
|
新增
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:indexImg:delete')"
|
||||||
|
type="danger"
|
||||||
|
:disabled="dataListSelections.length <= 0"
|
||||||
|
@click="onDelete()"
|
||||||
|
>
|
||||||
|
批量删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #imgUrl="scope">
|
||||||
|
<img
|
||||||
|
v-if="scope.row.imgUrl"
|
||||||
|
alt=""
|
||||||
|
:src="scope.row.imgUrl"
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
v-else
|
||||||
|
alt=""
|
||||||
|
src="~@/assets/img/def.png"
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
<template #menu="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:indexImg:update')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click="onAddOrUpdate(scope.row.imgId)"
|
||||||
|
>
|
||||||
|
修改
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:indexImg:delete')"
|
||||||
|
type="danger"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click="onDelete(scope.row.imgId)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</avue-crud>
|
||||||
|
|
||||||
|
<!-- 弹窗, 新增 / 修改 -->
|
||||||
|
<add-or-update
|
||||||
|
v-if="addOrUpdateVisible"
|
||||||
|
ref="addOrUpdateRef"
|
||||||
|
@refresh-data-list="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { isAuth } from '@/utils'
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import AddOrUpdate from './add-or-update.vue'
|
||||||
|
import { tableOption } from '@/crud/admin/indexImg.js'
|
||||||
|
|
||||||
|
const dataList = ref([])
|
||||||
|
const dataListLoading = ref(false)
|
||||||
|
const dataListSelections = ref([])
|
||||||
|
const resourcesUrl = import.meta.env.VITE_APP_RESOURCES_URL
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* 获取数据列表
|
||||||
|
*/
|
||||||
|
const getDataList = (pageParam, params, done) => {
|
||||||
|
dataListLoading.value = true
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/indexImg/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
|
current: pageParam == null ? page.currentPage : pageParam.currentPage,
|
||||||
|
size: pageParam == null ? page.pageSize : pageParam.pageSize
|
||||||
|
},
|
||||||
|
params
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
data.records.forEach(item => {
|
||||||
|
item.imgUrl = item.imgUrl ? resourcesUrl + item.imgUrl : ''
|
||||||
|
})
|
||||||
|
dataList.value = data.records
|
||||||
|
page.total = data.total
|
||||||
|
dataListLoading.value = false
|
||||||
|
if (done) done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrUpdateVisible = ref(false)
|
||||||
|
const addOrUpdateRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 新增 / 修改
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onAddOrUpdate = (id) => {
|
||||||
|
addOrUpdateVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
addOrUpdateRef.value?.init(id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onDelete = (id) => {
|
||||||
|
const ids = id ? [id] : dataListSelections.value?.map(item => {
|
||||||
|
return item.imgId
|
||||||
|
})
|
||||||
|
ElMessageBox.confirm(`确定进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/indexImg'),
|
||||||
|
method: 'delete',
|
||||||
|
data: http.adornData(ids, false)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 条件查询
|
||||||
|
*/
|
||||||
|
const onSearch = (params, done) => {
|
||||||
|
getDataList(page, params, done)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 多选变化
|
||||||
|
*/
|
||||||
|
const selectionChange = (val) => {
|
||||||
|
dataListSelections.value = val
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -0,0 +1,124 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:modal="false"
|
||||||
|
title="选择发货地址"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="dataFormRef"
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
label-width="80px"
|
||||||
|
@keyup.enter="onSubmit()"
|
||||||
|
>
|
||||||
|
<el-form-item label="快递公司">
|
||||||
|
<el-select
|
||||||
|
v-model="dataForm.dvyId"
|
||||||
|
placeholder="请选择"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in dataForm.dvyNames"
|
||||||
|
:key="item.dvyId"
|
||||||
|
:label="item.dvyName"
|
||||||
|
:value="item.dvyId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="快递单号"
|
||||||
|
prop="dvyFlowId"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.dvyFlowId"
|
||||||
|
controls-position="right"
|
||||||
|
:min="0"
|
||||||
|
label="快递单号"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="visible = false">取消</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="onSubmit()"
|
||||||
|
>确定</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
const emit = defineEmits(['refreshDataList'])
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const validDvyFlowId = (rule, value, callback) => {
|
||||||
|
if (!value.trim()) {
|
||||||
|
callback(new Error('不能为空'))
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const dataRule = {
|
||||||
|
dvyFlowId: [
|
||||||
|
{ required: true, message: '不能为空', trigger: 'blur' },
|
||||||
|
{ validator: validDvyFlowId, trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const visible = ref(false)
|
||||||
|
const dataForm = reactive({
|
||||||
|
dvyId: '',
|
||||||
|
dvyFlowId: 0,
|
||||||
|
dvyNames: [],
|
||||||
|
orderNumber: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
const init = (orderNumber, dvyId, dvyFlowId) => {
|
||||||
|
visible.value = true
|
||||||
|
dataForm.orderNumber = orderNumber || ''
|
||||||
|
dataForm.dvyId = dvyId || ''
|
||||||
|
dataForm.dvyFlowId = dvyFlowId || ''
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/delivery/list'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams()
|
||||||
|
}).then(({ data }) => {
|
||||||
|
dataForm.dvyNames = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
const dataFormRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 表单提交
|
||||||
|
*/
|
||||||
|
const onSubmit = () => {
|
||||||
|
dataFormRef.value?.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/order/order/delivery'),
|
||||||
|
method: 'put',
|
||||||
|
data: http.adornData({
|
||||||
|
orderNumber: dataForm.orderNumber,
|
||||||
|
dvyId: dataForm.dvyId,
|
||||||
|
dvyFlowId: dataForm.dvyFlowId
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
visible.value = false
|
||||||
|
emit('refreshDataList')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,163 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-hotSearch-add-or-update">
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="!dataForm.hotSearchId ? '新增' : '修改'"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="dataFormRef"
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
label-width="80px"
|
||||||
|
@keyup.enter="onSubmit()"
|
||||||
|
>
|
||||||
|
<el-form-item
|
||||||
|
label="标题"
|
||||||
|
prop="title"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.title"
|
||||||
|
controls-position="right"
|
||||||
|
:min="0"
|
||||||
|
maxlength="50"
|
||||||
|
show-word-limit
|
||||||
|
label="标题"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item
|
||||||
|
label="内容"
|
||||||
|
prop="content"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.content"
|
||||||
|
controls-position="right"
|
||||||
|
type="textarea"
|
||||||
|
:min="0"
|
||||||
|
maxlength="255"
|
||||||
|
show-word-limit
|
||||||
|
label="内容"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="排序号"
|
||||||
|
prop="seq"
|
||||||
|
>
|
||||||
|
<el-input-number
|
||||||
|
v-model="dataForm.seq"
|
||||||
|
controls-position="right"
|
||||||
|
:min="0"
|
||||||
|
label="排序号"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="状态"
|
||||||
|
prop="status"
|
||||||
|
>
|
||||||
|
<el-radio-group v-model="dataForm.status">
|
||||||
|
<el-radio :label="0">
|
||||||
|
下线
|
||||||
|
</el-radio>
|
||||||
|
<el-radio :label="1">
|
||||||
|
正常
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button @click="visible = false">
|
||||||
|
取消
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="onSubmit()"
|
||||||
|
>
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { Debounce } from '@/utils/debounce'
|
||||||
|
const emit = defineEmits(['refreshDataList'])
|
||||||
|
const dataForm = ref({
|
||||||
|
hotSearchId: 0,
|
||||||
|
title: '',
|
||||||
|
content: '',
|
||||||
|
recDate: '',
|
||||||
|
seq: 0,
|
||||||
|
status: 0
|
||||||
|
})
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
const visible = ref(false)
|
||||||
|
const dataRule = {
|
||||||
|
title: [
|
||||||
|
{ required: true, message: '标题不能为空', trigger: 'blur' },
|
||||||
|
{ min: 1, max: 50, message: '长度在1到50个字符内', trigger: 'blur' },
|
||||||
|
{ pattern: /\s\S+|S+\s|\S/, message: '标题不能为空', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
content: [
|
||||||
|
{ required: true, message: '内容不能为空', trigger: 'blur' },
|
||||||
|
{ min: 1, max: 255, message: '长度在1到255个字符内', trigger: 'blur' },
|
||||||
|
{ pattern: /\s\S+|S+\s|\S/, message: '内容不能为空', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataFormRef = ref(null)
|
||||||
|
const init = (id) => {
|
||||||
|
dataForm.value.hotSearchId = id || 0
|
||||||
|
visible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
dataFormRef.value?.resetFields()
|
||||||
|
if (dataForm.value.hotSearchId) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/hotSearch/info/' + dataForm.value.hotSearchId),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams()
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataForm.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单提交
|
||||||
|
*/
|
||||||
|
const onSubmit = Debounce(() => {
|
||||||
|
dataFormRef.value?.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
const param = dataForm.value
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/hotSearch'),
|
||||||
|
method: param.hotSearchId ? 'put' : 'post',
|
||||||
|
data: http.adornData(param)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
visible.value = false
|
||||||
|
emit('refreshDataList', page)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,172 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-hotSearcch">
|
||||||
|
<avue-crud
|
||||||
|
ref="crudRef"
|
||||||
|
:page="page"
|
||||||
|
:data="dataList"
|
||||||
|
:table-loading="dataListLoading"
|
||||||
|
:option="tableOption"
|
||||||
|
@search-change="onSearch"
|
||||||
|
@on-load="getDataList"
|
||||||
|
@refresh-change="refreshChange"
|
||||||
|
@selection-change="selectionChange"
|
||||||
|
>
|
||||||
|
<template #menu-left>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:hotSearch:save')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click="onAddOrUpdate()"
|
||||||
|
>
|
||||||
|
新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
:disabled="dataListSelections.length <= 0"
|
||||||
|
@click.stop="onDeconste"
|
||||||
|
>
|
||||||
|
批量删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #status="scope">
|
||||||
|
<el-tag
|
||||||
|
v-if="scope.row.status === 0"
|
||||||
|
type="danger"
|
||||||
|
>
|
||||||
|
未启用
|
||||||
|
</el-tag>
|
||||||
|
<el-tag v-else>
|
||||||
|
启用
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #menu="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:hotSearch:update')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click="onAddOrUpdate(scope.row.hotSearchId)"
|
||||||
|
>
|
||||||
|
修改
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:hotSearch:deconste')"
|
||||||
|
type="danger"
|
||||||
|
icon="el-icon-deconste"
|
||||||
|
@click.stop="onDeconste(scope.row,scope.index)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</avue-crud>
|
||||||
|
|
||||||
|
<!-- 弹窗, 新增 / 修改 -->
|
||||||
|
<add-or-update
|
||||||
|
v-if="addOrUpdateVisible"
|
||||||
|
ref="addOrUpdateRef"
|
||||||
|
@refresh-data-list="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { isAuth } from '@/utils'
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import { tableOption } from '@/crud/shop/hotSearch.js'
|
||||||
|
import AddOrUpdate from './add-or-update.vue'
|
||||||
|
const dataList = ref([])
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
const dataListLoading = ref(false)
|
||||||
|
const dataListSelections = ref([])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取数据列表
|
||||||
|
*/
|
||||||
|
const getDataList = (pageParam, params, done) => {
|
||||||
|
dataListLoading.value = true
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/hotSearch/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(Object.assign({
|
||||||
|
current: pageParam ? pageParam.currentPage : 1,
|
||||||
|
size: pageParam ? pageParam.pageSize : 20
|
||||||
|
}, params))
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
page.total = data.total
|
||||||
|
page.pageSize = data.size
|
||||||
|
page.currentPage = data.current
|
||||||
|
dataList.value = data.records
|
||||||
|
dataListLoading.value = false
|
||||||
|
if (done) done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多选回调
|
||||||
|
* @param list
|
||||||
|
*/
|
||||||
|
const selectionChange = (list) => {
|
||||||
|
dataListSelections.value = list
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrUpdateVisible = ref(false)
|
||||||
|
const addOrUpdateRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 新增 / 修改
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onAddOrUpdate = (id) => {
|
||||||
|
addOrUpdateVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
addOrUpdateRef.value?.init(id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点击查询
|
||||||
|
*/
|
||||||
|
const onSearch = (params, done) => {
|
||||||
|
getDataList(page, params, done)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*/
|
||||||
|
const onDeconste = (row) => {
|
||||||
|
const ids = row.hotSearchId ? [row.hotSearchId] : dataListSelections.value?.map(item => {
|
||||||
|
return item.hotSearchId
|
||||||
|
})
|
||||||
|
ElMessageBox.confirm(`确定进行[${row.hotSearchId ? '删除' : '批量删除'}]操作?`, '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/hotSearch'),
|
||||||
|
method: 'delete',
|
||||||
|
data: http.adornData(ids, false)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}).catch(() => { })
|
||||||
|
}
|
||||||
|
const refreshChange = () => {
|
||||||
|
getDataList(page)
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,148 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="!dataForm.id ? '新增' : '修改'"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="dataFormRef"
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
label-width="80px"
|
||||||
|
@keyup.enter="onSubmit()"
|
||||||
|
>
|
||||||
|
<el-form-item
|
||||||
|
label="公告标题"
|
||||||
|
prop="title"
|
||||||
|
>
|
||||||
|
<el-input v-model="dataForm.title" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="状态"
|
||||||
|
prop="status"
|
||||||
|
>
|
||||||
|
<el-radio-group v-model="dataForm.status">
|
||||||
|
<el-radio :label="1">
|
||||||
|
公布
|
||||||
|
</el-radio>
|
||||||
|
<el-radio :label="0">
|
||||||
|
撤销
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="置顶"
|
||||||
|
prop="isTop"
|
||||||
|
>
|
||||||
|
<el-radio-group v-model="dataForm.isTop">
|
||||||
|
<el-radio :label="1">
|
||||||
|
是
|
||||||
|
</el-radio>
|
||||||
|
<el-radio :label="0">
|
||||||
|
否
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="公告内容"
|
||||||
|
prop="content"
|
||||||
|
>
|
||||||
|
<TinyMce
|
||||||
|
ref="contentEnRef"
|
||||||
|
v-model="dataForm.content"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button
|
||||||
|
@click="visible = false"
|
||||||
|
>取消</el-button>
|
||||||
|
<el-button
|
||||||
|
|
||||||
|
type="primary"
|
||||||
|
@click="onSubmit()"
|
||||||
|
>确定</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { Debounce } from '@/utils/debounce'
|
||||||
|
const emit = defineEmits(['refreshDataList'])
|
||||||
|
const visible = ref(false)
|
||||||
|
const contentEnRef = ref(null)
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const validateTitle = (rule, value, callback) => {
|
||||||
|
if (!value.trim()) {
|
||||||
|
dataForm.value.title = ''
|
||||||
|
callback(new Error('公告标题不能为空'))
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const dataRule = {
|
||||||
|
title: [
|
||||||
|
{ required: true, message: '公告标题不能为空', trigger: 'blur' },
|
||||||
|
{ validator: validateTitle, trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataForm = ref({
|
||||||
|
title: null,
|
||||||
|
content: null,
|
||||||
|
url: null,
|
||||||
|
status: 1,
|
||||||
|
isTop: 0
|
||||||
|
})
|
||||||
|
const dataFormRef = ref(null)
|
||||||
|
const init = (id) => {
|
||||||
|
dataForm.value.id = id || 0
|
||||||
|
visible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
dataFormRef.value?.resetFields()
|
||||||
|
if (dataForm.value.id) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/notice/info/' + dataForm.value.id),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams()
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataForm.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单提交
|
||||||
|
*/
|
||||||
|
const onSubmit = Debounce(() => {
|
||||||
|
dataFormRef.value?.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/notice'),
|
||||||
|
method: dataForm.value.id ? 'put' : 'post',
|
||||||
|
data: http.adornData(dataForm.value)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
visible.value = false
|
||||||
|
emit('refreshDataList')
|
||||||
|
dataForm.value.content = ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,152 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-shop-notice">
|
||||||
|
<avue-crud
|
||||||
|
ref="crudRef"
|
||||||
|
:page="page"
|
||||||
|
:data="dataList"
|
||||||
|
:table-loading="dataListLoading"
|
||||||
|
:option="tableOption"
|
||||||
|
@search-change="onSearch"
|
||||||
|
@on-load="getDataList"
|
||||||
|
@refresh-change="refreshChange"
|
||||||
|
>
|
||||||
|
<template #status="scope">
|
||||||
|
<el-tag
|
||||||
|
v-if="scope.row.status === 0"
|
||||||
|
type="danger"
|
||||||
|
>
|
||||||
|
撤销
|
||||||
|
</el-tag>
|
||||||
|
<el-tag v-else>
|
||||||
|
公布
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
<template #isTop="scope">
|
||||||
|
<el-tag v-if="scope.row.isTop === 0">
|
||||||
|
否
|
||||||
|
</el-tag>
|
||||||
|
<el-tag v-else>
|
||||||
|
是
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
<template #menuLeft>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:notice:save')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click="onAddOrUpdate()"
|
||||||
|
>
|
||||||
|
新增
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
<template #menu="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:notice:update')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click="onAddOrUpdate(scope.row.id)"
|
||||||
|
>
|
||||||
|
修改
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:notice:delete')"
|
||||||
|
type="danger"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click.stop="onDelete(scope.row.id)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</avue-crud>
|
||||||
|
<add-or-update
|
||||||
|
v-if="addOrUpdateVisible"
|
||||||
|
ref="addOrUpdateRef"
|
||||||
|
@refresh-data-list="refreshChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { isAuth } from '@/utils'
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import { tableOption } from '@/crud/shop/notice'
|
||||||
|
import AddOrUpdate from './add-or-update.vue'
|
||||||
|
|
||||||
|
const dataList = ref([])
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
const dataListLoading = ref(false)
|
||||||
|
const addOrUpdateVisible = ref(false)
|
||||||
|
|
||||||
|
const getDataList = (pageParam, params, done) => {
|
||||||
|
dataListLoading.value = true
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/notice/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(Object.assign({
|
||||||
|
current: pageParam == null ? page.currentPage : pageParam.currentPage,
|
||||||
|
size: pageParam == null ? page.pageSize : pageParam.pageSize
|
||||||
|
}, params))
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataList.value = data.records
|
||||||
|
page.total = data.total
|
||||||
|
dataListLoading.value = false
|
||||||
|
if (done) done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrUpdateRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 新增 / 修改
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onAddOrUpdate = (id) => {
|
||||||
|
addOrUpdateVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
addOrUpdateRef.value?.init(id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const onDelete = (id) => {
|
||||||
|
ElMessageBox.confirm('确定进行删除操作?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/notice/' + id),
|
||||||
|
method: 'delete',
|
||||||
|
data: http.adornData({})
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}).catch(() => { })
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新回调
|
||||||
|
*/
|
||||||
|
const refreshChange = () => {
|
||||||
|
getDataList(page)
|
||||||
|
}
|
||||||
|
|
||||||
|
const onSearch = (params, done) => {
|
||||||
|
getDataList(page, params, done)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
||||||
@ -0,0 +1,289 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="!dataForm.addrId ? '新增' : '修改'"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="dataFormRef"
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
label-width="80px"
|
||||||
|
@keyup.enter="onSubmit()"
|
||||||
|
>
|
||||||
|
<el-form-item
|
||||||
|
label="名称"
|
||||||
|
prop="addrName"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.addrName"
|
||||||
|
placeholder="自提点名称"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="省份">
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item prop="province">
|
||||||
|
<el-select
|
||||||
|
v-model="dataForm.provinceId"
|
||||||
|
placeholder="请选择"
|
||||||
|
@change="selectProvince"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="province in provinceList"
|
||||||
|
:key="province.areaId"
|
||||||
|
:label="province.areaName"
|
||||||
|
:value="province.areaId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item prop="city">
|
||||||
|
<el-select
|
||||||
|
v-model="dataForm.cityId"
|
||||||
|
placeholder="请选择"
|
||||||
|
@change="selectCity"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="city in cityList"
|
||||||
|
:key="city.areaId"
|
||||||
|
:label="city.areaName"
|
||||||
|
:value="city.areaId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item prop="area">
|
||||||
|
<el-select
|
||||||
|
v-model="dataForm.areaId"
|
||||||
|
placeholder="请选择"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="area in areaList"
|
||||||
|
:key="area.areaId"
|
||||||
|
:label="area.areaName"
|
||||||
|
:value="area.areaId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="地址"
|
||||||
|
prop="addr"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.addr"
|
||||||
|
placeholder="地址"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="手机号"
|
||||||
|
prop="mobile"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.mobile"
|
||||||
|
maxlength="11"
|
||||||
|
placeholder="手机号"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span
|
||||||
|
class="dialog-footer"
|
||||||
|
>
|
||||||
|
<el-button @click="visible = false">取消</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="onSubmit()"
|
||||||
|
>确定</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { isMobile } from '@/utils/validate'
|
||||||
|
import { Debounce } from '@/utils/debounce'
|
||||||
|
const emit = defineEmits(['refreshDataList'])
|
||||||
|
const visible = ref(false)
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const validateMobile = (rule, value, callback) => {
|
||||||
|
if (!isMobile(value)) {
|
||||||
|
callback(new Error('手机号格式错误'))
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const dataRule = {
|
||||||
|
addrName: [
|
||||||
|
{ required: true, message: '自提点名称不能为空', trigger: 'blur' },
|
||||||
|
{ pattern: /\s\S+|S+\s|\S/, message: '请输入正确的自提点名称', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
addr: [
|
||||||
|
{ required: true, message: '地址不能为空', trigger: 'blur' },
|
||||||
|
{ pattern: /\s\S+|S+\s|\S/, message: '请输入正确的地址', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
city: [{ required: true, message: '城市不能为空', trigger: 'blur' }],
|
||||||
|
province: [
|
||||||
|
{ required: true, message: '省份不能为空', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
area: [{ required: true, message: '区/县不能为空', trigger: 'blur' }],
|
||||||
|
mobile: [
|
||||||
|
{ required: true, message: '手机号不能为空', trigger: 'blur' },
|
||||||
|
{ validator: validateMobile, trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
const provinceList = ref([])
|
||||||
|
const dataFormRef = ref(null)
|
||||||
|
const cityList = ref([])
|
||||||
|
const areaList = ref([])
|
||||||
|
const dataForm = reactive({
|
||||||
|
addrId: 0,
|
||||||
|
addr: '',
|
||||||
|
addrName: '',
|
||||||
|
mobile: '',
|
||||||
|
area: '',
|
||||||
|
city: '',
|
||||||
|
province: '',
|
||||||
|
areaId: null,
|
||||||
|
cityId: null,
|
||||||
|
provinceId: null
|
||||||
|
})
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
const init = (id) => {
|
||||||
|
dataForm.addrId = id || 0
|
||||||
|
visible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
dataFormRef.value?.resetFields()
|
||||||
|
cityList.value = []
|
||||||
|
areaList.value = []
|
||||||
|
dataForm.provinceId = null
|
||||||
|
dataForm.cityId = null
|
||||||
|
dataForm.areaId = null
|
||||||
|
})
|
||||||
|
listAreaByParentId().then(({ data }) => {
|
||||||
|
provinceList.value = data
|
||||||
|
})
|
||||||
|
if (dataForm.addrId) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl(
|
||||||
|
`/shop/pickAddr/info/${dataForm.addrId}`
|
||||||
|
),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams()
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataForm.addr = data.addr
|
||||||
|
dataForm.mobile = data.mobile
|
||||||
|
dataForm.addrName = data.addrName
|
||||||
|
dataForm.areaId = data.areaId
|
||||||
|
dataForm.cityId = data.cityId
|
||||||
|
dataForm.provinceId = data.provinceId
|
||||||
|
listAreaByParentId(data.provinceId).then(({ data }) => {
|
||||||
|
cityList.value = data
|
||||||
|
})
|
||||||
|
listAreaByParentId(data.cityId).then(({ data }) => {
|
||||||
|
areaList.value = data
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
const listAreaByParentId = (pid) => {
|
||||||
|
if (!pid) pid = 0
|
||||||
|
return http({
|
||||||
|
url: http.adornUrl('/admin/area/listByPid'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams({ pid })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择省
|
||||||
|
* @param val
|
||||||
|
*/
|
||||||
|
const selectProvince = (val) => {
|
||||||
|
dataForm.cityId = null
|
||||||
|
dataForm.city = ''
|
||||||
|
// 获取城市的select
|
||||||
|
listAreaByParentId(val).then(({ data }) => {
|
||||||
|
cityList.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择市
|
||||||
|
* @param val
|
||||||
|
*/
|
||||||
|
const selectCity = (val) => {
|
||||||
|
dataForm.areaId = null
|
||||||
|
dataForm.area = ''
|
||||||
|
// 获取区的select
|
||||||
|
listAreaByParentId(val).then(({ data }) => {
|
||||||
|
areaList.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单提交
|
||||||
|
*/
|
||||||
|
const onSubmit = Debounce(() => {
|
||||||
|
for (let i = 0; i < provinceList.value.length; i++) {
|
||||||
|
if (provinceList.value[i].areaId === dataForm.provinceId) {
|
||||||
|
// 将省名字保存起来
|
||||||
|
dataForm.province = provinceList.value[i].areaName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0; i < cityList.value.length; i++) {
|
||||||
|
if (cityList.value[i].areaId === dataForm.cityId) {
|
||||||
|
// 将市名字保存起来
|
||||||
|
dataForm.city = cityList.value[i].areaName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0; i < areaList.value.length; i++) {
|
||||||
|
if (areaList.value[i].areaId === dataForm.areaId) {
|
||||||
|
// 将市名字保存起来
|
||||||
|
dataForm.area = areaList.value[i].areaName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dataFormRef.value?.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/pickAddr'),
|
||||||
|
method: dataForm.addrId ? 'put' : 'post',
|
||||||
|
data: http.adornData({
|
||||||
|
addrId: dataForm.addrId || undefined,
|
||||||
|
addr: dataForm.addr,
|
||||||
|
addrName: dataForm.addrName,
|
||||||
|
mobile: dataForm.mobile,
|
||||||
|
area: dataForm.area,
|
||||||
|
city: dataForm.city,
|
||||||
|
province: dataForm.province,
|
||||||
|
areaId: dataForm.areaId,
|
||||||
|
cityId: dataForm.cityId,
|
||||||
|
provinceId: dataForm.provinceId
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
visible.value = false
|
||||||
|
emit('refreshDataList', page)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@ -0,0 +1,166 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-pickAddr">
|
||||||
|
<avue-crud
|
||||||
|
ref="crudRef"
|
||||||
|
:page="page"
|
||||||
|
:data="dataList"
|
||||||
|
:option="tableOption"
|
||||||
|
:permission="permission"
|
||||||
|
@search-change="onSearch"
|
||||||
|
@selection-change="selectionChange"
|
||||||
|
@on-load="getDataList"
|
||||||
|
>
|
||||||
|
<template #menu-left>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:pickAddr:save')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click.stop="onAddOrUpdate()"
|
||||||
|
>
|
||||||
|
新增
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:pickAddr:delete')"
|
||||||
|
type="danger"
|
||||||
|
:disabled="dataListSelections.length <= 0"
|
||||||
|
@click="onDelete()"
|
||||||
|
>
|
||||||
|
批量删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #menu="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:pickAddr:update')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click.stop="onAddOrUpdate(scope.row.addrId)"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:pickAddr:delete')"
|
||||||
|
type="danger"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click.stop="onDelete(scope.row.addrId)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</avue-crud>
|
||||||
|
|
||||||
|
<!-- 弹窗, 新增 / 修改 -->
|
||||||
|
<add-or-update
|
||||||
|
v-if="addOrUpdateVisible"
|
||||||
|
ref="addOrUpdateRef"
|
||||||
|
@refresh-data-list="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { isAuth } from '@/utils'
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import AddOrUpdate from './add-or-update.vue'
|
||||||
|
import { tableOption } from '@/crud/shop/pickAddr.js'
|
||||||
|
const permission = {
|
||||||
|
delBtn: isAuth('prod:prod:delete')
|
||||||
|
}
|
||||||
|
const dataList = ref([])
|
||||||
|
const dataListSelections = ref([])
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* 获取数据列表
|
||||||
|
*/
|
||||||
|
const getDataList = (pageParam, params, done) => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/pickAddr/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
|
current: pageParam == null ? page.currentPage : pageParam.currentPage,
|
||||||
|
size: pageParam == null ? page.pageSize : pageParam.pageSize
|
||||||
|
},
|
||||||
|
params
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataList.value = data.records
|
||||||
|
page.total = data.total
|
||||||
|
if (done) done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrUpdateVisible = ref(false)
|
||||||
|
const addOrUpdateRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 新增 / 修改
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onAddOrUpdate = (id) => {
|
||||||
|
addOrUpdateVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
addOrUpdateRef.value?.init(id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onDelete = (id) => {
|
||||||
|
const ids = id ? [id] : dataListSelections.value?.map(item => {
|
||||||
|
return item.addrId
|
||||||
|
})
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
'确定进行删除操作?', '提示',
|
||||||
|
{
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/pickAddr'),
|
||||||
|
method: 'delete',
|
||||||
|
data: http.adornData(ids, false)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
getDataList(page)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(() => { })
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 条件查询
|
||||||
|
* @param params
|
||||||
|
* @param done
|
||||||
|
*/
|
||||||
|
const onSearch = (params, done) => {
|
||||||
|
getDataList(page, params, done)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 多选变化
|
||||||
|
* @param val
|
||||||
|
*/
|
||||||
|
const selectionChange = (val) => {
|
||||||
|
dataListSelections.value = val
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -0,0 +1,167 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-transport">
|
||||||
|
<avue-crud
|
||||||
|
ref="crudRef"
|
||||||
|
:page="page"
|
||||||
|
:data="dataList"
|
||||||
|
:option="tableOption"
|
||||||
|
@search-change="onSearch"
|
||||||
|
@selection-change="selectionChange"
|
||||||
|
@on-load="getDataList"
|
||||||
|
>
|
||||||
|
<template #prod-prop-values="scope">
|
||||||
|
<el-tag
|
||||||
|
v-for="item in scope.row.prodPropValues"
|
||||||
|
:key="item.valueId"
|
||||||
|
>
|
||||||
|
{{ item.propValue }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
<template #menu-left>
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:transport:save')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-plus"
|
||||||
|
@click.stop="onAddOrUpdate()"
|
||||||
|
>
|
||||||
|
新增
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:transport:delete')"
|
||||||
|
type="danger"
|
||||||
|
:disabled="dataListSelections.length <= 0"
|
||||||
|
@click="onDelete()"
|
||||||
|
>
|
||||||
|
批量删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #menu="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:transport:update')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click.stop="onAddOrUpdate(scope.row.transportId)"
|
||||||
|
>
|
||||||
|
修改
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('shop:transport:delete')"
|
||||||
|
type="danger"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click.stop="onDelete(scope.row.transportId)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</avue-crud>
|
||||||
|
<!-- 弹窗, 新增 / 修改 -->
|
||||||
|
<add-or-update
|
||||||
|
v-if="addOrUpdateVisible"
|
||||||
|
ref="addOrUpdateRef"
|
||||||
|
@refresh-data-list="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { isAuth } from '@/utils'
|
||||||
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
|
import { tableOption } from '@/crud/shop/transport'
|
||||||
|
import AddOrUpdate from './add-or-update.vue'
|
||||||
|
const dataList = ref([])
|
||||||
|
const dataListSelections = ref([])
|
||||||
|
const page = ref({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取数据列表
|
||||||
|
*/
|
||||||
|
const getDataList = (pageParam, params, done) => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/transport/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
|
current: pageParam == null ? page.value.currentPage : pageParam.currentPage,
|
||||||
|
size: pageParam == null ? page.value.pageSize : pageParam.pageSize
|
||||||
|
},
|
||||||
|
params
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataList.value = data.records
|
||||||
|
page.value.total = data.total
|
||||||
|
if (done) done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrUpdateVisible = ref(false)
|
||||||
|
const addOrUpdateRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 新增 / 修改
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onAddOrUpdate = (id) => {
|
||||||
|
addOrUpdateVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
addOrUpdateRef.value?.init(id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onDelete = (id) => {
|
||||||
|
const ids = id ? [id] : dataListSelections.value?.map(item => item.transportId)
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
`确定进行[${id ? '删除' : '批量删除'}]操作?`,
|
||||||
|
'提示',
|
||||||
|
{
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/shop/transport'),
|
||||||
|
method: 'delete',
|
||||||
|
data: http.adornData(ids, false)
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
getDataList()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}).catch(() => {})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 条件查询
|
||||||
|
*/
|
||||||
|
const onSearch = (params, done) => {
|
||||||
|
getDataList(page.value, params, done)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多选变化
|
||||||
|
*/
|
||||||
|
const selectionChange = (val) => {
|
||||||
|
dataListSelections.value = val
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,135 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="!dataForm.userId ? '新增' : '修改'"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form
|
||||||
|
ref="dataFormRef"
|
||||||
|
:model="dataForm"
|
||||||
|
:rules="dataRule"
|
||||||
|
label-width="80px"
|
||||||
|
@keyup.enter="onSubmit()"
|
||||||
|
>
|
||||||
|
<el-form-item
|
||||||
|
label="用户头像"
|
||||||
|
prop="pic"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
:src="dataForm.pic"
|
||||||
|
class="image"
|
||||||
|
alt=""
|
||||||
|
>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="用户昵称"
|
||||||
|
prop="nickName"
|
||||||
|
>
|
||||||
|
<el-input
|
||||||
|
v-model="dataForm.nickName"
|
||||||
|
:disabled="true"
|
||||||
|
placeholder="用户昵称"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item
|
||||||
|
label="状态"
|
||||||
|
prop="status"
|
||||||
|
>
|
||||||
|
<el-radio-group v-model="dataForm.status">
|
||||||
|
<el-radio :label="0">
|
||||||
|
禁用
|
||||||
|
</el-radio>
|
||||||
|
<el-radio :label="1">
|
||||||
|
正常
|
||||||
|
</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span
|
||||||
|
class="dialog-footer"
|
||||||
|
>
|
||||||
|
<el-button @click="visible = false">取消</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
@click="onSubmit()"
|
||||||
|
>确定</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ElMessage } from 'element-plus'
|
||||||
|
import { Debounce } from '@/utils/debounce'
|
||||||
|
const emit = defineEmits(['refreshDataList'])
|
||||||
|
|
||||||
|
const visible = ref(false)
|
||||||
|
const dataForm = ref({
|
||||||
|
userId: 0,
|
||||||
|
nickName: '',
|
||||||
|
pic: '',
|
||||||
|
status: 1
|
||||||
|
})
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
const dataRule = {
|
||||||
|
nickName: [
|
||||||
|
{ required: true, message: '用户名不能为空', trigger: 'blur' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataFormRef = ref(null)
|
||||||
|
const init = (id) => {
|
||||||
|
dataForm.value.userId = id || 0
|
||||||
|
visible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
dataFormRef.value?.resetFields()
|
||||||
|
})
|
||||||
|
if (dataForm.value.userId) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl(`/admin/user/info/${dataForm.value.userId}`),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams()
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataForm.value = data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ init })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单提交
|
||||||
|
*/
|
||||||
|
const onSubmit = Debounce(() => {
|
||||||
|
dataFormRef.value?.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/user'),
|
||||||
|
method: dataForm.value.userId ? 'put' : 'post',
|
||||||
|
data: http.adornData({
|
||||||
|
userId: dataForm.value.userId || undefined,
|
||||||
|
nickName: dataForm.value.nickName,
|
||||||
|
status: dataForm.value.status
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
ElMessage({
|
||||||
|
message: '操作成功',
|
||||||
|
type: 'success',
|
||||||
|
duration: 1500,
|
||||||
|
onClose: () => {
|
||||||
|
visible.value = false
|
||||||
|
emit('refreshDataList', page)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
@ -0,0 +1,123 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mod-user">
|
||||||
|
<avue-crud
|
||||||
|
ref="crudRef"
|
||||||
|
:page="page"
|
||||||
|
:data="dataList"
|
||||||
|
:option="tableOption"
|
||||||
|
@search-change="onSearch"
|
||||||
|
@selection-change="selectionChange"
|
||||||
|
@on-load="getDataList"
|
||||||
|
>
|
||||||
|
<template #pic="scope">
|
||||||
|
<span
|
||||||
|
v-if="scope.row.pic"
|
||||||
|
class="avue-crud__img"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
:src="scope.row.pic"
|
||||||
|
class="el-icon-document"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
<span v-else>-</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #status="scope">
|
||||||
|
<el-tag
|
||||||
|
v-if="scope.row.status === 0"
|
||||||
|
type="danger"
|
||||||
|
>
|
||||||
|
禁用
|
||||||
|
</el-tag>
|
||||||
|
<el-tag v-else>
|
||||||
|
正常
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #menu="scope">
|
||||||
|
<el-button
|
||||||
|
v-if="isAuth('admin:user:update')"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click.stop="onAddOrUpdate(scope.row.userId)"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</avue-crud>
|
||||||
|
|
||||||
|
<!-- 弹窗, 新增 / 修改 -->
|
||||||
|
<add-or-update
|
||||||
|
v-if="addOrUpdateVisible"
|
||||||
|
ref="addOrUpdateRef"
|
||||||
|
@refresh-data-list="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { isAuth } from '@/utils'
|
||||||
|
import { tableOption } from '@/crud/user/user.js'
|
||||||
|
import AddOrUpdate from './add-or-update.vue'
|
||||||
|
|
||||||
|
const dataList = ref([])
|
||||||
|
const dataListLoading = ref(false)
|
||||||
|
const dataListSelections = ref([])
|
||||||
|
const addOrUpdateVisible = ref(false)
|
||||||
|
const page = reactive({
|
||||||
|
total: 0, // 总页数
|
||||||
|
currentPage: 1, // 当前页数
|
||||||
|
pageSize: 10 // 每页显示多少条
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* 获取数据列表
|
||||||
|
*/
|
||||||
|
const getDataList = (pageParam, params, done) => {
|
||||||
|
dataListLoading.value = true
|
||||||
|
http({
|
||||||
|
url: http.adornUrl('/admin/user/page'),
|
||||||
|
method: 'get',
|
||||||
|
params: http.adornParams(
|
||||||
|
Object.assign(
|
||||||
|
{
|
||||||
|
current: pageParam == null ? page.currentPage : pageParam.currentPage,
|
||||||
|
size: pageParam == null ? page.pageSize : pageParam.pageSize
|
||||||
|
},
|
||||||
|
params
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.then(({ data }) => {
|
||||||
|
dataList.value = data.records
|
||||||
|
page.total = data.total
|
||||||
|
dataListLoading.value = false
|
||||||
|
if (done) done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const addOrUpdateRef = ref(null)
|
||||||
|
/**
|
||||||
|
* 新增 / 修改
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
const onAddOrUpdate = (id) => {
|
||||||
|
addOrUpdateVisible.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
addOrUpdateRef.value?.init(id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 条件查询
|
||||||
|
*/
|
||||||
|
const onSearch = (params, done) => {
|
||||||
|
getDataList(page, params, done)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多选变化
|
||||||
|
*/
|
||||||
|
const selectionChange = (val) => {
|
||||||
|
dataListSelections.value = val
|
||||||
|
}
|
||||||
|
</script>
|
||||||
Loading…
Reference in new issue