feat(admin): Complete Phase 3.5.1-3.5.4 Prompt Management System (83%)

Summary:
- Implement Prompt management infrastructure and core services
- Build admin portal frontend with light theme
- Integrate CodeMirror 6 editor for non-technical users

Phase 3.5.1: Infrastructure Setup
- Create capability_schema for Prompt storage
- Add prompt_templates and prompt_versions tables
- Add prompt:view/edit/debug/publish permissions
- Migrate RVW prompts to database (RVW_EDITORIAL, RVW_METHODOLOGY)

Phase 3.5.2: PromptService Core
- Implement gray preview logic (DRAFT for debuggers, ACTIVE for users)
- Module-level debug control (setDebugMode)
- Handlebars template rendering
- Variable extraction and validation (extractVariables, validateVariables)
- Three-level disaster recovery (database -> cache -> hardcoded fallback)

Phase 3.5.3: Management API
- 8 RESTful endpoints (/api/admin/prompts/*)
- Permission control (PROMPT_ENGINEER can edit, SUPER_ADMIN can publish)

Phase 3.5.4: Frontend Management UI
- Build admin portal architecture (AdminLayout, OrgLayout)
- Add route system (/admin/*, /org/*)
- Implement PromptListPage (filter, search, debug switch)
- Implement PromptEditor (CodeMirror 6 simplified for clinical users)
- Implement PromptEditorPage (edit, save, publish, test, version history)

Technical Details:
- Backend: 6 files, ~2044 lines (prompt.service.ts 596 lines)
- Frontend: 9 files, ~1735 lines (PromptEditorPage.tsx 399 lines)
- CodeMirror 6: Line numbers, auto-wrap, variable highlight, search, undo/redo
- Chinese-friendly: 15px font, 1.8 line-height, system fonts

Next Step: Phase 3.5.5 - Integrate RVW module with PromptService

Tested: Backend API tests passed (8/8), Frontend pending user testing
Status: Ready for Phase 3.5.5 RVW integration
This commit is contained in:
2026-01-11 21:25:16 +08:00
parent cdfbc9927a
commit 5523ef36ea
297 changed files with 15914 additions and 1266 deletions

View File

@@ -2,10 +2,18 @@ import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { ConfigProvider } from 'antd'
import zhCN from 'antd/locale/zh_CN'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { AuthProvider } from './framework/auth'
import { PermissionProvider } from './framework/permission'
import { RouteGuard } from './framework/router'
import MainLayout from './framework/layout/MainLayout'
import AdminLayout from './framework/layout/AdminLayout'
import OrgLayout from './framework/layout/OrgLayout'
import HomePage from './pages/HomePage'
import LoginPage from './pages/LoginPage'
import AdminDashboard from './pages/admin/AdminDashboard'
import OrgDashboard from './pages/org/OrgDashboard'
import PromptListPage from './pages/admin/PromptListPage'
import PromptEditorPage from './pages/admin/PromptEditorPage'
import { MODULES } from './framework/modules/moduleRegistry'
/**
@@ -13,12 +21,17 @@ import { MODULES } from './framework/modules/moduleRegistry'
*
* @description
* - ConfigProvider: Ant Design国际化配置
* - QueryClientProvider: React Query状态管理Week 2 新增)⭐
* - PermissionProvider: 权限管理系统Week 2 Day 7新增
* - RouteGuard: 路由守卫保护Week 2 Day 7新增
* - QueryClientProvider: React Query状态管理
* - AuthProvider: JWT认证管理 🆕
* - PermissionProvider: 权限管理系统
* - RouteGuard: 路由守卫保护
* - BrowserRouter: 前端路由
*
* @version Week 2 Day 1 - 添加React Query支持
* 路由结构:
* - /login - 通用登录页(个人用户)
* - /t/{tenantCode}/login - 租户专属登录页
* - / - 首页(需要认证)
* - /{module}/* - 业务模块(需要认证+权限)
*/
// 创建React Query客户端
@@ -26,9 +39,9 @@ const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5分钟
gcTime: 1000 * 60 * 10, // 10分钟原cacheTime
retry: 1, // 失败重试1次
refetchOnWindowFocus: false, // 窗口聚焦时不自动重新获取
gcTime: 1000 * 60 * 10, // 10分钟
retry: 1,
refetchOnWindowFocus: false,
},
},
})
@@ -36,39 +49,68 @@ const queryClient = new QueryClient({
function App() {
return (
<ConfigProvider locale={zhCN}>
{/* React Query状态管理 */}
<QueryClientProvider client={queryClient}>
{/* 权限提供者:提供全局权限状态 */}
<PermissionProvider>
<BrowserRouter>
<Routes>
<Route path="/" element={<MainLayout />}>
{/* 首页 */}
<Route index element={<HomePage />} />
{/* 动态加载模块路由 - 应用路由守卫保护 ⭐ */}
{MODULES.map(module => (
<Route
key={module.id}
path={`${module.path}/*`}
element={
// 为每个模块添加路由守卫
<RouteGuard
requiredVersion={module.requiredVersion}
moduleName={module.name}
>
<module.component />
</RouteGuard>
}
/>
))}
{/* 404重定向 */}
<Route path="*" element={<Navigate to="/" replace />} />
</Route>
</Routes>
</BrowserRouter>
</PermissionProvider>
{/* 认证提供者:JWT Token管理 */}
<AuthProvider>
{/* 权限提供者:模块级权限管理 */}
<PermissionProvider>
<BrowserRouter>
<Routes>
{/* 登录页面(无需认证) */}
<Route path="/login" element={<LoginPage />} />
<Route path="/t/:tenantCode/login" element={<LoginPage />} />
{/* 业务应用端 /app/* */}
<Route path="/" element={<MainLayout />}>
{/* 首页 */}
<Route index element={<HomePage />} />
{/* 动态加载模块路由 */}
{MODULES.map(module => (
<Route
key={module.id}
path={`${module.path}/*`}
element={
<RouteGuard
requiredVersion={module.requiredVersion}
moduleName={module.name}
>
<module.component />
</RouteGuard>
}
/>
))}
</Route>
{/* 运营管理端 /admin/* */}
<Route path="/admin" element={<AdminLayout />}>
<Route index element={<Navigate to="/admin/dashboard" replace />} />
<Route path="dashboard" element={<AdminDashboard />} />
{/* Prompt 管理 */}
<Route path="prompts" element={<PromptListPage />} />
<Route path="prompts/:code" element={<PromptEditorPage />} />
{/* 其他模块(待开发) */}
<Route path="tenants" element={<div className="text-center py-20">🚧 ...</div>} />
<Route path="users" element={<div className="text-center py-20">🚧 ...</div>} />
<Route path="system" element={<div className="text-center py-20">🚧 ...</div>} />
</Route>
{/* 机构管理端 /org/* */}
<Route path="/org" element={<OrgLayout />}>
<Route index element={<Navigate to="/org/dashboard" replace />} />
<Route path="dashboard" element={<OrgDashboard />} />
<Route path="users" element={<div className="text-center py-20">🚧 ...</div>} />
<Route path="departments" element={<div className="text-center py-20">🚧 /...</div>} />
<Route path="usage" element={<div className="text-center py-20">🚧 使...</div>} />
<Route path="audit" element={<div className="text-center py-20">🚧 ...</div>} />
</Route>
{/* 404重定向 */}
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
</PermissionProvider>
</AuthProvider>
</QueryClientProvider>
</ConfigProvider>
)