给所有请求都加上jwt,隐藏生成jwt的secret(放到.env中),隐藏app-secret(放在pm2运行配置文件中,后续直接读取环境配置即可)

This commit is contained in:
2025-10-17 15:28:22 +08:00
parent 9ec6d30573
commit 59706b70d0
70 changed files with 2279 additions and 688 deletions
+3 -1
View File
@@ -18,6 +18,7 @@ const REVIEW_TYPE_TO_APP: Record<string, AppModule> = {
interface LayoutProps {
children: React.ReactNode;
userRole?: UserRole;
frontendJWT?: string;
}
// 添加一个接口表示路由handle可能包含的属性
@@ -32,7 +33,7 @@ interface Match {
data: unknown;
}
export function Layout({ children, userRole = 'developer' }: LayoutProps) {
export function Layout({ children, userRole = 'developer' as UserRole, frontendJWT = '' }: LayoutProps) {
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
const [selectedApp, setSelectedApp] = useState<AppModule>('');
const matches = useMatches() as Match[];
@@ -108,6 +109,7 @@ export function Layout({ children, userRole = 'developer' }: LayoutProps) {
onToggle={toggleSidebar}
userRole={userRole}
selectedApp={selectedApp}
frontendJWT={frontendJWT}
/>
<div className={`main-content ${sidebarCollapsed ? 'sidebar-collapsed' : ''}`}>
+18 -4
View File
@@ -7,6 +7,7 @@ interface SidebarProps {
onToggle: () => void;
collapsed: boolean;
userRole: UserRole;
frontendJWT?: string;
selectedApp?: string; // 添加所选应用模块参数
}
@@ -31,7 +32,7 @@ const APP_ICON_MAP: Record<string, string> = {
'model': '/images/icon_assistant.png'
};
export function Sidebar({ onToggle, collapsed, userRole, selectedApp = '' }: SidebarProps) {
export function Sidebar({ onToggle, collapsed, userRole, frontendJWT = '', selectedApp = '' }: SidebarProps) {
const location = useLocation();
const [expandedMenus, setExpandedMenus] = useState<Record<string, boolean>>({});
const [currentApp, setCurrentApp] = useState<string>(''); // 初始设置为空字符串而不是selectedApp
@@ -47,7 +48,7 @@ export function Sidebar({ onToggle, collapsed, userRole, selectedApp = '' }: Sid
try {
console.log('userRole', userRole);
const roleKey = mapUserRoleToRoleKey(userRole);
const result = await getUserRoutesByRole(roleKey);
const result = await getUserRoutesByRole(roleKey, frontendJWT);
if (result.success && result.data) {
setMenuItems(result.data);
@@ -253,7 +254,7 @@ export function Sidebar({ onToggle, collapsed, userRole, selectedApp = '' }: Sid
// })
return (
<div className={`sidebar ${collapsed ? 'collapsed' : ''}`}>
<div className={`sidebar ${collapsed ? 'collapsed' : ''} flex flex-col`}>
<div className="py-6 px-4 border-b border-gray-100 flex justify-between items-center">
<div className="flex items-center"
onClick={() => {
@@ -300,7 +301,7 @@ export function Sidebar({ onToggle, collapsed, userRole, selectedApp = '' }: Sid
</div>
)}
<div className="py-4 px-[10px]">
<div className="py-4 px-[10px] flex-1 overflow-y-auto sidebar-scroll-area">
{isLoading || isLoadingRoutes ? (
// 加载中状态显示,保留菜单布局结构
<div className="py-2">
@@ -382,6 +383,19 @@ export function Sidebar({ onToggle, collapsed, userRole, selectedApp = '' }: Sid
))
)}
</div>
{/* 操作手册下载按钮 */}
<div className="mt-auto px-4 py-1 border-t border-gray-100">
<a
href="/智慧法务平台操作手册.pdf"
download="智慧法务平台操作手册.pdf"
className={`flex items-center ${collapsed ? 'justify-center' : ''} text-gray-600 hover:text-green-700 transition-colors duration-200`}
title="下载操作手册"
>
<i className={`ri-question-line ${collapsed ? 'text-base' : 'text-base mr-3'}`}></i>
{!collapsed && <span className="text-base"></span>}
</a>
</div>
</div>
);
}