Django中如何处理学生大学申请场景下的文档请求功能?
材料请求功能实现方案
1. 数据库存储方案
优先选择每份要求的材料单独存储一行的方案,不推荐用数组存单行。
核心原因:
- 扩展灵活:后续要给单个材料加状态(待上传/已上传/已驳回/已审核)、上传时间、审核备注、文件存储地址、驳回原因这类字段,数组结构完全无法支持
- 查询效率更高:如果要统计某类材料的提交率、筛选所有未上传的材料,单条存储直接按字段过滤即可,数组需要全表扫描后反序列化解析,性能差距极大
- 数据一致性更有保障:不会出现数组元素和实际上传的文件记录对应不上的问题
可参考的表结构:
新建application_document_requests表,核心字段如下:
id主键application_id外键,关联对应申请单的IDdocument_type材料类型,可存枚举值或者字符串,比如transcript(成绩单)、certificate_of_enrollment(在读证明)status材料状态,枚举值:pending_upload(待上传)、uploaded(已上传)、rejected(已驳回)、approved(已通过)file_url学生上传后存储的文件访问地址request_note大学发起请求时可填的补充要求,可选uploaded_at上传时间戳created_at请求创建时间戳updated_at记录更新时间戳
如果你的系统里可选材料列表是全局统一维护的,还可以额外建document_templates字典表,存储所有可选材料的名称、格式要求、大小限制等,document_type字段直接关联该表的主键即可。
只有当你的业务完全不需要给单个材料加任何额外属性、后续也没有扩展计划、只是单纯存个要求的材料名列表的时候,才考虑用数组字段存储,否则都优先选单条存储的方案。
2. 学生侧材料列表展示逻辑
- 数据查询:首先根据当前登录学生的ID,关联查询所有属于该学生、且状态为
pending_upload或rejected的application_document_requests记录,按关联的申请单分组展示即可 - 展示内容:每条材料项要展示对应的大学名称、申请项目名称、材料类型要求、状态标签,如果是驳回状态还要展示驳回原因,以及对应上传入口/已上传文件的预览入口
- 优化体验:可增加顶部筛选栏,支持按申请状态、材料状态筛选,也可以加未上传材料的数量提醒,方便学生快速处理待办
3. 材料全量上传校验逻辑
分两个场景做校验即可:
单份材料上传校验
学生上传单份材料时,前端先做文件格式、大小的前置校验,上传到存储服务成功后,把对应application_document_requests记录的状态更新为uploaded,同时写入文件地址和上传时间。
全量材料完成校验
要判断某份申请的所有请求材料是否全部上传,直接查询该application_id关联的所有application_document_requests记录,检查是否存在状态为pending_upload的记录:
- 无待上传记录:说明所有要求的材料都已提交,可给对应申请单标记
documents_completed的状态,也可以触发通知提醒大学侧审核 - 有待上传记录:统计剩余未上传的数量,在学生端、大学端的申请详情页都展示提醒即可
如果业务要求所有请求材料上传完成后才能提交最终申请,在学生提交申请的接口里加一层前置校验即可,只要还存在待上传的材料请求,就拦截提交操作并提示学生上传剩余材料。
内容的提问来源于stack exchange,提问作者sixovov947
相关产品推荐
相关产品推荐

