修复登录问题,sidebar修复用户角色的问题

This commit is contained in:
2025-07-28 10:56:59 +08:00
parent 46febb97cb
commit 6727d62272
7 changed files with 43 additions and 35 deletions
+3 -3
View File
@@ -598,16 +598,16 @@ function buildMenuTreeFromRoutes(routes: RouteInfo[]): MenuItem[] {
/** /**
* 根据用户角色映射到权限系统的角色标识 * 根据用户角色映射到权限系统的角色标识
* @param userRole 前端用户角色 ('common' | 'developer') * @param userRole 前端用户角色 ('common' | 'admin' | 'deptLeader' | 'groupLeader')
* @returns 数据库中的角色标识 * @returns 数据库中的角色标识
*/ */
export function mapUserRoleToRoleKey(userRole: string): string { export function mapUserRoleToRoleKey(userRole: string): string {
const roleMapping: Record<string, string> = { const roleMapping: Record<string, string> = {
'common': 'common', 'common': 'common',
'developer': 'admin', 'admin': 'admin',
'deptLeader': 'deptLeader', 'deptLeader': 'deptLeader',
'groupLeader': 'groupLeader' 'groupLeader': 'groupLeader'
}; };
return roleMapping[userRole] || 'common'; return roleMapping[userRole];
} }
+1 -1
View File
@@ -200,7 +200,7 @@ export async function apiRequest<T>(
return getMockResponse<T>(endpoint); return getMockResponse<T>(endpoint);
} }
console.log('api-base-url-----------',API_BASE_URL) // console.log('api-base-url-----------',API_BASE_URL)
try { try {
// 构建 URL // 构建 URL
+33 -27
View File
@@ -30,7 +30,7 @@ import { OAUTH_CONFIG, API_BASE_URL } from "~/config/api-config";
* @property {'common'} common - 普通用户,有基本的系统访问权限 * @property {'common'} common - 普通用户,有基本的系统访问权限
* @property {'developer'} developer - 开发者/管理员,有完整的系统管理权限 * @property {'developer'} developer - 开发者/管理员,有完整的系统管理权限
*/ */
export type UserRole = 'common' | 'developer'; export type UserRole = 'common' | 'admin' | 'deptLeader' | 'groupLeader';
/** /**
* 用户信息接口,对应 sso_users 表结构 * 用户信息接口,对应 sso_users 表结构
@@ -187,7 +187,7 @@ function createUserInfoWithJWT(userInfo: UserInfo, savedUserData: SsoUser, userR
export async function getUserSession(request: Request) { export async function getUserSession(request: Request) {
const session = await getSession(request); const session = await getSession(request);
const isAuthenticated = session.get("isAuthenticated") === true; const isAuthenticated = session.get("isAuthenticated") === true;
const userRole = session.get("userRole") || 'common' as UserRole; const userRole = session.get("userRole") as UserRole;
let accessToken = session.get("accessToken"); let accessToken = session.get("accessToken");
const refreshToken = session.get("refreshToken"); const refreshToken = session.get("refreshToken");
let tokenIssuedAt = session.get("tokenIssuedAt"); let tokenIssuedAt = session.get("tokenIssuedAt");
@@ -736,8 +736,6 @@ export async function simpleRootLogin(
}); });
} }
// 调用登录接口 // 调用登录接口
const loginResponse = await fetch(`${API_BASE_URL}/password_login`, { const loginResponse = await fetch(`${API_BASE_URL}/password_login`, {
method: 'POST', method: 'POST',
@@ -755,40 +753,48 @@ export async function simpleRootLogin(
if (loginResult.code === 0 && loginResult.data) { if (loginResult.code === 0 && loginResult.data) {
// 登录成功,构建用户信息 // 登录成功,构建用户信息
const userData = loginResult.data; const userData = loginResult.data;
const userRole = 'common' as UserRole; // 默认角色 console.log('管理员登录userData', userData);
const userRole = userData.role; // 默认角色
// 构建用户信息对象 // 生成模拟的OAuth token信息
const userInfo = { const mockTokenExpiresIn = 7200; // 2小时
const mockAccessToken = `mock_access_token_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
const mockRefreshToken = `mock_refresh_token_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
// 生成前端JWT
const jwtUserInfo: UserInfoForJWT = {
sub: userData.sub, sub: userData.sub,
user_id: userData.sub, // 使用sub作为user_id user_id: userData.user_id,
username: userData.username, username: userData.username,
nick_name: userData.nick_name, nick_name: userData.nick_name,
phone_number: userData.phone_number,
email: userData.email, email: userData.email,
phone_number: userData.phone_number,
ou_id: userData.ou_id, ou_id: userData.ou_id,
ou_name: userData.ou_name, ou_name: userData.ou_name,
is_leader: userData.is_leader, is_leader: userData.is_leader,
user_role: userRole user_role: userRole
}; };
const frontendJWT = JWTUtils.generateJWT(jwtUserInfo, mockTokenExpiresIn);
// 构建增强的用户信息对象
const enhancedUserInfo = {
...userData,
user_id: userData.user_id,
user_role: userRole,
frontend_jwt: frontendJWT
};
// 创建会话 // 使用统一的session创建函数
const session = await sessionStorage.getSession(); return createUserSession({
session.set("isAuthenticated", true); isAuthenticated: true,
session.set("userRole", userRole); userRole: userRole,
session.set("userInfo", userInfo); redirectTo,
accessToken: mockAccessToken,
const cookie = await sessionStorage.commitSession(session); refreshToken: mockRefreshToken,
tokenExpiresIn: mockTokenExpiresIn,
// console.log("账号密码登录成功 - 用户:", userData.username); userInfo: enhancedUserInfo,
// console.log("账号密码登录成功 - 角色:", userRole); frontendJWT
// console.log("账号密码登录成功 - 重定向到:", redirectTo);
return new Response(null, {
status: 302,
headers: {
Location: redirectTo,
"Set-Cookie": cookie,
},
}); });
} else { } else {
// 登录失败,返回错误信息 // 登录失败,返回错误信息
+1
View File
@@ -72,6 +72,7 @@ export class OAuthClient {
* @returns 访问令牌响应 * @returns 访问令牌响应
*/ */
async getAccessToken(code: string): Promise<TokenResponse | null> { async getAccessToken(code: string): Promise<TokenResponse | null> {
console.log('this.config.serverUrl', this.config.serverUrl);
const url = `${this.config.serverUrl}/oauth/token`; const url = `${this.config.serverUrl}/oauth/token`;
const data = new URLSearchParams({ const data = new URLSearchParams({
grant_type: 'authorization_code', grant_type: 'authorization_code',
+1
View File
@@ -45,6 +45,7 @@ export function Sidebar({ onToggle, collapsed, userRole, selectedApp = '' }: Sid
const fetchUserRoutes = async () => { const fetchUserRoutes = async () => {
setIsLoadingRoutes(true); setIsLoadingRoutes(true);
try { try {
console.log('userRole', userRole);
const roleKey = mapUserRoleToRoleKey(userRole); const roleKey = mapUserRoleToRoleKey(userRole);
const result = await getUserRoutesByRole(roleKey); const result = await getUserRoutesByRole(roleKey);
+2 -2
View File
@@ -72,7 +72,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
const { getUserSession } = await import("~/api/login/auth.server"); const { getUserSession } = await import("~/api/login/auth.server");
const { userInfo, frontendJWT } = await getUserSession(request); const { userInfo, frontendJWT } = await getUserSession(request);
console.log('frontendJWT', frontendJWT); // console.log('frontendJWT', frontendJWT);
// 获取任务列表和统计数据,传递用户信息和JWT // 获取任务列表和统计数据,传递用户信息和JWT
const [tasksResponse, statsResponse] = await Promise.all([ const [tasksResponse, statsResponse] = await Promise.all([
@@ -80,7 +80,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
getCrossCheckingStats(userInfo, frontendJWT) getCrossCheckingStats(userInfo, frontendJWT)
]); ]);
console.log('tasksResponse', tasksResponse.data?.tasks); // console.log('tasksResponse', tasksResponse.data?.tasks);
if (!tasksResponse.success) { if (!tasksResponse.success) {
console.error('获取任务列表失败:', tasksResponse.error); console.error('获取任务列表失败:', tasksResponse.error);
+2 -2
View File
@@ -202,10 +202,10 @@ export default function RulesIndex() {
// 检查用户是否为开发者角色 // 检查用户是否为开发者角色
const userRole = rootData?.userRole || 'common'; const userRole = rootData?.userRole || 'common';
const isDeveloper = userRole === 'developer'; const isDeveloper = userRole === 'admin';
// 在组件渲染时初始化状态 // 在组件渲染时初始化状态
// useEffect(() => { // useEffect(() => {
// setFilteredRules(initialRules); // setFilteredRules(initialRules);
// setFilteredTotalCount(initialTotalCount); // setFilteredTotalCount(initialTotalCount);
// setRuleTypes(initialRuleTypes); // setRuleTypes(initialRuleTypes);