feat(admin, admin-ui): 实现RuoYi风格后台菜单管理,优化媒体资源处理

新增服务端菜单校验与归一化逻辑,完善菜单相关Schema;前端实现条件渲染的菜单编辑器,支持搜索式图标选择器与父级树过滤。新增媒体URL统一处理工具修复管理端本地静态资源路径映射问题,更新全部相关文档、技术决策记录与测试用例。本次变更不影响WonderQ-MiniAPP端。
This commit is contained in:
duanshuwen committed 2026-08-27 09:08:05 +08:00
1 parent 6245159e7c
commit 4c245f0d1f
28 files changed
+625 -36

No files matched your search

+11
View File
@@ -166,12 +166,23 @@ button, input { font: inherit; }
.system-tree-panel .el-tree { max-height: 260px; overflow: auto; padding: 8px 12px; }
.system-tree-panel .el-tree-node__content { height: 32px; }
.system-editor-form .el-radio-group { display: flex; gap: 18px; }
.menu-icon-picker { display: flex; flex-direction: column; gap: 8px; }
.menu-icon-picker__search { width: 100%; }
.menu-icon-picker__grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; max-height: 300px; overflow-y: auto; padding-right: 2px; }
.menu-icon-picker__option { display: inline-flex; min-height: 58px; align-items: center; justify-content: center; flex-direction: column; gap: 4px; border: 1px solid transparent; border-radius: 4px; color: #606266; background: transparent; cursor: pointer; font-family: inherit; font-size: 11px; }
.menu-icon-picker__option:hover, .menu-icon-picker__option:focus-visible, .menu-icon-picker__option.is-active { color: var(--primary-color, #409eff); border-color: #b3d8ff; background: #ecf5ff; outline: none; }
.menu-icon-picker .el-empty { padding: 8px 0; }
.system-editor-form .el-input-number { width: 100%; }
@media (max-width: 760px) {
.system-table-heading { align-items: flex-start; flex-direction: column; }
.system-action-bar { justify-content: flex-start; width: 100%; }
.system-filter-card .el-form-item:last-child { margin-left: 0; }
.system-filter-card .el-input { width: min(230px, 100%); }
}
@media (max-width: 640px) {
.system-editor-form .el-row { row-gap: 0; }
.system-editor-form .el-col-12 { width: 100%; max-width: 100%; flex: 0 0 100%; }
}
@media (max-width: 880px) { .wanfa-workspace { grid-template-columns: 1fr; } }
@media (max-width: 980px) { .media-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .lead-detail-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 760px) { .concierge-row { align-items: flex-start; flex-direction: column; } .concierge-actions { justify-content: flex-start; } .lead-filters { grid-template-columns: 1fr 1fr; } .lead-filters .el-input { grid-column: 1 / -1; } .operations-grid { grid-template-columns: 1fr; } .media-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }