export interface ApiCourse { id: number title: string category?: string | null course_system_dict_item_id?: number | null course_system_item?: { id: number; label: string; value: string } | null teach_start_date?: string | null teach_end_date?: string | null time_range?: string | null location?: string | null teacher?: string | null teacher_title?: string | null university?: string | null main_speakers?: Array<{ name?: string; university?: string; title?: string; remark?: string }> recruit_targets?: string[] signup_start_date?: string | null signup_end_date?: string | null capacity: number signups_count: number progress_status: number progress_status_label: string intro_html?: string | null cover?: { url?: string | null } | null promo?: { url?: string | null } | null can_signup?: boolean has_signed_up?: boolean } export interface ApiActivity { id: number title: string activity_type_dict_item_id?: number | null activity_type_item?: { id: number; label: string; value: string } | null event_start_date?: string | null event_end_date?: string | null signup_start_date?: string | null signup_end_date?: string | null location?: string | null intro_html?: string | null summary?: string | null progress_status: number progress_status_label: string display_status: string signups_count?: number has_signed_up?: boolean can_signup?: boolean sessions?: ApiActivitySession[] session?: ApiActivitySession | null } export interface ApiActivitySession { id: number title?: string | null date?: string | null end_date?: string | null time?: string | null venue?: string | null capacity: number signed: number remaining?: number | null is_full: boolean has_signed_up?: boolean } export interface ApiNews { id: number title: string tag?: string | null category_dict_item_id?: number | null summary?: string | null date?: string | null content?: string | null content_html?: string | null source?: string | null source_url?: string | null } export interface ApiBanner { id: number type: string title?: string | null cover_url?: string | null content_html?: string | null kicker?: string | null status_label?: string | null seats_text?: string | null datetime_text?: string | null target_type: 'course' | 'activity' | 'news' | 'custom' target_id?: number | null } export interface ApiUser { id: number nickname?: string | null avatar_url?: string | null name?: string | null mobile?: string | null company?: string | null job_title?: string | null research_direction?: string | null research_direction_ids?: number[] is_partner: boolean is_incubation?: boolean is_admin?: boolean is_grid_member?: boolean is_staff?: boolean role?: string role_label?: string identity_type?: string | null can_see_radar?: boolean can_see_papers?: boolean can_access_demands?: boolean can_use_crawler?: boolean admin_user_id?: number | null } export interface ApiResearchDirection { id: number name: string } export interface ApiDictItem { id: number label: string value: string } export interface ApiDemand { id: number type?: string | null type_dict_item_id?: number status?: string | null title: string industry_type?: string | null main_business?: string | null finance_amount?: string | null job_positions?: string | null description?: string | null date?: string | null } export interface Paginated { items: T[] meta: { current_page: number per_page: number total: number last_page: number } } export interface CalendarEvent { id: number activity_id?: number title: string start_date?: string | null end_date?: string | null time_range?: string | null location?: string | null progress_status: number progress_status_label: string } export interface CalendarResponse { month: string events: CalendarEvent[] }