mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-11-12 21:44:22 +08:00
576 lines
85 KiB
JSON
576 lines
85 KiB
JSON
{
|
||
"runtime": {
|
||
"api_documentation_cb3d2229": "API 接口文档",
|
||
"openflare_provides_a_simple_powerful_api_for_ba400468": "OpenFlare 提供简单、强大的 API 接口,支持多种编程语言和开发环境。通过标准化的 RESTful 接口,您可以轻松地与后端服务进行集成与二次开发。",
|
||
"platform_user_guide_d0ead991": "平台使用指南",
|
||
"welcome_to_the_openflare_management_platform_this_e8ecbe4d": "欢迎使用 OpenFlare 管理平台。本文档将引导您快速了解平台的核心组件、角色权限设计及二次开发流程,帮助您快速上手开发。",
|
||
"privacy_policy_b6da1ca6": "隐私政策 (Privacy)",
|
||
"we_value_your_privacy_this_policy_explains_2c9e3c0b": "我们非常重视您的隐私保护。本政策将向您透明地展示我们如何收集、使用、存储您的个人信息,",
|
||
"and_the_rights_you_have_over_it_4560abf2": "以及您享有的相关权利。",
|
||
"terms_of_service_4e80a140": "服务协议 (Terms)",
|
||
"please_read_the_following_terms_carefully_to_c46a6a61": "为了保障您的合法权益,请您仔细阅读以下条款。",
|
||
"use_1b3d699e": ":使用",
|
||
"or_07d4e3c0": "(或",
|
||
"place_the_lucide_icon_directly_inside_the_104f794c": ":直接将 Lucide 图标组件嵌套于标题容器中,应用",
|
||
"use_only_5e12eecb": ":文本使用且仅使用",
|
||
"for_pages_with_multiple_tabs_keep_each_5f721959": ":凡是带有多个 Tab 页切换的页面,**禁止**将所有 Tab 的渲染代码堆积在同一个物理页面主文件内。每个 Tab 页对应的 Content 必须单独拆分为独立组件文件(如",
|
||
"beyond_tabs_when_a_page_exceeds_600_d152cfdc": ":不仅是 Tabs 切换,当一个页面代码行数超过 600",
|
||
"message_18ab4763": ") 的",
|
||
"and_de1d5dd0": "与",
|
||
"inputs_fabee312": "输入框 (",
|
||
"and_selectors_e4875cdf": ") 与下拉选择器 (",
|
||
"should_share_the_compact_height_f1fe2218": ") 的高度应统一限制为小号高度",
|
||
"with_font_size_e7c29991": ",字体大小使用",
|
||
"and_use_ca398a12": ",并使用",
|
||
"to_remove_overlapping_native_shadows_dd65b475": "去除原生的重叠阴影。",
|
||
"align_checkboxes_toward_the_top_left_using_092dcef0": "Checkbox 应在左侧垂直偏上对齐,使用容器",
|
||
"add_bf15da3a": "排列。Checkbox 组件本身添加",
|
||
"to_the_checkbox_so_multiline_descriptions_stay_1bb85c4b": ",从而在多行描述文本的情况下依然保持良好的顶对齐,避免出现居中对齐导致的凌乱感。",
|
||
"use_the_default_primary_or_secondary_db7513e5": "普通主表单及新增/保存按钮,一律使用默认 Primary 按钮或次要",
|
||
"button_for_forms_and_create_save_actions_a657dba8": "按钮,小号高度统一采用",
|
||
"outline_buttons_must_include_the_66ace005": "。线框按钮必须带有",
|
||
"class_43eff5ff": "类。",
|
||
"1_align_label_and_input_32d4558d": "// 1. Label 与 Input 对齐",
|
||
"div_classname_space_y_1_5_label_32230ad7": "<div className=\"space-y-1.5\">\n <Label htmlFor=\"id\" className=\"text-xs font-medium text-foreground\">标题</Label>\n <Input id=\"id\" className=\"h-8 text-xs shadow-none\" />\n</div>",
|
||
"2_align_checkbox_to_the_top_bdf68ad8": "// 2. Checkbox 顶对齐",
|
||
"div_classname_flex_items_start_gap_2_ccf0d526": "<div className=\"flex items-start gap-2.5\">\n <Checkbox id=\"c\" className=\"mt-0.5\" />\n <div className=\"grid gap-1\">\n <label htmlFor=\"c\" className=\"text-xs font-medium leading-none\">标题</label>\n <p className=\"text-[10px] text-muted-foreground\">多行说明内容</p>\n </div>\n</div>",
|
||
"card_classname_border_dashed_shadow_none_cardheader_35727acf": "<Card className=\"border-dashed shadow-none\">\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">指标标题</span>\n <Cpu className=\"size-4 text-primary\" />\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"text-2xl font-semibold tracking-tight\">42.8 %</div>\n <Progress value={42.8} className=\"h-1.5\" />\n <p className=\"text-[10px] text-muted-foreground\">状态说明小字</p>\n </CardContent>\n</Card>",
|
||
"div_classname_border_border_dashed_shadow_none_b430b520": "<div className=\"border border-dashed shadow-none rounded-lg overflow-hidden bg-background\">\n <Table>\n <TableHeader className=\"bg-muted/40\">\n <TableRow className=\"border-dashed hover:bg-transparent\">\n <TableHead className=\"text-xs font-semibold\">编号</TableHead>\n <TableHead className=\"text-xs font-semibold\">状态</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow className=\"border-dashed hover:bg-muted/10 transition-colors\">\n <TableCell className=\"font-mono text-xs\">ID-1001</TableCell>\n <TableCell>\n <Badge variant=\"outline\" className=\"text-[10px] bg-emerald-500/10 border-emerald-500/20 text-emerald-600 rounded-full py-0 px-2\">\n <span className=\"size-1 bg-emerald-500 rounded-full mr-1.5 shrink-0\" />\n 成功\n </Badge>\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n</div>",
|
||
"disabled_f95ea7f4": "未启用",
|
||
"title_administrator_login_alert_content_administrator_user_6f32cf7c": "{\"title\": \"管理员登录提醒\", \"content\": \"管理员 {{user.username}} ...\", \"level\": \"INFO\"}",
|
||
"lark_webhook_c2e0b312": "飞书 Webhook",
|
||
"title_content_view_details_url_7af4b7d5": "### $title\n$content\n\n[查看详情]($url)",
|
||
"dingtalk_group_bot_5d8efec9": "钉钉群机器人",
|
||
"wecom_group_bot_138ea7a8": "企业微信群机器人",
|
||
"under_development_78c33fbf": "开发中",
|
||
"this_feature_is_being_migrated_and_developed_61ebaf78": "该功能正在迁移开发中,敬请期待。",
|
||
"port_for_the_built_in_frps_web_cfab540f": "FRPS 内置 Web 管理界面端口",
|
||
"request_failed_please_try_again_later_8977b79a": "请求失败,请稍后重试。",
|
||
"operation_failed_0c3b4cf7": "操作失败",
|
||
"automatic_configuration_must_be_a_json_object_90ba17a4": "自动配置必须是 JSON 对象。",
|
||
"high_frequency_404_scan_from_one_ip_f7d27ffb": "单 IP 404 高频扫描",
|
||
"abnormal_direct_access_from_one_ip_732dbeee": "单 IP 直连访问异常",
|
||
"permanent_3e71ccc8": "永久",
|
||
"expired_2fe0e333": "已过期",
|
||
"in_value0_minutes_fd2a5b53": "{value0} 分钟后",
|
||
"in_value0_hours_5ca37144": "{value0} 小时后",
|
||
"node_2410d860": "节点",
|
||
"edge_099db313": "边",
|
||
"edge_s_id_74f6affc": "边(?:\\s+ID)?",
|
||
"value0_s_value1_s_40960c98": "{value0}\\s+{value1}(?=$|[\\s,。,::的])",
|
||
"rule_graph_schema_version_must_be_1_ea9a1161": "规则图 schema_version 必须为 1",
|
||
"rule_graph_exceeds_the_size_limit_337651b9": "规则图超过大小限制",
|
||
"node_id_must_not_be_empty_51a5de58": "节点 ID 不能为空",
|
||
"duplicate_node_id_value0_621230af": "节点 ID {value0} 重复",
|
||
"edge_id_must_not_be_empty_bc8f69cb": "连线 ID 不能为空",
|
||
"duplicate_edge_id_value0_0a9d1c7c": "连线 ID {value0} 重复",
|
||
"the_start_node_must_not_have_incoming_50a07b17": "开始节点不能有入边",
|
||
"the_rule_graph_must_contain_exactly_one_7dfbc027": "规则图必须恰好有一个开始节点",
|
||
"the_rule_graph_must_contain_exactly_one_0036eb82": "规则图必须恰好有一个通过节点",
|
||
"edge_value0_has_an_invalid_endpoint_or_9d84eb7e": "连线 {value0} 的端点或出口无效",
|
||
"node_value0_output_value1_is_not_connected_c3038e81": "节点 {value0} 的 {value1} 出口未连接",
|
||
"node_value0_output_value1_can_only_be_903e54ce": "节点 {value0} 的 {value1} 出口只能连接一次",
|
||
"node_value0_is_unreachable_from_the_start_086531dc": "节点 {value0} 无法从开始节点到达",
|
||
"node_value0_cannot_reach_a_terminal_node_8de2ff6e": "节点 {value0} 无法抵达终止节点",
|
||
"the_rule_graph_must_not_contain_cycles_fd6fe797": "规则图不能包含循环",
|
||
"node_value0_contains_an_invalid_ip_address_1873ab94": "节点 {value0} 包含无效 IP",
|
||
"node_value0_contains_an_invalid_cidr_00c880d9": "节点 {value0} 包含无效 CIDR",
|
||
"node_value0_contains_an_invalid_ip_group_589219a5": "节点 {value0} 包含无效 IP 组",
|
||
"node_value0_contains_an_invalid_geography_code_1a9f469b": "节点 {value0} 包含无效地域代码",
|
||
"node_value0_has_pow_settings_outside_the_9fd2a4cb": "节点 {value0} 的 PoW 配置超出范围",
|
||
"node_value0_has_invalid_block_response_settings_ae4c35ca": "节点 {value0} 的阻止响应配置无效",
|
||
"node_value0_match_mode_must_be_and_242c1ae7": "节点 {value0} 的匹配模式必须为 and 或 or",
|
||
"node_value0_contains_an_invalid_browser_tag_4d0e6740": "节点 {value0} 包含无效浏览器标签",
|
||
"node_value0_contains_an_invalid_operating_system_45bea1fb": "节点 {value0} 包含无效操作系统标签",
|
||
"node_value0_allows_at_most_32_custom_497938c6": "节点 {value0} 的自定义 UA 正则不能超过 32 条",
|
||
"node_value0_custom_ua_pattern_must_not_a72718be": "节点 {value0} 的自定义 UA 正则不能为空",
|
||
"node_value0_custom_ua_pattern_is_too_c2c83c0e": "节点 {value0} 的自定义 UA 正则过长",
|
||
"node_value0_has_an_invalid_custom_ua_c47ffd0d": "节点 {value0} 的自定义 UA 正则无效",
|
||
"node_value0_requires_at_least_one_pattern_6114bb93": "节点 {value0} 开启屏蔽自定义 UA 时至少需要一条正则",
|
||
"start_d2bb025a": "开始",
|
||
"ip_match_43f4b6d4": "IP 匹配",
|
||
"geography_match_9acb08c4": "地域匹配",
|
||
"ua_check_b56dac23": "UA 检查",
|
||
"security_checks_e09822e6": "安全防护",
|
||
"pow_challenge_3c043088": "PoW 挑战",
|
||
"allow_1e9f2561": "通过",
|
||
"block_2a366d09": "阻止",
|
||
"wechat_81b430b6": "微信",
|
||
"wildcard_c6b0739e": "通配符",
|
||
"exact_match_391fe725": "精确匹配",
|
||
"value0_expires_value1_7d8600f8": "{value0}(到期:{value1})",
|
||
"sorry_the_page_you_requested_seems_to_ba66cd83": "抱歉,您访问的页面似已迷失在数字星云中。",
|
||
"check_the_path_or_return_to_safety_b1f31888": "请检查路径或返回安全地带。",
|
||
"previous_c9b9ae7a": "上一页",
|
||
"home_203c08e0": "首页",
|
||
"1_api_conventions_and_authentication_e6d4df61": "1. 接口规范与鉴权说明",
|
||
"standard_api_request_conventions_and_developer_access_39eb956e": "平台统一接口调用格式规范以及开发者访问令牌鉴权方式说明",
|
||
"1_1_standard_response_format_5cddae2f": "1.1 统一响应格式",
|
||
"all_api_endpoints_use_a_standard_json_87c92fb0": "系统所有 API 接口均遵循标准 JSON 响应结构:",
|
||
"field_49ecd0e3": "字段",
|
||
"type_ba40014f": "类型",
|
||
"description_4262c45d": "说明",
|
||
"error_message_empty_on_success_contains_error_d89d457f": "错误信息。请求成功时为空字符串 `\"\"`,失败时包含错误详情描述。",
|
||
"the_response_payload_null_when_the_request_97b8b29c": "接口返回的具体数据内容。请求失败或无数据返回时为 `null`。",
|
||
"successful_response_example_8917e853": "成功响应示例:",
|
||
"failed_response_example_eae899e1": "失败响应示例:",
|
||
"error_msg_incorrect_password_data_null_b2eccc86": "{\n \"error_msg\": \"用户密码错误\",\n \"data\": null\n}",
|
||
"1_2_authentication_methods_3c5db38a": "1.2 鉴权方式",
|
||
"protected_endpoints_require_credentials_except_public_endpoints_1fa0a24c": "除了公共公开接口(如登录、注册、配置)外,受保护的接口需要携带凭证才能正常访问:",
|
||
"session_credentials_de72024d": "Session 凭证:",
|
||
"browser_clients_can_stay_signed_in_using_f316279b": "浏览器环境下支持利用常规 Session Cookie 会话保持登录。",
|
||
"access_tokens_8de23550": "AccessToken 令牌:",
|
||
"for_backend_calls_and_third_party_integrations_dfd8bf0f": "供后台调用或第三方应用集成使用。客户端生成 API 访问令牌后,需要在请求头(Request Header)中携带以进行身份校验。",
|
||
"use_either_of_the_following_request_headers_1e03b04b": "支持携带令牌的请求头格式(二选一):",
|
||
"2_user_and_authentication_endpoints_4a89d429": "2. 用户与认证接口",
|
||
"2_1_user_registration_4f332f85": "2.1 用户注册",
|
||
"endpoint_79a2369a": "接口:",
|
||
"description_3e633a20": "说明:",
|
||
"register_a_local_account_when_registration_is_938891dc": "注册本地账户(在后台注册开关开启状态下)。",
|
||
"parameter_9634fb08": "参数",
|
||
"required_11da9dc4": "必填",
|
||
"yes_b5141d3d": "是",
|
||
"username_must_be_unique_and_contain_no_e81c1e5c": "用户名,必须唯一且无空格。",
|
||
"password_at_least_8_characters_37cdc807": "密码,长度必须大于等于 8 位。",
|
||
"no_0c70665b": "否",
|
||
"nickname_defaults_to_the_username_when_omitted_676aae7e": "昵称。未传时默认与用户名一致。",
|
||
"2_2_password_login_271483ba": "2.2 密码登录",
|
||
"authenticate_with_a_username_and_password_establishing_a38ff252": "通过常规用户名密码进行登录校验,成功后建立 Session Cookie 会话。",
|
||
"username_1a3f0617": "用户名",
|
||
"password_a621ab60": "密码",
|
||
"2_3_sign_out_3252611d": "2.3 退出登录",
|
||
"delete_the_current_session_cookie_and_sign_c213ffd9": "销毁当前会话 Cookie 并退出登录状态。",
|
||
"2_4_get_profile_7b96110a": "2.4 获取个人资料",
|
||
"get_the_signed_in_account_s_basic_b0eb8cfa": "获取当前登录账户的基本数据模型(包含 ID、角色、昵称等)。",
|
||
"3_personal_access_token_endpoints_989f5d7c": "3. 个人访问令牌 (AccessToken) 接口",
|
||
"access_token_management_requires_a_session_login_42d91543": "AccessToken 管理相关接口均要求通过 Session 登录后调用,支持普通用户权限。",
|
||
"3_1_list_tokens_9840c227": "3.1 获取令牌列表",
|
||
"list_the_current_user_s_tokens_with_c34d2210": "查询当前用户已创建的所有令牌详情(令牌明文已被脱敏)。",
|
||
"3_2_create_an_access_token_e53bd784": "3.2 新建访问令牌",
|
||
"parameters_ba89685c": "参数:",
|
||
"name_token_name_is_admin_false_4f3e4868": "{\"name\": \"token名称\", \"is_admin\": false}",
|
||
"generate_an_access_token_the_response_includes_70552390": "生成一个全新访问令牌。返回体中包含一次性明文 Token,切勿遗失。",
|
||
"optional_default_210b9d8f": "(可选,默认",
|
||
"grant_administrator_privileges_to_the_token_only_2292cad8": "):是否赋予令牌管理员权限,仅管理员用户可设置。非管理员令牌无法访问",
|
||
"endpoints_815c88e5": " 端点。",
|
||
"successful_response_example_7783a39c": "成功返回样例:",
|
||
"3_3_revoke_delete_a_token_ae510f58": "3.3 撤销/删除令牌",
|
||
"permanently_delete_a_token_by_id_immediately_145287f6": "通过 ID 物理删除对应访问令牌,该令牌将立即失效。",
|
||
"3_4_rotate_a_token_secret_79209983": "3.4 轮换令牌密钥",
|
||
"replace_a_token_s_secret_and_return_d2caca89": "轮换指定令牌的物理密钥值。系统将废弃原有密钥,返回新生成的明文 Token,令牌名称与 ID 保持一致。",
|
||
"4_public_configuration_and_administration_17ebdbd5": "4. 公共配置与管理接口",
|
||
"4_1_public_system_configuration_2be912e4": "4.1 公共系统配置",
|
||
"get_publicly_visible_configuration_keys_and_values_bc7bff66": "无感获取当前系统配置表中公共可见的键值集合。供前端页面动态渲染使用。",
|
||
"response_example_d3087445": "返回数据结构样例:",
|
||
"4_2_system_configuration_crud_administrator_2ce66c8b": "4.2 系统配置项 CRUD (管理员)",
|
||
"manage_system_configs_dynamically_through_an_administrator_acdcdb99": "用于在后台对 `system_configs` 配置进行动态变更,要求管理员权限会话调用。",
|
||
"list_configuration_3d58680b": "获取配置列表:",
|
||
"create_a_configuration_entry_1d995264": "新建配置项:",
|
||
"update_a_configuration_value_2a0b0b76": "修改指定配置值:",
|
||
"delete_a_configuration_entry_1b77a6ea": "删除配置项:",
|
||
"1_quick_start_ef8fbb58": "1. 快速开始",
|
||
"a_guide_to_the_general_purpose_full_9cd8c987": "为开发者提供通用全栈开发脚手架 (Boilerplate) 平台使用说明",
|
||
"architecture_e992b65c": "架构底座:",
|
||
"go_gin_gorm_redis_asynq_backend_react_d5fe02d3": "Go (Gin + GORM + Redis + Asynq) 后端 + React (Next.js 16 + Tailwind CSS 4 + Shadcn UI) 前端",
|
||
"authentication_d36b345b": "认证体系:",
|
||
"local_username_password_registration_and_login_plus_583ab638": "支持本地常规账号密码注册登录 + 第三方自定义 OIDC (OAuth2) 认证源绑定",
|
||
"access_tokens_b7b856d3": "访问令牌:",
|
||
"personal_developer_access_tokens_api_keys_for_4b407149": "提供开发者个人 AccessToken (API Key),用于通过 Http Header 鉴权直接调用系统 API",
|
||
"observability_ea0cc1bf": "可观测性:",
|
||
"zap_structured_logging_and_opentelemetry_distributed_tracing_9fd6da9f": "集成 Zap 结构化日志与 OpenTelemetry 全链路 Tracing 追踪",
|
||
"2_authentication_and_security_settings_76967059": "2. 身份认证与安全设置",
|
||
"the_platform_combines_authentication_methods_to_support_bc9f1772": "平台采用混合式身份认证,满足不同的部署和业务场景需求:",
|
||
"2_1_username_and_password_authentication_97184f8f": "2.1 常规账号密码认证",
|
||
"registration_and_password_login_c5bd6cb4": "自主注册与密码登录:",
|
||
"users_can_register_and_create_sessions_with_21883e04": "支持普通用户通过用户名及密码直接进行注册与会话建立,密码在后端采用",
|
||
"salted_hashing_dc2a9b63": "高强度加盐哈希存储。",
|
||
"system_switches_53741557": "系统开关控制:",
|
||
"administrators_can_disable_password_registration_or_login_a2648e62": "管理员可在后台配置动态开关,随时禁用自主密码注册或密码登录,以转为纯第三方认证模式。",
|
||
"2_2_third_party_oidc_providers_f14083c8": "2.2 第三方 OIDC 认证源",
|
||
"users_can_link_external_accounts_from_their_c08d3f5a": "用户可以在个人资料页面关联绑定外部授权账户:",
|
||
"open_4540d74d": "进入 ",
|
||
"settings_profile_32835b0d": "设置 / 个人资料",
|
||
"message_a173cce8": " 页面。",
|
||
"under_linked_accounts_view_existing_connections_or_5151eb9b": "在“第三方账号绑定”栏目下查看当前绑定的账号,或点击未绑定的可用 OIDC 认证源直接触发 OAuth2 绑定流。",
|
||
"after_linking_use_the_oidc_login_button_6095b15d": "绑定成功后,用户在登录界面可直接点击 OIDC 登录按钮实现快捷跳转。",
|
||
"3_integrating_personal_access_tokens_af2647b5": "3. 个人访问令牌 (AccessToken) 接口对接",
|
||
"personal_access_tokens_allow_developers_and_third_9a242a0e": "为便于开发者或第三方工具直接调用系统 API,平台提供个人访问令牌管理功能。",
|
||
"3_1_token_generation_and_storage_2b78c681": "3.1 令牌生成与存储规范",
|
||
"one_time_plaintext_display_fd13912a": "一次性明文展示:",
|
||
"a_newly_generated_plaintext_token_such_as_57eb11a1": "创建令牌时生成的随机明文 Token 值 (形如",
|
||
"is_displayed_only_once_copy_and_save_8d378c8a": ") 仅会在弹窗中展示一次。请立即复制保存,关闭弹窗后系统将无法重新获取。",
|
||
"secure_hash_storage_1ce392ff": "安全哈希存储:",
|
||
"only_a_sha_256_hash_of_the_dbf434b1": "数据库仅存储 Token 的 SHA-256 哈希指纹,即使数据库泄漏,攻击者也无法通过摘要逆向恢复令牌原文。",
|
||
"3_2_calling_apis_with_headers_fccd7b0d": "3.2 携带 Header 进行 API 调用",
|
||
"use_your_saved_plaintext_token_with_either_3af53a05": "您可以凭借保存的明文 Token 随时调用系统开放接口,系统认证支持以下两种 Http 请求头携带方式之一:",
|
||
"method_1_authorization_bearer_header_2a9c2a6c": "方式一:Authorization Bearer 头",
|
||
"method_2_custom_x_access_token_header_4548169f": "方式二:X-Access-Token 自定义头",
|
||
"4_dynamic_system_configuration_b3bf8c49": "4. 动态系统配置项",
|
||
"the_built_in_key_value_configuration_module_713f6d05": "平台内置了完备的 KV 配置管理模块,允许管理员动态调整系统运行状态:",
|
||
"cached_reads_35828322": "缓存读取加速:",
|
||
"configuration_is_read_from_the_database_through_3e9f6a34": "配置加载基于 GORM 读取数据库,并辅以 Redis Hash 结构进行多层缓存加速,大幅降低配置查询耗时。",
|
||
"core_system_configuration_keys_6dc02be8": "核心系统配置项说明:",
|
||
"platform_display_name_116219b1": ":平台展示名称",
|
||
"password_login_switch_153eaa45": ":密码登录开关",
|
||
"user_registration_switch_827b5b21": ":用户自主注册开关",
|
||
"maximum_tokens_per_regular_user_default_5_5dd6d9e7": ":普通用户创建令牌的最大数限制 (默认5)",
|
||
"5_background_tasks_and_scheduling_7142ce96": "5. 异步任务与定时调度",
|
||
"cobra_provides_separate_commands_so_worker_services_1bbae2df": "项目借助 Cobra 实现多命令入口分发,通过独立部署 Worker 服务解耦复杂计算或高延迟IO:",
|
||
"scheduled_dispatch_scheduler_command_e79062ad": "定时任务派发 (CMD scheduler):",
|
||
"enqueues_tasks_in_redis_according_to_their_694e5985": "负责按 Cron 表达式配置,定时将待执行任务推送到 Redis 队列中。",
|
||
"workers_with_queue_priorities_worker_command_faa970b1": "多优先级 Worker (CMD worker):",
|
||
"asynq_consumes_tasks_by_priority_and_executes_69d82251": "基于 Asynq 驱动,按优先级拉取任务并并发调度执行(如定时清理临时上传目录、同步外部系统日志等)。",
|
||
"6_distributed_tracing_and_structured_logs_e8971cad": "6. 链路追踪与结构化日志",
|
||
"the_platform_integrates_monitoring_components_for_observability_2b1da50f": "为了保障分布式微服务架构下的可观测性,平台接入了高级监控组件:",
|
||
"tracing_context_is_propagated_automatically_gin_requests_0f549cce": "自动传递 Tracing 上下文,所有经由 Gin 中间件、外部请求或 GORM 数据库的事务操作都将带有全局唯一的 Span,用于排查链路耗时或调用异常。",
|
||
"zap_structured_logs_1c9725e8": "Zap 结构化日志:",
|
||
"standardizes_backend_console_and_log_output_as_16970757": "将后端控制台或日志输出格式统一规范化为 JSON,方便与 ELK、Loki 等日志收集分析工具无缝对接。",
|
||
"last_updated_value0_87a896df": "最后更新:{value0}",
|
||
"back_to_home_d66f4359": "返回首页",
|
||
"sections_fcb2696e": " 个内容",
|
||
"last_updated_a83cd480": "最后更新:",
|
||
"copied_8f6f8d97": "已复制",
|
||
"copy_markdown_f9c71ee4": "复制 Markdown",
|
||
"table_of_contents_52daa71e": "目录",
|
||
"questions_about_this_content_feb7d44a": "对这些内容有疑问?",
|
||
"contact_support_4cac90c8": "联系支持",
|
||
"1_information_we_collect_af0db091": "1. 详细信息收集说明",
|
||
"we_collect_only_the_information_necessary_to_72f6e528": "我们仅遵循合法、正当、必要的原则,收集为您提供服务所必需的信息。我们的数据收集范围严格限制如下:",
|
||
"1_1_authentication_information_60199ee9": "1.1 身份鉴权信息:",
|
||
"when_you_register_locally_or_sign_in_acdd6bd1": "当您通过本地账号注册或绑定第三方 OIDC 认证源登录时,我们会收集您的用户名、关联的邮箱、加密后的密码哈希指纹及关联的第三方 OpenID 标识符。",
|
||
"we_do_not_require_a_phone_number_3540dfca": "我们不强制要求绑定手机号、身份证件或任何真实社会信用实体信息。",
|
||
"1_2_service_and_api_logs_46c9a04d": "1.2 服务与接口日志信息:",
|
||
"for_system_security_and_auditing_we_automatically_89737fdd": "为保障系统运行安全及满足安全审计要求,我们会自动收集您的操作日志,包括 IP 地址、访问日期和时间、个人访问令牌 API 调用历史记录、User-Agent(浏览器/设备/请求工具类型)。",
|
||
"2_data_storage_and_security_7cc5cdef": "2. 数据存储与安全保护",
|
||
"we_recognize_the_importance_of_data_security_cd3bd4d9": "我们深知数据安全的重要性,并采取业界领先的技术措施保护您的数据:",
|
||
"storage_security_a33cfbef": "存储安全:",
|
||
"user_data_is_stored_in_a_dedicated_132af7bb": "用户数据独立存储于专用的云数据库或本地容器化持久层中,仅供授权系统应用挂载读取。",
|
||
"cryptography_9a15a88b": "加密技术:",
|
||
"sensitive_password_and_personal_access_token_hashes_9f724cd8": "敏感的密码指纹和个人访问令牌哈希在数据库中均采用高强度算法加密存储。API 数据传输链路强制使用 SSL/TLS 进行安全加密。",
|
||
"access_control_3471eafa": "访问控制:",
|
||
"we_apply_the_principle_of_least_privilege_79328c28": "我们实行严格的最小权限原则(Least Privilege),平台数据不会对外共享,所有系统级内部运维操作均有审计日志可查。",
|
||
"3_how_we_use_information_41b4d6ad": "3. 信息使用规范",
|
||
"collected_information_is_used_only_for_the_4868b538": "我们收集的信息将仅用于以下目的:",
|
||
"identification_481b07f4": "身份识别:",
|
||
"to_identify_your_registered_account_and_display_8c559094": "用于确认您的注册身份,展示您的个人中心及设置页面数据。",
|
||
"service_functions_c5834f20": "业务功能:",
|
||
"to_identify_and_process_api_authentication_requests_d48a36a2": "用于识别并处理您的个人访问令牌 API 鉴权指令。",
|
||
"security_e7132437": "安全风控:",
|
||
"to_analyze_ip_addresses_and_activity_logs_5210836a": "利用 IP 及行为日志进行接口反作弊、反暴力破解分析,保障后台服务稳定性。",
|
||
"prohibited_uses_b13fde94": "禁止用途:",
|
||
"we_will_8856fb95": "我们承诺",
|
||
"never_c1d7d603": "绝不",
|
||
"sell_your_data_to_third_parties_or_7bb4d77a": "将您的数据出售给第三方,亦不会向任何机构提供任何用户画像分析或广告推送服务。",
|
||
"4_information_sharing_and_disclosure_c034d295": "4. 信息共享与对外披露",
|
||
"4_1_sharing_principles_b89eb890": "4.1 共享原则:",
|
||
"we_do_not_share_personal_information_with_ffcf1e8f": "除以下极端情况外,我们不会向任何第三方(包括且不限于关联公司、商业合作伙伴)共享您的个人信息:",
|
||
"with_your_prior_explicit_authorization_or_consent_0fa05878": "事先获得您的明确授权或同意;",
|
||
"when_required_by_applicable_laws_legal_proceedings_cb547dd6": "根据适用的法律法规、法律程序的要求、强制性的行政或司法要求所必须的情况下进行提供。",
|
||
"4_2_transfer_and_public_disclosure_383d35be": "4.2 转让与公开披露:",
|
||
"we_do_not_transfer_your_personal_information_e3339921": "我们不会将您的个人信息转让给任何公司、组织和个人,亦不进行任何公开商业披露。",
|
||
"5_your_rights_and_data_management_08999326": "5. 您的权利与数据管理",
|
||
"under_the_personal_information_protection_law_of_94ea405e": "依照《中华人民共和国个人信息保护法》,您对您的个人信息享有完整的控制权:",
|
||
"5_1_access_and_management_854d0793": "5.1 查阅与管理权:",
|
||
"you_may_sign_in_at_any_time_8727c5be": "您可以随时登录本平台,查阅您的基础个人信息,生成、轮换或撤销您的 AccessToken (API 密钥)。",
|
||
"5_2_deletion_and_account_closure_9d1e7aba": "5.2 删除与注销权:",
|
||
"if_you_stop_using_the_service_you_24c642c6": "若您决定停止使用本服务,您可以申请注销账户。注销后,我们将立即从活跃存储媒介中删除您的所有敏感信息,法律法规要求留存的安全日志除外。",
|
||
"6_policy_updates_and_notices_444076f5": "6. 政策更新与通知",
|
||
"this_privacy_policy_may_change_as_the_2a270464": "随着业务的发展或法律法规的变动,本《隐私政策》条款可能发生变更。",
|
||
"we_will_prominently_announce_material_changes_for_210fbd3b": "当条款发生重大变更时,我们会以显著方式(如平台公告、站内弹窗等)予以通知。如果您继续使用本服务,即表示您同意接受修订后的政策约束。",
|
||
"1_agreement_and_service_overview_511c6782": "1. 缔约申明与服务综述",
|
||
"1_1_parties_d2bf79cd": "1.1 缔约主体:",
|
||
"these_terms_of_service_the_agreement_govern_1e6754fc": "本《服务协议》(以下简称“本协议”)是您(以下称“用户”或“开发者”)与本通用开发脚手架平台(以下简称“本系统”或“平台”)运营维护方之间关于使用本系统所订立的契约。",
|
||
"1_2_read_carefully_dfde346e": "1.2 审慎阅读:",
|
||
"this_system_is_a_general_purpose_full_f1d395fe": "本系统作为一个通用的、面向二次开发的全栈软件底座,旨在为用户提供基础的注册、会话、OIDC 接入、API Key 令牌鉴权及后台管理服务。若您使用本系统,请务必仔细阅读本协议各条款。",
|
||
"1_3_agreement_contents_f05cebc0": "1.3 协议构成:",
|
||
"the_agreement_includes_these_terms_and_any_43e244b6": "本协议内容包括协议正文及所有我们已经发布或将来可能发布的各类规则、声明、说明。所有规则为本协议不可分割的组成部分,与协议正文具有同等法律效力。",
|
||
"2_service_definition_and_nature_61db87f8": "2. 服务定义与性质界定",
|
||
"your_responsibility_527cbdbf": "责任自担:",
|
||
"the_entity_deploying_and_operating_a_customized_047c6a8f": "关于用户对本系统进行二次开发并应用于其他生产环境产生的任何业务行为,由二开部署运营主体承担全部合规责任。",
|
||
"3_registration_and_account_use_cfab1555": "3. 账号注册与使用规范",
|
||
"3_1_accounts_2631c114": "3.1 账号体系:",
|
||
"users_may_register_through_the_frontend_or_e527ef52": "用户可通过本系统的前端注册表单自助创建账户,或通过系统管理员配置并启用的自定义第三方 OIDC 认证源进行登录关联。",
|
||
"3_2_password_and_token_security_80dd80d9": "3.2 密码及令牌安全责任:",
|
||
"password_security_7a29e44e": "密码安全:",
|
||
"keep_your_account_password_secure_eb9adf10": "您应妥善保管您账户的登录密码。",
|
||
"api_token_security_34af066f": "API Token 安全:",
|
||
"a_personal_access_token_api_key_represents_6215b3b0": "个人生成的 AccessToken (API Key) 代表您账户的完整调用权限。",
|
||
"you_are_responsible_for_data_loss_or_0c9acc88": "因您保管不善导致 Token 泄漏而造成的一切数据丢失或系统损失,均由您自行承担。",
|
||
"4_prohibited_user_conduct_bd5628b6": "4. 用户行为准则(负面清单)",
|
||
"when_using_this_system_you_must_comply_1e54356c": "您在使用本系统时,必须严格遵守《中华人民共和国网络安全法》、《计算机信息网络国际联网安全保护管理办法》等法律法规。",
|
||
"the_following_activities_are_strictly_prohibited_5b57de7f": "严禁利用本平台从事以下活动(“红线条款”):",
|
||
"endangering_national_security_4a160c4e": "危害国家安全:",
|
||
"opposing_constitutional_principles_endangering_national_security_disclosing_bdfb8814": "反对宪法所确定的基本原则、危害国家安全、泄露国家秘密、颠覆国家政权、破坏国家统一的;",
|
||
"illegal_information_services_c97748bb": "非法信息服务:",
|
||
"hacking_tools_ddos_attack_services_server_brute_686746c4": "黑客攻击工具、DDoS 攻击服务、服务器爆破等其他非法信息服务平台;",
|
||
"pornography_gambling_and_drugs_fdb44a54": "黄赌毒关联:",
|
||
"creating_copying_publishing_or_distributing_obscene_pornographic_ec8c0fdb": "制作、复制、发布、传播淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;",
|
||
"intellectual_property_infringement_cc10b950": "侵犯知识产权:",
|
||
"selling_pirated_software_or_media_illegal_game_3f0f4159": "销售盗版软件、盗版影视资源、非法游戏外挂、私服、黑号、社工库数据等;",
|
||
"other_unlawful_information_4085c17c": "其他违法信息:",
|
||
"spreading_rumors_promoting_cults_or_superstition_insulting_a062981a": "涉及散布谣言、宣扬邪教/封建迷信、侮辱/诽谤他人、侵害他人合法权益的。",
|
||
"enforcement_9c7cfd68": "处理规则:",
|
||
"if_these_rules_are_violated_the_platform_86df3b18": "一旦发现您违反上述规定,平台运维主体有权不经通知",
|
||
"permanently_suspend_your_account_block_all_access_b9f04a42": "立即永久封禁您的账号、拦截所有 AccessToken 请求,并依法向公安机关、网安部门移交相关线索。",
|
||
"5_disclaimer_and_force_majeure_be649f43": "5. 免责声明与不可抗力",
|
||
"5_1_general_disclaimer_30d01f0d": "5.1 基础免责:",
|
||
"this_development_platform_is_provided_as_is_23bc2b55": "本开发底座按“现状”(As-Is)及“现有”(As-Available)状态提供。我们不保证服务一定能满足您的特定开发需求,对服务的及时性、安全性、准确性都不作额外担保。",
|
||
"5_2_service_interruptions_16558fa8": "5.2 技术服务中断:",
|
||
"the_platform_is_not_liable_for_interruptions_405b1c95": "对于因以下不可抗力原因导致的服务中断、数据丢失或账号损坏,平台不承担赔偿责任:",
|
||
"natural_disasters_including_typhoons_earthquakes_tsunamis_and_1bbbfb21": "自然灾害(台风、地震、海啸、洪水等);",
|
||
"government_actions_cybersecurity_law_changes_or_administrative_2b7322f5": "政府行为、网络安全法律法规调整或行政命令;",
|
||
"telecommunication_faults_or_damage_to_data_center_259a542f": "电信部门线路技术故障、机房海底光缆损毁;",
|
||
"data_corruption_or_downtime_caused_by_hacking_68f2e04f": "黑客入侵、勒索病毒感染导致的数据损毁或宕机。",
|
||
"6_governing_law_and_disputes_b9663c86": "6. 法律适用与争议解决",
|
||
"6_1_governing_law_ff2afc5e": "6.1 法律适用:",
|
||
"the_formation_performance_interpretation_and_resolution_of_c1510775": "本协议的订立、执行、解释及争议的解决均适用",
|
||
"the_laws_of_the_people_s_republic_5d5c80d6": "中华人民共和国法律",
|
||
"excluding_the_conflict_of_laws_rules_of_b235c4e3": "(不包括港澳台地区冲突法)。",
|
||
"6_2_dispute_resolution_44e871de": "6.2 争议解决:",
|
||
"disputes_should_first_be_resolved_through_friendly_1ccf4610": "若发生任何争议或纠纷,首先应友好协商解决;协商不成的,应提交至本系统部署或运营方所在地有管辖权的人民法院管辖。",
|
||
"failed_to_load_value0_7f5a06a3": "{value0} 加载失败",
|
||
"load_failed_d1d04482": "加载失败",
|
||
"no_data_497c8569": "暂无数据",
|
||
"loading_d04fcbda": "加载中",
|
||
"saved_e05ddf99": "保存成功",
|
||
"save_failed_6309a3bb": "保存失败",
|
||
"unknown_error_13a46616": "未知错误",
|
||
"deleted_5223f91b": "删除成功",
|
||
"delete_failed_c228558c": "删除失败",
|
||
"configuration_list_53052147": "配置列表",
|
||
"confirm_delete_2d61cf17": "确认删除?",
|
||
"this_cannot_be_undone_this_will_permanently_8c896756": "此操作无法撤销。这将永久删除该配置。",
|
||
"cancel_2cd0f3be": "取消",
|
||
"confirm_delete_a3ea3c17": "确认删除",
|
||
"configuration_info_7f69a860": "配置信息",
|
||
"select_a_configuration_to_view_details_ec4949ab": "请选择配置查看详情",
|
||
"updating_e1d9dd03": " 更新中",
|
||
"update_3055a035": "更新",
|
||
"actions_ed31fbb4": "操作",
|
||
"enter_password_728a7b60": "请输入密码",
|
||
"for_your_account_security_please_enter_the_28fc0bbd": "为了您的账户安全,请输入6位认证密码进行验证",
|
||
"verifying_6c128e0a": "验证中...",
|
||
"confirm_36f33ada": "确认",
|
||
"profile_b94d13a4": "个人资料",
|
||
"manage_your_account_information_and_preferences_cced83b4": "管理您的个人账户信息及个性化配置",
|
||
"user_guide_c83b6b0a": "使用文档",
|
||
"api_integration_and_everyday_operation_guides_281269a1": "学习如何集成 API 及日常操作帮助指南",
|
||
"system_settings_68ea5dd4": "系统设置",
|
||
"manage_registration_login_and_authentication_provider_security_f378ed37": "管理登录注册开关与认证源安全策略",
|
||
"global_system_configuration_1eb8931e": "全局系统配置",
|
||
"manage_core_platform_runtime_settings_341e4182": "动态管理平台运行时核心配置参数",
|
||
"user_permissions_8e8b1d33": "用户权限管理",
|
||
"view_and_manage_registered_users_and_their_db533b7c": "集中查询并管理系统注册用户的启用状态",
|
||
"background_task_scheduling_408172d1": "后台任务调度",
|
||
"dispatch_and_monitor_background_and_scheduled_tasks_83967fc9": "分发与观测系统异步定时任务的执行情况",
|
||
"system_logs_366ada1d": "系统日志",
|
||
"view_background_task_logs_and_system_status_24fd6a7d": "查看异步任务执行日志与系统运行状态详情",
|
||
"a_modern_extensible_administration_platform_with_ready_0d95c0c1": "通用的、现代化的后台管理系统脚手架, 开箱即用、完整基建、极易扩展,助您快速构建企业级应用。",
|
||
"get_started_715ee9dc": "开始使用",
|
||
"hide_tip_738f4b27": "隐藏提示",
|
||
"quick_navigation_05deefcb": "常用功能导航",
|
||
"open_fee3b5a5": "立即跳转 ",
|
||
"open_df42ebc3": "立即进入 ",
|
||
"administration_console_ceb0c289": "后台管理控制台",
|
||
"live_origin_error_page_preview_a2a12823": "源站错误页实时预览",
|
||
"html_editor_19f0d7b7": "HTML 编辑器",
|
||
"bytes_f5d87a8b": " 字节",
|
||
"leave_empty_for_the_built_in_default_29ffce9f": " · 空则使用内置默认",
|
||
"leave_empty_to_use_the_built_in_e57252bd": "留空使用内置默认模板…",
|
||
"drag_to_resize_b5154511": "拖动调整宽度",
|
||
"live_preview_a76fdaad": "实时预览",
|
||
"preview_13d61fea": "预览",
|
||
"for_example_github_1061e2e4": "例如: github",
|
||
"for_example_github_login_1e0c113c": "例如: GitHub 登录",
|
||
"https_or_leave_empty_a0d86d9b": "https://... 或留空",
|
||
"missing_configuration_value0_31b43fa6": "缺少配置项: {value0}",
|
||
"missing_configuration_file_access_whitelist_6dd80936": "缺少配置项: file_access_whitelist",
|
||
"directory_visibility_configuration_json_string_format_url_8e3c0671": "目录显示配置(JSON 字符串,格式为 {url: enabled})",
|
||
"missing_configuration_login_session_ttl_hours_d6f433c2": "缺少配置项: login_session_ttl_hours",
|
||
"server_address_d3716cc5": "服务器地址",
|
||
"platform_display_name_4b656edf": "系统平台的展示名称",
|
||
"for_example_openflare_28e07341": "例如: OpenFlare",
|
||
"for_example_https_example_com_9cf31711": "例如: https://example.com",
|
||
"allow_search_engines_to_crawl_and_index_59eff8b5": "允许搜索引擎抓取与收录",
|
||
"for_example_smtp_example_com_834569b4": "例如: smtp.example.com",
|
||
"for_example_587_or_465_1bd015a5": "例如: 587 或 465",
|
||
"for_example_sender_example_com_1795f7c6": "例如: sender@example.com",
|
||
"for_example_receiver_example_com_ade0ff8b": "例如: receiver@example.com",
|
||
"for_example_login_email_c7212e1f": "例如: login_email",
|
||
"for_example_login_verification_email_9d28f166": "例如: 登录验证码邮件",
|
||
"for_example_openflare_login_verification_code_0925e8d4": "例如: OpenFlare 登录验证码",
|
||
"for_example_your_code_is_code_valid_44cf273f": "例如: 包含变量:{{.Code}},5分钟内有效",
|
||
"h3_message_title_h3_p_message_content_20c91d04": "<h3>正文标题</h3><p>内容段落,可用变量 {{.Code}}</p>",
|
||
"register_a_user_curl_x_post_https_4ae682b0": "# 注册用户\ncurl -X POST https://api.example.com/api/v1/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"username\": \"developer\",\n \"email\": \"dev@example.com\",\n \"password\": \"secure_password\"\n }'",
|
||
"quick_start_42fbb067": "# 快速开始",
|
||
"developer_friendly_40c2a4ce": "开发者友好,",
|
||
"quick_to_integrate_18cbee8a": "极速集成上手",
|
||
"standard_restful_apis_complete_typescript_types_detailed_6369a0e2": "标准化的 RESTful API 接口,完整的 TypeScript 类型定义,详细的文档和 Swagger UI。无论使用什么编程语言,只需几行代码,即可快速集成。",
|
||
"restful_api_with_clear_understandable_semantics_1fa9d6f5": "RESTful API,语义清晰,易于理解",
|
||
"openapi_swagger_documentation_ccbcbc84": "OpenAPI / Swagger 接口文档",
|
||
"developer_friendly_typescript_type_definitions_910a7909": "TypeScript 类型定义,开发友好",
|
||
"code_samples_and_integration_guides_9e998a5a": "丰富的代码示例和集成指南",
|
||
"an_open_source_platform_for_managing_edge_317d8f34": "开源边缘节点与反向代理管理平台。基于 Go + React 构建,统一管理 OpenResty 节点、网站规则与 WAF 配置。",
|
||
"product_aea82737": "产品",
|
||
"dashboard_0853bf3c": "仪表盘",
|
||
"personal_c2952a5f": "个人设置",
|
||
"development_9ec42862": "开发",
|
||
"source_code_606a4e58": "源代码",
|
||
"community_5bcd0ddc": "社区",
|
||
"discussions_3cef912c": "讨论",
|
||
"privacy_policy_e464b41f": "隐私政策",
|
||
"terms_of_service_9303687a": "服务条款",
|
||
"built_for_customization_ff3cf147": "为二次开发而生",
|
||
"a_modern_administration_platform_116688ff": "通用的、现代化的后台管理系统脚手架",
|
||
"ready_to_use_infrastructure_that_is_easy_77776634": "开箱即用、完整基建、极易扩展,助您快速构建企业级应用。",
|
||
"get_started_d1f9c450": "立即开始",
|
||
"learn_more_ca66c2da": "了解更多",
|
||
"ready_to_use_c58cfea2": "开箱即用",
|
||
"highly_extensible_9dfa6c10": "高度可扩展",
|
||
"production_infrastructure_08c3a5e6": "工业级基建",
|
||
"good_fortune_b3541887": "福",
|
||
"retry_b8784c8d": "重试",
|
||
"an_unknown_error_occurred_please_try_again_79a9f98a": "发生未知错误,请稍后重试",
|
||
"view_error_details_9e7e4e37": "查看详细错误信息",
|
||
"unknown_error_e83a8ca8": "发生未知错误",
|
||
"fetching_data_9ac5e428": "正在获取活动数据...",
|
||
"type_and_press_enter_to_add_e30b7b5f": "输入后按 Enter 添加",
|
||
"remove_value0_30c2158a": "移除 {value0}",
|
||
"fnv_1a_32_bit_function_fnv1a_str_a1690b96": "\n// FNV-1a 32-bit\nfunction fnv1a(str) {\n let h = 2166136261 >>> 0;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h;\n}\nfunction fnv1aResume(state, str) {\n let h = state >>> 0;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 16777619) >>> 0;\n }\n return h;\n}\n\n// xorshift32 PRNG → hex string\nfunction prngFromHash(seed, len) {\n let s = seed >>> 0, r = '';\n while (r.length < len) {\n s ^= (s << 13) >>> 0;\n s ^= (s >>> 17) >>> 0;\n s ^= (s << 5) >>> 0;\n s = s >>> 0;\n r += s.toString(16).padStart(8, '0');\n }\n return r.slice(0, len);\n}\n\n// SHA-256 via SubtleCrypto (available in workers)\nasync function sha256Hex(input) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));\n return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n// Solve one puzzle\nasync function solvePuzzle(token, index, size, difficulty) {\n const tFnv = fnv1a(token);\n const saltSeed = fnv1aResume(tFnv, String(index + 1));\n const targetSeed = fnv1aResume(saltSeed, 'd');\n const salt = prngFromHash(saltSeed, size);\n const target = prngFromHash(targetSeed, difficulty);\n\n for (let nonce = 0; nonce < 10_000_000; nonce++) {\n if ((await sha256Hex(salt + nonce)).startsWith(target)) return nonce;\n }\n throw new Error('无法在合理范围内求解第 ' + (index + 1) + ' 个难题');\n}\n\n// Entry point — receive task from main thread\nself.onmessage = async ({ data }) => {\n const { token, count, size, difficulty } = data;\n try {\n const t0 = performance.now();\n const solutions = [];\n for (let i = 0; i < count; i++) {\n solutions.push(await solvePuzzle(token, i, size, difficulty));\n }\n const elapsed = ((performance.now() - t0) / 1000).toFixed(3);\n self.postMessage({ type: 'done', solutions, elapsed });\n } catch (err) {\n self.postMessage({ type: 'error', message: err.message });\n }\n};\n",
|
||
"worker_execution_failed_1877e35b": "Worker 执行失败",
|
||
"failed_to_fetch_the_verification_challenge_95553133": "获取人机验证难题失败",
|
||
"cap_starting_verification_pow_solver_657f3af5": "[Cap] 人机验证 PoW 求解开始",
|
||
"challenge_count_value0_ea1ffc80": " 难题数量 (count) : {value0}",
|
||
"difficulty_value0_f104cb0d": " 验证难度 (difficulty): {value0}",
|
||
"salt_size_value0_4f2bae5d": " 盐值长度 (size) : {value0}",
|
||
"cap_verification_pow_solver_completed_e1f79fd5": "[Cap] 人机验证 PoW 求解完成",
|
||
"worker_duration_value0_s_8de32777": " Worker 耗时 : {value0}s",
|
||
"total_duration_including_communication_value0_s_004a6894": " 总耗时(含通信) : {value0}s",
|
||
"verification_failed_d3925ab2": "人机验证失败",
|
||
"doctype_html_html_lang_en_head_meta_3e4f5ecb": "\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>离线页 | OpenFlare</title>\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n background-color: #f4f3ef;\n color: #121212;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n }\n\n .bauhaus-card {\n width: 100%;\n max-width: 580px;\n background: #ffffff;\n border: 3px solid #121212;\n box-shadow: 8px 8px 0px #121212;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .card-accent-bar {\n height: 12px;\n display: flex;\n }\n\n .accent-red { flex: 2; background-color: #e63946; }\n .accent-blue { flex: 3; background-color: #1d3557; }\n .accent-yellow { flex: 1; background-color: #f1faee; }\n\n .card-body {\n padding: 40px 32px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .tag {\n align-self: flex-start;\n background-color: #121212;\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n padding: 4px 10px;\n }\n\n .title {\n font-size: 28px;\n font-weight: 800;\n line-height: 1.2;\n letter-spacing: -0.02em;\n }\n\n .message {\n font-size: 15px;\n line-height: 1.6;\n color: #4a4a4a;\n }\n\n .contact-box {\n border: 2px solid #121212;\n background-color: #f9f8f3;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .contact-line {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-weight: 600;\n }\n\n .contact-line a {\n color: #e63946;\n text-decoration: none;\n font-weight: 700;\n }\n\n .contact-line a:hover {\n text-decoration: underline;\n }\n\n .card-footer {\n border-top: 2px solid #121212;\n padding: 16px 32px;\n background-color: #faf9f6;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.05em;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .brand-icon {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n </style>\n</head>\n<body>\n<div class=\"bauhaus-card\">\n <div class=\"card-accent-bar\">\n <div class=\"accent-red\"></div>\n <div class=\"accent-blue\"></div>\n <div class=\"accent-yellow\"></div>\n </div>\n <div class=\"card-body\">\n <div class=\"tag\">OFFLINE FALLBACK</div>\n <h1 class=\"title\">离线联系站长</h1>\n <p class=\"message\">\n 源站网络临时不可达。离线 Service Worker 已拦截请求,您可以使用下方联系方式取得支持。\n </p>\n <div class=\"contact-box\">\n <div class=\"contact-line\">\n <span>站长邮箱</span>\n <a href=\"mailto:admin@example.com\">admin@example.com</a>\n </div>\n <div class=\"contact-line\">\n <span>服务监控</span>\n <a href=\"https://status.example.com\" target=\"_blank\" rel=\"noopener\">status.example.com</a>\n </div>\n </div>\n </div>\n <div class=\"card-footer\">\n <div class=\"brand\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare Service Worker</span>\n </div>\n <span>OFFLINE MODE</span>\n </div>\n</div>\n</body>\n</html>\n",
|
||
"minimal_white_5636e8a9": "极简白底",
|
||
"line_topology_22ad450c": "线框拓扑",
|
||
"bauhaus_5cc69781": "包豪斯",
|
||
"doctype_html_html_lang_en_head_meta_42a4f2da": "\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>离线页 | OpenFlare</title>\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n :root {\n --color-bg: #fcfcfc;\n --color-line: #e0e0e0;\n --color-line-hover: #1a1a1a;\n --color-text-main: #1a1a1a;\n --color-text-sub: #666666;\n --color-text-muted: #999999;\n --color-accent: #d4d4d4;\n --font-geo: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n body {\n font-family: var(--font-geo);\n background-color: var(--color-bg);\n background-image: radial-gradient(circle, var(--color-accent) 0.8px, transparent 0.8px);\n background-size: 24px 24px;\n color: var(--color-text-main);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n letter-spacing: 0.01em;\n }\n\n .main-container {\n width: 100%;\n max-width: 640px;\n display: flex;\n flex-direction: column;\n gap: 32px;\n }\n\n .line-box {\n border: 1px solid var(--color-line);\n background: rgba(255, 255, 255, 0.7);\n backdrop-filter: blur(4px);\n padding: 32px;\n transition: all var(--transition-fast);\n position: relative;\n }\n\n .line-box:hover {\n border-color: var(--color-line-hover);\n box-shadow: 0 0 0 1px var(--color-line-hover);\n }\n\n .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n color: var(--color-text-sub);\n margin-bottom: 12px;\n }\n\n .status-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #f59e0b;\n }\n\n .title {\n font-size: 24px;\n font-weight: 700;\n letter-spacing: -0.02em;\n margin-bottom: 12px;\n }\n\n .description {\n font-size: 14px;\n line-height: 1.6;\n color: var(--color-text-sub);\n margin-bottom: 24px;\n }\n\n .contact-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n border-top: 1px dashed var(--color-line);\n padding-top: 20px;\n }\n\n .contact-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 13px;\n }\n\n .contact-label {\n color: var(--color-text-muted);\n font-size: 12px;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n }\n\n .contact-value a {\n color: var(--color-text-main);\n font-weight: 600;\n text-decoration: none;\n border-bottom: 1px solid var(--color-line);\n transition: border-color var(--transition-fast);\n }\n\n .contact-value a:hover {\n border-color: var(--color-text-main);\n }\n\n .footer-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 11px;\n color: var(--color-text-muted);\n letter-spacing: 0.05em;\n }\n\n .brand {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n color: var(--color-text-main);\n }\n\n .brand-icon {\n width: 14px;\n height: 14px;\n fill: currentColor;\n }\n </style>\n</head>\n<body>\n<div class=\"main-container\">\n <div class=\"line-box\">\n <div class=\"status-badge\">\n <span class=\"status-dot\"></span>\n SERVICE WORKER OFFLINE CACHE\n </div>\n <h1 class=\"title\">网络中断或源站不可达</h1>\n <p class=\"description\">\n 系统已自动启用 Service Worker 兜底保护。如需紧急联系站长,请通过以下渠道:\n </p>\n <div class=\"contact-list\">\n <div class=\"contact-row\">\n <span class=\"contact-label\">Email Support</span>\n <span class=\"contact-value\"><a href=\"mailto:admin@example.com\">admin@example.com</a></span>\n </div>\n <div class=\"contact-row\">\n <span class=\"contact-label\">Status Page</span>\n <span class=\"contact-value\"><a href=\"https://status.example.com\" target=\"_blank\" rel=\"noopener\">status.example.com</a></span>\n </div>\n </div>\n </div>\n <div class=\"footer-bar\">\n <div class=\"brand\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare Edge</span>\n </div>\n <span>FALLBACK ACTIVE</span>\n </div>\n</div>\n</body>\n</html>\n",
|
||
"doctype_html_html_lang_en_head_meta_505c1308": "\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>离线页 | OpenFlare</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n background-color: #ffffff;\n color: #333333;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n padding: 48px 24px;\n }\n .container {\n max-width: 560px;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n .badge {\n display: inline-flex;\n align-items: center;\n padding: 4px 12px;\n border-radius: 9999px;\n background-color: #f3f4f6;\n color: #4b5563;\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.05em;\n }\n .title {\n font-size: 32px;\n font-weight: 700;\n color: #111827;\n line-height: 1.25;\n }\n .description {\n font-size: 15px;\n line-height: 1.6;\n color: #6b7280;\n max-width: 480px;\n }\n .contact-card {\n width: 100%;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n padding: 24px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n text-align: left;\n }\n .contact-item {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 14px;\n color: #374151;\n }\n .contact-item svg {\n width: 18px;\n height: 18px;\n color: #6b7280;\n flex-shrink: 0;\n }\n .contact-item a {\n color: #2563eb;\n text-decoration: none;\n }\n .contact-item a:hover {\n text-decoration: underline;\n }\n .footer {\n margin-top: 32px;\n display: flex;\n align-items: center;\n gap: 8px;\n color: #9ca3af;\n font-size: 13px;\n }\n .brand-icon {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n </style>\n</head>\n<body>\n<div class=\"container\">\n <div class=\"badge\">OFFLINE CONTACT</div>\n <h1 class=\"title\">站点暂不可用,联系站长</h1>\n <p class=\"description\">\n 当前无法连接至源站。页面已开启 Service Worker 离线保护,您可以通过以下方式与站长取得联系。\n </p>\n <div class=\"contact-card\">\n <div class=\"contact-item\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"></path></svg>\n <span>联系邮箱:<a href=\"mailto:admin@example.com\">admin@example.com</a></span>\n </div>\n <div class=\"contact-item\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"></path></svg>\n <span>服务状态页:<a href=\"https://status.example.com\" target=\"_blank\" rel=\"noopener\">status.example.com</a></span>\n </div>\n </div>\n <div class=\"footer\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare Protection</span>\n </div>\n</div>\n</body>\n</html>\n",
|
||
"status_code_tag_must_not_be_empty_21235ebf": "状态码标签不能为空",
|
||
"invalid_status_code_range_value0_8983e96e": "无效状态码区间: {value0}",
|
||
"invalid_status_code_value0_0f206e48": "无效状态码: {value0}",
|
||
"status_code_range_endpoints_are_reversed_value0_d92c2784": "状态码区间左右端点反序: {value0}",
|
||
"status_code_must_be_between_value0_value1_c5b04822": "状态码须在 {value0}–{value1}: {value2}",
|
||
"invalid_status_code_tag_d16e85d7": "无效状态码标签",
|
||
"add_at_least_one_status_code_tag_b81b2696": "请至少添加一个状态码标签",
|
||
"the_expanded_status_code_list_is_empty_47245f34": "状态码展开结果为空",
|
||
"request_canceled_5892f9b1": "请求已被取消",
|
||
"insufficient_permissions_complete_verification_and_try_again_73719073": "权限不足,请过盾后重试",
|
||
"the_requested_resource_was_not_found_aecc0681": "请求的资源不存在",
|
||
"request_parameter_validation_failed_60ef7c51": "请求参数验证失败",
|
||
"too_many_requests_retry_in_value0_seconds_ab5e78f1": "请求过于频繁,请 {value0} 秒后重试",
|
||
"request_rate_limit_ad4f0f8b": "请求频率限制",
|
||
"internal_server_error_try_again_later_4f0dd7e9": "服务器内部错误,请稍后重试",
|
||
"cannot_connect_to_the_server_check_that_5551f4fc": "无法连接到服务器,请确认后端服务已启动",
|
||
"network_request_failed_8407ceab": "网络请求失败",
|
||
"request_canceled_manually_7ba622e6": "请求已被手动取消",
|
||
"all_requests_canceled_72f8fa9a": "所有请求已被取消",
|
||
"network_connection_failed_check_your_network_cbf47b07": "网络连接失败,请检查您的网络",
|
||
"request_timed_out_try_again_later_6c3465f6": "请求超时,请稍后重试",
|
||
"unauthorized_sign_in_first_466879f5": "未授权,请先登录",
|
||
"insufficient_permissions_5e3c8a26": "权限不足",
|
||
"value0_must_be_a_valid_number_1d79f887": "「{value0}」必须是有效的数字",
|
||
"value0_must_be_true_or_false_23cce68e": "「{value0}」必须是 true 或 false",
|
||
"value0_must_not_be_empty_8bf3a929": "「{value0}」不能为空",
|
||
"request_canceled_282c4cfb": "请求已取消",
|
||
"base64_encoding_is_not_supported_in_this_7642d848": "当前环境不支持 Base64 编码",
|
||
"rate_limit_retry_later": "请求过于频繁,请稍后重试",
|
||
"list_separator": "、",
|
||
"sentence_end": "。",
|
||
"task_notification_template_example": "{\"title\":\"任务完成\",\"content\":\"{{task_name}}: {{task_status}}\",\"level\":\"INFO\"}",
|
||
"ui_totalRequests": "总请求数",
|
||
"ui_totalVisits": "总访问量",
|
||
"ui_bandwidthServed": "已传输流量",
|
||
"ui_requestsOverTime": "请求趋势",
|
||
"ui_requestsByDevice": "按设备类型统计请求",
|
||
"ui_statusCodes": "状态码",
|
||
"ui_topPaths": "热门路径",
|
||
"ui_topHosts": "热门主机",
|
||
"ui_topIps": "热门 IP",
|
||
"ui_topBrowsers": "热门浏览器",
|
||
"ui_topOperatingSystems": "操作系统",
|
||
"ui_topUserAgents": "热门 User-Agent",
|
||
"ui_deviceTypes": "设备类型",
|
||
"ui_fileHash": "哈希(SHA-256)",
|
||
"ui_pathStyle": "路径寻址模式",
|
||
"ui_requestHeaders": "请求头",
|
||
"ui_barkApp": "Bark 应用",
|
||
"ui_administrator": "管理员",
|
||
"ui_nodeLabel": "节点:",
|
||
"ui_payload": "任务参数",
|
||
"ui_selectAll": "全选",
|
||
"ui_production": "生产版本",
|
||
"ui_allDeployments": "所有部署",
|
||
"ui_remoteUrl": "远程 URL",
|
||
"ui_githubRelease": "GitHub Release",
|
||
"ui_releaseTag": "发布标签",
|
||
"ui_originHostHeader": "源站 Host 请求头",
|
||
"ui_globalRuleGroup": "全局规则组",
|
||
"ui_zone": "域名区域",
|
||
"ui_pageNotFound": "页面不存在",
|
||
"ui_jsonBody": "JSON 请求体",
|
||
"ui_openTelemetryTracing": "OpenTelemetry 链路追踪:",
|
||
"ui_clientId": "客户端 ID",
|
||
"ui_clientSecret": "客户端密钥",
|
||
"ui_scopes": "授权范围",
|
||
"ui_copyright": "© 2026 Modern Platform. 保留所有权利。",
|
||
"ui_technologyStack": "技术栈",
|
||
"ui_readyFor": "准备就绪",
|
||
"ui_development": "开发",
|
||
"ui_features": "功能",
|
||
"ui_modern": "现代",
|
||
"ui_versionLabel": "版本",
|
||
"ui_builtAt": "构建时间",
|
||
"ui_breadcrumb": "面包屑导航",
|
||
"ui_more": "更多",
|
||
"ui_previousSlide": "上一张",
|
||
"ui_nextSlide": "下一张",
|
||
"ui_closeLabel": "关闭",
|
||
"ui_imageCrop": "裁剪图片",
|
||
"ui_pagination": "分页导航",
|
||
"ui_previousPage": "上一页",
|
||
"ui_previousLabel": "上一页",
|
||
"ui_nextPage": "下一页",
|
||
"ui_nextLabel": "下一页",
|
||
"ui_morePages": "更多页面",
|
||
"ui_sidebarLabel": "侧边栏",
|
||
"ui_mobileSidebarDescription": "显示移动端侧边栏。",
|
||
"ui_toggleSidebar": "切换侧边栏",
|
||
"ui_loadingLabel": "加载中",
|
||
"origin_error_page_minimalist": "\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{status}} | OpenFlare</title>\n <style>\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n background-color: #ffffff;\n color: #333333;\n height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .container {\n max-width: 600px;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n\n .error-code {\n font-size: 48px;\n font-weight: 700;\n color: #333333;\n line-height: 1.2;\n letter-spacing: -0.02em;\n }\n\n .error-description {\n font-size: 20px;\n line-height: 1.6;\n color: #666666;\n max-width: 480px;\n }\n\n .host {\n font-size: 14px;\n color: #999999;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n word-break: break-all;\n }\n\n .footer {\n margin-top: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: #999999;\n font-size: 14px;\n font-weight: 500;\n }\n\n .brand-icon {\n width: 24px;\n height: 24px;\n fill: currentColor;\n display: block;\n }\n\n @media (max-width: 480px) {\n .error-code {\n font-size: 36px;\n }\n\n .error-description {\n font-size: 18px;\n }\n }\n </style>\n</head>\n<body>\n<div class=\"container\">\n <h1 class=\"error-code\" aria-label=\"HTTP 状态码\">{{status}}</h1>\n <p class=\"error-description\">\n 源站无法访问,请稍后重试。如果问题持续存在,请联系网站管理员。\n </p>\n <p class=\"host\">{{host}}</p>\n <div class=\"footer\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13 2L3 14H12L11 22L21 10H12L13 2Z\" />\n </svg>\n <span>OpenFlare</span>\n </div>\n</div>\n</body>\n</html>\n",
|
||
"origin_error_page_line_style": "\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{status}} | OpenFlare</title>\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n :root {\n --color-bg: #fcfcfc;\n --color-line: #e0e0e0;\n --color-line-hover: #1a1a1a;\n --color-text-main: #1a1a1a;\n --color-text-sub: #666666;\n --color-text-muted: #999999;\n --color-accent: #d4d4d4;\n --font-geo: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n body {\n font-family: var(--font-geo);\n background-color: var(--color-bg);\n background-image: radial-gradient(circle, var(--color-accent) 0.8px, transparent 0.8px);\n background-size: 24px 24px;\n color: var(--color-text-main);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 48px 24px;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n letter-spacing: 0.01em;\n }\n\n .main-container {\n width: 100%;\n max-width: 640px;\n display: flex;\n flex-direction: column;\n gap: 48px;\n }\n\n .line-box {\n border: 1px solid var(--color-line);\n background: rgba(255, 255, 255, 0.6);\n backdrop-filter: blur(4px);\n padding: 32px;\n transition: all var(--transition-fast);\n position: relative;\n }\n\n .line-box:hover {\n border-color: var(--color-line-hover);\n box-shadow: 0 0 0 1px var(--color-line-hover);\n }\n\n .line-box:active {\n transform: scale(0.995);\n transition-duration: 100ms;\n }\n\n .error-header {\n text-align: center;\n }\n\n .error-code {\n font-size: 64px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.03em;\n color: var(--color-text-main);\n margin-bottom: 12px;\n }\n\n .error-label {\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.2em;\n text-transform: uppercase;\n color: var(--color-text-sub);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n }\n\n .error-label::before,\n .error-label::after {\n content: '';\n width: 24px;\n height: 1px;\n background-color: var(--color-line);\n }\n\n .topology-wrapper {\n width: 100%;\n overflow: hidden;\n }\n\n .topology-svg {\n width: 100%;\n height: 140px;\n display: block;\n }\n\n .node-circle {\n fill: var(--color-bg);\n stroke: var(--color-text-main);\n stroke-width: 1.5;\n transition: all var(--transition-fast);\n }\n\n .node-circle.error {\n stroke: var(--color-text-muted);\n stroke-dasharray: 3 3;\n }\n\n .flow-line {\n stroke: var(--color-accent);\n stroke-width: 1.5;\n fill: none;\n transition: stroke var(--transition-fast);\n }\n\n .flow-line.error {\n stroke: var(--color-text-muted);\n stroke-dasharray: 4 4;\n }\n\n .node-text {\n font-family: var(--font-geo);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.1em;\n fill: var(--color-text-sub);\n text-anchor: middle;\n }\n\n .status-text {\n font-family: var(--font-geo);\n font-size: 9px;\n font-weight: 500;\n letter-spacing: 0.05em;\n fill: var(--color-text-muted);\n text-anchor: middle;\n }\n\n .status-text.error {\n fill: #b0b0b0;\n }\n\n .description {\n text-align: center;\n }\n\n .desc-text {\n font-size: 18px;\n line-height: 1.6;\n color: var(--color-text-sub);\n font-weight: 400;\n max-width: 480px;\n margin: 0 auto 24px;\n }\n\n .meta-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n border-top: 1px solid var(--color-line);\n padding-top: 24px;\n text-align: left;\n }\n\n .meta-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .meta-key {\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--color-text-muted);\n }\n\n .meta-val {\n font-size: 13px;\n font-family: 'SF Mono', 'Fira Code', monospace, var(--font-geo);\n color: var(--color-text-main);\n font-weight: 500;\n word-break: break-all;\n }\n\n .footer-brand {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: var(--color-text-muted);\n font-size: 13px;\n font-weight: 500;\n letter-spacing: 0.05em;\n transition: color var(--transition-fast);\n cursor: default;\n }\n\n .footer-brand:hover {\n color: var(--color-text-main);\n }\n\n .brand-icon {\n width: 20px;\n height: 20px;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n fill: none;\n }\n\n @media (max-width: 480px) {\n body {\n padding: 32px 16px;\n }\n .error-code {\n font-size: 48px;\n }\n .line-box {\n padding: 24px 16px;\n }\n .meta-grid {\n grid-template-columns: 1fr;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"main-container\">\n <div class=\"line-box error-header\">\n <div class=\"error-code\" aria-label=\"HTTP 状态码\">{{status}}</div>\n <div class=\"error-label\">源站不可用</div>\n </div>\n\n <div class=\"line-box topology-wrapper\">\n <svg class=\"topology-svg\" viewBox=\"0 0 600 140\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <defs>\n <marker id=\"arrow\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 1 L 8 5 L 0 9 z\" fill=\"#d4d4d4\" />\n </marker>\n <marker id=\"arrow-error\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\" orient=\"auto-start-reverse\">\n <path d=\"M 0 1 L 8 5 L 0 9 z\" fill=\"#999999\" />\n </marker>\n </defs>\n\n <line x1=\"135\" y1=\"70\" x2=\"265\" y2=\"70\" class=\"flow-line\" marker-end=\"url(#arrow)\" />\n <line x1=\"335\" y1=\"70\" x2=\"465\" y2=\"70\" class=\"flow-line error\" marker-end=\"url(#arrow-error)\" />\n\n <circle cx=\"110\" cy=\"70\" r=\"20\" class=\"node-circle\" />\n <text x=\"110\" y=\"74\" class=\"node-text\" style=\"font-size: 8px; fill: #1a1a1a;\">CLI</text>\n <text x=\"110\" y=\"115\" class=\"node-text\">客户端</text>\n <text x=\"110\" y=\"130\" class=\"status-text\">请求已发送</text>\n\n <circle cx=\"300\" cy=\"70\" r=\"20\" class=\"node-circle\" />\n <path d=\"M296 70 L304 64 L301 70 L305 70 L296 76 L299 70 Z\" fill=\"none\" stroke=\"#1a1a1a\" stroke-width=\"1\" stroke-linejoin=\"round\"/>\n <text x=\"300\" y=\"115\" class=\"node-text\">OPENFLARE</text>\n <text x=\"300\" y=\"130\" class=\"status-text\">边缘代理</text>\n\n <circle cx=\"490\" cy=\"70\" r=\"20\" class=\"node-circle error\" />\n <line x1=\"484\" y1=\"64\" x2=\"496\" y2=\"76\" stroke=\"#999\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <line x1=\"496\" y1=\"64\" x2=\"484\" y2=\"76\" stroke=\"#999\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <text x=\"490\" y=\"115\" class=\"node-text\" style=\"fill: #999;\">源站</text>\n <text x=\"490\" y=\"130\" class=\"status-text error\">不可用</text>\n </svg>\n </div>\n\n <div class=\"footer-brand\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n <span>OpenFlare</span>\n </div>\n </div>\n\n <script>\n document.addEventListener('DOMContentLoaded', () => {\n const tsEl = document.getElementById('timestamp');\n if (tsEl) {\n const now = new Date();\n tsEl.textContent = now.toISOString().replace('T', ' ').substring(0, 19) + ' UTC';\n }\n });\n </script>\n</body>\n</html>\n",
|
||
"origin_error_page_baohaus": "\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{status}} | OpenFlare</title>\n <style>\n :root {\n --color-red: #E53935;\n --color-yellow: #FDD835;\n --color-blue: #1E88E5;\n --color-black: #212121;\n --color-white: #FAFAFA;\n --color-grey: #9E9E9E;\n --font-primary: 'Futura', 'Century Gothic', 'Tw Cen MT', sans-serif;\n }\n\n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n background-color: var(--color-white);\n color: var(--color-black);\n font-family: var(--font-primary);\n min-height: 100vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow-x: hidden;\n }\n\n body::before {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-image: radial-gradient(var(--color-grey) 1px, transparent 1px);\n background-size: 20px 20px;\n opacity: 0.15;\n z-index: -1;\n pointer-events: none;\n }\n\n .layout-container {\n display: grid;\n grid-template-columns: 1fr 1.618fr;\n grid-template-rows: 1fr 1fr;\n min-height: 100vh;\n width: 100%;\n }\n\n .zone-left {\n grid-column: 1 / 2;\n grid-row: 1 / 3;\n border-right: 4px solid var(--color-black);\n border-bottom: 4px solid var(--color-black);\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n background-color: var(--color-white);\n padding: 2rem;\n z-index: 2;\n }\n\n .decor-circle {\n position: absolute;\n width: 40vh;\n height: 40vh;\n background-color: var(--color-yellow);\n border-radius: 50%;\n top: 15%;\n left: 10%;\n z-index: 1;\n }\n\n .error-number {\n font-size: clamp(6rem, 12vw, 14rem);\n font-weight: 700;\n line-height: 0.9;\n letter-spacing: -0.04em;\n color: var(--color-black);\n position: relative;\n z-index: 2;\n }\n\n .brand-footer {\n position: absolute;\n bottom: 2rem;\n left: 2rem;\n display: flex;\n align-items: center;\n gap: 10px;\n z-index: 3;\n }\n\n .brand-icon {\n width: 24px;\n height: 24px;\n fill: var(--color-black);\n }\n\n .brand-text {\n font-size: 0.85rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.15em;\n }\n\n .zone-top-right {\n grid-column: 2 / 3;\n grid-row: 1 / 2;\n border-bottom: 4px solid var(--color-black);\n background-color: var(--color-white);\n padding: 4rem;\n display: flex;\n flex-direction: column;\n justify-content: center;\n z-index: 2;\n }\n\n .error-title {\n font-size: clamp(1.5rem, 3vw, 2.5rem);\n text-transform: uppercase;\n font-weight: 700;\n margin-bottom: 1.5rem;\n letter-spacing: 0.05em;\n }\n\n .error-desc {\n font-size: 1.1rem;\n line-height: 1.6;\n max-width: 450px;\n color: var(--color-black);\n }\n\n .meta-data {\n margin-top: 2rem;\n font-family: monospace;\n font-size: 0.8rem;\n color: var(--color-grey);\n border-top: 1px solid var(--color-grey);\n padding-top: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n word-break: break-all;\n }\n\n .zone-bottom-right {\n grid-column: 2 / 3;\n grid-row: 2 / 3;\n background-color: var(--color-white);\n position: relative;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n }\n\n .geo-line {\n position: absolute;\n width: 100%;\n height: 3px;\n background-color: var(--color-black);\n top: 50%;\n left: 0;\n }\n\n .geo-triangle {\n position: absolute;\n right: 15%;\n bottom: 15%;\n width: 0;\n height: 0;\n border-left: 80px solid transparent;\n border-right: 80px solid transparent;\n border-bottom: 140px solid var(--color-blue);\n }\n\n .geo-rect {\n position: absolute;\n top: 40%;\n left: 20%;\n width: 150px;\n height: 30px;\n background-color: var(--color-red);\n transform: rotate(-45deg);\n }\n\n @media (max-width: 900px) {\n .layout-container {\n display: flex;\n flex-direction: column;\n }\n\n .zone-left {\n border-right: none;\n border-bottom: 4px solid var(--color-black);\n min-height: 50vh;\n padding-top: 4rem;\n }\n\n .decor-circle {\n width: 30vh;\n height: 30vh;\n top: 10%;\n }\n\n .zone-top-right {\n border-bottom: 4px solid var(--color-black);\n padding: 2rem;\n }\n\n .zone-bottom-right {\n min-height: 30vh;\n }\n\n .geo-triangle {\n border-left-width: 50px;\n border-right-width: 50px;\n border-bottom-width: 90px;\n right: 10%;\n }\n\n .geo-rect {\n width: 100px;\n height: 20px;\n left: 15%;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"layout-container\">\n <div class=\"zone-left\">\n <div class=\"decor-circle\"></div>\n <div class=\"error-number\" aria-label=\"HTTP 状态码\">{{status}}</div>\n\n <div class=\"brand-footer\">\n <svg class=\"brand-icon\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\"/>\n </svg>\n <span class=\"brand-text\">OpenFlare</span>\n </div>\n </div>\n\n <div class=\"zone-top-right\">\n <h1 class=\"error-title\">源站不可用</h1>\n <p class=\"error-desc\">\n 服务器从源站收到了无效响应。\n <br><br>\n <strong>形式追随功能:</strong> 连接已中断,请检查源站状态。\n </p>\n <div class=\"meta-data\">\n <div>错误码: {{status}}</div>\n <div>主机: {{host}}</div>\n <div>代理: OPENFLARE_EDGE</div>\n <div id=\"timestamp\">--:--:-- UTC</div>\n </div>\n </div>\n\n <div class=\"zone-bottom-right\">\n <div class=\"geo-line\"></div>\n <div class=\"geo-rect\"></div>\n <div class=\"geo-triangle\"></div>\n </div>\n </div>\n\n <script>\n document.addEventListener('DOMContentLoaded', () => {\n const tsElement = document.getElementById('timestamp');\n if (tsElement) {\n const now = new Date();\n tsElement.textContent = now.toISOString().split('T')[1].split('.')[0] + ' UTC';\n }\n });\n </script>\n</body>\n</html>\n",
|
||
"ui_accountId": "账户 ID",
|
||
"ui_endpointLabel": "服务地址",
|
||
"ui_regionLabel": "区域",
|
||
"ui_bucketLabel": "存储桶",
|
||
"ui_accessKeyId": "访问密钥 ID",
|
||
"ui_secretAccessKey": "访问密钥",
|
||
"ui_isoCode": "ISO 代码",
|
||
"ui_serverUrl": "服务器 URL",
|
||
"ui_commandPalette": "命令面板",
|
||
"ui_commandSearch": "搜索要执行的命令…",
|
||
"ui_botLabel": "机器人",
|
||
"ui_unknownLabel": "未知",
|
||
"ui_otherLabel": "其他",
|
||
"ui_toastRegion": "通知",
|
||
"ui_closeToast": "关闭通知",
|
||
"node_type_edge": "边缘节点",
|
||
"node_type_relay": "中继节点",
|
||
"node_type_tunnel": "隧道节点",
|
||
"system_metric_day": "{count}天",
|
||
"system_metric_hour": "{count}小时",
|
||
"system_metric_minute": "{count}分钟",
|
||
"system_metric_second": "{count}秒",
|
||
"system_metric_unknown": "未知",
|
||
"system_metric_none": "无"
|
||
}
|
||
}
|