|  | @@ -0,0 +1,214 @@
 | 
	
		
			
				|  |  | +<script setup lang="tsx">
 | 
	
		
			
				|  |  | +import { NButton, NImage, NPopconfirm, NSwitch } from 'naive-ui';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  fetchAddAdvertInfo,
 | 
	
		
			
				|  |  | +  fetchDeleteAdvertInfo,
 | 
	
		
			
				|  |  | +  fetchGetadvertInfoList,
 | 
	
		
			
				|  |  | +  fetchUpdateAdvertInfo
 | 
	
		
			
				|  |  | +} from '@/service/api/operation/advertisement';
 | 
	
		
			
				|  |  | +import { useTable } from '@/components/zt/Table/hooks/useTable';
 | 
	
		
			
				|  |  | +import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const columns: NaiveUI.TableColumn<Api.operation.AdvertInfo>[] = [
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    key: 'advertName',
 | 
	
		
			
				|  |  | +    title: '广告位名称',
 | 
	
		
			
				|  |  | +    align: 'center'
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    key: 'advertImg',
 | 
	
		
			
				|  |  | +    title: '广告图',
 | 
	
		
			
				|  |  | +    align: 'center',
 | 
	
		
			
				|  |  | +    render: row => {
 | 
	
		
			
				|  |  | +      return <NImage src={row.advertImg} class={'h90px w180px'}></NImage>;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    key: 'advertBack',
 | 
	
		
			
				|  |  | +    title: '背景图',
 | 
	
		
			
				|  |  | +    align: 'center',
 | 
	
		
			
				|  |  | +    render: row => {
 | 
	
		
			
				|  |  | +      return <NImage src={row.advertBack} class={'h90px w180px'}></NImage>;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    key: 'jumpUrl',
 | 
	
		
			
				|  |  | +    title: '跳转链接',
 | 
	
		
			
				|  |  | +    align: 'center'
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    key: 'advertSort',
 | 
	
		
			
				|  |  | +    title: '排序',
 | 
	
		
			
				|  |  | +    align: 'center'
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    key: 'status',
 | 
	
		
			
				|  |  | +    title: '状态',
 | 
	
		
			
				|  |  | +    align: 'center',
 | 
	
		
			
				|  |  | +    render: row => {
 | 
	
		
			
				|  |  | +      return (
 | 
	
		
			
				|  |  | +        <NSwitch
 | 
	
		
			
				|  |  | +          uncheckedValue={0}
 | 
	
		
			
				|  |  | +          checkedValue={1}
 | 
	
		
			
				|  |  | +          value={row.status}
 | 
	
		
			
				|  |  | +          onUpdate:value={val => {
 | 
	
		
			
				|  |  | +            row.status = val;
 | 
	
		
			
				|  |  | +            fetchUpdateAdvertInfo(row);
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        ></NSwitch>
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const [registerTable, { refresh, setTableLoading }] = useTable({
 | 
	
		
			
				|  |  | +  searchFormConfig: {
 | 
	
		
			
				|  |  | +    schemas: [
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'advertName',
 | 
	
		
			
				|  |  | +        label: '广告位名称',
 | 
	
		
			
				|  |  | +        component: 'NInput'
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'status',
 | 
	
		
			
				|  |  | +        label: '状态',
 | 
	
		
			
				|  |  | +        component: 'NSelect',
 | 
	
		
			
				|  |  | +        componentProps: {
 | 
	
		
			
				|  |  | +          options: [
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              label: '启用',
 | 
	
		
			
				|  |  | +              value: 1
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              label: '禁用',
 | 
	
		
			
				|  |  | +              value: 0
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          ]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    ],
 | 
	
		
			
				|  |  | +    inline: false,
 | 
	
		
			
				|  |  | +    size: 'small',
 | 
	
		
			
				|  |  | +    labelPlacement: 'left',
 | 
	
		
			
				|  |  | +    isFull: false
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  tableConfig: {
 | 
	
		
			
				|  |  | +    keyField: 'id',
 | 
	
		
			
				|  |  | +    title: '广告位列表',
 | 
	
		
			
				|  |  | +    showAddButton: true
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function handleDelete(row: Recordable) {
 | 
	
		
			
				|  |  | +  setTableLoading(true);
 | 
	
		
			
				|  |  | +  await fetchDeleteAdvertInfo(row.id);
 | 
	
		
			
				|  |  | +  refresh();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +const [registerModalForm, { openModal, closeModal, getFieldsValue, setFieldsValue }] = useModalFrom({
 | 
	
		
			
				|  |  | +  modalConfig: {
 | 
	
		
			
				|  |  | +    title: '广告位',
 | 
	
		
			
				|  |  | +    width: 800,
 | 
	
		
			
				|  |  | +    isShowHeaderText: true,
 | 
	
		
			
				|  |  | +    height: 600
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  formConfig: {
 | 
	
		
			
				|  |  | +    schemas: [
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        label: '',
 | 
	
		
			
				|  |  | +        field: 'id',
 | 
	
		
			
				|  |  | +        component: 'NInput',
 | 
	
		
			
				|  |  | +        show: false
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'advertName',
 | 
	
		
			
				|  |  | +        label: '广告位名称',
 | 
	
		
			
				|  |  | +        component: 'NInput',
 | 
	
		
			
				|  |  | +        required: true
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'advertImg',
 | 
	
		
			
				|  |  | +        label: '广告图',
 | 
	
		
			
				|  |  | +        component: 'zUpload',
 | 
	
		
			
				|  |  | +        required: true,
 | 
	
		
			
				|  |  | +        componentProps: {
 | 
	
		
			
				|  |  | +          tipText: '单张,仅支持png,jpg,jpeg格式,建议尺寸比例 16:9;图片大小不能超过3m。',
 | 
	
		
			
				|  |  | +          max: 1,
 | 
	
		
			
				|  |  | +          FileSize: 3
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'advertBack',
 | 
	
		
			
				|  |  | +        label: '背景图',
 | 
	
		
			
				|  |  | +        component: 'zUpload',
 | 
	
		
			
				|  |  | +        required: true,
 | 
	
		
			
				|  |  | +        componentProps: {
 | 
	
		
			
				|  |  | +          tipText: '单张,仅支持png,jpg,jpeg格式,建议尺寸比例 16:9;图片大小不能超过3m。',
 | 
	
		
			
				|  |  | +          max: 1,
 | 
	
		
			
				|  |  | +          FileSize: 3
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'jumpUrl',
 | 
	
		
			
				|  |  | +        label: '跳转链接',
 | 
	
		
			
				|  |  | +        component: 'NInput',
 | 
	
		
			
				|  |  | +        required: true
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'advertSort',
 | 
	
		
			
				|  |  | +        label: '排序',
 | 
	
		
			
				|  |  | +        component: 'NInputNumber',
 | 
	
		
			
				|  |  | +        required: true
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        field: 'status',
 | 
	
		
			
				|  |  | +        label: '状态',
 | 
	
		
			
				|  |  | +        component: 'NSwitch',
 | 
	
		
			
				|  |  | +        required: true,
 | 
	
		
			
				|  |  | +        componentProps: {
 | 
	
		
			
				|  |  | +          checkedValue: 1,
 | 
	
		
			
				|  |  | +          uncheckedValue: 0
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        defaultValue: 1
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    ],
 | 
	
		
			
				|  |  | +    gridProps: {
 | 
	
		
			
				|  |  | +      cols: '1'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    labelWidth: 120
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +async function handleSubmit() {
 | 
	
		
			
				|  |  | +  const form = await getFieldsValue();
 | 
	
		
			
				|  |  | +  if (form.id) {
 | 
	
		
			
				|  |  | +    await fetchUpdateAdvertInfo(form);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    await fetchAddAdvertInfo(form);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  closeModal();
 | 
	
		
			
				|  |  | +  refresh();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function edit(row: Recordable) {
 | 
	
		
			
				|  |  | +  openModal(row);
 | 
	
		
			
				|  |  | +  setFieldsValue(row);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <LayoutTable>
 | 
	
		
			
				|  |  | +    <ZTable :columns="columns" :api="fetchGetadvertInfoList" @register="registerTable" @add="openModal">
 | 
	
		
			
				|  |  | +      <template #op="{ row }">
 | 
	
		
			
				|  |  | +        <NButton size="small" ghost type="primary" @click="edit(row)">编辑</NButton>
 | 
	
		
			
				|  |  | +        <NPopconfirm @positive-click="handleDelete(row)">
 | 
	
		
			
				|  |  | +          <template #trigger>
 | 
	
		
			
				|  |  | +            <NButton size="small" type="error" ghost>删除</NButton>
 | 
	
		
			
				|  |  | +          </template>
 | 
	
		
			
				|  |  | +          确定删除吗?
 | 
	
		
			
				|  |  | +        </NPopconfirm>
 | 
	
		
			
				|  |  | +      </template>
 | 
	
		
			
				|  |  | +    </ZTable>
 | 
	
		
			
				|  |  | +    <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmit"></BasicModelForm>
 | 
	
		
			
				|  |  | +  </LayoutTable>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style scoped></style>
 |