# 开发交接 - 当前进度说明 更新时间:2026-06-09 ## 当前目标 当前系统从原 IPNux 上游适配改造为齐云 IP 上游适配,主要服务静态/长效住宅代理业务,并保留后续扩展其它 IP 平台的 adapter 能力。 ## 已完成内容 ### 后端 - 已删除 IPNux 上游适配代码: - `IPNuxApiSupport` - `IPNuxStaticProxyClient` - `IPNuxDynamicProxyClient` - 已新增齐云适配包: - `java/src/main/java/com/youlai/boot/proxy/integration/qiyun/QiYunApiSupport.java` - `QiYunStaticProxyClient.java` - `QiYunProductType.java` - `QiYunPeriod.java` - `QiYunPeriodMapper.java` - 齐云供应商类型为 `QIYUN`。 - 齐云认证使用 Header:`apikey = upstreamProvider.authToken`。 - 齐云接口基础地址当前按文档默认配置为 `https://www.qiyunip.com`,存储在后台“上游供应商”的 `baseUrl` 字段。 - 如果调用项目/地区/节点接口出现 `Connection refused`,优先检查: - 后台上游供应商基础地址是否误填、是否带了错误端口。 - 运行后端的服务器是否能访问 `https://www.qiyunip.com/api/agent/getproject?product_type=staticA`。 - 本机/服务器防火墙、代理、DNS、运营商网络是否拦截该域名的 HTTPS 连接。 - 后端已将齐云网络连接异常转换为业务异常,前端会提示“齐云接口连接失败”,并继续写入上游请求日志。 - 系统平台商品类型仍保留原数据库值: - `STATIC_RESIDENTIAL`:当前用于齐云静态/长效代理下单、地区价格、资产开通和资产管理。 - `DYNAMIC_RESIDENTIAL`:动态代理旧结构预留,齐云当前没有动态通道接口,不作为 MVP 主流程使用。 - 不建议直接修改 `product_type` 枚举值,因为订单、价格、资产、会员套餐目录都依赖该值分流。 - 齐云商品类型使用 `Product.upstreamProductCode` 存储: - `staticA` - `staticB` - `home` - `custom` - `custom` 独享长效已纳入齐云静态长效模型,按齐云文档不传 `pid`。 - 商品新增通用上游扩展字段: - `upstreamParams` - `upstreamCapabilities` - `upstreamParams` 用于保存齐云差异参数,例如: ```json { "pid": "1", "areaId": "-1", "nodeId": "-1", "nodeValue": "随机地区" } ``` - 已改造上游 facade / client 静态接口,使续费、改密、调换节点都带 `upstreamProductCode`,方便不同平台识别自己的商品类型。 - 齐云已实现的上游能力: - 购买:`/api/agent/buy` - 节点库存:`/api/agent/getnode` - 节点列表:`/api/agent/proxy` - 续费:`/api/agent/renew` - 修改密码:`/api/agent/editpass` - 调换节点 adapter 能力:`/api/agent/batchchange` - 齐云暂不支持的能力: - 远端白名单 - 远端自动续费开关 - 动态代理通道 - 会员端和 OpenAPI 端已取消 IPNux 的用途标签必填限制。 - 订单创建前已增加齐云商品配置兜底校验: - 历史商品即使没有经过最新后台保存校验,也会在下单前校验齐云产品类型。 - `staticA/staticB/home` 必须有 `pid`。 - 所有齐云静态商品必须有 `nodeId/nodeValue`。 - 静态订单已允许 `purposeWeb` 为空,避免齐云下单被旧 IPNux 用途参数阻断。 - 静态库存查询已传入通用上游参数: - `product_type` - `pid` - `area_id` - 静态资产 VO 已增加 `providerType`,前端可根据供应商类型隐藏不支持的功能。 - 静态资产调换节点业务接口已完成: - 管理端:`POST /api/v1/proxy/static-assets/change-node` - 会员端:`POST /api/v1/member/static-assets/change-node` - 当前仅允许 `QIYUN` 供应商调用。 - 默认目标节点可使用商品 `upstreamParams.nodeId/nodeValue`,也允许请求覆盖。 - 静态资产单资产同步上游节点已完成: - 管理端:`POST /api/v1/proxy/static-assets/sync` - 会员端:`POST /api/v1/member/static-assets/sync` - 当前通过齐云 `/api/agent/proxy` 按资产 `upstreamProxyId` 或 IP 搜索节点。 - 同步成功后会更新本地资产 IP、端口、账号、密码、协议、地区、状态、到期时间和 rawData。 - 静态资产批量同步上游节点已完成: - 管理端:`POST /api/v1/proxy/static-assets/batch-sync` - 会员端:`POST /api/v1/member/static-assets/batch-sync` - 支持传 `assetIds` 批量同步。 - 支持传 `orderId` 按订单同步该订单下的静态资产。 - 批量同步单个资产失败不会中断整体流程,接口返回成功同步数量。 - 静态资产定时同步上游节点已完成: - 定时任务:`StaticProxyUpstreamSyncJob` - 默认每小时执行一次:`proxy.static-upstream-sync.cron=0 0 * * * ?` - 默认每轮最多同步 100 条:`proxy.static-upstream-sync.limit=100` - 默认启用,可通过 `proxy.static-upstream-sync.enabled=false` 关闭。 - 同步范围为启用状态、未过期、齐云供应商下的静态资产,按 `lastSyncTime` 升序优先同步较久未刷新的资产。 - 静态资产同步失败日志已接入现有上游请求日志表: - 复用表:`xxk_upstream_request_log` - 本地同步业务类型:`STATIC_SYNC_NODE` - 本地同步接口名:`StaticProxyAssetSync` - 齐云接口请求失败仍由 `QiYunApiSupport` 自动记录原始接口日志。 - 本地失败场景包括资产商品缺失、上游供应商缺失、上游返回节点无法匹配、本地资产更新失败等。 - 批量同步和定时同步中单资产失败会沉淀日志,不中断其它资产同步。 - 本地同步成功也会写入 `STATIC_SYNC_NODE` 成功日志,用于覆盖旧失败状态。 - 会员前台 v2 批量购买下单链路已联动后端: - `MemberStaticRegionInventoryVO` 已补充 `qiyunIsp`,用于前台运营商筛选和订单快照。 - `MemberStaticPackagePurchaseForm` 已支持 `items[]` 多节点下单参数,每项包含齐云地区、节点、运营商和购买数量。 - `MemberPackageCenterServiceImpl.purchaseStaticPackage` 已支持多节点批量下单,事务内逐节点校验库存并创建订单。 - 批量下单折扣按购物车总购买数量计算,单个节点订单按各自数量拆单。 - “全部地区”已按随机地区处理,不再向齐云库存/下单接口传 `area_id=-1`。 - 代理账号设置已支持随机生成/指定账号;指定账号时校验账号和密码。 - 端口设置后端仍保留兼容字段,但前台暂不开放指定端口,当前按随机端口提交。 - `QiYunStaticProxyClient` 仅在指定账号/指定端口模式下向齐云传 `user`、`pass`、`port`,随机模式不传这些参数。 ### 后台 UI - 上游供应商页面默认供应商类型已改为 `QIYUN`。 - 上游供应商默认基础地址已改为 `https://www.qiyunip.com`。 - 供应商鉴权字段文案已调整为 Header apikey。 - 上游供应商新增表单已按 MVP 调整为齐云优先: - 供应商类型下拉只保留 `齐云 IP(QIYUN)`。 - 新增默认编码:`QIYUN01`。 - 新增默认名称:`齐云IP`。 - 新增默认成功码:`1`。 - 选择 `QIYUN` 时会自动兜底填充基础地址和成功码。 - 商品页面新增齐云产品类型选择: - 静态长效A (高带宽) `staticA` - 静态长效B(特惠) `staticB` - 住宅长效 `home` - 独享长效 `custom` - 商品页面“商品类型”已改文案为“平台商品类型”: - `STATIC_RESIDENTIAL` 显示为“齐云静态长效IP”。 - `DYNAMIC_RESIDENTIAL` 显示为“动态住宅IP(预留)”。 - 齐云具体产品 `staticA/staticB/home/custom` 不在这里选择,而是在“齐云产品类型”中选择。 - 商品页面新增 `上游扩展参数` JSON 输入框。 - 商品页面已新增齐云项目/地区/节点联动选择: - 供应商为 `QIYUN` 且选择齐云产品类型后启用。 - `custom` 独享长效自动隐藏/禁用项目选择。 - 选择项目、地区、节点后自动生成 `upstreamParams` JSON。 - 静态资产页面已对齐云资产隐藏白名单入口。 - 静态资产页面已对齐云资产新增“调换”按钮和弹窗。 - 调换弹窗已升级为齐云项目/地区/节点联动选择器,同时保留目标节点 ID/名称手动输入兜底。 - 静态资产列表已返回调换节点联动所需字段: - `upstreamProviderId` - `upstreamProductCode` - `upstreamParams` - 静态资产页面已对齐云资产新增“同步”按钮,可单资产从齐云刷新节点信息。 - 静态资产页面已增加多选和“批量同步”按钮,仅同步选中的齐云资产。 - 静态资产页面已增加“最近同步失败”列: - 后端从 `xxk_upstream_request_log` 聚合每个资产最近一次 `STATIC_SYNC_NODE` 同步日志。 - 如果最近一次同步日志为失败,则展示失败原因和时间。 - 如果失败后又同步成功,则列表不再显示旧失败。 - 点击失败原因可跳转到上游请求日志页,并自动筛选 `STATIC_SYNC_NODE + 失败 + assetId`。 - 失败列已增加“重试同步”按钮,复用单资产同步接口;重试成功后刷新列表并隐藏旧失败。 - 上游请求日志页面已增加业务类型选项:`静态节点同步(STATIC_SYNC_NODE)`。 - 开放 API 申请审核页“查看账户”跳转路径已统一为 `/open-api-manage/open-api-account`: - 后台静态路由 `ProxyOpenApiAccount` 已注册在 `open-api-manage/open-api-account`。 - 按钮跳转继续携带 `memberUserId` 和标题参数。 - `proxy/open-api-account/index` 是 Vue 组件文件路径,不作为页面访问 URL。 - 会员前台购买闭环 MVP 已补: - `member-web/src/views/console/BuyView.vue` 已从套餐目录读取静态套餐。 - 支持选择商品、地区、时长、数量。 - 支持刷新静态库存。 - 提交后调用 `POST /api/v1/member/package-center/static-orders` 创建静态订单。 - 创建成功后逐个调用 `POST /api/v1/member/orders/{orderNo}/pay`,使用 `BALANCE` 钱包余额支付。 - 支付成功后跳转到 `/console/static-assets` 查看资产。 - 会员前台静态资产页已补实际使用字段: - 展示代理地址、端口、账号、密码、协议、地区、状态、到期时间。 - 支持复制代理地址、账号、密码。 - 会员前台登录/注册方式已接入后台配置: - 前台调用 `GET /api/v1/member/auth/config` 自动读取后台开启的 `ACCOUNT/MOBILE/EMAIL`。 - 登录页按 `loginMethods` 自动展示账号、手机号、邮箱登录 Tab。 - 注册页按 `registerMethods` 自动展示账号、手机号、邮箱注册 Tab。 - 手机号/邮箱如果后台开启验证码,则主表单展示验证码输入和发送按钮;点击发送时弹出图形验证码弹窗,图形验证码正确后再发送手机号/邮箱验证码。 - 微信小程序登录不适合当前 Web 会员前台,未接入页面展示。 - 上游供应商已增加测试连接能力: - 后端:`POST /api/v1/proxy/upstream-providers/{id}/test-connection` - 后台 UI:上游供应商列表新增“测试”按钮。 - 当前齐云测试连接通过调用 `staticA` 项目列表接口做轻量探活。 - 商品保存已增加齐云配置强校验: - 齐云产品类型必须是 `staticA/staticB/home/custom`。 - `staticA/staticB/home` 必须配置项目 ID:`upstreamParams.pid`。 - 所有齐云商品必须配置 `upstreamParams.nodeId/nodeValue`。 - `upstreamParams` 必须是合法 JSON。 ### 用户前台 member-web-v2 - 当前用户前台主开发目录为 `member-web-v2`。 - 控制台菜单栏已直接暴露四种购买入口: - 静态长效A (高带宽) - 静态长效B(特惠) - 住宅长效 - 独享长效 - 购买产品菜单图标已改为自定义 SVG 风格,并统一图标尺寸、菜单文字间距和选中态。 - 从购买产品菜单进入购买页时,页面根据路由参数锁定产品类型,并隐藏商品选择组件。 - 购买页标题已从“购买静态代理”调整为“购买代理”。 - 商品下拉和购买时长下拉已替换为前台自定义 `SearchSelect` 风格组件: - 商品下拉支持搜索。 - 购买时长下拉不启用搜索。 - `SearchSelect` 已新增 `searchable` 开关,默认支持搜索。 - 项目选择已改为“项目分类 + 项目”的布局: - 项目分类支持全部、手游、端游、其他。 - 项目分类默认停留在“全部分类”,不自动选中第一个分类,用户进入购买产品页时先看到全部项目。 - 项目下拉支持搜索。 - 省份筛选仅保留“全部地区”,已去除“全部省份”。 - 节点筛选已增加运营商选择,数据来自齐云节点字段 `qiyunIsp`。 - 购买页已增加代理账号设置: - 随机生成。 - 指定账号。 - 指定账号时展示账号和密码输入框。 - 端口设置暂时隐藏,当前前台固定提交随机端口模式。 - 节点选择已改为多节点购物车式交互: - 节点卡片数量选择器正常常显,居中展示,并加宽可操作区域。 - 支持一次选择多个节点,并为每个节点设置购买数量。 - 节点卡片和订单清单中的减少操作最低保留数量 1,不自动删除清单项。 - 删除清单项需要点击订单清单中的移除按钮。 - 控制台资源入口与静态资产页已统一面向用户显示为“我的代理”,不再在菜单和页面标题中写“静态代理”。 - 控制台顶部搜索栏已从静态输入框改为可用搜索: - 支持搜索控制台功能入口并直接跳转。 - 支持按关键词查询最近订单和我的代理,依赖会员订单列表和静态资产列表的 `keywords` 参数。 - 从搜索结果进入“我的订单”或“我的代理”时,会把关键词带到页面并刷新列表。 - 右侧配置区域已改为“订单清单”购物车样式: - 展示已选节点、运营商、地区、单项数量。 - 支持单项数量加减、移除、清空。 - 汇总节点数量、购买总量和预估金额。 - 前台提交 `POST /api/v1/member/package-center/static-orders` 时,已通过 `items[]` 传递多节点下单明细,并继续按返回订单逐笔调用钱包余额支付。 - 购买页、动态资源、官网价格页、帮助页、开放 API 和通知公告等客户可见文案已收缩为面向客户的表达: - 无资源时统一使用“无可用资源”方向。 - 去除“后台配置”“上游接口”“生产接口”“后台审核”等面向开发/运营内部的文案。 - 会员前台客户可见文案约束: - `member-web-v2` 中控制台和官网客户可见页面必须使用面向用户的商业化表达。 - 避免直接出现“后台、接口、策略、配置、强制、驳回、生产、上游、开发、内部”等面向研发/运营的词。 - 认证类页面建议使用“服务权限、认证进度、申请编号、处理说明、需补充”等用户可理解表达。 - 状态失败或资料不通过时,优先表达为“需补充/请重新提交”,避免直接写“驳回”。 - 会员前台品牌与底部内容配置约束: - 后台“业务配置管理 -> 站点与资源配置 -> 会员前台站点配置”已有用户前台系统名称、浏览器图标、页面 Logo、客服信息和站点底部富文本。 - `member-web-v2` 不应在外壳、标题、Logo、控制台底部等位置继续硬编码品牌信息。 - 用户前台系统名称、页面 Logo、浏览器标签页 ico 和控制台底部富文本必须优先读取公开接口 `GET /api/v1/member/site-config`。 - 接口不可用或字段为空时,前台才使用通用默认值兜底;默认值不能写死为“齐云 IP”。 - 404 等异常页面的浏览器标签标题也必须走站点配置或通用默认值,不能回落到“齐云 IP”。 - 菜单栏/侧边栏品牌位只展示配置的站点名称和 Logo,不再显示 `Member Console`、`Proxy Cloud` 等英文副标题小字。 - 会员前台站点配置已接入: - 新增 `member-web-v2/src/stores/site.ts`,统一加载 `GET /api/v1/member/site-config`。 - 新增 `MemberAPI.siteConfig()` 和 `MemberSiteConfig` 类型。 - 浏览器标题已按“页面名称 - 站点名称”生成,首页为站点名称。 - 前台默认站点名称已从“齐云 IP”调整为通用默认值“代理云会员中心”,`index.html` 默认标题同步调整。 - 浏览器标签页 ico 会使用 `siteFaviconUrl` 更新 ``。 - 官网顶部 Logo、官网底部品牌、控制台侧边栏 Logo、移动端 Header Logo、登录/注册品牌位已优先使用 `siteLogoUrl/siteName`。 - 控制台底部已优先渲染后台配置的 `homeFooterContent` 富文本;未配置时显示默认版权文案。 - 已去除菜单栏、侧边栏和控制台底部默认文案中的 `Member Console`、`Proxy Cloud`;404 模板页版权也已改为站点名称。 - 404 页面挂载后会重新读取站点配置并设置标题为“页面不存在 - 站点名称”。 - 用户控制台实名认证已完成对接: - `member-web-v2/src/views/console/VerifyView.vue` 已从占位 JSON 展示改为真实认证工作流。 - 页面会读取 `GET /api/v1/member/verify/current` 返回的当前认证信息和策略字段。 - 支持展示未提交、待审核、已认证、已驳回状态。 - 支持按策略展示手机号、真实姓名、身份证号、身份证人像面、身份证国徽面、其他图片辅证。 - 支持通过 `POST /api/v1/files` 上传认证图片,并把返回 `url` 写入认证表单。 - 提交时调用 `POST /api/v1/member/verify/submit`,字段对齐后端 `MemberVerifySubmitForm`。 - 待审核和已认证状态下页面只读,已驳回状态允许按审核备注重新提交。 - 用户可见文案已商业化收口: - “提交并查看实名审核资料”调整为“完善实名信息,保障账户使用”。 - “认证策略/强制认证场景/审核状态/认证单号/审核备注/已驳回”等表达已替换为“服务权限/认证进度/申请编号/处理说明/需补充”等用户表达。 - 用户控制台当前会员 ID 字段已按后端参数修正: - 后端 `MemberCurrentUserVO` 返回会员 ID 字段为 `userId`。 - `member-web-v2/src/api/member.ts` 的 `CurrentMember` 已增加 `userId`,并保留 `id` 兼容旧数据。 - 账户资料页和右上角用户菜单已优先展示 `auth.user.userId`,再兜底展示 `auth.user.id`。 - 用户控制台账户资料页认证状态已做前台转义: - `verifyStatus=0` 显示“未提交”。 - `verifyStatus=1` 显示“待审核”。 - `verifyStatus=2` 显示“已认证”。 - `verifyStatus=3` 显示“需补充”。 - 未知状态显示为 `状态 {status}`,避免直接裸露数字。 ### 数据库脚本 - 已更新建表脚本: - `java/sql/mysql/xxk_proxy_platform_v1.sql` - `java/sql/youlai_admin.sql` - 已新增齐云升级脚本: - `java/sql/mysql/xxk_proxy_qiyun_adapter_upgrade.sql` - 该升级脚本已改为兼容老 MySQL 的 `information_schema + PREPARE` 判断写法,重复执行时不会因为字段已存在报错。 - 静态资产同步失败日志复用现有 `xxk_upstream_request_log`,本次不需要新增数据库表或字段。 ## 数据库补丁规则 后续数据库补丁统一按 `V01` 累计更新。 规则: - 不再分散新增多个临时补丁文件。 - 后续新增 SQL 变更统一追加到当前齐云适配升级补丁或后续明确命名的 `V01` 累计补丁中。 - 补丁必须尽量幂等,字段、索引、菜单、配置插入前要先判断是否存在。 - 已遇到的问题:当前 MySQL 版本不支持 `ADD COLUMN IF NOT EXISTS`,所以字段变更要使用 `information_schema` 判断后再动态执行。 ## 未完成 / 后续建议 - 2026-06-10 排查补充: - 已定位“齐云开通成功,但本地订单仍显示开通中”的主要风险点在 `ProxyOrderServiceImpl`。 - 原逻辑在上游返回成功后,如果本地资源落库、续费资产更新、佣金确认、回调等后续步骤抛异常,会进入 `markOpenSyncException`;但该方法原先只写 `remark` 和 `OPEN_SYNC_FAIL` 操作日志,不更新 `order_status/open_status`,因此订单会停留在支付阶段写入的 `OPENING`。 - 现已调整: - 订单成功状态、资源落库和订单明细状态更新作为成功主流程提交。 - 分销佣金确认、开放 API 回调等后置动作失败时只记录 warn,不再回滚订单开通成功状态。 - 上游已成功但本地资源/资产同步失败时,订单会标记为 `OPEN_FAIL`,`compensation_status=NONE`,并写入 `compensation_reason/remark` 和 `OPEN_SYNC_FAIL` 日志,避免继续显示“开通中”。 - 手动退款补偿会拦截 `compensation_status=NONE` 的同步异常订单,避免对“上游已开通成功”的订单误触发退款。 - 当前已经卡住的历史订单不会被代码自动修复,建议先按订单号核对: - `xxk_proxy_order` 是否仍为 `order_status=OPENING/open_status=OPENING`。 - `xxk_order_operate_log` 是否已有 `OPEN_SYNC_FAIL`。 - `xxk_static_proxy_asset` 是否已生成该订单资产。 - `xxk_upstream_request_log` 中 `STATIC_OPEN_ORDER` 的齐云响应是否为成功。 - 若确认资产已生成且可用,可人工将该订单修正为成功;若资产未生成但齐云已开通,需要先按齐云订单号/代理 ID 同步或补录资产,再改订单状态。不要直接对这类订单执行退款补偿。 - 齐云“调换节点”已具备基础可用功能,并已接入项目/地区/节点联动选择器。 - 齐云节点同步已支持单资产手动同步、勾选批量同步、后端按订单同步、定时同步任务、后台失败日志查看、资产列表最近失败提示和失败行内重试。 - 购买闭环 MVP 已补到:会员选择静态套餐 -> 创建订单 -> 钱包余额支付 -> 调齐云开通 -> 生成资产 -> 用户控制台复制使用。 - 后续商业化增强建议: - 正式支付通道充值和支付回调验签。 - 下单/支付按钮防重复提交的后端幂等键。 - 同步失败告警、独立同步历史页。 - 齐云余额/上游账户状态监控,如果齐云接口支持。 - 请求日志定期归档/清理。 - 齐云项目列表、地区列表、节点列表已经接入后台商品配置联动选择器;保留 `upstreamParams` JSON 文本框用于查看和高级手动调整。 - 齐云白名单和远端自动续费文档未提供接口,当前按“不支持远端能力”处理。 - 动态代理相关旧功能结构仍在系统内,但齐云没有动态通道接口,后续如果接其它支持动态的平台,再新增对应 `UpstreamDynamicProxyClient`。 - 当前没有 git 管理,不要依赖 git diff / commit 交接;需要通过本文档和文件实际内容继续开发。 ## 验证说明 - 用户已明确:新增代码不需要编译验证。 - 用户已明确:不要启动 `member-web-v2` 本地 dev 服务。 - 用户已明确:项目当前没有 git,不要依赖 git diff / status / commit 交接,也不要把 git 作为验证步骤。 - 后续交接说明按文件实际内容记录,不要求启动服务或编译。 - 本次后续不再做 Maven / 前端 build 编译验证。 - 之前尝试执行 Maven 时,当前 Windows 沙箱出现 `CreateProcessWithLogonW failed: 1326`,不是业务代码编译输出。 - 如果本地 `npm run dev` 页面仍显示 `IPNux/IPNUX`,当前源码已无该选项,请重启 `ui` 目录下的 Vite dev 服务并强刷浏览器缓存;旧 `ui/dist` 里仍有历史构建产物,但 dev 模式不应加载它。