xiangning 909ef069c5 feat: RBAC + 后端动态菜单 + 双token刷新 + 头像代理 + IM/工作流/AI模块
- RBAC 平台管理:用户/角色/权限/菜单四页面(Vben VxeGrid+Modal)
- 后端动态菜单(backend模式):菜单由 /menu/all 驱动,子路由相对path
- 双token刷新:enableRefreshToken,access过期自动续期
- 头像代理:/api/files/preview 避免S3 https问题
- 权限管理树形展示(按Group分组)
- vxe-table适配器补齐(CellTag/CellSwitch/CellOperation/VbenTableAction)
- 新增:AI对话/知识库/IM聊天/工作流 模块API与页面
- 移除旧静态路由模块(改后端菜单驱动)
2026-07-04 19:40:02 +08:00

65 lines
2.9 KiB
XML

<svg id="buildflow-flow-mark" xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64" role="img" aria-label="BuildFlow">
<defs>
<linearGradient id="buildflow-mark-bg" x1="10" y1="5" x2="54" y2="59" gradientUnits="userSpaceOnUse">
<stop stop-color="#4AA3FF"/>
<stop offset="0.55" stop-color="#1677FF"/>
<stop offset="1" stop-color="#0A5BFF"/>
</linearGradient>
<path id="buildflow-motion-path" d="M16 40C21 29 27 24 32 24C37 24 43 29 48 40"/>
<style>
#buildflow-flow-mark .flow-line {
stroke-dasharray: 58;
animation: buildflow-line 2.5s ease-in-out infinite;
}
#buildflow-flow-mark .flow-dot {
animation: buildflow-dot 2.5s ease-in-out infinite;
}
#buildflow-flow-mark .node {
transform-box: fill-box;
transform-origin: center;
animation: buildflow-node 2.5s ease-in-out infinite;
}
#buildflow-flow-mark #buildflow-node-middle {
animation-delay: 0.18s;
}
#buildflow-flow-mark #buildflow-node-finish {
animation-delay: 0.36s;
}
@keyframes buildflow-line {
0% { stroke-dashoffset: 58; opacity: 0.28; }
42%, 76% { stroke-dashoffset: 0; opacity: 1; }
100% { stroke-dashoffset: -58; opacity: 0.28; }
}
@keyframes buildflow-dot {
0%, 100% { opacity: 0.25; }
48%, 76% { opacity: 1; }
}
@keyframes buildflow-node {
0%, 100% { transform: scale(0.96); }
48%, 76% { transform: scale(1); }
}
</style>
</defs>
<rect x="6" y="6" width="52" height="52" rx="16" fill="url(#buildflow-mark-bg)"/>
<path d="M16 40C21 29 27 24 32 24C37 24 43 29 48 40" fill="none" stroke="#FFFFFF" stroke-width="8" stroke-linecap="round" opacity="0.18"/>
<use href="#buildflow-motion-path" class="flow-line" fill="none" stroke="#FFFFFF" stroke-width="3.4" stroke-linecap="round"/>
<circle class="flow-dot" r="2.8" fill="#FFFFFF">
<animateMotion dur="2.5s" repeatCount="indefinite" keyTimes="0;0.72;1" keyPoints="0;1;1" calcMode="linear">
<mpath href="#buildflow-motion-path"/>
</animateMotion>
</circle>
<g id="buildflow-node-start" class="node">
<rect x="10" y="34" width="12" height="12" rx="4" fill="#FFFFFF"/>
<path d="M13.5 38H18.5" stroke="#1677FF" stroke-width="1.8" stroke-linecap="round"/>
<path d="M13.5 42H17.5" stroke="#1677FF" stroke-width="1.8" stroke-linecap="round" opacity="0.68"/>
</g>
<g id="buildflow-node-middle" class="node">
<rect x="26" y="18" width="12" height="12" rx="6" fill="#FFFFFF"/>
<path d="M33 20L28.6 25.2H31.7L30.6 30L35.7 23.8H32.5L33 20Z" fill="#1677FF"/>
</g>
<g id="buildflow-node-finish" class="node">
<rect x="42" y="34" width="12" height="12" rx="6" fill="#FFFFFF"/>
<path d="M45.1 40L47.3 42.1L51 37.5" fill="none" stroke="#1677FF" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>