diff --git a/src/api/oauth2.ts b/src/api/oauth2.ts index 7ca7973..a15fef7 100644 --- a/src/api/oauth2.ts +++ b/src/api/oauth2.ts @@ -16,35 +16,9 @@ export const getOauth2RedirectURL = async ( }) } -export const bindOauth2 = async ( - provider: string, - state: string, - code: string, -): Promise => { - return fetcher( - FetcherMethod.POST, - `/api/v1/oauth2/${provider}/bind`, - { - state: state, - code: code, - }, - ) -} - export const unbindOauth2 = async (provider: string): Promise => { return fetcher( FetcherMethod.POST, `/api/v1/oauth2/${provider}/unbind`, ) } - -export const oauth2callback = async ( - provider: string, - state: string, - code: string, -): Promise => { - return fetcher(FetcherMethod.POST, `/api/v1/oauth2/${provider}/callback`, { - state, - code, - }) -} diff --git a/src/components/profile.tsx b/src/components/profile.tsx index f2f4644..a9d9aff 100644 --- a/src/components/profile.tsx +++ b/src/components/profile.tsx @@ -1,5 +1,6 @@ import { getProfile, updateProfile } from "@/api/user" import { Button } from "@/components/ui/button" +import { Checkbox } from "@/components/ui/checkbox" import { Dialog, DialogClose, @@ -19,8 +20,10 @@ import { FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" import { ScrollArea } from "@/components/ui/scroll-area" import { useMainStore } from "@/hooks/useMainStore" +import { asOptionalField } from "@/lib/utils" import { zodResolver } from "@hookform/resolvers/zod" import { useState } from "react" import { useForm } from "react-hook-form" @@ -32,6 +35,7 @@ const profileFormSchema = z.object({ original_password: z.string().min(5).max(72), new_password: z.string().min(8).max(72), new_username: z.string().min(1).max(32), + reject_password: asOptionalField(z.boolean()), }) export const ProfileCard = ({ className }: { className: string }) => { @@ -44,6 +48,7 @@ export const ProfileCard = ({ className }: { className: string }) => { original_password: "", new_password: "", new_username: profile?.username, + reject_password: profile?.reject_password, }, resetOptions: { keepDefaultValues: false, @@ -122,6 +127,26 @@ export const ProfileCard = ({ className }: { className: string }) => { )} /> + ( + + +
+ + +
+
+ +
+ )} + /> diff --git a/src/hooks/useAuth.tsx b/src/hooks/useAuth.tsx index 8ffb374..0dccd85 100644 --- a/src/hooks/useAuth.tsx +++ b/src/hooks/useAuth.tsx @@ -1,4 +1,3 @@ -import { oauth2callback } from "@/api/oauth2" import { getProfile, login as loginRequest } from "@/api/user" import { AuthContextProps } from "@/types" import { createContext, useContext, useEffect, useMemo } from "react" @@ -45,9 +44,8 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { } } - const loginOauth2 = async (provider: string, state: string, code: string) => { + const loginOauth2 = async () => { try { - await oauth2callback(provider, state, code) const user = await getProfile() user.role = user.role || 0 setProfile(user) diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 04d0e2c..a0e22b3 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -174,5 +174,6 @@ "ConnectedAt": "Connected at", "OnlineUser": "Online User", "Total": "Total", - "ConfirmBlock": "Confirm Block" + "ConfirmBlock": "Confirm Block", + "RejectPassword": "Reject Password Login" } diff --git a/src/routes/login.tsx b/src/routes/login.tsx index 8666531..d459073 100644 --- a/src/routes/login.tsx +++ b/src/routes/login.tsx @@ -35,11 +35,9 @@ function Login() { const { data: settingData } = useSetting() useEffect(() => { - const oauth2Code = new URLSearchParams(window.location.search).get("code") - const oauth2State = new URLSearchParams(window.location.search).get("state") - const oauth2Provider = new URLSearchParams(window.location.search).get("provider") - if (oauth2Code && oauth2State && oauth2Provider) { - loginOauth2(oauth2Provider, oauth2State, oauth2Code) + const oauth2 = new URLSearchParams(window.location.search).get("oauth2") + if (oauth2) { + loginOauth2() } }, [window.location.search]) diff --git a/src/routes/profile.tsx b/src/routes/profile.tsx index 819213c..e2b58ae 100644 --- a/src/routes/profile.tsx +++ b/src/routes/profile.tsx @@ -1,4 +1,4 @@ -import { Oauth2RequestType, bindOauth2, getOauth2RedirectURL, unbindOauth2 } from "@/api/oauth2" +import { Oauth2RequestType, getOauth2RedirectURL, unbindOauth2 } from "@/api/oauth2" import { getProfile } from "@/api/user" import { ProfileCard } from "@/components/profile" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" @@ -19,22 +19,12 @@ export default function ProfilePage() { const isDesktop = useMediaQuery("(min-width: 890px)") useEffect(() => { - const oauth2Code = new URLSearchParams(window.location.search).get("code") - const oauth2State = new URLSearchParams(window.location.search).get("state") - const oauth2Provider = new URLSearchParams(window.location.search).get("provider") - if (oauth2Code && oauth2State && oauth2Provider) { - bindOauth2(oauth2Provider, oauth2State, oauth2Code) - .catch((error) => { - toast.error(error.message) - }) - .then(() => { - getProfile().then((profile) => { - setProfile(profile) - }) - }) - .finally(() => { - window.history.replaceState({}, document.title, window.location.pathname) - }) + const oauth2 = new URLSearchParams(window.location.search).get("oauth2") + if (oauth2) { + getProfile().then((profile) => { + setProfile(profile) + }) + window.history.replaceState({}, document.title, window.location.pathname) } }, [window.location.search]) @@ -50,9 +40,8 @@ export default function ProfilePage() { const unbindO2 = async (provider: string) => { try { await unbindOauth2(provider) - getProfile().then((profile) => { - setProfile(profile) - }) + const profile = await getProfile() + setProfile(profile) } catch (error: any) { toast.error(error.message) } diff --git a/src/types/api.ts b/src/types/api.ts index 16359d5..a1c9fa3 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -10,296 +10,296 @@ */ export interface GithubComNezhahqNezhaModelCommonResponseAny { - data?: any - error?: string - success?: boolean + data: any + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelAlertRule { - data?: ModelAlertRule[] - error?: string - success?: boolean + data: ModelAlertRule[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelCron { - data?: ModelCron[] - error?: string - success?: boolean + data: ModelCron[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelDDNSProfile { - data?: ModelDDNSProfile[] - error?: string - success?: boolean + data: ModelDDNSProfile[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelNAT { - data?: ModelNAT[] - error?: string - success?: boolean + data: ModelNAT[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelNotification { - data?: ModelNotification[] - error?: string - success?: boolean + data: ModelNotification[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelNotificationGroupResponseItem { - data?: ModelNotificationGroupResponseItem[] - error?: string - success?: boolean + data: ModelNotificationGroupResponseItem[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelServer { - data?: ModelServer[] - error?: string - success?: boolean + data: ModelServer[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelServerGroupResponseItem { - data?: ModelServerGroupResponseItem[] - error?: string - success?: boolean + data: ModelServerGroupResponseItem[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelService { - data?: ModelService[] - error?: string - success?: boolean + data: ModelService[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelServiceInfos { - data?: ModelServiceInfos[] - error?: string - success?: boolean + data: ModelServiceInfos[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayModelUser { - data?: ModelUser[] - error?: string - success?: boolean + data: ModelUser[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayString { - data?: string[] - error?: string - success?: boolean + data: string[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseArrayUint64 { - data?: number[] - error?: string - success?: boolean + data: number[] + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseGithubComNezhahqNezhaModelSettingResponseModelConfig { - data?: GithubComNezhahqNezhaModelSettingResponseModelConfig - error?: string - success?: boolean + data: GithubComNezhahqNezhaModelSettingResponseModelConfig + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseModelForceUpdateResponse { - data?: ModelForceUpdateResponse - error?: string - success?: boolean + data: ModelForceUpdateResponse + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseModelLoginResponse { - data?: ModelLoginResponse - error?: string - success?: boolean + data: ModelLoginResponse + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseModelProfile { - data?: ModelProfile - error?: string - success?: boolean + data: ModelProfile + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseModelServiceResponse { - data?: ModelServiceResponse - error?: string - success?: boolean + data: ModelServiceResponse + error: string + success: boolean } export interface GithubComNezhahqNezhaModelCommonResponseUint64 { - data?: number - error?: string - success?: boolean + data: number + error: string + success: boolean } export interface GithubComNezhahqNezhaModelPaginatedResponseArrayModelOnlineUserModelOnlineUser { - data?: GithubComNezhahqNezhaModelValueArrayModelOnlineUser - error?: string - success?: boolean + data: GithubComNezhahqNezhaModelValueArrayModelOnlineUser + error: string + success: boolean } export interface GithubComNezhahqNezhaModelPaginatedResponseArrayModelWAFApiMockModelWAFApiMock { - data?: GithubComNezhahqNezhaModelValueArrayModelWAFApiMock - error?: string - success?: boolean + data: GithubComNezhahqNezhaModelValueArrayModelWAFApiMock + error: string + success: boolean } export interface GithubComNezhahqNezhaModelSettingResponseModelConfig { - config?: ModelConfig - frontend_templates?: ModelFrontendTemplate[] - version?: string + config: ModelConfig + frontend_templates: ModelFrontendTemplate[] + version: string } export interface GithubComNezhahqNezhaModelValueArrayModelOnlineUser { - pagination?: ModelPagination - value?: ModelOnlineUser[] + pagination: ModelPagination + value: ModelOnlineUser[] } export interface GithubComNezhahqNezhaModelValueArrayModelWAFApiMock { - pagination?: ModelPagination - value?: ModelWAFApiMock[] + pagination: ModelPagination + value: ModelWAFApiMock[] } export interface ModelAlertRule { - created_at?: string - enable?: boolean + created_at: string + enable: boolean /** 失败时执行的触发任务id */ - fail_trigger_tasks?: number[] - id?: number - name?: string + fail_trigger_tasks: number[] + id: number + name: string /** 该报警规则所在的通知组 */ - notification_group_id?: number + notification_group_id: number /** 恢复时执行的触发任务id */ - recover_trigger_tasks?: number[] - rules?: ModelRule[] + recover_trigger_tasks: number[] + rules: ModelRule[] /** 触发模式: 0-始终触发(默认) 1-单次触发 */ - trigger_mode?: number - updated_at?: string + trigger_mode: number + updated_at: string } export interface ModelAlertRuleForm { enable?: boolean /** 失败时触发的任务id */ - fail_trigger_tasks?: number[] + fail_trigger_tasks: number[] /** @minLength 1 */ - name?: string - notification_group_id?: number + name: string + notification_group_id: number /** 恢复时触发的任务id */ - recover_trigger_tasks?: number[] - rules?: ModelRule[] + recover_trigger_tasks: number[] + rules: ModelRule[] /** @default 0 */ - trigger_mode?: number + trigger_mode: number } export interface ModelConfig { - admin_template?: string - agent_secret_key?: string - avg_ping_count?: number + admin_template: string + agent_secret_key: string + avg_ping_count: number /** 覆盖范围(0:提醒未被 IgnoredIPNotification 包含的所有服务器; 1:仅提醒被 IgnoredIPNotification 包含的服务器;) */ - cover?: number - custom_code?: string - custom_code_dashboard?: string + cover: number + custom_code: string + custom_code_dashboard: string /** debug模式开关 */ - debug?: boolean - dns_servers?: string + debug: boolean + dns_servers: string /** IP变更提醒 */ - enable_ip_change_notification?: boolean + enable_ip_change_notification: boolean /** 通知信息IP不打码 */ - enable_plain_ip_in_notification?: boolean + enable_plain_ip_in_notification: boolean /** 特定服务器IP(多个服务器用逗号分隔) */ - ignored_ip_notification?: string + ignored_ip_notification: string /** [ServerID] -> bool(值为true代表当前ServerID在特定服务器列表内) */ - ignored_ip_notification_server_ids?: Record - install_host?: string - ip_change_notification_group_id?: number - jwt_secret_key?: string + ignored_ip_notification_server_ids: Record + install_host: string + ip_change_notification_group_id: number + jwt_secret_key: string /** 系统语言,默认 zh_CN */ - language?: string - listen_host?: string - listen_port?: number + language: string + listen_host: string + listen_port: number /** 时区,默认为 Asia/Shanghai */ - location?: string + location: string /** oauth2 配置 */ - oauth2?: Record + oauth2: Record /** oauth2 供应商列表,无需配置,自动生成 */ - oauth2_providers?: string[] + oauth2_providers: string[] /** 真实IP */ - real_ip_header?: string - site_name?: string - tls?: boolean - user_template?: string + real_ip_header: string + site_name: string + tls: boolean + user_template: string } export interface ModelCreateFMResponse { - session_id?: string + session_id: string } export interface ModelCreateTerminalResponse { - server_id?: number - server_name?: string - session_id?: string + server_id: number + server_name: string + session_id: string } export interface ModelCron { - command?: string + command: string /** 计划任务覆盖范围 (0:仅覆盖特定服务器 1:仅忽略特定服务器 2:由触发该计划任务的服务器执行) */ - cover?: number - created_at?: string - cron_job_id?: number - id?: number + cover: number + created_at: string + cron_job_id: number + id: number /** 最后一次执行时间 */ - last_executed_at?: string + last_executed_at: string /** 最后一次执行结果 */ - last_result?: boolean - name?: string + last_result: boolean + name: string /** 指定通知方式的分组 */ - notification_group_id?: number + notification_group_id: number /** 推送成功的通知 */ - push_successful?: boolean + push_successful: boolean /** 分钟 小时 天 月 星期 */ - scheduler?: string - servers?: number[] + scheduler: string + servers: number[] /** 0:计划任务 1:触发任务 */ - task_type?: number - updated_at?: string + task_type: number + updated_at: string } export interface ModelCronForm { command?: string /** @default 0 */ - cover?: number + cover: number /** @minLength 1 */ - name?: string - notification_group_id?: number + name: string + notification_group_id: number push_successful?: boolean - scheduler?: string - servers?: number[] + scheduler: string + servers: number[] /** * 0:计划任务 1:触发任务 * @default 0 */ - task_type?: number + task_type: number } export interface ModelCycleTransferStats { - from?: string - max?: number - min?: number - name?: string - next_update?: Record - server_name?: Record - to?: string - transfer?: Record + from: string + max: number + min: number + name: string + next_update: Record + server_name: Record + to: string + transfer: Record } export interface ModelDDNSForm { access_id?: string access_secret?: string - domains?: string[] + domains: string[] enable_ipv4?: boolean enable_ipv6?: boolean /** @default 3 */ - max_retries?: number + max_retries: number /** @minLength 1 */ - name?: string - provider?: string + name: string + provider: string webhook_headers?: string /** @default 1 */ webhook_method?: number @@ -310,22 +310,22 @@ export interface ModelDDNSForm { } export interface ModelDDNSProfile { - access_id?: string - access_secret?: string - created_at?: string - domains?: string[] - enable_ipv4?: boolean - enable_ipv6?: boolean - id?: number - max_retries?: number - name?: string - provider?: string - updated_at?: string - webhook_headers?: string - webhook_method?: number - webhook_request_body?: string - webhook_request_type?: number - webhook_url?: string + access_id: string + access_secret: string + created_at: string + domains: string[] + enable_ipv4: boolean + enable_ipv6: boolean + id: number + max_retries: number + name: string + provider: string + updated_at: string + webhook_headers: string + webhook_method: number + webhook_request_body: string + webhook_request_type: number + webhook_url: string } export interface ModelForceUpdateResponse { @@ -335,186 +335,183 @@ export interface ModelForceUpdateResponse { } export interface ModelFrontendTemplate { - author?: string - is_admin?: boolean - is_official?: boolean - name?: string - path?: string - repository?: string - version?: string + author: string + is_admin: boolean + is_official: boolean + name: string + path: string + repository: string + version: string } export interface ModelGeoIP { - country_code?: string - ip?: ModelIP + country_code: string + ip: ModelIP } export interface ModelHost { - arch?: string - boot_time?: number - cpu?: string[] - disk_total?: number - gpu?: string[] - mem_total?: number - platform?: string - platform_version?: string - swap_total?: number - version?: string - virtualization?: string + arch: string + boot_time: number + cpu: string[] + disk_total: number + gpu: string[] + mem_total: number + platform: string + platform_version: string + swap_total: number + version: string + virtualization: string } export interface ModelHostState { - cpu?: number - disk_used?: number - gpu?: number[] - load_1?: number - load_15?: number - load_5?: number - mem_used?: number - net_in_speed?: number - net_in_transfer?: number - net_out_speed?: number - net_out_transfer?: number - process_count?: number - swap_used?: number - tcp_conn_count?: number - temperatures?: ModelSensorTemperature[] - udp_conn_count?: number - uptime?: number + cpu: number + disk_used: number + gpu: number[] + load_1: number + load_15: number + load_5: number + mem_used: number + net_in_speed: number + net_in_transfer: number + net_out_speed: number + net_out_transfer: number + process_count: number + swap_used: number + tcp_conn_count: number + temperatures: ModelSensorTemperature[] + udp_conn_count: number + uptime: number } export interface ModelIP { - ipv4_addr?: string - ipv6_addr?: string + ipv4_addr: string + ipv6_addr: string } export interface ModelLoginRequest { - password?: string - username?: string + password: string + username: string } export interface ModelLoginResponse { - expire?: string - token?: string + expire: string + token: string } export interface ModelNAT { - created_at?: string - domain?: string - host?: string - id?: number - name?: string - server_id?: number - updated_at?: string + created_at: string + domain: string + host: string + id: number + name: string + server_id: number + updated_at: string } export interface ModelNATForm { - domain?: string - host?: string + domain: string + host: string /** @minLength 1 */ - name?: string - server_id?: number + name: string + server_id: number } export interface ModelNotification { - created_at?: string - id?: number - name?: string - request_body?: string - request_header?: string - request_method?: number - request_type?: number - updated_at?: string - url?: string - verify_tls?: boolean + created_at: string + id: number + name: string + request_body: string + request_header: string + request_method: number + request_type: number + updated_at: string + url: string + verify_tls: boolean } export interface ModelNotificationForm { /** @minLength 1 */ - name?: string - request_body?: string - request_header?: string - request_method?: number - request_type?: number + name: string + request_body: string + request_header: string + request_method: number + request_type: number skip_check?: boolean - url?: string + url: string verify_tls?: boolean } export interface ModelNotificationGroup { - created_at?: string - id?: number - name?: string - updated_at?: string + created_at: string + id: number + name: string + updated_at: string } export interface ModelNotificationGroupForm { /** @minLength 1 */ - name?: string - notifications?: number[] + name: string + notifications: number[] } export interface ModelNotificationGroupResponseItem { - group?: ModelNotificationGroup - notifications?: number[] -} - -export interface ModelOauth2Callback { - code?: string - state?: string + group: ModelNotificationGroup + notifications: number[] } export interface ModelOauth2Config { - client_id?: string - client_secret?: string - endpoint?: ModelOauth2Endpoint - scopes?: string[] - user_id_path?: string - user_info_url?: string + client_id: string + client_secret: string + endpoint: ModelOauth2Endpoint + scopes: string[] + user_id_path: string + user_info_url: string } export interface ModelOauth2Endpoint { - auth_url?: string - token_url?: string + auth_url: string + token_url: string } export interface ModelOauth2LoginResponse { - redirect?: string + redirect: string } export interface ModelOnlineUser { - connected_at?: string - ip?: string - user_id?: number + connected_at: string + ip: string + user_id: number } export interface ModelPagination { - limit?: number - offset?: number - total?: number + limit: number + offset: number + total: number } export interface ModelProfile { - agent_secret?: string - created_at?: string - id?: number - login_ip?: string - oauth2_bind?: Record - password?: string - role?: number - updated_at?: string - username?: string + agent_secret: string + created_at: string + id: number + login_ip: string + oauth2_bind: Record + password: string + reject_password: boolean + role: number + updated_at: string + username: string } export interface ModelProfileForm { - new_password?: string - new_username?: string - original_password?: string + new_password: string + new_username: string + original_password: string + reject_password?: boolean } export interface ModelRule { /** 覆盖范围 RuleCoverAll/IgnoreAll */ - cover?: number + cover: number /** 流量统计周期 */ cycle_interval?: number /** 流量统计的开始时间 */ @@ -537,7 +534,7 @@ export interface ModelRule { * net_all_speed、transfer_in、transfer_out、transfer_all、offline * transfer_in_cycle、transfer_out_cycle、transfer_all_cycle */ - type?: string + type: string } export interface ModelSensorTemperature { @@ -546,27 +543,27 @@ export interface ModelSensorTemperature { } export interface ModelServer { - created_at?: string + created_at: string /** DDNS配置 */ ddns_profiles?: number[] /** 展示排序,越大越靠前 */ - display_index?: number + display_index: number /** 启用DDNS */ - enable_ddns?: boolean - geoip?: ModelGeoIP + enable_ddns: boolean + geoip: ModelGeoIP /** 对游客隐藏 */ - hide_for_guest?: boolean - host?: ModelHost - id?: number - last_active?: string - name?: string + hide_for_guest: boolean + host: ModelHost + id: number + last_active: string + name: string /** 管理员可见备注 */ - note?: string + note: string /** 公开备注 */ - public_note?: string - state?: ModelHostState - updated_at?: string - uuid?: string + public_note: string + state: ModelHostState + updated_at: string + uuid: string } export interface ModelServerForm { @@ -576,12 +573,12 @@ export interface ModelServerForm { * 展示排序,越大越靠前 * @default 0 */ - display_index?: number + display_index: number /** 启用DDNS */ enable_ddns?: boolean /** 对游客隐藏 */ hide_for_guest?: boolean - name?: string + name: string /** 管理员可见备注 */ note?: string /** 公开备注 */ @@ -589,95 +586,95 @@ export interface ModelServerForm { } export interface ModelServerGroup { - created_at?: string - id?: number - name?: string - updated_at?: string + created_at: string + id: number + name: string + updated_at: string } export interface ModelServerGroupForm { /** @minLength 1 */ - name?: string - servers?: number[] + name: string + servers: number[] } export interface ModelServerGroupResponseItem { - group?: ModelServerGroup - servers?: number[] + group: ModelServerGroup + servers: number[] } export interface ModelService { - cover?: number - created_at?: string - duration?: number - enable_show_in_service?: boolean - enable_trigger_task?: boolean + cover: number + created_at: string + duration: number + enable_show_in_service: boolean + enable_trigger_task: boolean /** 失败时执行的触发任务id */ - fail_trigger_tasks?: number[] - id?: number - latency_notify?: boolean - max_latency?: number - min_latency?: number - name?: string + fail_trigger_tasks: number[] + id: number + latency_notify: boolean + max_latency: number + min_latency: number + name: string /** 当前服务监控所属的通知组 ID */ - notification_group_id?: number - notify?: boolean + notification_group_id: number + notify: boolean /** 恢复时执行的触发任务id */ - recover_trigger_tasks?: number[] - skip_servers?: Record - target?: string - type?: number - updated_at?: string + recover_trigger_tasks: number[] + skip_servers: Record + target: string + type: number + updated_at: string } export interface ModelServiceForm { - cover?: number - duration?: number + cover: number + duration: number enable_show_in_service?: boolean enable_trigger_task?: boolean - fail_trigger_tasks?: number[] + fail_trigger_tasks: number[] latency_notify?: boolean /** @default 0 */ - max_latency?: number + max_latency: number /** @default 0 */ - min_latency?: number + min_latency: number /** @minLength 1 */ - name?: string - notification_group_id?: number + name: string + notification_group_id: number notify?: boolean - recover_trigger_tasks?: number[] - skip_servers?: Record - target?: string - type?: number + recover_trigger_tasks: number[] + skip_servers: Record + target: string + type: number } export interface ModelServiceInfos { - avg_delay?: number[] - created_at?: number[] - monitor_id?: number - monitor_name?: string - server_id?: number - server_name?: string + avg_delay: number[] + created_at: number[] + monitor_id: number + monitor_name: string + server_id: number + server_name: string } export interface ModelServiceResponse { - cycle_transfer_stats?: Record - services?: Record + cycle_transfer_stats: Record + services: Record } export interface ModelServiceResponseItem { - current_down?: number - current_up?: number - delay?: number[] - down?: number[] - service_name?: string - total_down?: number - total_up?: number - up?: number[] + current_down: number + current_up: number + delay: number[] + down: number[] + service_name: string + total_down: number + total_up: number + up: number[] } export interface ModelSettingForm { - cover?: number + cover: number custom_code?: string custom_code_dashboard?: string dns_servers?: string @@ -686,61 +683,62 @@ export interface ModelSettingForm { ignored_ip_notification?: string install_host?: string /** IP变更提醒的通知组 */ - ip_change_notification_group_id?: number + ip_change_notification_group_id: number /** @minLength 2 */ - language?: string + language: string /** 真实IP */ real_ip_header?: string /** @minLength 1 */ - site_name?: string + site_name: string tls?: boolean user_template?: string } export interface ModelStreamServer { - country_code?: string + country_code: string /** 展示排序,越大越靠前 */ - display_index?: number - host?: ModelHost - id?: number - last_active?: string - name?: string + display_index: number + host: ModelHost + id: number + last_active: string + name: string /** 公开备注,只第一个数据包有值 */ - public_note?: string - state?: ModelHostState + public_note: string + state: ModelHostState } export interface ModelStreamServerData { - now?: number - online?: number - servers?: ModelStreamServer[] + now: number + online: number + servers: ModelStreamServer[] } export interface ModelTerminalForm { - protocol?: string - server_id?: number + protocol: string + server_id: number } export interface ModelUser { - agent_secret?: string - created_at?: string - id?: number - password?: string - role?: number - updated_at?: string - username?: string + agent_secret: string + created_at: string + id: number + password: string + reject_password: boolean + role: number + updated_at: string + username: string } export interface ModelUserForm { - password?: string - role?: number - username?: string + password: string + role: number + username: string } export interface ModelWAFApiMock { - block_identifier?: number - block_reason?: number - block_timestamp?: number - count?: number - ip?: string + block_identifier: number + block_reason: number + block_timestamp: number + count: number + ip: string } diff --git a/src/types/authContext.ts b/src/types/authContext.ts index 84d7049..53a8d99 100644 --- a/src/types/authContext.ts +++ b/src/types/authContext.ts @@ -3,6 +3,6 @@ import { ModelProfile } from "@/types" export interface AuthContextProps { profile: ModelProfile | undefined login: (username: string, password: string) => void - loginOauth2: (provider: string, state: string, code: string) => void + loginOauth2: () => void logout: () => void }