From 97f7619bca01150a3706560880f8a400173c8f28 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Sun, 3 Aug 2025 15:13:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...e-adjust-record-2025-01-27-ai-assistant.md | 153 +++++++++- .../code-adjust-record-2025-01-27-cursor.md | 289 ++++++++++++++++++ .../xsjcxx/stuMsgAudit/stuMsgDetailDialog.vue | 100 +++++- .../xg/xsjcxx/stuMsgAudit/stuMsgDialog.vue | 135 +++++++- .../stuMsgSupply/stuMsgDetailDialog.vue | 100 +++++- .../xg/xsjcxx/stuMsgSupply/stuMsgDialog.vue | 150 ++++++++- .../views/xg/xsjcxx/stuPersonalMsg/index.vue | 100 +++++- .../components/StudentDetailDialog.vue | 100 +++++- web/src/views/xg/xsjcxx/stuRoster/index.vue | 207 ++++++++++++- 9 files changed, 1315 insertions(+), 19 deletions(-) diff --git a/docs/变更管理/code-adjust-record-2025-01-27-ai-assistant.md b/docs/变更管理/code-adjust-record-2025-01-27-ai-assistant.md index f2d524d5..aa762850 100644 --- a/docs/变更管理/code-adjust-record-2025-01-27-ai-assistant.md +++ b/docs/变更管理/code-adjust-record-2025-01-27-ai-assistant.md @@ -420,4 +420,155 @@ disabilityLevel: '', **变更时间**: 2025-01-27 16:00:00 **变更人员**: AI Assistant **变更类型**: 功能优化 -**影响范围**: 学生花名册高级检索界面 \ No newline at end of file +**影响范围**: 学生花名册高级检索界面 + +# 代码调整记录 - 2025-01-27 + +## 修改概述 +将 `stuMsgDetailDialog.vue` 界面的学生照片加载方式与 `index.vue` 界面保持一致,实现统一的异步照片加载机制。 + +## 修改文件 +- `web/src/views/xg/xsjcxx/stuMsgSupply/stuMsgDetailDialog.vue` + +## 具体修改内容 + +### 1. 模板部分修改 +- **位置**: 第100-108行 +- **修改前**: 直接使用 `form.photoUrl` 显示照片 +- **修改后**: 使用异步加载机制,包含加载状态显示 +```vue + + + + +
+ + 加载中... +
+ +``` + +### 2. 脚本部分修改 + +#### 2.1 导入模块 +- **位置**: 第745行 +- **新增**: 导入 `watchEffect` 和 `Loading` 图标 +```typescript +import { ref, reactive, getCurrentInstance, nextTick, watch, toRefs, watchEffect } from 'vue'; +import { Loading } from '@element-plus/icons-vue'; +``` + +#### 2.2 响应式变量 +- **位置**: 第825-826行 +- **新增**: 照片加载相关的响应式变量 +```typescript +const photoLoading = ref(false); // 照片加载状态 +const asyncPhotoUrl = ref(''); // 异步加载的照片URL +``` + +#### 2.3 照片加载方法 +- **位置**: 第975-1015行 +- **新增**: `getImageBlobUrl` 方法,通过认证请求获取图片数据 +```typescript +const getImageBlobUrl = async (imageUrl: string): Promise => { + // 通过axios请求图片数据,自动带上token和clientId + const response = await request({ + url: '/resource/oss/download/' + imageUrl, + method: 'get', + responseType: 'blob', + timeout: 300000 + }); + // 创建blob URL并返回 +} +``` + +#### 2.4 监听器 +- **位置**: 第1225-1240行 +- **新增**: `watchEffect` 监听 `form.photoPath` 变化,异步加载图片 +```typescript +watchEffect(async () => { + if (form.photoPath) { + photoLoading.value = true; + try { + const blobUrl = await getImageBlobUrl(form.photoPath); + asyncPhotoUrl.value = blobUrl; + } catch (error) { + console.error('加载图片失败:', error); + asyncPhotoUrl.value = ''; + } finally { + photoLoading.value = false; + } + } else { + asyncPhotoUrl.value = ''; + photoLoading.value = false; + } +}); +``` + +### 3. 样式部分修改 +- **位置**: 第1740-1762行 +- **新增**: 照片加载状态的CSS样式 +```css +.photo-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 150px; + height: 150px; + border: 2px dashed #d9d9d9; + border-radius: 6px; + background-color: #fafafa; + color: #8c8d91; + font-size: 14px; + transition: border-color 0.3s; +} + +.photo-loading .el-icon { + font-size: 24px; + margin-bottom: 8px; + color: #409eff; +} + +.photo-loading span { + font-size: 12px; +} +``` + +## 技术实现要点 + +### 1. 异步加载机制 +- 使用 `watchEffect` 监听 `form.photoPath` 变化 +- 通过 `getImageBlobUrl` 方法获取图片数据 +- 支持认证请求,自动携带token和clientId + +### 2. 加载状态管理 +- `photoLoading` 控制加载状态显示 +- `asyncPhotoUrl` 存储异步加载的照片URL +- 加载失败时显示占位符 + +### 3. 用户体验优化 +- 加载过程中显示加载动画和提示文字 +- 加载失败时优雅降级到占位符 +- 保持与 `index.vue` 界面一致的视觉效果 + +## 修改效果 +1. **统一性**: 两个界面的照片加载方式完全一致 +2. **安全性**: 通过认证请求获取图片,确保访问权限 +3. **用户体验**: 提供加载状态反馈,提升用户体验 +4. **错误处理**: 完善的错误处理机制,确保界面稳定性 + +## 测试建议 +1. 测试有照片路径时的加载效果 +2. 测试无照片路径时的显示效果 +3. 测试网络异常时的错误处理 +4. 测试加载状态的视觉反馈 + +## 相关文件 +- 参考文件: `web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue` +- 修改文件: `web/src/views/xg/xsjcxx/stuMsgSupply/stuMsgDetailDialog.vue` + +--- +**修改时间**: 2025-01-27 14:30:00 +**修改人**: AI Assistant +**修改类型**: 功能优化 - 照片加载方式统一 \ No newline at end of file diff --git a/docs/变更管理/code-adjust-record-2025-01-27-cursor.md b/docs/变更管理/code-adjust-record-2025-01-27-cursor.md index 51d92b83..98c0e96c 100644 --- a/docs/变更管理/code-adjust-record-2025-01-27-cursor.md +++ b/docs/变更管理/code-adjust-record-2025-01-27-cursor.md @@ -891,3 +891,292 @@ watchEffect(async () => { **变更状态**: ✅ 已完成 **代码审查**: 待审查 **测试状态**: 待测试 + +# 学生花名册卡片视图照片加载中状态优化 + +**变更时间**: 2025-01-27 15:30:00 +**变更人员**: Cursor AI +**变更文件**: `web/src/views/xg/xsjcxx/stuRoster/index.vue` + +## 变更内容 + +### 功能优化 +在学生花名册卡片视图中,优化了学生照片加载过程中的用户体验: + +1. **照片加载中状态显示优化** + - 将原本显示在头像内部的"加载中..."文字移除 + - 在头像底部新增独立的加载中状态提示 + - 添加了旋转的加载图标和"加载中..."文字 + +2. **视觉效果增强** + - 加载中状态文字使用蓝色主题色 + - 添加了淡蓝色背景和边框 + - 实现了脉冲动画效果,提升视觉吸引力 + - 加载图标持续旋转,提供动态反馈 + +3. **布局优化** + - 调整卡片头部布局为 `align-items: flex-start`,确保在有加载中文字时布局不会错乱 + - 照片容器改为垂直布局,头像和加载文字垂直排列 + +4. **响应式适配** + - 为移动端添加了专门的样式调整 + - 移动端加载中文字更小更紧凑 + - 确保在不同屏幕尺寸下都有良好的显示效果 + +## 技术实现 + +### HTML结构变更 +```vue + +
+ + + + + 加载中... + +
+``` + +### CSS样式新增 +```css +/* 照片加载中状态文字样式 */ +.photo-loading-text { + margin-top: 8px; + text-align: center; + padding: 4px 8px; + background-color: #f0f9ff; + border: 1px solid #b3d8ff; + border-radius: 12px; + transition: all 0.3s ease; + animation: pulse 2s infinite; +} + +.photo-loading-text .el-text { + font-weight: 500; + color: #409eff; +} + +.photo-loading-text .el-icon { + animation: rotate 1s linear infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + transform: scale(1); + } + 50% { + opacity: 0.8; + transform: scale(1.05); + } +} +``` + +### 移动端响应式样式 +```css +/* 移动端照片加载中文字样式调整 */ +.photo-loading-text { + margin-top: 6px; + padding: 3px 6px; + font-size: 11px; +} + +.photo-loading-text .el-icon { + font-size: 10px !important; +} +``` + +## 用户体验改进 + +1. **更清晰的加载状态反馈** + - 用户能够清楚地看到照片正在加载 + - 避免了头像内部文字显示不清晰的问题 + +2. **更好的视觉层次** + - 加载状态文字独立显示,不会与头像内容混淆 + - 使用动画效果提升了视觉吸引力 + +3. **响应式友好** + - 在不同设备上都有良好的显示效果 + - 移动端适配更加完善 + +## 测试建议 + +1. **功能测试** + - 验证照片加载过程中是否正确显示加载中状态 + - 确认加载完成后加载中状态是否正确消失 + +2. **视觉测试** + - 检查加载中动画效果是否流畅 + - 验证在不同屏幕尺寸下的显示效果 + +3. **性能测试** + - 确认新增的动画效果不会影响页面性能 + - 验证大量学生数据时的显示效果 + +## 相关文件 + +- **主要文件**: `web/src/views/xg/xsjcxx/stuRoster/index.vue` +- **相关组件**: 学生花名册卡片视图组件 +- **样式文件**: 内联样式,无需额外文件 + +## 备注 + +此次优化提升了学生花名册卡片视图的用户体验,特别是在照片加载过程中的状态反馈更加清晰和友好。通过将加载状态文字从头像内部移到外部,避免了视觉混乱,同时添加了动画效果提升了界面的现代感。 + +# 学生信息审核界面照片加载功能优化 + +**变更时间**: 2025-01-27 15:30:00 +**变更人员**: Cursor AI +**变更类型**: 功能优化 + +## 📋 变更概述 + +参考学生信息完善界面的照片加载方式,优化学生信息审核界面的照片加载功能,实现异步加载和更好的用户体验。 + +## 🔧 具体变更内容 + +### 1. 照片显示逻辑优化 +**文件**: `web/src/views/xg/xsjcxx/stuMsgAudit/stuMsgDetailDialog.vue` + +#### 变更前 +```vue +
+ +
暂无照片
+
+``` + +#### 变更后 +```vue +
+
+ + 加载中... +
+ +
暂无照片
+
+``` + +### 2. 新增响应式数据 +```typescript +const photoLoading = ref(false); // 照片加载状态 +const asyncPhotoUrl = ref(''); // 异步加载的照片URL +``` + +### 3. 新增照片加载方法 +```typescript +// 通过认证请求获取图片数据并转换为blob URL +const getImageBlobUrl = async (imageUrl: string): Promise => { + try { + const response = await request({ + url: '/resource/oss/download/' + imageUrl, + method: 'get', + responseType: 'blob', + timeout: 300000 // 300秒超时 + }); + + const blob = response; + + if (!blob || !(blob instanceof Blob)) { + throw new Error('响应数据不是有效的Blob对象'); + } + + const blobUrl = URL.createObjectURL(blob); + return blobUrl; + } catch (error) { + return ''; + } +}; +``` + +### 4. 新增照片路径监听 +```typescript +// 监听form.photoPath变化,异步加载图片 +watchEffect(async () => { + if (form.photoPath) { + photoLoading.value = true; + try { + const blobUrl = await getImageBlobUrl(form.photoPath); + asyncPhotoUrl.value = blobUrl; + } catch (error) { + console.error('加载图片失败:', error); + asyncPhotoUrl.value = ''; + } finally { + photoLoading.value = false; + } + } else { + asyncPhotoUrl.value = ''; + photoLoading.value = false; + } +}); +``` + +### 5. 新增导入语句 +```typescript +import { watchEffect } from 'vue'; +import { Loading } from '@element-plus/icons-vue'; +``` + +### 6. 新增CSS样式 +```css +/* 照片加载状态样式 */ +.photo-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 150px; + height: 150px; + border: 2px dashed #d9d9d9; + border-radius: 6px; + background-color: #fafafa; + color: #8c8d91; + font-size: 14px; + transition: border-color 0.3s; +} + +.photo-loading .el-icon { + font-size: 24px; + margin-bottom: 8px; + color: #409eff; +} + +.photo-loading span { + font-size: 12px; +} +``` + +## 🎯 优化效果 + +### 用户体验提升 +1. **加载状态提示**: 照片加载时显示加载动画和文字提示 +2. **异步加载**: 通过blob URL异步加载照片,避免直接暴露文件路径 +3. **错误处理**: 加载失败时优雅降级,显示占位符 +4. **认证支持**: 自动携带token和clientId进行认证请求 + +### 技术改进 +1. **安全性**: 使用blob URL避免直接暴露服务器文件路径 +2. **性能**: 异步加载避免阻塞界面渲染 +3. **兼容性**: 支持认证的图片请求,适用于需要权限的图片资源 +4. **可维护性**: 统一的照片加载逻辑,便于后续维护 + +## 📚 参考实现 + +本次优化参考了 `web/src/views/xg/xsjcxx/stuMsgSupply/stuMsgDetailDialog.vue` 中的照片加载实现,确保了两个界面的一致性。 + +## ✅ 验证要点 + +1. 照片加载时显示加载动画 +2. 照片加载成功后正确显示 +3. 照片加载失败时显示占位符 +4. 支持认证的图片请求 +5. 界面响应正常,无控制台错误 + +--- + +**变更状态**: ✅ 已完成 +**测试状态**: 🔄 待测试 +**文档状态**: ✅ 已更新 diff --git a/web/src/views/xg/xsjcxx/stuMsgAudit/stuMsgDetailDialog.vue b/web/src/views/xg/xsjcxx/stuMsgAudit/stuMsgDetailDialog.vue index 3e722663..6b039040 100644 --- a/web/src/views/xg/xsjcxx/stuMsgAudit/stuMsgDetailDialog.vue +++ b/web/src/views/xg/xsjcxx/stuMsgAudit/stuMsgDetailDialog.vue @@ -99,7 +99,11 @@
- +
+ + 加载中... +
+
暂无照片
@@ -746,8 +750,9 @@ diff --git a/web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue b/web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue index 32c5ecb4..39d0ae05 100644 --- a/web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue +++ b/web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue @@ -70,7 +70,11 @@
- +
+ + 加载中... +
+
暂无照片
@@ -725,9 +729,10 @@