fix: 修复编辑oai账号是代理IP被错误保存的问题

This commit is contained in:
shaw
2025-09-18 10:22:41 +08:00
parent 0881cc09e2
commit f70c3babc9
3 changed files with 33 additions and 79 deletions

View File

@@ -11,7 +11,7 @@
**🔐 自行搭建Claude API中转服务支持多账户管理** **🔐 自行搭建Claude API中转服务支持多账户管理**
[English](#english) • [中文文档](#中文文档) • [📸 界面预览](docs/preview.md) • [📢 公告频道](https://t.me/claude_relay_service) [English](#english) • [中文文档](#中文文档) • [📸 演示站点](https://demo.pincc.ai/admin-next/login) • [📢 公告频道](https://t.me/claude_relay_service)
</div> </div>
@@ -42,27 +42,19 @@
如果有以上困惑,那这个项目可能适合你。 如果有以上困惑,那这个项目可能适合你。
> 💡 **热心网友福利** > 💡 **Claude Code 拼车服务**
> 热心网友正在用本项目,正在拼车官方Claude Code Max 20X 200刀版本,是现在最稳定的方案。 > 目前有两个稳定的 Claude Code Max 20X 200刀 拼车渠道:
> 有需要自取: [https://ctok.ai/](https://ctok.ai/) > 1. **PinCC** - 项目官方运营的拼车服务:[https://pincc.ai/](https://pincc.ai/)
> 2. **CToK** - 社区认可的合作伙伴服务:[https://ctok.ai/](https://ctok.ai/)
### 适合的场景 ### 适合的场景
**找朋友拼车**: 三五好友一起分摊Claude Code Max订阅Opus爽用 **找朋友拼车**: 三五好友一起分摊Claude Code Max订阅
**隐私敏感**: 不想让第三方镜像看到你的对话内容 **隐私敏感**: 不想让第三方镜像看到你的对话内容
**技术折腾**: 有基本的技术基础,愿意自己搭建和维护 **技术折腾**: 有基本的技术基础,愿意自己搭建和维护
**稳定需求**: 需要长期稳定的Claude访问不想受制于镜像站 **稳定需求**: 需要长期稳定的Claude访问不想受制于镜像站
**地区受限**: 无法直接访问Claude官方服务 **地区受限**: 无法直接访问Claude官方服务
### 不适合的场景
**纯小白**: 完全不懂技术,连服务器都不会买
**偶尔使用**: 一个月用不了几次,没必要折腾
**注册问题**: 无法自行注册Claude账号
**支付问题**: 没有支付渠道订阅Claude Code
**如果你只是普通用户,对隐私要求不高,随便玩玩、想快速体验 Claude那选个你熟知的镜像站会更合适。**
--- ---
## 💭 为什么要自己搭? ## 💭 为什么要自己搭?
@@ -84,7 +76,7 @@
## 🚀 核心功能 ## 🚀 核心功能
> 📸 **[点击查看界面预览](docs/preview.md)** - 查看Web管理界面的详细截图 > 📸 **[查看演示站点](https://demo.pincc.ai/admin-next/login)**
### 基础功能 ### 基础功能
@@ -134,13 +126,7 @@
### 快速安装 ### 快速安装
```bash ```bash
# 下载并运行管理脚本 curl -fsSL https://pincc.ai/manage.sh -o manage.sh && chmod +x manage.sh && ./manage.sh install
curl -fsSL https://raw.githubusercontent.com/Wei-Shaw/claude-relay-service/main/scripts/manage.sh -o manage.sh
chmod +x manage.sh
./manage.sh install
# 安装后可以使用 crs 命令管理服务
crs # 显示交互式菜单
``` ```
### 脚本功能 ### 脚本功能
@@ -298,60 +284,15 @@ npm run service:status
## 🐳 Docker 部署 ## 🐳 Docker 部署
### 使用 Docker Hub 镜像(最简单) ### Docker compose
> 🚀 使用官方镜像,自动构建,始终保持最新版本
#### 第一步下载构建docker-compose.yml文件的脚本并执行
```bash ```bash
# 拉取镜像(支持 amd64 和 arm64 curl -fsSL https://pincc.ai/crs-compose.sh -o crs-compose.sh && chmod +x crs-compose.sh && ./crs-compose.sh
docker pull weishaw/claude-relay-service:latest ```
# 使用 docker-compose #### 第二步:启动
# 创建 .env 文件用于 docker-compose 的环境变量: ```bash
cat > .env << 'EOF'
# 必填:安全密钥(请修改为随机值)
JWT_SECRET=your-random-secret-key-at-least-32-chars
ENCRYPTION_KEY=your-32-character-encryption-key
# 可选:管理员凭据
ADMIN_USERNAME=cr_admin
ADMIN_PASSWORD=your-secure-password
EOF
# 创建 docker-compose.yml 文件:
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
claude-relay:
image: weishaw/claude-relay-service:latest
container_name: claude-relay-service
restart: unless-stopped
ports:
- "3000:3000"
environment:
- JWT_SECRET=${JWT_SECRET}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- REDIS_HOST=redis
- ADMIN_USERNAME=${ADMIN_USERNAME:-}
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
volumes:
- ./logs:/app/logs
- ./data:/app/data
depends_on:
- redis
redis:
image: redis:7-alpine
container_name: claude-relay-redis
restart: unless-stopped
volumes:
- redis_data:/data
volumes:
redis_data:
EOF
# 启动服务
docker-compose up -d docker-compose up -d
``` ```
@@ -364,7 +305,6 @@ docker-compose.yml 已包含:
- ✅ Redis数据库 - ✅ Redis数据库
- ✅ 健康检查 - ✅ 健康检查
- ✅ 自动重启 - ✅ 自动重启
- ✅ 所有配置通过环境变量管理
### 环境变量说明 ### 环境变量说明

View File

@@ -671,10 +671,7 @@ async function getAllAccounts() {
if (accountData.proxy) { if (accountData.proxy) {
try { try {
accountData.proxy = JSON.parse(accountData.proxy) accountData.proxy = JSON.parse(accountData.proxy)
// 屏蔽代理密码 // 屏蔽代理密码,返回明文
if (accountData.proxy && accountData.proxy.password) {
accountData.proxy.password = '******'
}
} catch (e) { } catch (e) {
// 如果解析失败设置为null // 如果解析失败设置为null
accountData.proxy = null accountData.proxy = null

View File

@@ -1883,7 +1883,19 @@ const selectedTagCount = computed(() => {
// 分页相关 // 分页相关
const currentPage = ref(1) const currentPage = ref(1)
const pageSize = ref(10) // 从 localStorage 读取保存的每页显示条数,默认为 10
const getInitialPageSize = () => {
const saved = localStorage.getItem('apiKeysPageSize')
if (saved) {
const parsedSize = parseInt(saved, 10)
// 验证保存的值是否在允许的选项中
if ([10, 20, 50, 100].includes(parsedSize)) {
return parsedSize
}
}
return 10
}
const pageSize = ref(getInitialPageSize())
const pageSizeOptions = [10, 20, 50, 100] const pageSizeOptions = [10, 20, 50, 100]
// 模态框状态 // 模态框状态
@@ -3640,6 +3652,11 @@ watch([currentPage, pageSize], () => {
updateSelectAllState() updateSelectAllState()
}) })
// 监听每页显示条数变化,保存到 localStorage
watch(pageSize, (newSize) => {
localStorage.setItem('apiKeysPageSize', newSize.toString())
})
// 监听API Keys数据变化清理无效的选中状态 // 监听API Keys数据变化清理无效的选中状态
watch(apiKeys, () => { watch(apiKeys, () => {
const validIds = new Set(apiKeys.value.map((key) => key.id)) const validIds = new Set(apiKeys.value.map((key) => key.id))