feat(frontend): add frontend-v2 modular architecture (Task 17)
- React 19 + TypeScript + Vite - Module registration mechanism with dynamic loading - Permission management system (basic/advanced/premium) - Route guards for access control - Error boundaries for module isolation - 6 business module placeholders (AIA/ASL/PKB/DC/SSA/ST) - Top navigation layout - Tailwind CSS 3 + Ant Design 5
This commit is contained in:
140
frontend-v2/src/framework/permission/PermissionContext.tsx
Normal file
140
frontend-v2/src/framework/permission/PermissionContext.tsx
Normal file
@@ -0,0 +1,140 @@
|
||||
import { createContext, useState, useCallback, ReactNode } from 'react'
|
||||
import { UserInfo, PermissionContextType, checkVersionLevel, UserVersion } from './types'
|
||||
|
||||
/**
|
||||
* 权限上下文
|
||||
*
|
||||
* @description 提供全局权限状态管理
|
||||
* @version Week 2 Day 7 - 任务17
|
||||
*
|
||||
* 注意:当前阶段(Week 2)用户信息为硬编码,方便开发测试
|
||||
* 后续计划:Week 2 Day 8-9 对接后端JWT认证
|
||||
*/
|
||||
|
||||
/**
|
||||
* 模拟用户数据(开发阶段使用)
|
||||
*
|
||||
* 🔧 开发说明:
|
||||
* - 当前硬编码为 premium 权限,可以访问所有模块
|
||||
* - 方便开发和测试所有功能
|
||||
* - 后续将从后端 JWT token 中解析真实用户信息
|
||||
*/
|
||||
const MOCK_USER: UserInfo = {
|
||||
id: 'test-user-001',
|
||||
name: '测试研究员',
|
||||
email: 'test@example.com',
|
||||
version: 'premium', // 👈 硬编码为最高权限
|
||||
avatar: null,
|
||||
isTrial: false,
|
||||
trialEndsAt: null,
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建权限上下文
|
||||
*/
|
||||
export const PermissionContext = createContext<PermissionContextType | undefined>(undefined)
|
||||
|
||||
/**
|
||||
* 权限提供者组件
|
||||
*/
|
||||
interface PermissionProviderProps {
|
||||
children: ReactNode
|
||||
}
|
||||
|
||||
export const PermissionProvider = ({ children }: PermissionProviderProps) => {
|
||||
// 当前用户状态(开发阶段使用模拟数据)
|
||||
const [user, setUser] = useState<UserInfo | null>(MOCK_USER)
|
||||
|
||||
/**
|
||||
* 检查模块权限
|
||||
* @param requiredVersion 所需权限等级
|
||||
* @returns 是否有权限访问
|
||||
*/
|
||||
const checkModulePermission = useCallback(
|
||||
(requiredVersion?: UserVersion): boolean => {
|
||||
// 未登录用户无权限
|
||||
if (!user) return false
|
||||
|
||||
// 没有权限要求,允许访问
|
||||
if (!requiredVersion) return true
|
||||
|
||||
// 检查权限等级
|
||||
return checkVersionLevel(user.version, requiredVersion)
|
||||
},
|
||||
[user]
|
||||
)
|
||||
|
||||
/**
|
||||
* 检查功能权限
|
||||
* @param feature 功能标识
|
||||
* @returns 是否有权限使用该功能
|
||||
*
|
||||
* TODO: 后续可以基于功能列表进行更细粒度的权限控制
|
||||
*/
|
||||
const checkFeaturePermission = useCallback(
|
||||
(feature: string): boolean => {
|
||||
if (!user) return false
|
||||
|
||||
// 当前简化实现:premium用户拥有所有功能
|
||||
if (user.version === 'premium') return true
|
||||
|
||||
// 后续可以扩展为基于功能配置表的权限检查
|
||||
console.log('Feature permission check:', feature)
|
||||
return true
|
||||
},
|
||||
[user]
|
||||
)
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
*/
|
||||
const logout = useCallback(() => {
|
||||
setUser(null)
|
||||
// TODO: 清除后端session/token
|
||||
console.log('User logged out')
|
||||
}, [])
|
||||
|
||||
const value: PermissionContextType = {
|
||||
user,
|
||||
isAuthenticated: !!user,
|
||||
checkModulePermission,
|
||||
checkFeaturePermission,
|
||||
setUser,
|
||||
logout,
|
||||
}
|
||||
|
||||
return (
|
||||
<PermissionContext.Provider value={value}>
|
||||
{children}
|
||||
</PermissionContext.Provider>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔧 开发说明:权限系统演进计划
|
||||
*
|
||||
* 【当前阶段 - Week 2】
|
||||
* - ✅ 用户信息:硬编码为 premium
|
||||
* - ✅ 权限检查:基于 UserVersion 等级
|
||||
* - ✅ 功能完整:支持模块级权限控制
|
||||
*
|
||||
* 【Week 2 Day 8-9 - 对接后端】
|
||||
* - [ ] 从后端获取真实用户信息
|
||||
* - [ ] 解析 JWT token 获取用户权限
|
||||
* - [ ] 实现登录/登出功能
|
||||
* - [ ] 集成用户管理API
|
||||
*
|
||||
* 【Week 3-4 - ASL开发】
|
||||
* - [ ] 在ASL模块中应用权限控制
|
||||
* - [ ] 实现功能级权限(如:LLM模型选择权限)
|
||||
* - [ ] 添加试用期限制逻辑
|
||||
*
|
||||
* 【Week 5+ - 完善】
|
||||
* - [ ] 动态权限配置
|
||||
* - [ ] 权限缓存优化
|
||||
* - [ ] 权限变更实时通知
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
15
frontend-v2/src/framework/permission/index.ts
Normal file
15
frontend-v2/src/framework/permission/index.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* 权限系统模块导出
|
||||
*
|
||||
* @description 统一导出权限相关的组件、Hook和类型
|
||||
* @version Week 2 Day 7 - 任务17
|
||||
*/
|
||||
|
||||
export { PermissionProvider, PermissionContext } from './PermissionContext'
|
||||
export { usePermission } from './usePermission'
|
||||
export type { UserInfo, UserVersion, PermissionContextType } from './types'
|
||||
export { VERSION_LEVEL, checkVersionLevel } from './types'
|
||||
|
||||
|
||||
|
||||
|
||||
87
frontend-v2/src/framework/permission/types.ts
Normal file
87
frontend-v2/src/framework/permission/types.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* 权限系统类型定义
|
||||
*
|
||||
* @description 定义用户权限、角色等类型
|
||||
* @version Week 2 Day 7 - 任务17
|
||||
*/
|
||||
|
||||
/**
|
||||
* 用户版本类型(权限等级)
|
||||
* - basic: 基础版(免费试用)
|
||||
* - advanced: 高级版(付费用户)
|
||||
* - premium: 旗舰版(完整功能)
|
||||
*/
|
||||
export type UserVersion = 'basic' | 'advanced' | 'premium'
|
||||
|
||||
/**
|
||||
* 用户信息接口
|
||||
*/
|
||||
export interface UserInfo {
|
||||
/** 用户ID */
|
||||
id: string
|
||||
|
||||
/** 用户名称 */
|
||||
name: string
|
||||
|
||||
/** 用户邮箱 */
|
||||
email: string
|
||||
|
||||
/** 用户版本(权限等级) */
|
||||
version: UserVersion
|
||||
|
||||
/** 头像URL */
|
||||
avatar?: string | null
|
||||
|
||||
/** 是否试用中 */
|
||||
isTrial?: boolean
|
||||
|
||||
/** 试用到期时间 */
|
||||
trialEndsAt?: Date | null
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限上下文接口
|
||||
*/
|
||||
export interface PermissionContextType {
|
||||
/** 当前用户信息 */
|
||||
user: UserInfo | null
|
||||
|
||||
/** 是否已登录 */
|
||||
isAuthenticated: boolean
|
||||
|
||||
/** 检查模块权限 */
|
||||
checkModulePermission: (requiredVersion?: UserVersion) => boolean
|
||||
|
||||
/** 检查功能权限 */
|
||||
checkFeaturePermission: (feature: string) => boolean
|
||||
|
||||
/** 设置用户信息(登录时) */
|
||||
setUser: (user: UserInfo | null) => void
|
||||
|
||||
/** 退出登录 */
|
||||
logout: () => void
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限等级映射(用于比较)
|
||||
*/
|
||||
export const VERSION_LEVEL: Record<UserVersion, number> = {
|
||||
basic: 1,
|
||||
advanced: 2,
|
||||
premium: 3,
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查权限等级是否满足要求
|
||||
*/
|
||||
export const checkVersionLevel = (
|
||||
userVersion: UserVersion,
|
||||
requiredVersion?: UserVersion
|
||||
): boolean => {
|
||||
if (!requiredVersion) return true
|
||||
return VERSION_LEVEL[userVersion] >= VERSION_LEVEL[requiredVersion]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
44
frontend-v2/src/framework/permission/usePermission.ts
Normal file
44
frontend-v2/src/framework/permission/usePermission.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import { useContext } from 'react'
|
||||
import { PermissionContext } from './PermissionContext'
|
||||
import { PermissionContextType } from './types'
|
||||
|
||||
/**
|
||||
* 权限Hook
|
||||
*
|
||||
* @description 提供便捷的权限检查功能
|
||||
* @version Week 2 Day 7 - 任务17
|
||||
*
|
||||
* @example
|
||||
* ```tsx
|
||||
* const MyComponent = () => {
|
||||
* const { user, checkModulePermission } = usePermission()
|
||||
*
|
||||
* if (!checkModulePermission('advanced')) {
|
||||
* return <UpgradePrompt />
|
||||
* }
|
||||
*
|
||||
* return <div>欢迎 {user?.name}</div>
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
export const usePermission = (): PermissionContextType => {
|
||||
const context = useContext(PermissionContext)
|
||||
|
||||
if (context === undefined) {
|
||||
throw new Error(
|
||||
'usePermission must be used within a PermissionProvider. ' +
|
||||
'Please wrap your app with <PermissionProvider>.'
|
||||
)
|
||||
}
|
||||
|
||||
return context
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出权限相关类型(方便使用)
|
||||
*/
|
||||
export type { UserInfo, UserVersion, PermissionContextType } from './types'
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user