修复登录问题,sidebar修复用户角色的问题
This commit is contained in:
@@ -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];
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
// 登录失败,返回错误信息
|
// 登录失败,返回错误信息
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user