代码修改
This commit is contained in:
		
							parent
							
								
									f52947abab
								
							
						
					
					
						commit
						488748c992
					
				| @ -0,0 +1,621 @@ | ||||
| <template> | ||||
|   <div class="custom-page"> | ||||
|     <!-- 关键词搜索 --> | ||||
|     <el-form :inline="true" :model="searchForm" class="search-bar"> | ||||
|       <el-form-item label="关键词"> | ||||
|         <el-input v-model="searchForm.name" placeholder="请输入关键词" clearable /> | ||||
|       </el-form-item> | ||||
|       <el-form-item> | ||||
|         <el-button type="primary" @click="handleSearch">查询</el-button> | ||||
|         <el-button @click="handleReset">重置</el-button> | ||||
|       </el-form-item> | ||||
|     </el-form> | ||||
| 
 | ||||
|     <!-- 表格 --> | ||||
|     <avue-crud ref="crudRef" v-model:page="pageData" :data="crudData" :option="crudOptions" :table-loading="loading"> | ||||
|       <template v-if="activeTab === '0'" #menu-left> | ||||
|         <el-button type="primary" icon="Plus" @click="handleAdd">新增</el-button> | ||||
|       </template> | ||||
|       <template #menu="scope"> | ||||
|         <custom-table-operate :actions="getActions(scope.row)" :data="scope" /> | ||||
|       </template> | ||||
|     </avue-crud> | ||||
| 
 | ||||
|     <!-- 新增弹窗 --> | ||||
|     <el-dialog :key="dialogTitle" v-model="dialogVisible" :title="dialogTitle" width="60%" align-center :draggable="true"> | ||||
|       <el-form :model="formData" label-width="120px" class="custom-form" :disabled="isReadonly"> | ||||
|         <el-row :gutter="20"> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="姓名" prop="name"> | ||||
|               <el-input v-model="formData.name" placeholder="请输入姓名" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="证件类型" prop="idType"> | ||||
|               <el-select v-model="formData.idType" placeholder="请选择证件类型" disabled> | ||||
|                 <el-option label="身份证" value="101" /> | ||||
|                 <el-option label="护照" value="2" /> | ||||
|                 <el-option label="港澳身份证" value="3" /> | ||||
|               </el-select> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-row> | ||||
|         <el-row :gutter="20"> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="证件号码" prop="idCard"> | ||||
|               <el-input v-model="formData.idCard" placeholder="请输入证件号码" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="性别" prop="sex"> | ||||
|               <el-radio-group v-model="formData.sex"> | ||||
|                 <el-radio value="1">男</el-radio> | ||||
|                 <el-radio value="0">女</el-radio> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-row> | ||||
|         <el-row :gutter="20"> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="年龄" prop="age"> | ||||
|               <el-input v-model="formData.age" placeholder="请输入年龄" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="联系方式" prop="phone"> | ||||
|               <el-input v-model="formData.phone" placeholder="请输入联系方式" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-row> | ||||
|         <el-row :gutter="20"> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="居住地行政区划" prop="addressArr"> | ||||
|               <area-select v-model="formData.addressArr" :label="null" /> | ||||
|               <!-- <el-input v-model="formData.detailAddress" placeholder="请选择居住地行政区划" /> --> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="具体地址" prop="detailAddress"> | ||||
|               <el-input v-model="formData.detailAddress" placeholder="请输入具体地址" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-row> | ||||
|         <el-row :gutter="20"> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="种植面积" prop="area"> | ||||
|               <el-input v-model="formData.area" placeholder="请输入种植面积" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="种植作物" prop="planCrop"> | ||||
|               <!-- <el-select v-model="formData.planCrop" placeholder="种植作物" style="width: 380px" :clearable="true"> | ||||
|                 <el-option v-for="item in cropsOptions" :key="item.id" :label="item.cropsName" :value="item.id" /> | ||||
|               </el-select> --> | ||||
|               <url-select | ||||
|                 v-model="formData.planCrop" | ||||
|                 url="/land-resource/crops/page" | ||||
|                 :params="{ status: '0' }" | ||||
|                 label-key="cropsName" | ||||
|                 value-key="id" | ||||
|                 placeholder="请选择种植作物" | ||||
|               /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-row> | ||||
|       </el-form> | ||||
|       <template #footer> | ||||
|         <div class="dialog-footer"> | ||||
|           <el-button @click="dialogVisible = false">取消</el-button> | ||||
|           <el-button v-if="!isReadonly" type="primary" @click="handleSave">保存</el-button> | ||||
|         </div> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { ref, computed, reactive, onMounted, watch, nextTick } from 'vue'; | ||||
| import { ElMessageBox, ElMessage } from 'element-plus'; | ||||
| import { CRUD_OPTIONS } from '@/config'; | ||||
| import { fetchFarmerList, fetchFarmerById, saveFarmerList, editFarmer, approveFarmer, deleteFarmers } from '@/apis/businessEntity'; | ||||
| import { pageCropsList } from '@/apis/landResourceManagement/cropsManagement/index.js'; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| // 1. 模拟“当前用户角色” | ||||
| //    可选值:'superadmin'(超级管理员)、'auditor'(审核员)、'submitter'(提交人) | ||||
| // --------------------------------------------------------------------- | ||||
| const role = ref('superadmin'); // 开发时可手动切换为 'superadmin' / 'auditor' / 'submitter' | ||||
| 
 | ||||
