element-ui表单必填项

位置:首页 / 技术中心 / 杂项

杂项 Admin 2026-06-08 14:35:00 185

完整代码如下

<template>
    <div class="box">
        <!-- 查询表单 -->
        <el-form :model="searchForm" :inline="true" class="demo-form-inline">
            <el-form-item label="规则时间:">
                <el-date-picker
                    v-model="searchForm.ruleTime"
                    type="daterange"
                    range-separator="至"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期"
                    value-format="yyyy-MM-dd"
                ></el-date-picker>
            </el-form-item>
            <el-form-item label="所属区域: ">
                <el-cascader v-model="areaIds" :options="deptOptions" :props="{ checkStrictly: true, value: 'id' }" clearable
                  @change="getAreaId">
                  <template slot-scope="{ node, data }">
                    <span>{{ data.label }}</span>
                    <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                  </template>
                </el-cascader>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" icon="el-icon-search" @click="handleSearch">查询</el-button>
                <el-button  icon="el-icon-refresh" @click="handleReset">重置</el-button>
                <el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button>
            </el-form-item>
        </el-form>
        <!-- 列表 -->
        <el-table :data="tableData.list" :header-cell-style="{background: '#F5F6F7',color: '#333','font-weight': 500}">
            <el-table-column type="index" label="序号" width="50" align="center"/>
            <el-table-column label="规则时间" align="center">
                <template slot-scope="scope">
                    {{ scope.row.startTime }} 至 {{ scope.row.endTime }}
                </template>
            </el-table-column>
            <el-table-column label="所属区域" align="center">
                <template slot-scope="scope">
                    {{ scope.row.areaName || scope.row.areaId }}
                </template>
            </el-table-column>
            <el-table-column prop="createName" label="操作人" align="center"></el-table-column>
            <el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
            <el-table-column prop="status" label="状态" align="center">
                <template slot-scope="scope">
                    <span :class="scope.row.status === 1 ? 'status-enabled' : 'status-disabled'">
                        {{ scope.row.status === 1 ? '启用' : '停用' }}
                    </span>
                </template>
            </el-table-column>
            <el-table-column label="操作" align="center">
                <template slot-scope="scope">
                    <el-button size="mini" type="text" @click="handleView(scope.row)">查看</el-button>
                    <el-button size="mini" type="text" @click="handleEdit(scope.row)">编辑</el-button>
                    <el-button size="mini" type="text" @click="handleDelete(scope.row)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <!-- 分页 -->
        <pagination v-show="tableData.total > 0" :total="tableData.total" :page.sync="tableData.pageNo" :limit.sync="tableData.pageSize" @pagination="getList" />
       
        <!-- 新增/编辑弹窗 -->
        <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="685px" :close-on-click-modal="true" class="dialog">
            <el-form :model="form" :rules="rules" class="dialog-form" label-width="93px">
                <el-form-item label="规则区域:" prop="areaId">
                    <el-cascader v-model="formAreaIds" :options="deptOptions" :props="{ checkStrictly: true, value: 'id' }" clearable
                      @change="getFormAreaId">
                      <template slot-scope="{ node, data }">
                        <span>{{ data.label }}</span>
                        <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
                      </template>
                    </el-cascader>
                </el-form-item>
                <el-form-item label="规则时间:" prop="ruleTime">
                    <el-date-picker
                        v-model="form.ruleTime"
                        type="daterange"
                        range-separator="至"
                        start-placeholder="开始日期"
                        end-placeholder="结束日期"
                        class="w-full"
                    ></el-date-picker>
                </el-form-item>
                <el-form-item label="能力完好:" prop="completeDisability">
                    <el-input v-model="form.completeDisability" placeholder="请输入" class="w-full">
                        <template slot="suffix">
                            <slot name="completeDisabilityUnit"><span>元/月</span></slot>
                        </template>
                    </el-input>
                </el-form-item>
                <el-form-item label="轻度失能:" prop="mildDisability">
                    <el-input v-model="form.mildDisability" placeholder="请输入" class="w-full">
                        <template slot="suffix">
                            <slot name="mildDisabilityUnit"><span>元/月</span></slot>
                        </template>
                    </el-input>
                </el-form-item>
                <el-form-item label="中度失能:" prop="moderateDisability">
                    <el-input v-model="form.moderateDisability" placeholder="请输入" class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="重度失能:" prop="severeDisability">
                    <el-input v-model="form.severeDisability" placeholder="请输入" class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="完全失能:" prop="totalIncapacity">
                    <el-input v-model="form.totalIncapacity" placeholder="请输入" class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="操作人:" prop="createName">
                    <el-input v-model="form.createName" placeholder="请输入" class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="状态:">
                    <el-radio v-model="form.status" :label="1">启用</el-radio>
                    <el-radio v-model="form.status" :label="0">停用</el-radio>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button type="primary" @click="handleConfirm">确定</el-button>
                <el-button @click="handleCancel">取消</el-button>
            </div>
        </el-dialog>

        <!-- 查看弹窗 -->
        <el-dialog title="查看详情" :visible.sync="viewDialogVisible" width="685px" :close-on-click-modal="true" class="dialog">
            <el-form :model="viewForm" class="dialog-form" label-width="93px" :disabled="true">
                <el-form-item label="规则区域:">
                    <el-select v-model="viewForm.areaName" disabled class="w-full">
                        <el-option :label="viewForm.areaName" :value="viewForm.areaName"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="规则时间:">
                    <el-date-picker
                        v-model="viewForm.ruleTime"
                        type="daterange"
                        range-separator="至"
                        start-placeholder="开始日期"
                        end-placeholder="结束日期"
                        disabled
                        class="w-full"
                    ></el-date-picker>
                </el-form-item>
                <el-form-item label="能力完好:">
                    <el-input v-model="viewForm.completeDisability" disabled class="w-full">
                        <template slot="suffix">
                            <slot name="viewCompleteDisabilityUnit"><span>元/月</span></slot>
                        </template>
                    </el-input>
                </el-form-item>
                <el-form-item label="轻度失能:">
                    <el-input v-model="viewForm.mildDisability" disabled class="w-full">
                        <template slot="suffix">
                            <slot name="viewMildDisabilityUnit"><span>元/月</span></slot>
                        </template>
                    </el-input>
                </el-form-item>
                <el-form-item label="中度失能:">
                    <el-input v-model="viewForm.moderateDisability" disabled class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="重度失能:">
                    <el-input v-model="viewForm.severeDisability" disabled class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="完全失能:">
                    <el-input v-model="viewForm.totalIncapacity" disabled class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="内容:">
                    <el-input v-model="viewForm.content" type="textarea" disabled class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="状态:">
                    <el-radio v-model="viewForm.status" :label="1" disabled>启用</el-radio>
                    <el-radio v-model="viewForm.status" :label="0" disabled>停用</el-radio>
                </el-form-item>
                <el-form-item label="操作人:">
                    <el-input v-model="viewForm.createName" disabled class="w-full"></el-input>
                </el-form-item>
                <el-form-item label="检查人:">
                    <el-input v-model="viewForm.personName" disabled class="w-full"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click="viewDialogVisible = false">关闭</el-button>
            </div>
        </el-dialog>
    </div>
