Files
school-developer/src/views/stuwork/rewarddorm/form.vue
2026-01-19 12:49:30 +08:00

205 lines
5.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog
:title="form.id ? '编辑文明宿舍' : '新增文明宿舍'"
v-model="visible"
:width="600"
:close-on-click-modal="false"
draggable>
<el-form
ref="dataFormRef"
:model="form"
:rules="dataRules"
label-width="100px"
v-loading="loading">
<el-row :gutter="24">
<el-col :span="24" class="mb20">
<el-form-item label="宿舍号" prop="roomNo">
<el-select
v-model="form.roomNo"
placeholder="请选择宿舍号"
clearable
filterable
style="width: 100%">
<el-option
v-for="item in roomList"
:key="item.roomNo"
:label="item.roomNo"
:value="item.roomNo">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="奖项名称" prop="ruleName">
<el-input
v-model="form.ruleName"
placeholder="请输入奖项名称"
clearable
style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="备注" prop="remarks">
<el-input
v-model="form.remarks"
type="textarea"
:rows="4"
placeholder="请输入备注"
:maxlength="250"
show-word-limit
style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="visible = false"> </el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading"> </el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="RewardDormFormDialog">
import { ref, reactive, nextTick, onMounted } from 'vue'
import { useMessage } from '/@/hooks/message'
import { addObj, editObj, getDetail } from '/@/api/stuwork/rewarddorm'
import { dormRoomList } from '/@/api/stuwork/dormroom'
const emit = defineEmits(['refresh'])
// 定义变量内容
const dataFormRef = ref()
const visible = ref(false)
const loading = ref(false)
const operType = ref('add')
const roomList = ref<any[]>([])
// 提交表单数据
const form = reactive({
id: '',
roomNo: '',
ruleId: '',
ruleName: '',
remarks: ''
})
// 定义校验规则
const dataRules = {
roomNo: [
{ required: true, message: '请选择宿舍号', trigger: 'change' }
],
ruleName: [
{ required: true, message: '请输入奖项名称', trigger: 'blur' }
]
}
// 打开弹窗
const openDialog = async (type: string = 'add', row?: any) => {
visible.value = true
operType.value = type
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields()
form.id = ''
form.roomNo = ''
form.ruleId = ''
form.ruleName = ''
form.remarks = ''
// 编辑时填充数据
if (type === 'edit' && row) {
form.id = row.id
form.roomNo = row.roomNo || ''
form.ruleId = row.ruleId || ''
form.ruleName = row.ruleName || ''
form.remarks = row.remarks || ''
// 如果需要获取详情
if (row.id && (!row.ruleName || !row.remarks)) {
loading.value = true
getDetail(row.id).then((res: any) => {
if (res.data) {
form.roomNo = res.data.roomNo || ''
form.ruleId = res.data.ruleId || ''
form.ruleName = res.data.ruleName || ''
form.remarks = res.data.remarks || ''
}
}).catch((err) => {
console.error('获取详情失败', err)
}).finally(() => {
loading.value = false
})
}
}
})
}
// 提交表单
const onSubmit = async () => {
if (!dataFormRef.value) return
await dataFormRef.value.validate(async (valid: boolean) => {
if (!valid) return
loading.value = true
try {
const submitData = {
roomNo: form.roomNo,
ruleId: form.ruleId || '', // 如果没有ruleId传空字符串
ruleName: form.ruleName,
remarks: form.remarks || ''
}
if (operType.value === 'add') {
await addObj(submitData)
useMessage().success('新增成功')
} else {
await editObj({
id: form.id,
...submitData
})
useMessage().success('编辑成功')
}
visible.value = false
emit('refresh')
} catch (err: any) {
useMessage().error(err.msg || (operType.value === 'add' ? '新增失败' : '编辑失败'))
} finally {
loading.value = false
}
})
}
// 获取宿舍列表
const getRoomListData = async () => {
try {
const res = await dormRoomList()
if (res.data && Array.isArray(res.data)) {
roomList.value = res.data
} else {
roomList.value = []
}
} catch (err) {
console.error('获取宿舍列表失败', err)
roomList.value = []
}
}
// 初始化
onMounted(() => {
getRoomListData()
})
// 暴露方法
defineExpose({
openDialog
})
</script>
<style scoped lang="scss">
</style>