| // 角色判断的计算属性 | ||||
| const isSuperAdmin = computed(() => role.value === 'superadmin'); | ||||
| const isAuditor = computed(() => role.value === 'auditor'); | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| // 2. Tab 与数据的状态控制 | ||||
| // --------------------------------------------------------------------- | ||||
| const activeTab = ref('2'); | ||||
| const dialogTitle = ref('新增'); | ||||
| const isReadonly = ref(false); | ||||
| // 搜索表单模型 | ||||
| const searchForm = ref({ | ||||
|   name: '', | ||||
|   idCard: '', | ||||
|   phone: '', | ||||
|   status: '', | ||||
|   userId: '', | ||||
| }); | ||||
| const loading = ref(false); | ||||
| const crudRef = ref(); | ||||
| // 分页数据 | ||||
| const pageData = ref({ | ||||
|   currentPage: 1, | ||||
|   pageSize: 10, | ||||
|   total: 0, | ||||
| }); | ||||
| // 模拟的原始数据列表(通常从后端接口拿到) | ||||
| const crudData = ref([]); | ||||
| 
 | ||||
| // 新增弹窗显示状态 | ||||
| const dialogVisible = ref(false); | ||||
| // 定义默认表单数据 | ||||
| const defaultFormData = { | ||||
|   name: '', | ||||
|   idType: '101', | ||||
|   idCard: '', | ||||
|   sex: '1', | ||||
|   age: '', | ||||
|   phone: '', | ||||
|   provinceCode: '', // 省 | ||||
|   cityCode: '', // 市 | ||||
|   countyCode: '', // 区县 | ||||
|   townCode: '', // 镇 | ||||
|   villageCode: '', // 村 | ||||
|   address: '', | ||||
|   addressArr: [], | ||||
|   detailAddress: '', | ||||
|   area: '', | ||||
|   planCrop: '', | ||||
|   reason: '', | ||||
| }; | ||||
| // 新增表单数据,使用默认数据初始化 | ||||
| const formData = ref({ ...defaultFormData }); | ||||
| 
 | ||||
| // 重置表单数据的方法 | ||||
| const resetForm = () => { | ||||
|   formData.value = { ...defaultFormData }; | ||||
| }; | ||||
| 
 | ||||
