mirror of
https://github.com/cedar2025/Xboard.git
synced 2025-01-22 10:38:14 -05:00
Compare commits
6 Commits
c2c88cd7a5
...
ded0da79b0
Author | SHA1 | Date | |
---|---|---|---|
|
ded0da79b0 | ||
|
762d1fb44b | ||
|
8a75523796 | ||
|
da635d0b3b | ||
|
afd083b524 | ||
|
6291509096 |
2
.github/ISSUE_TEMPLATE/bug-report----问题反馈.md
vendored
2
.github/ISSUE_TEMPLATE/bug-report----问题反馈.md
vendored
@ -33,7 +33,7 @@ PHP版本 | Version:
|
||||
<!-- 拖拽图片到这里(请注意隐藏敏感信息)-->
|
||||
|
||||
**日志信息 | Logs**
|
||||
<!-- 运行命令:php artisan log:export 7 -->
|
||||
<!-- storage/logs 目录下的日志 -->
|
||||
```log
|
||||
// 粘贴日志内容到这里
|
||||
```
|
||||
|
@ -142,17 +142,17 @@ class Server extends Model
|
||||
private function castValueWithConfig($value, array $config)
|
||||
{
|
||||
if ($value === null) {
|
||||
return $config['default'];
|
||||
return $config['default'] ?? null;
|
||||
}
|
||||
|
||||
return match($config['type']) {
|
||||
return match ($config['type']) {
|
||||
'integer' => (int) $value,
|
||||
'boolean' => (bool) $value,
|
||||
'string' => (string) $value,
|
||||
'array' => (array) $value,
|
||||
'object' => is_array($value) ?
|
||||
$this->castSettingsWithConfig($value, $config['fields']) :
|
||||
$config['default'],
|
||||
'object' => is_array($value) ?
|
||||
$this->castSettingsWithConfig($value, $config['fields']) :
|
||||
$config['default'] ?? null,
|
||||
default => $value
|
||||
};
|
||||
}
|
||||
@ -195,7 +195,7 @@ class Server extends Model
|
||||
|
||||
$configs = self::PROTOCOL_CONFIGURATIONS[$this->type] ?? [];
|
||||
$castedSettings = $this->castSettingsWithConfig($value ?? [], $configs);
|
||||
|
||||
|
||||
$this->attributes['protocol_settings'] = json_encode($castedSettings);
|
||||
}
|
||||
|
||||
|
@ -45,19 +45,11 @@
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"cweagans/composer-patches": true
|
||||
}
|
||||
"sort-packages": true
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"dont-discover": []
|
||||
},
|
||||
"patches": {
|
||||
"joanhey/adapterman": {
|
||||
"http": "patches/Http.patch"
|
||||
}
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
|
@ -125,8 +125,11 @@ docker compose run -it --rm web php artisan xboard:install
|
||||
|
||||
⚠️ Important Configuration Notes:
|
||||
1. Database Configuration
|
||||
- Database Host: Enter `mysql` (not localhost or 127.0.0.1)
|
||||
- Database Port: `3306`
|
||||
- Database Host: Choose based on your deployment:
|
||||
1. If database and Xboard are in the same network, use `mysql`
|
||||
2. If connection fails, go to: Database -> Select Database -> Connection Info -> Container Connection, and use the "Host" value
|
||||
3. If using external database, enter your actual database host
|
||||
- Database Port: `3306` (default port unless configured otherwise)
|
||||
- Database Name: `xboard` (the database created earlier)
|
||||
- Database User: `xboard` (the user created earlier)
|
||||
- Database Password: Enter the password saved earlier
|
||||
|
@ -150,8 +150,11 @@ docker compose run -it --rm web php artisan xboard:install
|
||||
|
||||
⚠️ 重要配置说明:
|
||||
1. 数据库配置
|
||||
- 数据库地址:填写 `mysql`(注意不是 localhost 或 127.0.0.1)
|
||||
- 数据库端口:`3306`
|
||||
- 数据库地址:根据部署方式选择以下配置
|
||||
1. 如果数据库和 Xboard 在同一网络,一般填写 `mysql`
|
||||
2. 如果连接失败,请在 1Panel 面板中依次打开:数据库 -> 选择对应数据库 -> 连接信息 -> 容器连接,使用其中的"地址"
|
||||
3. 如果使用外部数据库,填写实际的数据库地址
|
||||
- 数据库端口:`3306`(如无特殊配置,使用默认端口)
|
||||
- 数据库名称:`xboard`(之前创建的数据库名)
|
||||
- 数据库用户:`xboard`(之前创建的用户名)
|
||||
- 数据库密码:填写之前保存的密码
|
||||
|
@ -109,7 +109,7 @@ location / {
|
||||
> - 如果您是最近安装的新版本,使用下面的命令:
|
||||
```bash
|
||||
docker compose pull && \
|
||||
docker compose run -it --rm web php artisan xboard:update && \
|
||||
docker compose run -it --rm web sh update.sh && \
|
||||
docker compose up -d
|
||||
```
|
||||
> - 如果您是较早安装的旧版本,需要将命令中的 `web` 改为 `xboard`,即:
|
||||
@ -117,7 +117,7 @@ docker compose up -d
|
||||
git config --global --add safe.directory $(pwd)
|
||||
git fetch --all && git reset --hard origin/master && git pull origin master
|
||||
docker compose pull && \
|
||||
docker compose run -it --rm xboard php artisan xboard:update && \
|
||||
docker compose run -it --rm xboard sh update.sh && \
|
||||
docker compose up -d
|
||||
```
|
||||
> 🤔 不确定用哪个?可以先尝试使用新版命令,如果报错再使用旧版命令。
|
||||
|
@ -1,23 +0,0 @@
|
||||
diff --git a/src/Http.php b/src/Http.php
|
||||
index 6c6cb16..f1a7f3f 100644
|
||||
--- a/src/Http.php
|
||||
+++ b/src/Http.php
|
||||
@@ -680,7 +680,7 @@
|
||||
}
|
||||
|
||||
// Parse $_POST.
|
||||
- if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['CONTENT_TYPE']) {
|
||||
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
switch ($_SERVER['CONTENT_TYPE']) {
|
||||
case 'multipart/form-data':
|
||||
static::parseUploadFiles($http_body, $http_post_boundary);
|
||||
@@ -691,6 +691,8 @@
|
||||
case 'application/x-www-form-urlencoded':
|
||||
\parse_str($http_body, $_POST);
|
||||
break;
|
||||
+ default:
|
||||
+ $_POST = \json_decode($http_body, true) ?? [];
|
||||
}
|
||||
- }
|
||||
+ }
|
||||
}
|
2
public/assets/admin/assets/index.js
vendored
2
public/assets/admin/assets/index.js
vendored
File diff suppressed because one or more lines are too long
3
public/assets/admin/locales/en-US.js
vendored
3
public/assets/admin/locales/en-US.js
vendored
@ -645,7 +645,8 @@ window.XBOARD_TRANSLATIONS['en-US'] = {
|
||||
"title": "Set Webhook",
|
||||
"description": "Set up webhook for the bot. Without setting it, you won't receive Telegram notifications.",
|
||||
"button": "One-Click Setup",
|
||||
"setting": "Setting Webhook..."
|
||||
"setting": "Setting Webhook...",
|
||||
"success": "Webhook set successfully"
|
||||
},
|
||||
"bot_enable": {
|
||||
"title": "Enable Bot Notifications",
|
||||
|
288
public/assets/admin/locales/ko-KR.js
vendored
288
public/assets/admin/locales/ko-KR.js
vendored
@ -413,9 +413,293 @@ window.XBOARD_TRANSLATIONS['ko-KR'] = {
|
||||
"description": "활성화하면 사용자가 구독을 변경할 때 시스템이 기존 구독에서 공제합니다. 자세한 내용은 문서를 참조하세요."
|
||||
},
|
||||
"new_order_event": {
|
||||
"title": "새 주문 이벤트",
|
||||
"description": "새 주문이 생성될 때 실행할 작업을 선택합니다."
|
||||
"title": "새 구독 시 트리거 이벤트",
|
||||
"description": "새 구독이 완료되면 이 작업이 트리거됩니다.",
|
||||
"options": {
|
||||
"no_action": "작업 없음",
|
||||
"reset_traffic": "사용자 트래픽 초기화"
|
||||
}
|
||||
},
|
||||
"renew_order_event": {
|
||||
"title": "구독 갱신 시 트리거 이벤트",
|
||||
"description": "구독 갱신이 완료되면 이 작업이 트리거됩니다.",
|
||||
"options": {
|
||||
"no_action": "작업 없음",
|
||||
"reset_traffic": "사용자 트래픽 초기화"
|
||||
}
|
||||
},
|
||||
"change_order_event": {
|
||||
"title": "구독 변경 시 트리거 이벤트",
|
||||
"description": "구독 변경이 완료되면 이 작업이 트리거됩니다.",
|
||||
"options": {
|
||||
"no_action": "작업 없음",
|
||||
"reset_traffic": "사용자 트래픽 초기화"
|
||||
}
|
||||
},
|
||||
"subscribe_path": {
|
||||
"title": "구독 경로",
|
||||
"description": "구독 경로, 수정하면 기존 구독 경로가 변경됩니다",
|
||||
"current_format": "현재 구독 경로 형식: {path}/xxxxxxxxxx"
|
||||
},
|
||||
"show_info_to_server": {
|
||||
"title": "노드에 구독 정보 표시",
|
||||
"description": "활성화하면 사용자가 노드를 구독할 때 구독 정보가 출력됩니다."
|
||||
},
|
||||
"show_protocol_to_server": {
|
||||
"title": "노드 이름에 프로토콜 표시",
|
||||
"description": "활성화하면 구독 라인에 프로토콜 이름이 포함됩니다 (예: [Hy2]홍콩)"
|
||||
},
|
||||
"saving": "저장 중...",
|
||||
"plan": {
|
||||
"title": "구독 플랜",
|
||||
"add": "플랜 추가",
|
||||
"search": "플랜 검색...",
|
||||
"sort": {
|
||||
"edit": "정렬 편집",
|
||||
"save": "정렬 저장"
|
||||
},
|
||||
"columns": {
|
||||
"id": "ID",
|
||||
"show": "표시",
|
||||
"sell": "판매",
|
||||
"renew": "갱신",
|
||||
"renew_tooltip": "구독 판매가 중단된 경우 기존 사용자의 갱신 가능 여부",
|
||||
"name": "이름",
|
||||
"stats": "통계",
|
||||
"group": "권한 그룹",
|
||||
"price": "가격",
|
||||
"actions": "작업",
|
||||
"edit": "편집",
|
||||
"delete": "삭제",
|
||||
"delete_confirm": {
|
||||
"title": "삭제 확인",
|
||||
"description": "이 작업은 이 구독을 영구적으로 삭제하며 되돌릴 수 없습니다. 계속하시겠습니까?",
|
||||
"success": "성공적으로 삭제됨"
|
||||
},
|
||||
"price_period": {
|
||||
"monthly": "월간",
|
||||
"quarterly": "분기",
|
||||
"half_yearly": "반년",
|
||||
"yearly": "연간",
|
||||
"two_yearly": "2년",
|
||||
"three_yearly": "3년",
|
||||
"onetime": "일회성",
|
||||
"reset_traffic": "트래픽 초기화",
|
||||
"unit": {
|
||||
"month": "/월",
|
||||
"quarter": "/분기",
|
||||
"half_year": "/반년",
|
||||
"year": "/년",
|
||||
"two_year": "/2년",
|
||||
"three_year": "/3년",
|
||||
"times": "/회"
|
||||
}
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"add_title": "플랜 추가",
|
||||
"edit_title": "플랜 편집",
|
||||
"name": {
|
||||
"label": "플랜 이름",
|
||||
"placeholder": "플랜 이름 입력"
|
||||
},
|
||||
"group": {
|
||||
"label": "권한 그룹",
|
||||
"placeholder": "권한 그룹 선택",
|
||||
"add": "그룹 추가"
|
||||
},
|
||||
"transfer": {
|
||||
"label": "트래픽",
|
||||
"placeholder": "트래픽 크기 입력",
|
||||
"unit": "GB"
|
||||
},
|
||||
"speed": {
|
||||
"label": "속도 제한",
|
||||
"placeholder": "속도 제한 입력",
|
||||
"unit": "Mbps"
|
||||
},
|
||||
"price": {
|
||||
"title": "가격 설정",
|
||||
"base_price": "기본 월간 가격",
|
||||
"clear": {
|
||||
"button": "가격 초기화",
|
||||
"tooltip": "모든 기간 가격 설정 초기화"
|
||||
}
|
||||
},
|
||||
"device": {
|
||||
"label": "기기 제한",
|
||||
"placeholder": "제한 없음은 비워두세요",
|
||||
"unit": "기기"
|
||||
},
|
||||
"capacity": {
|
||||
"label": "용량 제한",
|
||||
"placeholder": "제한 없음은 비워두세요",
|
||||
"unit": "사용자"
|
||||
},
|
||||
"reset_method": {
|
||||
"label": "트래픽 초기화 방식",
|
||||
"placeholder": "트래픽 초기화 방식 선택",
|
||||
"description": "구독 트래픽 초기화 방식을 설정하며, 다른 방식은 사용자 트래픽 계산 방식에 영향을 미칩니다",
|
||||
"options": {
|
||||
"follow_system": "시스템 설정 따름",
|
||||
"monthly_first": "매월 1일",
|
||||
"monthly_reset": "월간 초기화",
|
||||
"no_reset": "초기화 없음",
|
||||
"yearly_first": "1월 1일",
|
||||
"yearly_reset": "연간 초기화"
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"label": "플랜 설명",
|
||||
"placeholder": "여기에 플랜 설명을 작성하세요...",
|
||||
"description": "마크다운 형식을 지원하며, 제목, 목록, 굵게, 기울임꼴 등의 스타일을 사용하여 내용을 꾸밀 수 있습니다",
|
||||
"preview": "미리보기",
|
||||
"preview_button": {
|
||||
"show": "미리보기 표시",
|
||||
"hide": "미리보기 숨기기"
|
||||
},
|
||||
"template": {
|
||||
"button": "템플릿 사용",
|
||||
"tooltip": "클릭하여 미리 설정된 플랜 설명 템플릿 사용",
|
||||
"content": "## 플랜 특징\n• 고속 및 안정적인 글로벌 네트워크 액세스\n• 여러 기기 동시 온라인 지원\n• 무제한 트래픽 초기화\n\n## 사용 안내\n1. 지원 기기: iOS, Android, Windows, macOS\n2. 24/7 기술 지원\n3. 자동 주기적 트래픽 초기화\n\n## 주의사항\n- 남용 금지\n- 현지 법률 및 규정 준수\n- 언제든지 플랜 변경 지원"
|
||||
}
|
||||
},
|
||||
"force_update": {
|
||||
"label": "사용자에게 강제 업데이트"
|
||||
},
|
||||
"submit": {
|
||||
"submitting": "제출 중...",
|
||||
"submit": "제출",
|
||||
"cancel": "취소",
|
||||
"success": {
|
||||
"add": "플랜이 성공적으로 추가되었습니다",
|
||||
"update": "플랜이 성공적으로 업데이트되었습니다"
|
||||
}
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"description": "여기에서 구독 플랜을 구성할 수 있으며, 추가, 삭제 및 편집 작업을 수행할 수 있습니다."
|
||||
}
|
||||
}
|
||||
},
|
||||
"email": {
|
||||
"title": "이메일 설정",
|
||||
"description": "인증 코드, 비밀번호 재설정 및 알림 전송을 위한 시스템 이메일 서비스를 구성하며, 다양한 SMTP 제공업체를 지원합니다.",
|
||||
"email_host": {
|
||||
"title": "SMTP 호스트",
|
||||
"description": "SMTP 서버 주소, 예: smtp.gmail.com"
|
||||
},
|
||||
"email_port": {
|
||||
"title": "SMTP 포트",
|
||||
"description": "SMTP 서버 포트, 일반적인 포트: 25, 465, 587"
|
||||
},
|
||||
"email_username": {
|
||||
"title": "SMTP 사용자 이름",
|
||||
"description": "SMTP 인증 사용자 이름"
|
||||
},
|
||||
"email_password": {
|
||||
"title": "SMTP 비밀번호",
|
||||
"description": "SMTP 인증 비밀번호 또는 애플리케이션별 비밀번호"
|
||||
},
|
||||
"email_encryption": {
|
||||
"title": "암호화 방식",
|
||||
"description": "이메일 암호화 방식",
|
||||
"none": "없음",
|
||||
"ssl": "SSL/TLS",
|
||||
"tls": "STARTTLS"
|
||||
},
|
||||
"email_from": {
|
||||
"title": "발신자 주소",
|
||||
"description": "발신자 이메일 주소"
|
||||
},
|
||||
"email_from_name": {
|
||||
"title": "발신자 이름",
|
||||
"description": "발신자 표시 이름"
|
||||
},
|
||||
"email_template": {
|
||||
"title": "이메일 템플릿",
|
||||
"description": "이메일 템플릿 사용자 정의 방법은 문서를 참조하세요",
|
||||
"placeholder": "이메일 템플릿 선택"
|
||||
},
|
||||
"remind_mail": {
|
||||
"title": "이메일 알림",
|
||||
"description": "활성화하면 사용자는 구독이 만료되거나 트래픽이 부족할 때 이메일 알림을 받습니다."
|
||||
},
|
||||
"test": {
|
||||
"title": "테스트 이메일 전송",
|
||||
"sending": "전송 중...",
|
||||
"description": "구성을 확인하기 위해 테스트 이메일 전송",
|
||||
"success": "테스트 이메일이 성공적으로 전송되었습니다",
|
||||
"error": "테스트 이메일 전송 실패"
|
||||
}
|
||||
},
|
||||
"telegram": {
|
||||
"title": "텔레그램 설정",
|
||||
"description": "사용자 알림, 계정 연동 및 명령어 상호작용을 위한 텔레그램 봇 기능을 구성합니다.",
|
||||
"bot_token": {
|
||||
"title": "봇 토큰",
|
||||
"description": "Botfather가 제공한 토큰을 입력하세요.",
|
||||
"placeholder": "0000000000:xxxxxxxxx_xxxxxxxxxxxxxxx"
|
||||
},
|
||||
"webhook": {
|
||||
"title": "웹훅 설정",
|
||||
"description": "봇의 웹훅을 설정합니다. 설정하지 않으면 텔레그램 알림을 받을 수 없습니다.",
|
||||
"button": "원클릭 설정",
|
||||
"setting": "웹훅 설정 중...",
|
||||
"success": "웹훅이 성공적으로 설정되었습니다"
|
||||
},
|
||||
"bot_enable": {
|
||||
"title": "봇 알림 활성화",
|
||||
"description": "활성화하면 봇이 관리자와 텔레그램 계정을 연동한 사용자에게 기본 알림을 전송합니다."
|
||||
},
|
||||
"discuss_link": {
|
||||
"title": "그룹 링크",
|
||||
"description": "입력하면 사용자 측에 표시되거나 필요한 곳에서 사용됩니다.",
|
||||
"placeholder": "https://t.me/xxxxxx"
|
||||
}
|
||||
},
|
||||
"app": {
|
||||
"title": "앱 설정",
|
||||
"description": "API 인터페이스, 버전 관리 및 푸시 알림을 포함한 모바일 애플리케이션 구성을 관리합니다.",
|
||||
"common": {
|
||||
"placeholder": "입력해주세요"
|
||||
},
|
||||
"windows": {
|
||||
"version": {
|
||||
"title": "Windows 버전",
|
||||
"description": "Windows 클라이언트의 현재 버전 번호"
|
||||
},
|
||||
"download": {
|
||||
"title": "Windows 다운로드 URL",
|
||||
"description": "Windows 클라이언트 다운로드 링크"
|
||||
}
|
||||
},
|
||||
"macos": {
|
||||
"version": {
|
||||
"title": "macOS 버전",
|
||||
"description": "macOS 클라이언트의 현재 버전 번호"
|
||||
},
|
||||
"download": {
|
||||
"title": "macOS 다운로드 URL",
|
||||
"description": "macOS 클라이언트 다운로드 링크"
|
||||
}
|
||||
},
|
||||
"android": {
|
||||
"version": {
|
||||
"title": "Android 버전",
|
||||
"description": "Android 클라이언트의 현재 버전 번호"
|
||||
},
|
||||
"download": {
|
||||
"title": "Android 다운로드 URL",
|
||||
"description": "Android 클라이언트 다운로드 링크"
|
||||
}
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"saving": "저장 중...",
|
||||
"save_success": "자동으로 저장됨",
|
||||
"placeholder": "입력해주세요",
|
||||
"autoSaved": "자동으로 저장됨"
|
||||
}
|
||||
},
|
||||
"group": {
|
||||
|
3
public/assets/admin/locales/zh-CN.js
vendored
3
public/assets/admin/locales/zh-CN.js
vendored
@ -565,7 +565,8 @@ window.XBOARD_TRANSLATIONS['zh-CN'] = {
|
||||
"title": "设置Webhook",
|
||||
"description": "设置机器人的webhook,不设置将无法收到Telegram通知。",
|
||||
"button": "一键设置",
|
||||
"setting": "设置中..."
|
||||
"setting": "设置中...",
|
||||
"success": "Webhook 设置成功"
|
||||
},
|
||||
"bot_enable": {
|
||||
"title": "启用机器人通知",
|
||||
|
Loading…
Reference in New Issue
Block a user