</template>
<script>
import Cookies from "js-cookie";
import request from "@/utils/request";
import { deptTreeList } from "@/api/elderlyResources.js";
export default {
    name: 'institutionalOperationSubsidy',
    props: {
        id: {
            type: [Number, String],
            default: null
        },
        chioseTreeItem: {
            type: Object,
            default: () => ({})
        }
    },
    data() {
        return {
            searchForm:{},
            deptOptions:[],
            areaIds: [],
            formAreaIds: [],
            tableData:{
                list:[],
                total:0,
                pageNo:1,
                pageSize:10,
            },
            dialogVisible: false,
            viewDialogVisible: false,
            dialogTitle: '新增',
            form: {},
            viewForm: {},
            areaId: null,
            editId: null,
            rules: {
                areaId: [{ required: true, message: '请选择区域', trigger: 'change' }],
                ruleTime: [{ required: true, message: '请选择规则时间', trigger: 'change' }],
                completeDisability: [{ required: true, message: '请输入能力完好', trigger: 'change' }],
                mildDisability: [{ required: true, message: '请输入轻度失能', trigger: 'change' }],
                moderateDisability: [{ required: true, message: '请输入中度失能', trigger: 'change' }],
                severeDisability: [{ required: true, message: '请输入重度失能', trigger: 'change' }],
                totalIncapacity: [{ required: true, message: '请输入完全失能', trigger: 'change' }],
                content: [{ required: true, message: '请输入内容', trigger: 'change' }],
                status: [{ required: true, message: '请选择状态', trigger: 'change' }],
            }
        }
    },
    mounted() {
        this.areaId = Cookies.get("areaId");
        this.getAreaTree();
        this.getList();
    },
    // watch: {
    //     id: function(newVal) {
    //         this.getList()
    //     },
    //     chioseTreeItem: function(newVal) {
    //         this.getList()
    //     }
    // },
    methods: {
        // 获取区域树
        getAreaTree() {
            deptTreeList({}).then(res => {
                if (res.data.length > 0) {
                    if (res.data[0].label == '系统') {
                        this.deptOptions = res.data[0].children
                    } else {
                        this.deptOptions = res.data
                    }
                }
            })
        },
        // 级联选择区域
        getAreaId(val) {
            if (val && val.length > 0) {
                this.searchForm.areaId = val[val.length - 1]
            } else {
                this.searchForm.areaId = ''
            }
        },
        // 弹窗级联选择区域
        getFormAreaId(val) {
            if (val && val.length > 0) {
                this.form.areaId = val[val.length - 1]
            } else {
                this.form.areaId = ''
            }
        },
        // 查询
        handleSearch() {
            this.tableData.pageNo = 1;
            this.getList();
        },
        // 重置
        handleReset() {
            this.searchForm = {};
            this.areaIds = [];
            this.tableData.pageNo = 1;
            this.getList();
        },
        // 列表数据
        getList() {
            const params = {
                pageNo: this.tableData.pageNo,
                pageSize: this.tableData.pageSize,
                areaId: Number(this.areaId),
                ...this.searchForm
            };
            if (params.ruleTime && Array.isArray(params.ruleTime)) {
                params.startTime = params.ruleTime[0];
                params.endTime = params.ruleTime[1];
                delete params.ruleTime;
            }
            request({
                url: "/sx/operating/subsidy/list",
                method: "post",
                data: params
            }).then(res => {
                console.log(res,"补贴规则列表");
                this.tableData.list = res.data.list || [];
                this.tableData.total = res.data.total || 0;
            }).catch(err => {
                console.error('获取列表失败', err);
            });
        },
        // 新增
        handleAdd() {
            this.dialogTitle = '新增';
            this.editId = null;
            this.form = {
                areaId: Number(this.areaId),
                status: 1,
                createName: Cookies.get("userName") || ''
            };
            this.formAreaIds = [Number(this.areaId)];
            this.dialogVisible = true;
        },
        // 确定
        handleConfirm() {
            if (!this.validateForm()) {
                return;
            }
            if (this.editId) {
                this.updateSubsidy();
            } else {
                this.insertSubsidy();
            }
        },
        // 表单验证
        validateForm() {
            if (!this.form.areaId) {
                this.$message.error('规则区域不能为空');
                return false;
            }
            if (!this.form.ruleTime || !this.form.ruleTime[0] || !this.form.ruleTime[1]) {
                this.$message.error('规则时间不能为空');
                return false;
            }
            if (!this.form.completeDisability && this.form.completeDisability !== 0) {
                this.$message.error('能力完好不能为空');
                return false;
            }
            if (!this.form.mildDisability && this.form.mildDisability !== 0) {
                this.$message.error('轻度失能不能为空');
                return false;
            }
            if (!this.form.moderateDisability && this.form.moderateDisability !== 0) {
                this.$message.error('中度失能不能为空');
                return false;
            }
            if (!this.form.severeDisability && this.form.severeDisability !== 0) {
                this.$message.error('重度失能不能为空');
                return false;
            }
            if (!this.form.totalIncapacity && this.form.totalIncapacity !== 0) {
                this.$message.error('完全失能不能为空');
                return false;
            }
            return true;
        },
        // 取消
        handleCancel() {
            this.dialogVisible = false;
            this.form = {};
            this.formAreaIds = [];
        },
        // 查看
        handleView(row) {
            request({
                url: `/sx/operating/subsidy/get/${row.id}`,
                method: "get"
            }).then(res => {
                console.log(res,"补贴规则详情");
                this.viewForm = res.data || {};
                this.viewDialogVisible = true;
            }).catch(err => {
                this.$message.error('查看失败');
                console.error('查看失败', err);
            });
        },
        // 编辑
        handleEdit(row) {
            this.dialogTitle = '编辑';
            this.editId = row.id;
            this.form = { ...row };
            if (row.startTime && row.endTime) {
                this.form.ruleTime = [row.startTime, row.endTime];
            }
            this.formAreaIds = [row.areaId];
            this.dialogVisible = true;
        },
        // 删除
        handleDelete(row) {
            this.$confirm('确定删除该补贴规则吗?', '提示', {
                type: 'warning'
            }).then(() => {
                request({
                    url: `/sx/operating/subsidy/delete/${row.id}`,
                    method: "delete"
                }).then(res => {
                    this.$message.success('删除成功');
                    this.getList();
                }).catch(err => {
                    this.$message.error('删除失败');
                    console.error('删除失败', err);
                });
            }).catch(() => {
                this.$message.info('已取消删除');
            });
        },
        // 新增补贴规则
        insertSubsidy() {
            const data = { ...this.form };
            if (data.ruleTime && Array.isArray(data.ruleTime)) {
                data.startTime = data.ruleTime[0];
                data.endTime = data.ruleTime[1];
                delete data.ruleTime;
            }
            request({
                url: "/sx/operating/subsidy/insert",
                method: "post",
                data: data
            }).then(res => {
                this.$message.success('新增成功');
                this.dialogVisible = false;
                this.form = {};
                this.getList();
            }).catch(err => {
                this.$message.error('新增失败');
                console.error('新增失败', err);
            });
        },
        // 更新补贴规则
        updateSubsidy() {
            const data = { ...this.form };
            if (data.ruleTime && Array.isArray(data.ruleTime)) {
                data.startTime = data.ruleTime[0];
                data.endTime = data.ruleTime[1];
                delete data.ruleTime;
            }
            request({
                url: "/sx/operating/subsidy/update",
                method: "post",
                data: data
            }).then(res => {
                this.$message.success('更新成功');
                this.dialogVisible = false;
                this.form = {};
                this.editId = null;
                this.getList();
            }).catch(err => {
                this.$message.error('更新失败');
                console.error('更新失败', err);
            });
        }
    }
}
</script>
<style lang="scss" scoped>
.box {
    width: 100%;
    height: 100%;
    ::v-deep.el-dialog__body {
        padding: 15px 30px !important;
    }
    .demo-form-inline{
       ::v-deep .el-form-item
        {
            padding-right: 0px !important;
        }
    }
    .dialog {
        ::v-deep.el-select{
            display: inline-block;
            position: relative;
            width: 480px;
        }
        ::v-deep .el-input {
            width: 480px;
        }
        ::v-deep .el-form-item {
            padding-right: 0px !important;
        }
        ::v-deep .el-range-editor.el-input__inner {
            width: 480px;
        }
        ::v-deep .el-form-item--required:not(.is-no-asterisk) .el-form-item__label::before {
            content: '*';
            color: #FF0000;
            margin-right: 4px;
        }
        ::v-deep .el-input__suffix {
            right: 10px;
            transform: translateY(-50%);
            top: 50%;
            position: absolute;
        }
        ::v-deep .el-input__suffix-inner {
            display: inline-flex;
            align-items: center;
        }
    }
}
.status-enabled {
    color: #67c23a;
}
.status-disabled {
    color: #f56c6c;
}
</style>
18455111359 扫描二维码