| // ============================== | ||||
| // CRUD 配置 | ||||
| // ============================== | ||||
| const crudOptions = reactive({ | ||||
|   ...CRUD_OPTIONS, | ||||
|   header: false, | ||||
|   column: [ | ||||
|     { label: '主体编码', prop: 'id' }, | ||||
|     { label: '姓名', prop: 'name' }, | ||||
|     { | ||||
|       label: '证件类型', | ||||
|       prop: 'idType', | ||||
|       formatter: (row, column, cellValue) => { | ||||
|         return cellValue === '101' ? '身份证' : '其它'; | ||||
|       }, | ||||
|     }, | ||||
|     { label: '证件号码', prop: 'idCard' }, | ||||
|     { | ||||
|       label: '性别', | ||||
|       prop: 'sex', | ||||
|       formatter: (row, column, cellValue) => { | ||||
|         return cellValue === '1' ? '男' : '女'; | ||||
|       }, | ||||
|     }, | ||||
|     { label: '年龄', prop: 'age' }, | ||||
|     { label: '联系方式', prop: 'phone' }, | ||||
|     { label: '所属行政区划', prop: 'address' }, | ||||
|     { label: '种植作物', prop: 'planCropName' }, | ||||
|     { label: '数据来源', prop: 'dataSource' }, | ||||
|     { label: '创建时间', prop: 'createTime' }, | ||||
|   ], | ||||
| }); | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| // 3. 各种操作方法占位(请根据实际 API/逻辑改写) | ||||
| // --------------------------------------------------------------------- | ||||
| async function getData() { | ||||
|   loading.value = true; | ||||
|   try { | ||||
|     const params = { | ||||
|       ...searchForm.value, | ||||
|       status: activeTab.value, | ||||
|       current: pageData.value.currentPage, | ||||
|       size: pageData.value.pageSize, | ||||
|     }; | ||||
|     const response = await fetchFarmerList(params); | ||||
|     if (response.code === 200 && response.data) { | ||||
|       crudData.value = response.data.records; | ||||
|       console.log('获取数据成功:', crudData.value); | ||||
|       pageData.value = { | ||||
|         currentPage: response.data.current, | ||||
|         pageSize: response.data.size, | ||||
|         total: response.data.total, | ||||
|       }; | ||||
|     } else { | ||||
|       ElMessage.error(response.msg || '获取数据失败'); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error('获取数据失败,请稍后重试'); | ||||
|   } finally { | ||||
|     loading.value = false; | ||||
|   } | ||||
| } | ||||
| // 存储种植作物列表 | ||||
| const cropsOptions = ref([]); | ||||
| // 初始化种植作物列表 | ||||
| const fetchCropsList = async () => { | ||||
|   try { | ||||
|     // 调用 pageCropsList 获取种植作物分页列表 | ||||
|     const res = await pageCropsList({ status: '0' }); | ||||
|     if (res.code === 200) { | ||||
|       console.log('res :>> ', res.data.records); | ||||
|       cropsOptions.value = res.data.records; | ||||
|       console.log('object :>> ', cropsOptions.value); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     console.error('获取种植作物列表失败:', error); | ||||
|   } | ||||
| }; | ||||
| function handleSearch() { | ||||
|   getData(); | ||||
| } | ||||
| function handleReset() { | ||||
|   searchForm.value.keyword = ''; | ||||
|   handleSearch(); | ||||
| } | ||||
| function handleTabChange(tab) { | ||||
|   handleSearch(); | ||||
| } | ||||
| // 新增 | ||||
| const handleAdd = () => { | ||||
|   isReadonly.value = false; // 设置为可编辑模式 | ||||
|   resetForm(); | ||||
|   dialogTitle.value = '新增'; | ||||
|   dialogVisible.value = true; | ||||
| }; | ||||
| // 根据address解构行政区划数据 | ||||
| watch( | ||||
|   () => formData.value.addressArr, | ||||
|   (newValue) => { | ||||
|     if (newValue.length === 5) { | ||||
|       formData.value.provinceCode = newValue[0] || ''; | ||||
|       formData.value.cityCode = newValue[1] || ''; | ||||
|       formData.value.countyCode = newValue[2] || ''; | ||||
|       formData.value.townCode = newValue[3] || ''; | ||||
|       formData.value.villageCode = newValue[4] || ''; | ||||
|     } else { | ||||
|       ElMessageBox.alert('行政区划数据错误'); | ||||
|     } | ||||
|   } | ||||
| ); | ||||
| 
 | ||||
| // 保存新增数据saveFarmerList | ||||
| const handleSave = async () => { | ||||
|   try { | ||||
|     let response; | ||||
|     if (dialogTitle.value === '新增') { | ||||
|       console.log('新增formData.value.arr :>> ', formData.value.addressArr); | ||||
|       // 新增操作调用 saveFarmerList 接口 | ||||
|       response = await saveFarmerList(formData.value); | ||||
|       if (response.code === 200) { | ||||
|         ElMessage.success('新增成功'); | ||||
|       } | ||||
|     } else if (dialogTitle.value === '编辑') { | ||||
|       // 编辑操作调用 editFarmer 接口 | ||||
|       response = await editFarmer(formData.value); | ||||
|       if (response.code === 200) { | ||||
|         ElMessage.success('编辑成功'); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (response && response.code === 200) { | ||||
|       dialogVisible.value = false; | ||||
|       getData(); // 重新获取数据 | ||||
|     } | ||||
|   } catch (error) { | ||||
|     if (dialogTitle.value === '新增') { | ||||
|       ElMessage.error('新增失败,请稍后重试'); | ||||
|     } else { | ||||
|       ElMessage.error('编辑失败,请稍后重试'); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| const getFarmerById = async (id) => { | ||||
|   try { | ||||
|     const response = await fetchFarmerById(id); | ||||
|     if (response.code === 200 && response.data) { | ||||
|       return response.data; | ||||
|     } else { | ||||
|       ElMessage.error(response.msg || '获取数据失败'); | ||||
|       return null; | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error('获取数据失败,请稍后重试'); | ||||
|     return null; | ||||
|   } | ||||
| }; | ||||
| // 查看 | ||||
| async function handleView(row) { | ||||
|   dialogTitle.value = '查看'; | ||||
|   isReadonly.value = true; // 设置为只读模式 | ||||
| 
 | ||||
|   const data = await getFarmerById(row.id); | ||||
|   if (data) { | ||||
|     const addressArr = [data.provinceCode, data.cityCode, data.countyCode, data.townCode, data.villageCode].filter(Boolean); | ||||
|     formData.value = { | ||||
|       ...data, | ||||
|       addressArr: addressArr, | ||||
|     }; | ||||
|   } | ||||
|   nextTick(() => { | ||||
|     dialogVisible.value = true; | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // 编辑(修改/填写) | ||||
| async function handleEdit(row) { | ||||
|   if (row.status === '2') { | ||||
|     try { | ||||
|       await ElMessageBox.confirm('编辑后数据将需要重新审核,是否继续?', '确认编辑', { | ||||
|         confirmButtonText: '继续编辑', | ||||
|         cancelButtonText: '取消', | ||||
|         type: 'warning', | ||||
|       }); | ||||
|     } catch { | ||||
|       return; | ||||
|     } | ||||
|   } | ||||
|   const data = await getFarmerById(row.id); | ||||
|   if (data) { | ||||
|     const addressArr = [data.provinceCode, data.cityCode, data.countyCode, data.townCode, data.villageCode].filter(Boolean); | ||||
|     formData.value = { | ||||
|       ...data, | ||||
|       addressArr: addressArr, | ||||
|     }; | ||||
|   } | ||||
|   dialogTitle.value = '编辑'; | ||||
|   isReadonly.value = false; | ||||
|   nextTick(() => { | ||||
|     dialogVisible.value = true; | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // 提交审核(待提交 → 待审核) | ||||
| function handleSubmit(row) { | ||||
|   ElMessageBox.confirm('确定提交审核吗?', '提交审核').then(() => { | ||||
|     const params = { | ||||
|       id: row.id, | ||||
|       status: '1', | ||||
|       reason: row.reason || '', | ||||
|     }; | ||||
|     approveFarmer(params) | ||||
|       .then(() => { | ||||
|         row.rejectReason = ''; // 清空驳回原因 | ||||
|         getData(); // 重新获取数据 | ||||
|       }) | ||||
|       .catch(() => { | ||||
|         ElMessage.error('提交审核失败,请稍后重试'); | ||||
|       }); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // 重新提交(被驳回 → 待审核) | ||||
| function handleResubmit(row) { | ||||
|   ElMessageBox.confirm('确认重新提交吗?', '重新提交').then(() => { | ||||
|     const params = { | ||||
|       id: row.id, | ||||
|       status: '1', // 待审核 | ||||
|       reason: '重新提交审核', | ||||
|     }; | ||||
|     approveFarmer(params) | ||||
|       .then(() => { | ||||
|         console.log(`ID=${row.id} 重新提交审核`); | ||||
|         row.status = '1'; | ||||
|         row.rejectReason = ''; | ||||
|         getData(); | ||||
|         ElMessage.success('已重新提交,状态已变为"待审核"'); | ||||
|       }) | ||||
|       .catch((error) => { | ||||
|         console.error('重新提交失败:', error); | ||||
|         ElMessage.error(error.response?.data?.msg || '重新提交失败'); | ||||
|       }); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // 撤销(待审核 → 待提交),超级管理员和提交人拥有撤销 | ||||
| function handleWithdraw(row) { | ||||
|   ElMessageBox.confirm('确认撤销本次审核吗?', '撤销').then(() => { | ||||
|     const params = { | ||||
|       id: row.id, | ||||
|       status: '0', // 待提交 | ||||
|       reason: '用户主动撤销', | ||||
|     }; | ||||
|     approveFarmer(params) | ||||
|       .then(() => { | ||||
|         console.log(`ID=${row.id} 撤销审核`); | ||||
|         row.status = '0'; | ||||
|         getData(); | ||||
|         ElMessage.success('已撤销,状态已变为"待提交"'); | ||||
|       }) | ||||
|       .catch((error) => { | ||||
|         console.error('撤销失败:', error); | ||||
|         ElMessage.error(error.response?.data?.msg || '撤销失败'); | ||||
|       }); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // 审核通过(待审核 → 已通过) | ||||
| function handleApprove(row) { | ||||
|   ElMessageBox.confirm('确认通过审核?', '审核通过').then(() => { | ||||
|     const params = { | ||||
|       id: row.id, | ||||
|       status: '2', // 已通过 | ||||
|       reason: '审核通过', | ||||
|     }; | ||||
|     approveFarmer(params) | ||||
|       .then(() => { | ||||
|         console.log(`ID=${row.id} 审核通过`); | ||||
|         row.status = '2'; | ||||
|         getData(); | ||||
|         ElMessage.success('审核已通过'); | ||||
|       }) | ||||
|       .catch((error) => { | ||||
|         console.error('审核通过操作失败:', error); | ||||
|         ElMessage.error(error.response?.data?.msg || '审核操作失败'); | ||||
|       }); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // 审核驳回(待审核 → 已驳回),需要填写驳回原因 | ||||
| function handleReject(row) { | ||||
|   ElMessageBox.prompt('请输入驳回原因', '审核驳回', { | ||||
|     confirmButtonText: '确定', | ||||
|     cancelButtonText: '取消', | ||||
|     inputPattern: /.+/, // 必须输入内容 | ||||
|     inputErrorMessage: '驳回原因不能为空', | ||||
|   }) | ||||
|     .then(({ value }) => { | ||||
|       const params = { | ||||
|         id: row.id, | ||||
|         status: '3', // 已驳回 | ||||
|         reason: value.trim(), | ||||
|       }; | ||||
|       return approveFarmer(params).then(() => { | ||||
|         console.log(`ID=${row.id} 驳回,原因:${value.trim()}`); | ||||
|         row.status = '3'; | ||||
|         row.rejectReason = value.trim(); | ||||
|         getData(); | ||||
|         ElMessage.success('已驳回'); | ||||
|       }); | ||||
|     }) | ||||
|     .catch((error) => { | ||||
|       if (error !== 'cancel') { | ||||
|         console.error('驳回操作失败:', error); | ||||
|         ElMessage.error(error.response?.data?.msg || '驳回操作失败'); | ||||
|       } | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| // 查看/弹窗 驳回原因 | ||||
| function showRejectReason(row) { | ||||
|   ElMessageBox.alert(row.reason || '无驳回原因', '驳回原因'); | ||||
| } | ||||
| 
 | ||||
| async function handleDelete(row) { | ||||
|   try { | ||||
|     await ElMessageBox.confirm('确定删除该条记录?', '删除提示'); | ||||
| 
 | ||||
|     console.log(`删除 ID=${row.id}`); | ||||
|     await deleteFarmers(row.id); // 直接传递单ID | ||||
|     await getData(); | ||||
|     ElMessage.success('已删除'); | ||||
|   } catch (error) { | ||||
|     if (error !== 'cancel') { | ||||
|       ElMessage.error(`删除失败: ${error.message || '请稍后重试'}`); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // 定义操作映射 | ||||
| const ACTION_MAP = { | ||||
|   view: { name: '查看', icon: 'view', handler: handleView }, | ||||
|   edit: { name: '编辑', icon: 'edit', handler: handleEdit }, | ||||
|   submit: { name: '提交审核', icon: 'submit', handler: handleSubmit }, | ||||
|   delete: { type: 'danger', name: '删除', icon: 'delete', handler: handleDelete }, | ||||
|   approve: { name: '通过', icon: 'approve', handler: handleApprove }, | ||||
|   reject: { name: '驳回', icon: 'reject', handler: handleReject }, | ||||
|   withdraw: { name: '撤销', icon: 'withdraw', handler: handleWithdraw }, | ||||
|   resubmit: { name: '重新提交', icon: 'resubmit', handler: handleResubmit }, | ||||
|   reason: { name: '驳回原因', icon: 'reason', handler: showRejectReason }, | ||||
|   modify: { name: '修改', icon: 'edit', handler: handleEdit }, | ||||
| }; | ||||
| 
 | ||||
| // 定义角色和状态对应的操作配置 | ||||
| const ROLE_STATUS_ACTIONS = { | ||||
|   superadmin: { | ||||
|     0: ['view', 'edit', 'submit', 'delete'], | ||||
|     1: ['view', 'approve', 'reject', 'withdraw', 'delete'], | ||||
|     2: ['view', 'modify', 'delete'], | ||||
|     3: ['view', 'edit', 'reason', 'resubmit', 'delete'], | ||||
|   }, | ||||
|   auditor: { | ||||
|     0: [], | ||||
|     1: ['view', 'approve', 'reject'], | ||||
|     2: ['view', 'delete'], | ||||
|     3: ['view', 'reason', 'delete'], | ||||
|   }, | ||||
|   submitter: { | ||||
|     0: ['view', 'edit', 'submit', 'delete'], | ||||
|     1: ['view', 'withdraw', 'delete'], | ||||
|     2: ['view', 'modify', 'delete'], | ||||
|     3: ['view', 'edit', 'reason', 'resubmit', 'delete'], | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
| // 根据角色和状态动态生成操作按钮 | ||||
| function getActions(row) { | ||||
|   const currentRole = role.value; | ||||
|   const status = row.status; | ||||
|   const actionKeys = ROLE_STATUS_ACTIONS[currentRole]?.[status] || []; | ||||
| 
 | ||||
|   return actionKeys.map((key) => { | ||||
|     const action = ACTION_MAP[key]; | ||||
|     return { | ||||
|       ...action, | ||||
|       event: () => action.handler(row), | ||||
|     }; | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| // 4. 示例:页面加载时可以从后端获取 crudData | ||||
| // --------------------------------------------------------------------- | ||||
| onMounted(() => { | ||||
|   getData(); | ||||
|   fetchCropsList(); // 初始化种植作物列表 | ||||
| }); | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"> | ||||
| // :deep(.avue-crud__header) { | ||||
| //   display: none; | ||||
| // } | ||||
| .custom-page { | ||||
|   padding: 20px; | ||||
|   height: calc(100vh - 150px); | ||||
|   overflow-y: auto; | ||||
| 
 | ||||
|   .search-bar { | ||||
|     margin-bottom: 20px; | ||||
|   } | ||||
| } | ||||
| :deep(.el-dialog__body) { | ||||
|   padding: 20px; | ||||
|   height: calc(100vh - 300px); | ||||
|   overflow-y: auto; | ||||
| } | ||||
| 
 | ||||
| .custom-form { | ||||
|   padding: 20px; | ||||
| 
 | ||||
|   .el-form-item { | ||||
|     margin-bottom: 22px; | ||||
|   } | ||||
|   .el-input, | ||||
|   .el-select, | ||||
|   .el-cascader, | ||||
|   .el-date-picker { | ||||
|     width: 500px; | ||||
|     max-width: 100%; // 防止超出父容器 | ||||
|     box-sizing: border-box; // 让padding/border包含在宽度内 | ||||
|   } | ||||
| } | ||||
| </style> | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user