diff --git a/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java b/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java index ca19dbf..93e0b7b 100644 --- a/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java +++ b/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java @@ -29,13 +29,17 @@ public interface SchClassRepository extends JpaRepository, Jp "AND (:campusId IS NULL OR c.campusId = :campusId) " + "AND (:divisionId IS NULL OR c.divisionId = :divisionId) " + "AND (:majorsId IS NULL OR c.majorsId = :majorsId) " + - "AND (:years IS NULL OR c.enrollYear IN :years)"+ + "AND (:years IS NULL OR c.enrollYear IN :years) " + + "AND (:keyword IS NULL OR :keyword = '' " + + " OR c.name LIKE CONCAT('%', :keyword, '%') " + + " OR c.cname LIKE CONCAT('%', :keyword, '%')) " + "AND c.enrollYear = c.gradeId AND c.graduate = 0") Page findClassesByConditions(@Param("schId") Integer schId, @Param("campusId") Integer campusId, @Param("divisionId") Integer divisionId, @Param("majorsId") Integer majorsId, @Param("years") List years, + @Param("keyword") String keyword, Pageable pageable); boolean existsBySchIdAndGroupIdAndName(Integer schId, Integer groupId, String name); diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/api/SchClassController.java b/src/main/java/com/yunhai/bschclassmanage/controller/api/SchClassController.java index dca7698..0c05aec 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/api/SchClassController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/api/SchClassController.java @@ -97,8 +97,9 @@ public class SchClassController { @RequestParam(required = false) Integer campusId, @RequestParam(required = false) Integer divisionId, @RequestParam(required = false) Integer majorsId, + @RequestParam(required = false) String keyword, Pageable pageable) { - return schClassService.searcHigherSchClass(UserContext.getSchId(),year,campusId,divisionId,majorsId,pageable); + return schClassService.searcHigherSchClass(UserContext.getSchId(),year,campusId,divisionId,majorsId,keyword,pageable); } @PostMapping("saveHigherSchClass") diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/api/SysOperationLogController.java b/src/main/java/com/yunhai/bschclassmanage/controller/api/SysOperationLogController.java index 8135eca..a7bb95a 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/api/SysOperationLogController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/api/SysOperationLogController.java @@ -73,6 +73,17 @@ public class SysOperationLogController extends BaseController { .body(new InputStreamResource(bis)); } + /** 查询某条日志的响应原文(GZIP 解压),供详情页伸缩框展示 */ + @GetMapping("response/{id}") + public Map response(@PathVariable Long id) { + denyIfNotSuperAdmin(); + String data = sysOperationLogService.getResponseData(id); + Map m = new LinkedHashMap<>(); + m.put("success", true); + m.put("data", data == null ? "该条审计日志未记录响应数据" : data); + return m; + } + /** 重试某条失败的操作:按记录中的 classMethod + requestParams 反射重放原始操作 */ @PostMapping("retry/{id}") public Map retry(@PathVariable Long id) { diff --git a/src/main/java/com/yunhai/bschclassmanage/service/ISchClassService.java b/src/main/java/com/yunhai/bschclassmanage/service/ISchClassService.java index 900751c..14e4e94 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/ISchClassService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/ISchClassService.java @@ -49,6 +49,7 @@ public interface ISchClassService { Integer campusId, Integer divisionId, Integer majorsId, + String keyword, Pageable pageable); void saveHigherSchClass(UserContext.UserInfo user, SchClass entity); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/SchClassService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/SchClassService.java index c62657b..6f0b665 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/SchClassService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/SchClassService.java @@ -91,8 +91,8 @@ public class SchClassService implements ISchClassService { @Override public PageVO searcHigherSchClass(Integer schId, Integer year, Integer campusId, - Integer divisionId, Integer majorsId, Pageable pageable) { - return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId, pageable); + Integer divisionId, Integer majorsId,String keyword, Pageable pageable) { + return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId,keyword, pageable); } @Override diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassQueryService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassQueryService.java index 72470d6..c0c39e1 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassQueryService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/classes/SchClassQueryService.java @@ -162,12 +162,12 @@ public class SchClassQueryService { // ---------- 职业教育查询 ---------- public PageVO searcHigherSchClass(Integer schId, Integer year, Integer campusId, - Integer divisionId, Integer majorsId, Pageable pageable) { + Integer divisionId, Integer majorsId,String keyword, Pageable pageable) { List years = new ArrayList<>(); if (year != null && year > 0) years.add(year); years = years.isEmpty() ? null : years; - Page classPage = schClassRepository.findClassesByConditions(schId, campusId, divisionId, majorsId, years, pageable); + Page classPage = schClassRepository.findClassesByConditions(schId, campusId, divisionId, majorsId, years,keyword, pageable); if (classPage.isEmpty()) { return PageVO.empty(pageable.getPageSize()); } @@ -176,9 +176,9 @@ public class SchClassQueryService { Map campusNameMap = schDicCampusService.toIdAndNameMap(schId); Map divisionsNameMap = schDicDivisionService.toIdAndNameMap(schId); Map majorssNameMap = schDicMajorsService.toIdAndNameMap(schId); - + Map teacherNameMap = schTeacherService.toIdAndNameMap(schId); List voList = classList.stream() - .map(clazz -> convertHigherSchClassToVO(clazz, campusNameMap, divisionsNameMap, majorssNameMap)) + .map(clazz -> convertHigherSchClassToVO(clazz, campusNameMap, divisionsNameMap, majorssNameMap,teacherNameMap)) .collect(Collectors.toList()); return new PageVO<>(pageable.getPageNumber() + 1, @@ -190,12 +190,15 @@ public class SchClassQueryService { private HigherSchClassVO convertHigherSchClassToVO(SchClass clazz, Map campusNameMap, Map divisionsNameMap, - Map majorssNameMap) { + Map majorssNameMap, + Map teacherNameMap) { HigherSchClassVO vo = ModelMapperUtil.map(clazz, HigherSchClassVO.class); vo.setCampusName(campusNameMap.get(clazz.getCampusId())); vo.setDivisionName(divisionsNameMap.get(clazz.getDivisionId())); vo.setMajorsName(majorssNameMap.get(clazz.getMajorsId())); - vo.setFirstTeacherName(null); + vo.setGradeName(vo.getGradeId()+"级"); + vo.setFirstTeacherName(teacherNameMap.get(clazz.getFirstTeacherId())); + vo.setSecondTeacherName(null); return vo; } diff --git a/src/main/resources/static/work-view.html b/src/main/resources/static/work-view.html index fa6e689..fa78cf5 100644 --- a/src/main/resources/static/work-view.html +++ b/src/main/resources/static/work-view.html @@ -251,6 +251,17 @@ .modal .kv .k { color: var(--muted); font-size: 12px; } .modal .kv .v { font-family: var(--mono); font-size: 12.5px; word-break: break-all; white-space: pre-wrap; } .modal .kv .v.scroll { max-height: 160px; overflow-y: auto; padding: 6px 8px; background: #f8f8f9; border: 1px solid #e8eaec; border-radius: 4px; } + /* 返回值伸缩框:默认收起,展开后大文本滚动查看 */ + .modal .resp-details summary { + cursor: pointer; color: var(--accent); font-size: 12px; user-select: none; outline: none; + display: inline-block; padding: 2px 0; + } + .modal .resp-details summary:hover { color: var(--accent-hover); } + .modal .resp-pre { + margin: 8px 0 0; padding: 10px; background: #f8f8f9; border: 1px solid #e8eaec; + border-radius: 4px; max-height: 40vh; overflow: auto; font-family: var(--mono); + font-size: 12px; line-height: 1.5; word-break: break-all; white-space: pre-wrap; + } .modal .modal-actions { display: none; gap: 8px; justify-content: flex-end; padding: 12px 16px; border-top: 1px solid #e8eaec; flex: 0 0 auto; } /* 确认弹窗(View UI Modal.confirm 风格:居中 + 警示图标) */ @@ -704,10 +715,20 @@ // ==================== 详情弹窗 ==================== function openModal(title, rows, actionsHtml, retryHandler) { $('modalTitle').textContent = title; - $('modalKv').innerHTML = rows.map(r => - '
' + escHtml(r[0]) + '
' + - '
' + escHtml(r[1] == null || r[1] === '' ? '-' : r[1]) + '
' - ).join(''); + $('modalKv').innerHTML = rows.map(r => { + const opt = r[2]; + // 伸缩框选项:{ collapsible: id } —— 默认收起,首次展开时异步加载返回值 + if (opt && opt.collapsible) { + return '
' + escHtml(r[0]) + '
' + + '
' + + '
' + + '点击展开 / 收起返回值' + + '
加载中…
' + + '
'; + } + return '
' + escHtml(r[0]) + '
' + + '
' + escHtml(r[1] == null || r[1] === '' ? '-' : r[1]) + '
'; + }).join(''); const act = $('modalActions'); act.innerHTML = actionsHtml || ''; act.style.display = actionsHtml ? 'flex' : 'none'; @@ -716,6 +737,25 @@ if (b.dataset.a === 'retry') (retryHandler || doSyncRetry)(Number(b.dataset.id)); }; }); + // 返回值伸缩框:首次展开时才异步拉取(GZIP 解压由后端完成) + $('modalKv').querySelectorAll('details.resp-details').forEach(d => { + d.addEventListener('toggle', async () => { + if (!d.open || d.dataset.loaded) return; + d.dataset.loaded = '1'; + const pre = d.querySelector('.resp-pre'); + try { + const res = await fetch(API + '/syslog/response/' + d.dataset.id, { credentials: 'include', headers: authHeaders() }); + const j = await res.json(); + let payload = j; + if (j && typeof j === 'object' && 'code' in j && 'data' in j) payload = j.data; // 解统一包装 {code,msg,data} + const txt = (payload && payload.data != null) ? payload.data + : (typeof payload === 'string' ? payload : '(空)'); + pre.textContent = txt; + } catch (e) { + pre.textContent = '加载失败:' + e.message; + } + }); + }); $('modalMask').classList.add('show'); } $('modalClose').onclick = () => $('modalMask').classList.remove('show'); @@ -835,7 +875,8 @@ ['时间', fmtTime(r.createTime)], ['重试次数', (r.retryCount == null ? 0 : r.retryCount) + ' 次'], ['上次重试状态', lrStatus], - ['上次重试时间', r.lastRetryTime ? fmtTime(r.lastRetryTime) : '-'] + ['上次重试时间', r.lastRetryTime ? fmtTime(r.lastRetryTime) : '-'], + ['返回值', null, { collapsible: id }] ]); } else if (action === 'download') { downloadFile('/syslog/download/' + id, 'audit-' + id + '.txt');