|
|
@@ -0,0 +1,148 @@
|
|
|
+<template>
|
|
|
+ <t-dialog
|
|
|
+ width="40%"
|
|
|
+ :header="header"
|
|
|
+ :confirmBtn="confirmBtn"
|
|
|
+ :closeOnOverlayClick="false"
|
|
|
+ @close="handleCloseDialog"
|
|
|
+ @confirm="fetchSaveClassifyData"
|
|
|
+ >
|
|
|
+ <t-space direction="vertical" style="width: 100%">
|
|
|
+ <TForm ref="form" :data="classifyData" :rules="rules" resetType="initial">
|
|
|
+ <TFormItem label="分类名称:" name="name" help="名称长度小于5个汉字,大于2个汉字">
|
|
|
+ <t-input v-model.trim="classifyData.name" clearable placeholder="请输入分类名称" />
|
|
|
+ </TFormItem>
|
|
|
+ <TFormItem label="分类编号:" name="numbering" help="编号由大于4个字符的英文字母组成">
|
|
|
+ <t-input v-model.trim="classifyData.numbering" clearable placeholder="请输入分类编号" />
|
|
|
+ </TFormItem>
|
|
|
+ <TFormItem label="排序级别:" name="sort" help="排序级别由正整数组成">
|
|
|
+ <t-input v-model.trim="classifyData.sort" clearable placeholder="请输入排序级别" />
|
|
|
+ </TFormItem>
|
|
|
+ </TForm>
|
|
|
+ </t-space>
|
|
|
+ </t-dialog>
|
|
|
+</template>
|
|
|
+<script lang="ts" setup>
|
|
|
+import type { Classify } from '@/model/classify'
|
|
|
+import { computed, ref, reactive, watch } from 'vue'
|
|
|
+import type { FormInstanceFunctions, FormProps } from 'tdesign-vue-next'
|
|
|
+const props = defineProps<{
|
|
|
+ isEdit?: Boolean | null
|
|
|
+ headerTitle?: String | null
|
|
|
+ classify: Classify | {}
|
|
|
+}>()
|
|
|
+const form = ref<FormInstanceFunctions | null>(null)
|
|
|
+const header = computed(() => `${props.isEdit ? '编辑' : '创建'}${props.headerTitle || ''}`)
|
|
|
+const confirmBtn = computed(() => (props.isEdit ? '保存' : '确定'))
|
|
|
+const classifyData: FormProps['data'] = reactive({ name: '', sort: 0 })
|
|
|
+const rules: FormProps['rules'] = {
|
|
|
+ name: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '分类名称不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '分类名称不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'change'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ whitespace: true,
|
|
|
+ message: '分类名称不能为空'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ min: 4,
|
|
|
+ message: '输入汉字长度应在2到5之间',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ max: 10,
|
|
|
+ message: '输入汉字长度应在2到5之间',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ numbering: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '分类编号不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '分类编号不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'change'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ whitespace: true,
|
|
|
+ message: '分类编号不能为空'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ min: 4,
|
|
|
+ message: '输入字符应大于4个字符长度',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ pattern: /^[A-Za-z]+$/,
|
|
|
+ message: '输入字符须为英文字母',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ sort: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '排序级别不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '排序级别不能为空',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'change'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ whitespace: true,
|
|
|
+ message: '排序级别不能为空'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ pattern: /^[1-9]\d*$/,
|
|
|
+ message: '排序级别必须为正整数',
|
|
|
+ type: 'error',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+}
|
|
|
+watch(
|
|
|
+ () => props.classify,
|
|
|
+ (newClassify) => {
|
|
|
+ Object.assign(classifyData, newClassify)
|
|
|
+ },
|
|
|
+ { deep: true }
|
|
|
+)
|
|
|
+const fetchSaveClassifyData = async () => {
|
|
|
+ /* TODO: 保存分类数据 */
|
|
|
+ if (form.value) {
|
|
|
+ const valid = await form.value.validate()
|
|
|
+ if (valid && typeof valid === 'boolean') {
|
|
|
+ /* TODO: 校验通过保存分类数据 */
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+const handleCloseDialog = () => {
|
|
|
+ // 数据&&规则校验结果重置
|
|
|
+ if (form.value) {
|
|
|
+ form.value.reset()
|
|
|
+ form.value.clearValidate()
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|