snowy/snowy-admin-web/src/views/sys/resource/spa/form.vue

174 lines
5.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<a-drawer
:title="formData.id ? '编辑单页' : '增加单页'"
:width="500"
:visible="visible"
:destroy-on-close="true"
:body-style="{ paddingBottom: '80px' }"
:footer-style="{ textAlign: 'right' }"
@close="onClose"
>
<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
<a-form-item label="单页名称:" name="title">
<a-input v-model:value="formData.title" placeholder="请输入单页名称" allow-clear />
</a-form-item>
<a-form-item label="单页类型:" name="menuType">
<a-radio-group
v-model:value="formData.menuType"
button-style="solid"
:options="categoryOptions"
option-type="button"
>
</a-radio-group>
</a-form-item>
<a-form-item name="path">
<template #label>
<a-tooltip>
<template #title>
类型为内外链条时输入https开头的链接即可https://www.xiaonuo.vip,正常路由前面必须有反斜杠!
</template>
<question-circle-outlined />
</a-tooltip>
&nbsp {{ formData.menuType === 'MENU' ? '路由地址' : 'https链接地址' }}
</template>
<a-input v-model:value="formData.path" placeholder="请输入路由地址" allow-clear />
</a-form-item>
<a-form-item v-if="formData.menuType === 'MENU'" name="component">
<template #label>
<a-tooltip>
<template #title> 按规范可设置为代码组件文件夹名称,注:首字母无反斜杠哦! </template>
<question-circle-outlined />
</a-tooltip>
&nbsp 组件地址:
</template>
<a-input
v-model:value="formData.component"
addon-before="src/views/"
placeholder="请输入组件地址"
allow-clear
/>
</a-form-item>
<a-form-item name="name" v-if="formData.menuType === 'MENU'">
<template #label>
<a-tooltip>
<template #title> 按规范可设置为代码组件文件夹名称,注:首字母无反斜杠哦! </template>
<question-circle-outlined />
</a-tooltip>
&nbsp 别名:
</template>
<a-input
v-model:value="formData.name"
addon-before="setup name="
placeholder="请输入组件组件中name属性"
allow-clear
/>
</a-form-item>
<a-alert style="margin-bottom: 10px" message="温馨提示:排序第一条为首页页面!" type="warning" closable />
<a-form-item label="图标:" name="icon">
<a-input v-model:value="formData.icon" style="width: calc(100% - 70px)" placeholder="请选择图标" allow-clear />
<a-button type="primary" @click="iconSelector.showIconModal(formData.icon)">选择</a-button>
</a-form-item>
<a-form-item label="排序:" name="sortCode">
<a-slider v-model:value="formData.sortCode" :max="100" />
</a-form-item>
</a-form>
<template #footer>
<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
<a-button type="primary" :loading="submitLoading" @click="onSubmit">保存</a-button>
</template>
<Icon-selector ref="iconSelector" @iconCallBack="iconCallBack" />
</a-drawer>
</template>
<script setup name="spaForm">
import { message } from 'ant-design-vue'
import { required } from '@/utils/formRules'
import IconSelector from '@/components/Selector/iconSelector.vue'
import spaApi from '@/api/sys/resource/spaApi'
import { getCurrentInstance } from 'vue'
//
let visible = $ref(false)
const emit = defineEmits({ successful: null })
const formRef = ref()
const formData = ref({})
const submitLoading = ref(false)
const iconSelector = ref()
//
const onOpen = (record) => {
visible = true
formData.value = {
menuType: 'MENU',
sortCode: 99
}
if (record) {
formData.value = Object.assign({}, record)
}
}
// 关闭抽屉
const onClose = () => {
formRef.value.resetFields()
visible = false
}
// 默认要校验的
const formRules = {
title: [required('请输入菜单名称')],
menuType: [required('请选择菜单类型')],
path: [required('请输入路由地址')],
name: [required('请输入组件中name属性')],
module: [required('请选择模块')],
component: [required('请输入组件地址')]
}
// 图标选择器回调
const iconCallBack = (value) => {
formData.value.icon = value
}
const { proxy } = getCurrentInstance()
let categoryOptions = proxy.$TOOL
.dictTypeList('MENU_TYPE')
.filter((item) => {
// 排除
if (item.dictValue !== 'CATALOG') {
return item
}
})
.map((item) => {
return {
value: item['dictValue'],
label: item['name'] + '页'
}
})
// 验证并提交数据
const onSubmit = () => {
formRef.value
.validate()
.then(() => {
const param = parameterChanges(formData.value)
submitLoading.value = true
spaApi.submitForm(param, !param.id).then(() => {
visible = false
emit('successful')
}).finally(() => {
submitLoading.value = false
})
})
}
const parameterChanges = (data) => {
if (!data.component) {
return data
}
// 如果用户输入的组件path路径
if (data.component.slice(0, 1) === '/') {
data.component = data.component.slice(1)
}
return data
}
// 调用这个函数将子组件的一些数据和方法暴露出去
defineExpose({
onOpen
})
</script>