diff --git a/apps/admin/app/dashboard/servers/form-schema/defaults.ts b/apps/admin/app/dashboard/servers/form-schema/defaults.ts index 023a4cd..774c7d2 100644 --- a/apps/admin/app/dashboard/servers/form-schema/defaults.ts +++ b/apps/admin/app/dashboard/servers/form-schema/defaults.ts @@ -10,9 +10,9 @@ export function getProtocolDefaultConfig(proto: ProtocolType) { port: null, cipher: 'chacha20-ietf-poly1305', server_key: null, - security: 'none', - host: null, - path: null, + obfs: 'none', + obfs_host: null, + obfs_path: null, sni: null, allow_insecure: null, cert_mode: 'none', diff --git a/apps/admin/app/dashboard/servers/form-schema/fields.ts b/apps/admin/app/dashboard/servers/form-schema/fields.ts index 4b45f87..bbb1a15 100644 --- a/apps/admin/app/dashboard/servers/form-schema/fields.ts +++ b/apps/admin/app/dashboard/servers/form-schema/fields.ts @@ -65,42 +65,42 @@ export const PROTOCOL_FIELDS: Record = { ].includes(p.cipher), }, { - name: 'security', + name: 'obfs', type: 'select', - label: 'security', - options: SECURITY.shadowsocks, + label: 'obfs', + options: ['none', 'http', 'tls'], defaultValue: 'none', - group: 'security', + group: 'obfs', }, { - name: 'host', + name: 'obfs_host', type: 'input', label: 'host', placeholder: 'e.g. www.bing.com', - group: 'security', - condition: (p) => p.security && p.security !== 'none', + group: 'obfs', + condition: (p) => p.obfs && p.obfs !== 'none', }, { - name: 'path', + name: 'obfs_path', type: 'input', label: 'path', placeholder: 'e.g. /path/to/obfs', - group: 'security', - condition: (p) => p.security && p.security !== 'none', + group: 'obfs', + condition: (p) => p.obfs && p.obfs !== 'none', }, { name: 'sni', type: 'input', label: 'security_sni', group: 'security', - condition: (p) => p.security === 'tls', + condition: (p) => p.obfs === 'tls', }, { name: 'allow_insecure', type: 'switch', label: 'security_allow_insecure', group: 'security', - condition: (p) => p.security === 'tls', + condition: (p) => p.obfs === 'tls', }, { name: 'cert_mode', @@ -109,7 +109,7 @@ export const PROTOCOL_FIELDS: Record = { options: CERT_MODES, defaultValue: 'none', group: 'security', - condition: (p) => p.security === 'tls', + condition: (p) => p.obfs === 'tls', }, { name: 'cert_dns_provider', @@ -117,7 +117,7 @@ export const PROTOCOL_FIELDS: Record = { label: 'cert_dns_provider', placeholder: 'e.g. cloudflare, aliyun', group: 'security', - condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', + condition: (p) => p.obfs === 'tls' && p.cert_mode === 'dns', }, { name: 'cert_dns_env', @@ -126,7 +126,7 @@ export const PROTOCOL_FIELDS: Record = { placeholder: 'CF_DNS_API_TOKEN=1234567890abcdefghijklmnopqrstuvwxyz\nALI_ACCESS_KEY_ID=your_access_key_id\nALI_ACCESS_KEY_SECRET=your_access_key_secret', group: 'security', - condition: (p) => p.security === 'tls' && p.cert_mode === 'dns', + condition: (p) => p.obfs === 'tls' && p.cert_mode === 'dns', }, ], vmess: [ diff --git a/apps/admin/app/dashboard/servers/form-schema/schemas.ts b/apps/admin/app/dashboard/servers/form-schema/schemas.ts index 343c869..0a5b2db 100644 --- a/apps/admin/app/dashboard/servers/form-schema/schemas.ts +++ b/apps/admin/app/dashboard/servers/form-schema/schemas.ts @@ -26,9 +26,9 @@ const ss = z.object({ port: nullablePort, cipher: z.enum(SS_CIPHERS).nullish(), server_key: nullableString, - security: z.enum(SECURITY.shadowsocks).nullish(), - host: nullableString, - path: nullableString, + obfs: z.enum(['none', 'http', 'tls'] as const).nullish(), + obfs_host: nullableString, + obfs_path: nullableString, cert_mode: z.enum(CERT_MODES).nullish(), cert_dns_provider: nullableString, cert_dns_env: nullableString, diff --git a/apps/admin/app/dashboard/servers/page.tsx b/apps/admin/app/dashboard/servers/page.tsx index 158eb77..333e1d6 100644 --- a/apps/admin/app/dashboard/servers/page.tsx +++ b/apps/admin/app/dashboard/servers/page.tsx @@ -245,7 +245,7 @@ export default function ServersPage() { key='edit' trigger={t('edit')} title={t('drawerEditTitle')} - initialValues={row as any} + initialValues={row} loading={loading} onSubmit={async (values) => { setLoading(true); diff --git a/apps/admin/app/dashboard/servers/server-config.tsx b/apps/admin/app/dashboard/servers/server-config.tsx index 118fded..6daa898 100644 --- a/apps/admin/app/dashboard/servers/server-config.tsx +++ b/apps/admin/app/dashboard/servers/server-config.tsx @@ -44,30 +44,31 @@ import { toast } from 'sonner'; import { z } from 'zod'; const dnsConfigSchema = z.object({ - proto: z.enum(['tcp', 'udp', 'tls', 'https', 'quic']), + proto: z.string(), // z.enum(['tcp', 'udp', 'tls', 'https', 'quic']), address: z.string(), domains: z.array(z.string()), }); const outboundConfigSchema = z.object({ name: z.string(), - protocol: z.enum([ - 'http', - 'https', - 'socks5', - 'shadowsocks', - 'vmess', - 'vless', - 'trojan', - 'hysteria2', - 'tuic', - 'naive', - 'brook', - 'snell', - 'wireguard', - 'direct', - 'reject', - ]), + protocol: z.string(), + // z.enum([ + // 'http', + // 'https', + // 'socks5', + // 'shadowsocks', + // 'vmess', + // 'vless', + // 'trojan', + // 'hysteria2', + // 'tuic', + // 'naive', + // 'brook', + // 'snell', + // 'wireguard', + // 'direct', + // 'reject', + // ]), address: z.string(), port: z.number(), password: z.string().optional(), @@ -120,11 +121,11 @@ export default function ServerConfig() { node_secret: cfgResp.node_secret ?? '', node_pull_interval: cfgResp.node_pull_interval as number | undefined, node_push_interval: cfgResp.node_push_interval as number | undefined, - traffic_report_threshold: (cfgResp as any).traffic_report_threshold as number | undefined, - ip_strategy: (cfgResp as any).ip_strategy as 'prefer_ipv4' | 'prefer_ipv6' | undefined, - dns: (cfgResp as any).dns || [], - block: (cfgResp as any).block || [], - outbound: (cfgResp as any).outbound || [], + traffic_report_threshold: cfgResp.traffic_report_threshold as number | undefined, + ip_strategy: cfgResp.ip_strategy as 'prefer_ipv4' | 'prefer_ipv6' | undefined, + dns: cfgResp.dns || [], + block: cfgResp.block || [], + outbound: cfgResp.outbound || [], }); } }, [cfgResp, form]); @@ -355,16 +356,12 @@ export default function ServerConfig() { domains: Array.isArray(item.domains) ? item.domains.join('\n') : '', }))} onChange={(values) => { - // 转换 domains 字符串为数组 const converted = values.map((item: any) => ({ proto: item.proto, address: item.address, domains: typeof item.domains === 'string' - ? item.domains - .split('\n') - .map((d: string) => d.trim()) - .filter(Boolean) + ? item.domains.split('\n').map((d: string) => d.trim()) : item.domains || [], })); field.onChange(converted); @@ -446,7 +443,6 @@ export default function ServerConfig() { rules: Array.isArray(item.rules) ? item.rules.join('\n') : '', }))} onChange={(values) => { - // 转换 rules 字符串为数组 const converted = values.map((item: any) => ({ name: item.name, protocol: item.protocol, @@ -455,10 +451,7 @@ export default function ServerConfig() { password: item.password, rules: typeof item.rules === 'string' - ? item.rules - .split('\n') - .map((r: string) => r.trim()) - .filter(Boolean) + ? item.rules.split('\n').map((r: string) => r.trim()) : item.rules || [], })); field.onChange(converted); @@ -482,10 +475,7 @@ export default function ServerConfig() { placeholder={t('server_config.fields.block_rules_placeholder')} value={(field.value || []).join('\n')} onChange={(e) => { - const lines = e.target.value - .split('\n') - .map((line) => line.trim()) - .filter(Boolean); + const lines = e.target.value.split('\n').map((line) => line.trim()); field.onChange(lines); }} rows={10} diff --git a/apps/admin/app/dashboard/user/user-form.tsx b/apps/admin/app/dashboard/user/user-form.tsx index 2a4d750..3f71fde 100644 --- a/apps/admin/app/dashboard/user/user-form.tsx +++ b/apps/admin/app/dashboard/user/user-form.tsx @@ -170,6 +170,7 @@ export default function UserForm>({ {t('password')} { diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index 7dbb5b1..7a9b815 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -1350,6 +1350,26 @@ declare namespace API { node_secret: string; node_pull_interval: number; node_push_interval: number; + traffic_report_threshold: number; + ip_strategy: string; + dns: NodeDNS[]; + block: string[]; + outbound: NodeOutbound[]; + }; + + type NodeDNS = { + proto: string; + address: string; + domains: string[]; + }; + + type NodeOutbound = { + name: string; + protocol: string; + address: string; + port: number; + password: string; + rules: string[]; }; type NodeRelay = { @@ -1554,6 +1574,14 @@ declare namespace API { encryption_client_padding?: string; /** encryption password */ encryption_password?: string; + /** Traffic ratio, default is 1 */ + ratio?: number; + /** Certificate mode, `none`|`http`|`dns`|`self` */ + cert_mode?: string; + /** DNS provider for certificate */ + cert_dns_provider?: string; + /** Environment for DNS provider */ + cert_dns_env?: string; }; type PubilcRegisterConfig = { diff --git a/apps/admin/services/common/oauth.ts b/apps/admin/services/common/oauth.ts index 5a05d94..17e493f 100644 --- a/apps/admin/services/common/oauth.ts +++ b/apps/admin/services/common/oauth.ts @@ -1,5 +1,5 @@ // @ts-ignore - +/* eslint-disable */ import request from '@/utils/request'; /** Apple Login Callback POST /v1/auth/oauth/callback/apple */ diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index 3fcee7f..7a5c186 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -363,6 +363,26 @@ declare namespace API { node_secret: string; node_pull_interval: number; node_push_interval: number; + traffic_report_threshold: number; + ip_strategy: string; + dns: NodeDNS[]; + block: string[]; + outbound: NodeOutbound[]; + }; + + type NodeDNS = { + proto: string; + address: string; + domains: string[]; + }; + + type NodeOutbound = { + name: string; + protocol: string; + address: string; + port: number; + password: string; + rules: string[]; }; type NodeRelay = { @@ -562,6 +582,14 @@ declare namespace API { encryption_client_padding?: string; /** encryption password */ encryption_password?: string; + /** Traffic ratio, default is 1 */ + ratio?: number; + /** Certificate mode, `none`|`http`|`dns`|`self` */ + cert_mode?: string; + /** DNS provider for certificate */ + cert_dns_provider?: string; + /** Environment for DNS provider */ + cert_dns_env?: string; }; type PubilcRegisterConfig = { diff --git a/apps/user/app/(main)/(user)/dashboard/content.tsx b/apps/user/app/(main)/(user)/dashboard/content.tsx index 732e688..7100cad 100644 --- a/apps/user/app/(main)/(user)/dashboard/content.tsx +++ b/apps/user/app/(main)/(user)/dashboard/content.tsx @@ -225,7 +225,6 @@ export default function Content() { {Array.from({ length: 16 }).map((_, i) => { const row = Math.floor(i / 4); const col = i % 4; - // 计算位置百分比 const top = 10 + row * 25 + (col % 2 === 0 ? 5 : -5); const left = 5 + col * 30 + (row % 2 === 0 ? 0 : 10); diff --git a/apps/user/components/subscribe/duration-selector.tsx b/apps/user/components/subscribe/duration-selector.tsx index 666d9c6..51977fc 100644 --- a/apps/user/components/subscribe/duration-selector.tsx +++ b/apps/user/components/subscribe/duration-selector.tsx @@ -39,7 +39,6 @@ const DurationSelector: React.FC = ({ ); - // 查找当前选中项的折扣信息 const currentDiscount = discounts?.find((item) => item.quantity === quantity)?.discount; const discountPercentage = currentDiscount ? 100 - currentDiscount : 0; diff --git a/apps/user/components/subscribe/renewal.tsx b/apps/user/components/subscribe/renewal.tsx index 97479ea..c6e547e 100644 --- a/apps/user/components/subscribe/renewal.tsx +++ b/apps/user/components/subscribe/renewal.tsx @@ -52,7 +52,6 @@ export default function Renewal({ id, subscribe }: Readonly) { subscribe_id: subscribe.id, } as API.PurchaseOrderRequest); const result = data.data; - // 请求成功时保存数据 if (result) { lastSuccessOrderRef.current = result; } diff --git a/apps/user/services/common/oauth.ts b/apps/user/services/common/oauth.ts index 5a05d94..17e493f 100644 --- a/apps/user/services/common/oauth.ts +++ b/apps/user/services/common/oauth.ts @@ -1,5 +1,5 @@ // @ts-ignore - +/* eslint-disable */ import request from '@/utils/request'; /** Apple Login Callback POST /v1/auth/oauth/callback/apple */ diff --git a/apps/user/services/common/typings.d.ts b/apps/user/services/common/typings.d.ts index 3fcee7f..7a5c186 100644 --- a/apps/user/services/common/typings.d.ts +++ b/apps/user/services/common/typings.d.ts @@ -363,6 +363,26 @@ declare namespace API { node_secret: string; node_pull_interval: number; node_push_interval: number; + traffic_report_threshold: number; + ip_strategy: string; + dns: NodeDNS[]; + block: string[]; + outbound: NodeOutbound[]; + }; + + type NodeDNS = { + proto: string; + address: string; + domains: string[]; + }; + + type NodeOutbound = { + name: string; + protocol: string; + address: string; + port: number; + password: string; + rules: string[]; }; type NodeRelay = { @@ -562,6 +582,14 @@ declare namespace API { encryption_client_padding?: string; /** encryption password */ encryption_password?: string; + /** Traffic ratio, default is 1 */ + ratio?: number; + /** Certificate mode, `none`|`http`|`dns`|`self` */ + cert_mode?: string; + /** DNS provider for certificate */ + cert_dns_provider?: string; + /** Environment for DNS provider */ + cert_dns_env?: string; }; type PubilcRegisterConfig = { diff --git a/apps/user/services/user/typings.d.ts b/apps/user/services/user/typings.d.ts index 9bbdda5..5fc016b 100644 --- a/apps/user/services/user/typings.d.ts +++ b/apps/user/services/user/typings.d.ts @@ -378,6 +378,26 @@ declare namespace API { node_secret: string; node_pull_interval: number; node_push_interval: number; + traffic_report_threshold: number; + ip_strategy: string; + dns: NodeDNS[]; + block: string[]; + outbound: NodeOutbound[]; + }; + + type NodeDNS = { + proto: string; + address: string; + domains: string[]; + }; + + type NodeOutbound = { + name: string; + protocol: string; + address: string; + port: number; + password: string; + rules: string[]; }; type NodeRelay = { @@ -601,6 +621,14 @@ declare namespace API { encryption_client_padding?: string; /** encryption password */ encryption_password?: string; + /** Traffic ratio, default is 1 */ + ratio?: number; + /** Certificate mode, `none`|`http`|`dns`|`self` */ + cert_mode?: string; + /** DNS provider for certificate */ + cert_dns_provider?: string; + /** Environment for DNS provider */ + cert_dns_env?: string; }; type PubilcRegisterConfig = {