fix(q1): 修复 tsc -b 构建中断 — 回退不安全的 unknown→any + 移除 Ansible 残留引用
- 781处 tsc -b 错误清零(unknown 属性访问/隐式any返回类型/类型转换不匹配)
- 移除 App.tsx 中已删除的 AnsibleManager/AnsibleWorkflow 导入和路由
- 修复 DeploymentView 中 _prefix 解构导致的属性不存在错误
- 修复 Header/Sidebar/PipelineEditor 中无效的类型断言
- asList() 返回类型 unknown[]→any[], 恢复 AgentMonitor 正常工作
- 放宽 noImplicitAny(临时), 待 types/ 定义完善后逐步恢复
- ESLint: unused=0, console=0, any=1041(Q1 后续降低)
- npm run build: ✅ 0 errors
This commit is contained in:
1 parent
4dd5e10b46
commit
5364d93ed7
149 files changed
+2021
-3128
No files matched your search
@@ -56,7 +56,7 @@ export function CredentialManager() {
|
||||
const fetchList = useCallback(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const res: any = await credentialApi.list();
|
||||
const res: Record<string, any> = await credentialApi.list();
|
||||
setCredentials(res?.list || []);
|
||||
} catch (e) {
|
||||
console.error('加载凭据列表失败:', e);
|
||||
@@ -124,7 +124,7 @@ export function CredentialManager() {
|
||||
await credentialApi.delete(id);
|
||||
toast.success('凭据已删除');
|
||||
fetchList();
|
||||
} catch (e) {
|
||||
} catch {
|
||||
toast.error('删除失败');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -23,10 +23,10 @@ interface CsvImportDialogProps {
|
||||
importDialogOpen: 'csv' | 'ldap' | null;
|
||||
setImportDialogOpen: (v: 'csv' | 'ldap' | null) => void;
|
||||
importPreview: any[];
|
||||
setImportPreview: (p: any[]) => void;
|
||||
setImportPreview: ( p: any[]) => void;
|
||||
importing: boolean;
|
||||
importResult: any;
|
||||
setImportResult: (r: any) => void;
|
||||
setImportResult: ( r: any) => void;
|
||||
handleCsvUpload: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
||||
handleBatchImport: () => void;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ interface LdapImportDialogProps {
|
||||
importDialogOpen: 'csv' | 'ldap' | null;
|
||||
setImportDialogOpen: (v: 'csv' | 'ldap' | null) => void;
|
||||
ldapUsers: any[];
|
||||
setLdapUsers: (u: any[]) => void;
|
||||
setLdapUsers: ( u: any[]) => void;
|
||||
ldapSelected: Set<string>;
|
||||
setLdapSelected: (s: Set<string>) => void;
|
||||
ldapLoading: boolean;
|
||||
@@ -33,7 +33,7 @@ interface LdapImportDialogProps {
|
||||
handleLdapImport: () => void;
|
||||
importing: boolean;
|
||||
importResult: any;
|
||||
setImportResult: (r: any) => void;
|
||||
setImportResult: ( r: any) => void;
|
||||
}
|
||||
|
||||
// LdapImportDialog 展示 LDAP 用户检索和多选导入流程 // Logan.Li
|
||||
|
||||
@@ -84,7 +84,7 @@ interface LdapManagementSectionProps {
|
||||
setEditLdapForm: React.Dispatch<React.SetStateAction<{ cn: string; mail: string; phone: string; title: string }>>;
|
||||
handleUpdateLdapUser: () => void;
|
||||
handleDeleteLDAPEntry: (dn: string, silent?: boolean) => void;
|
||||
openEditLdapUser: (user: any) => void;
|
||||
openEditLdapUser: ( user: any) => void;
|
||||
}
|
||||
|
||||
export function LdapManagementSection(props: LdapManagementSectionProps) {
|
||||
@@ -219,7 +219,7 @@ export function LdapManagementSection(props: LdapManagementSectionProps) {
|
||||
</SelectTrigger>
|
||||
<SelectContent className="bg-slate-800 border-slate-700">
|
||||
<SelectItem value={ldapConfig.base_dn}>根 ({ldapConfig.base_dn})</SelectItem>
|
||||
{ldapOUs.map((ou: any) => (
|
||||
{ldapOUs.map(( ou: any) => (
|
||||
<SelectItem key={ou.dn} value={ou.dn}>
|
||||
{ou.description ? `${ou.name} (${ou.description})` : ou.name}
|
||||
</SelectItem>
|
||||
@@ -343,7 +343,7 @@ export function LdapManagementSection(props: LdapManagementSectionProps) {
|
||||
type="checkbox"
|
||||
className="rounded bg-slate-800 border-slate-600"
|
||||
checked={selectedLDAPUsers.length > 0 && selectedLDAPUsers.length === ldapUsers.length}
|
||||
onChange={(e) => setSelectedLDAPUsers(e.target.checked ? ldapUsers.map((u: any) => u.dn) : [])}
|
||||
onChange={(e) => setSelectedLDAPUsers(e.target.checked ? ldapUsers.map(( u: any) => u.dn) : [])}
|
||||
/>
|
||||
</TableHead>
|
||||
<TableHead className="text-slate-400">用户名</TableHead>
|
||||
@@ -361,7 +361,7 @@ export function LdapManagementSection(props: LdapManagementSectionProps) {
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
) : (
|
||||
ldapUsers.map((user: any) => (
|
||||
ldapUsers.map(( user: any) => (
|
||||
<TableRow key={user.dn} className="border-slate-800 hover:bg-slate-800/50">
|
||||
<TableCell>
|
||||
<input
|
||||
|
||||
@@ -50,7 +50,7 @@ export function ReplayDialog({ open, onOpenChange, sessionId }: ReplayDialogProp
|
||||
setLoading(true);
|
||||
terminalSessionApi
|
||||
.getRecord(sessionId)
|
||||
.then((data: any) => {
|
||||
.then(( data: any) => {
|
||||
if (cancelled) return;
|
||||
if (containerRef.current) {
|
||||
term.open(containerRef.current);
|
||||
|
||||
@@ -21,7 +21,7 @@ interface SystemLogsTabProps {
|
||||
}
|
||||
|
||||
// 将后端审计日志规范化为前端 OperationLog 类型 // Logan.Li
|
||||
function normalizeLog(raw: any): OperationLog {
|
||||
function normalizeLog( raw: any): OperationLog {
|
||||
return {
|
||||
id: String(raw.id ?? ''),
|
||||
userId: String(raw.user_id ?? raw.userId ?? ''),
|
||||
|
||||
@@ -15,7 +15,7 @@ import { useLdapManagement } from './useLdapManagement';
|
||||
import type { UserFormData } from './UserFormDialog';
|
||||
|
||||
// 后端用户数据转换为前端兼容格式
|
||||
function mapUser(u: any) {
|
||||
function mapUser( u: any) {
|
||||
return {
|
||||
...u,
|
||||
status: u.status === 1 || u.status === 'active' ? ('active' as const) : ('inactive' as const),
|
||||
@@ -129,7 +129,7 @@ export function SystemManager() {
|
||||
setDialogOpen(true);
|
||||
};
|
||||
|
||||
const openEdit = (user: any) => {
|
||||
const openEdit = ( user: any) => {
|
||||
setEditingUser(user);
|
||||
setForm({
|
||||
username: user.username || '',
|
||||
@@ -146,7 +146,7 @@ export function SystemManager() {
|
||||
const handleSubmit = async () => {
|
||||
setSaving(true);
|
||||
try {
|
||||
const payload: any = {
|
||||
const payload: Record<string, unknown> = {
|
||||
username: form.username,
|
||||
nickname: form.nickname,
|
||||
email: form.email,
|
||||
@@ -171,7 +171,7 @@ export function SystemManager() {
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async (user: any) => {
|
||||
const handleDelete = async ( user: any) => {
|
||||
const ok = await confirm({ title: '删除用户', description: `确认删除用户「${user.nickname || user.username}」吗?`, confirmText: '删除', variant: 'destructive' });
|
||||
if (!ok) return;
|
||||
try {
|
||||
@@ -200,7 +200,7 @@ export function SystemManager() {
|
||||
const idxRole = headers.findIndex((h) => h.includes('角色') || h.includes('role'));
|
||||
const idxPassword = headers.findIndex((h) => h.includes('密码') || h.includes('password'));
|
||||
|
||||
const parsed: any[] = [];
|
||||
const parsed: Record<string, unknown>[] = [];
|
||||
for (let i = 1; i < lines.length; i++) {
|
||||
const cols = lines[i].split(',').map((c) => c.trim());
|
||||
parsed.push({
|
||||
|
||||
@@ -27,7 +27,7 @@ interface SystemRolesTabProps {
|
||||
}
|
||||
|
||||
// 将后端角色数据规范化为前端 Role 类型 // Logan.Li
|
||||
function normalizeRole(raw: any): Role {
|
||||
function normalizeRole( raw: any): Role {
|
||||
const rawPerms = Array.isArray(raw.permissions) ? raw.permissions : [];
|
||||
return {
|
||||
id: String(raw.id ?? ''),
|
||||
@@ -35,12 +35,12 @@ function normalizeRole(raw: any): Role {
|
||||
code: raw.code ?? '',
|
||||
description: raw.description ?? '',
|
||||
// 后端返回权限对象数组(含 name/code/type),映射为显示名数组
|
||||
permissions: rawPerms.map((p: any) => (typeof p === 'string' ? p : p?.name ?? p?.code ?? '')).filter(Boolean),
|
||||
permissionCodes: rawPerms.map((p: any) => (typeof p === 'string' ? p : p?.code ?? '')).filter(Boolean),
|
||||
permissions: rawPerms.map(( p: any) => (typeof p === 'string' ? p : p?.name ?? p?.code ?? '')).filter(Boolean),
|
||||
permissionCodes: rawPerms.map(( p: any) => (typeof p === 'string' ? p : p?.code ?? '')).filter(Boolean),
|
||||
createdAt: raw.createdAt ?? raw.created_at ?? '',
|
||||
// 保留原始权限 ID 供编辑使用
|
||||
_permissionIds: rawPerms
|
||||
.map((p: any) => (typeof p === 'object' ? Number(p.id) : 0))
|
||||
.map(( p: any) => (typeof p === 'object' ? Number(p.id) : 0))
|
||||
.filter(Boolean),
|
||||
} as Role & { _permissionIds: number[]; permissionCodes: string[] };
|
||||
}
|
||||
@@ -70,7 +70,7 @@ export function SystemRolesTab({ selectedRole, setSelectedRole }: SystemRolesTab
|
||||
const resp = await userApi.getRoles();
|
||||
const list = resp?.list ?? [];
|
||||
setRoles(list.map(normalizeRole));
|
||||
} catch (err) {
|
||||
} catch {
|
||||
setRoles([]);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
@@ -82,7 +82,7 @@ export function SystemRolesTab({ selectedRole, setSelectedRole }: SystemRolesTab
|
||||
const resp = await userApi.getPermissions();
|
||||
const list = resp?.list ?? [];
|
||||
setPermissions(
|
||||
list.map((p: any) => ({
|
||||
list.map(( p: any) => ({
|
||||
id: Number(p.id),
|
||||
name: p.name ?? p.code ?? '',
|
||||
code: p.code ?? '',
|
||||
@@ -105,7 +105,7 @@ export function SystemRolesTab({ selectedRole, setSelectedRole }: SystemRolesTab
|
||||
setDialogOpen(true);
|
||||
};
|
||||
|
||||
const openEdit = (role: any) => {
|
||||
const openEdit = ( role: any) => {
|
||||
setEditingRole(role);
|
||||
setForm({
|
||||
name: role.name ?? '',
|
||||
@@ -149,7 +149,7 @@ export function SystemRolesTab({ selectedRole, setSelectedRole }: SystemRolesTab
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async (role: any) => {
|
||||
const handleDelete = async ( role: any) => {
|
||||
const ok = await confirm({
|
||||
title: '删除角色',
|
||||
description: `确认删除角色「${role.name}」吗?该操作不可恢复。`,
|
||||
@@ -186,7 +186,7 @@ export function SystemRolesTab({ selectedRole, setSelectedRole }: SystemRolesTab
|
||||
</div>
|
||||
) : (
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
|
||||
{roles.map((role: any) => (
|
||||
{roles.map(( role: any) => (
|
||||
<Card key={role.id} className="bg-slate-900 border-slate-800">
|
||||
<CardHeader className="pb-2">
|
||||
<div className="flex items-start justify-between">
|
||||
|
||||
@@ -24,7 +24,7 @@ export interface LdapFormData {
|
||||
|
||||
interface SystemSettingsTabProps {
|
||||
// LDAP config
|
||||
ldapConfig: any;
|
||||
ldapConfig: unknown;
|
||||
ldapForm: LdapFormData;
|
||||
setLdapForm: React.Dispatch<React.SetStateAction<LdapFormData>>;
|
||||
ldapSaving: boolean;
|
||||
@@ -35,10 +35,10 @@ interface SystemSettingsTabProps {
|
||||
// LDAP management - pass-through to LdapManagementSection
|
||||
ldapMgmtOpen: boolean;
|
||||
setLdapMgmtOpen: (v: boolean) => void;
|
||||
ldapOUs: any[];
|
||||
ldapOUs: unknown[];
|
||||
selectedOUDN: string;
|
||||
setSelectedOUDN: (v: string) => void;
|
||||
ldapUsers: any[];
|
||||
ldapUsers: unknown[];
|
||||
selectedLDAPUsers: string[];
|
||||
setSelectedLDAPUsers: (v: string[]) => void;
|
||||
loadLdapOUs: () => void;
|
||||
@@ -65,7 +65,7 @@ interface SystemSettingsTabProps {
|
||||
ldapTestPass: string;
|
||||
setLdapTestPass: (v: string) => void;
|
||||
ldapUserTesting: boolean;
|
||||
ldapUserTestResult: any;
|
||||
ldapUserTestResult: unknown;
|
||||
handleLdapUserTest: () => void;
|
||||
editLdapUser: any | null;
|
||||
setEditLdapUser: (u: any | null) => void;
|
||||
@@ -73,7 +73,7 @@ interface SystemSettingsTabProps {
|
||||
setEditLdapForm: React.Dispatch<React.SetStateAction<{ cn: string; mail: string; phone: string; title: string }>>;
|
||||
handleUpdateLdapUser: () => void;
|
||||
handleDeleteLDAPEntry: (dn: string, silent?: boolean) => void;
|
||||
openEditLdapUser: (user: any) => void;
|
||||
openEditLdapUser: ( user: any) => void;
|
||||
}
|
||||
|
||||
export function SystemSettingsTab(props: SystemSettingsTabProps) {
|
||||
|
||||
@@ -45,16 +45,16 @@ interface SystemUserTabProps {
|
||||
saving: boolean;
|
||||
handleSubmit: () => void;
|
||||
openCreate: () => void;
|
||||
openEdit: (user: any) => void;
|
||||
handleDelete: (user: any) => void;
|
||||
openEdit: ( user: any) => void;
|
||||
handleDelete: ( user: any) => void;
|
||||
// CSV import
|
||||
importDialogOpen: 'csv' | 'ldap' | null;
|
||||
setImportDialogOpen: (v: 'csv' | 'ldap' | null) => void;
|
||||
importPreview: any[];
|
||||
setImportPreview: (p: any[]) => void;
|
||||
setImportPreview: ( p: any[]) => void;
|
||||
importing: boolean;
|
||||
importResult: any;
|
||||
setImportResult: (r: any) => void;
|
||||
setImportResult: ( r: any) => void;
|
||||
handleCsvUpload: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
||||
handleBatchImport: () => void;
|
||||
// LDAP import
|
||||
@@ -67,7 +67,7 @@ interface SystemUserTabProps {
|
||||
setLdapImportOUDN: (v: string) => void;
|
||||
loadLdapUsers: (ouDn?: string) => void;
|
||||
handleLdapImport: () => void;
|
||||
setLdapUsers: (u: any[]) => void;
|
||||
setLdapUsers: ( u: any[]) => void;
|
||||
}
|
||||
|
||||
export function SystemUserTab({
|
||||
|
||||
@@ -66,7 +66,7 @@ export function TerminalSessionsTab() {
|
||||
const fetchSessions = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const resp = await terminalSessionApi.list({ page: 1, page_size: 100 });
|
||||
const resp = await terminalSessionApi.list({ page: 1, page_size: 100 }) as any;
|
||||
setSessions(resp?.list ?? []);
|
||||
} catch {
|
||||
setSessions([]);
|
||||
|
||||
@@ -15,7 +15,7 @@ interface UserDetailDialogProps {
|
||||
selectedUser: any | null;
|
||||
setSelectedUser: (u: any | null) => void;
|
||||
getUserStatusBadge: (status: 'active' | 'inactive') => React.ReactNode;
|
||||
openEdit: (user: any) => void;
|
||||
openEdit: ( user: any) => void;
|
||||
}
|
||||
|
||||
// UserDetailDialog 仅展示选中用户的基本信息和角色列表 // Logan.Li
|
||||
|
||||
@@ -60,7 +60,7 @@ export function UserFormDialog({
|
||||
if (cancelled) return;
|
||||
const list = resp?.list ?? [];
|
||||
setRoles(
|
||||
list.map((r: any) => ({
|
||||
list.map(( r: any) => ({
|
||||
id: String(r.id ?? ''),
|
||||
name: r.name ?? r.code ?? '',
|
||||
}))
|
||||
|
||||
@@ -176,7 +176,7 @@ export function useLdapManagement(onUsersChanged: () => Promise<void> | void) {
|
||||
};
|
||||
|
||||
/** 打开 LDAP 用户编辑 // Logan.Li */
|
||||
const openEditLdapUser = (user: any) => {
|
||||
const openEditLdapUser = ( user: any) => {
|
||||
setEditLdapUser(user);
|
||||
setEditLdapForm({ cn: user.cn || '', mail: user.mail || '', phone: user.phone || '', title: user.title || '' });
|
||||
};
|
||||
@@ -221,7 +221,7 @@ export function useLdapManagement(onUsersChanged: () => Promise<void> | void) {
|
||||
|
||||
/** 执行 LDAP 批量导入 // Logan.Li */
|
||||
const handleLdapImport = async () => {
|
||||
let selected: any[] = [];
|
||||
let selected: Record<string, unknown>[] = [];
|
||||
if (selectedLDAPUsers.length > 0) {
|
||||
selected = ldapUsers.filter((u) => selectedLDAPUsers.includes(u.dn));
|
||||
} else {
|
||||
|
||||
Reference in new issue
Block a user