8.6 KiB
8.6 KiB
出国申请附件不显示问题排查指南
问题描述
点击出国申请菜单下的出国申请选项卡中的"查看详情"按钮,弹窗界面已经增加了附件字段(显示"申请附件"标题),但看不到附件内容,只显示"暂无附件"。
问题分析
根据代码分析(web/src/views/rs/overseas/index.vue),附件显示逻辑如下:
<!-- 申请附件列表区域 -->
<div v-if="state.viewData && 'applicationId' in state.viewData && !('recordId' in state.viewData)" style="margin-top: 20px;">
<el-divider content-position="left">
<span style="font-size: 16px; font-weight: 500;">
<el-icon><Paperclip /></el-icon>
申请附件
</span>
</el-divider>
<el-table
v-if="viewAttachmentList.length > 0"
:data="viewAttachmentList"
border
size="small"
>
<!-- 表格列定义 -->
</el-table>
<el-empty v-else description="暂无附件" :image-size="100" />
</div>
关键点:
- 附件区域已经显示(说明条件判断通过)
- 表格不显示,说明
viewAttachmentList.length === 0 - 显示"暂无附件",证实了数据为空
排查步骤
步骤1:检查浏览器控制台
- 打开浏览器(Chrome/Edge)
- 按
F12打开开发者工具 - 点击 Console(控制台) 标签
- 清空现有日志(点击🚫图标)
- 再次点击"查看详情"按钮
- 观察控制台输出
可能的错误信息:
- ❌
加载附件列表失败: ...- API调用失败 - ❌
403 Forbidden- 权限不足 - ❌
401 Unauthorized- 未授权 - ❌
Cannot read property of undefined- JavaScript错误
步骤2:检查网络请求
- 开发者工具中点击 Network(网络) 标签
- 清空现有请求(点击🚫图标)
- 再次点击"查看详情"按钮
- 查找附件相关的请求
查找步骤:
- 在过滤器中输入:
attachment - 找到类似
/rs/overseas/attachment/list/xxx的请求
检查请求详情:
-
Status(状态码):
- ✅ 200 - 请求成功
- ❌ 403 - 权限不足
- ❌ 404 - 接口不存在
- ❌ 500 - 服务器错误
-
Response(响应):
{ "code": 200, "msg": "操作成功", "data": [] // 空数组说明确实没有附件 }
步骤3:检查该申请是否有附件
附件数据可能确实为空,需要先上传附件:
- 在出国申请列表中,点击该申请的 修改 按钮
- 在修改弹窗中,找到 申请附件 区域
- 点击 添加附件 按钮
- 填写附件信息:
- 附件标题:必填,如"护照复印件"
- 附件说明:选填
- 选择文件:必填
- 点击 确定 上传
- 保存申请表单
- 再次查看详情,确认附件是否显示
步骤4:检查权限配置
附件接口需要 rs:overseas:query 权限。
检查方法:
- 登录系统管理后台
- 进入 系统管理 > 角色管理
- 找到当前用户的角色
- 点击 菜单权限
- 展开 人事管理 > 出国管理
- 确认已勾选:
- ☑ 查询
- ☑ 详情
权限标识:
rs:overseas:query- 查询权限(必需)rs:overseas:list- 列表权限(必需)
步骤5:使用Vue Devtools检查数据
如果已安装Vue Devtools:
- 开发者工具中点击 Vue 标签
- 在组件树中找到
index.vue组件 - 在右侧面板查看:
viewAttachmentList- 查看其值- 如果是
[],说明确实没有数据 - 如果是
undefined,说明变量未初始化
步骤6:添加调试日志
如果以上步骤无法定位问题,可以临时添加调试代码:
在 loadViewAttachmentList 函数中添加日志:
// 查询详情的附件列表
const loadViewAttachmentList = async (applicationId: number | string) => {
console.log('🔍 开始加载附件列表,applicationId:', applicationId);
try {
const response = await listOverseasAttachments(applicationId);
console.log('✅ 附件接口响应:', response);
viewAttachmentList.value = response.data || [];
console.log('📋 附件列表数据:', viewAttachmentList.value);
console.log('📊 附件数量:', viewAttachmentList.value.length);
} catch (error) {
console.error('❌ 加载附件列表失败:', error);
viewAttachmentList.value = [];
}
};
常见问题与解决方案
问题1:显示"暂无附件"但实际有数据
原因:
- viewAttachmentList 未正确更新
- Vue响应式数据未触发更新
解决方案:
// 确保使用 .value 更新 ref
viewAttachmentList.value = response.data || [];
// 如果还不行,强制触发更新
nextTick(() => {
viewAttachmentList.value = [...response.data];
});
问题2:403权限错误
原因:用户没有查询权限
解决方案:
- 数据库执行:
-- 查看当前角色权限
SELECT * FROM sys_role_menu WHERE role_id = 2;
-- 添加查询权限(假设菜单ID是1234)
INSERT INTO sys_role_menu (role_id, menu_id) VALUES (2, 1234);
- 或通过界面配置(参见步骤4)
问题3:接口返回空数组
原因:该申请确实没有附件
解决方案:
- 上传附件(参见步骤3)
- 或检查数据库:
-- 查询附件数据
SELECT * FROM rs_overseas_application_attachment
WHERE application_id = xxx
AND deleted = 0;
问题4:文件路径错误导致下载失败
原因:
- 文件存储路径配置错误
- OSS配置问题
解决方案:
检查 application.yml 中的文件上传配置:
# 文件上传配置
ruoyi:
file:
upload-path: /path/to/upload/
domain: http://localhost:8080
快速测试方法
使用以下SQL直接插入测试附件数据:
-- 插入测试附件(请替换application_id为实际值)
INSERT INTO rs_overseas_application_attachment (
attachment_id,
application_id,
attachment_title,
attachment_content,
file_name,
file_original_name,
file_path,
file_size,
file_size_formatted,
mime_type,
upload_time,
upload_user_id,
upload_user_name,
create_time,
create_by,
deleted
) VALUES (
1234567890123456789, -- 雪花ID
YOUR_APPLICATION_ID, -- 替换为实际的申请ID
'测试附件',
'这是一个测试附件',
'test_20251010.pdf',
'test.pdf',
'/upload/test.pdf',
1024000,
'1.00 MB',
'application/pdf',
NOW(),
1,
'admin',
NOW(),
1,
0
);
插入后再次查看详情,应该能看到附件了。
预期效果
修复后,查看详情应该显示:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📎 申请附件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────┬──────────┬────────────┬───────┬────────┬─────────────┬────┐
│序号│附件标题 │附件说明 │文件名│文件大小│上传时间 │操作│
├────┼──────────┼────────────┼───────┼────────┼─────────────┼────┤
│ 1 │护照复印件│有效期至... │xxx.pdf│1.2 MB │2025-10-10..│下载│
└────┴──────────┴────────────┴───────┴────────┴─────────────┴────┘
总结
最可能的原因(按概率排序):
- ⭐⭐⭐⭐⭐ 该申请确实没有上传附件 - 需要先添加附件
- ⭐⭐⭐⭐ 权限不足 - 需要配置
rs:overseas:query权限 - ⭐⭐⭐ API接口调用失败 - 检查控制台错误
- ⭐⭐ 后端服务异常 - 检查后端日志
- ⭐ 前端代码bug - 检查Vue响应式数据
建议操作顺序:
- 先检查浏览器控制台和网络请求(步骤1、2)
- 确认该申请是否有附件数据(步骤3)
- 检查权限配置(步骤4)
- 如果以上都正常,添加调试日志定位具体问题(步骤6)
联系支持
如果按照以上步骤仍无法解决,请提供以下信息:
- 浏览器控制台错误截图
- 网络请求详情截图(包括Request和Response)
- 该申请的ID
- 当前用户的角色和权限
- 后端日志(如果有错误)
文档更新时间:2025-10-10
适用版本:v1.0.0+
相关文件:web/src/views/rs/overseas/index.vue