23 KiB
23 KiB
开发交接 - 当前进度说明
更新时间:2026-06-09
当前目标
当前系统从原 IPNux 上游适配改造为齐云 IP 上游适配,主要服务静态/长效住宅代理业务,并保留后续扩展其它 IP 平台的 adapter 能力。
已完成内容
后端
- 已删除 IPNux 上游适配代码:
IPNuxApiSupportIPNuxStaticProxyClientIPNuxDynamicProxyClient
- 已新增齐云适配包:
java/src/main/java/com/youlai/boot/proxy/integration/qiyun/QiYunApiSupport.javaQiYunStaticProxyClient.javaQiYunProductType.javaQiYunPeriod.javaQiYunPeriodMapper.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存储:staticAstaticBhomecustom
custom独享长效已纳入齐云静态长效模型,按齐云文档不传pid。- 商品新增通用上游扩展字段:
upstreamParamsupstreamCapabilities
upstreamParams用于保存齐云差异参数,例如:
{
"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_typepidarea_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
- 静态长效A (高带宽)
- 商品页面“商品类型”已改文案为“平台商品类型”:
STATIC_RESIDENTIAL显示为“齐云静态长效IP”。DYNAMIC_RESIDENTIAL显示为“动态住宅IP(预留)”。- 齐云具体产品
staticA/staticB/home/custom不在这里选择,而是在“齐云产品类型”中选择。
- 商品页面新增
上游扩展参数JSON 输入框。 - 商品页面已新增齐云项目/地区/节点联动选择:
- 供应商为
QIYUN且选择齐云产品类型后启用。 custom独享长效自动隐藏/禁用项目选择。- 选择项目、地区、节点后自动生成
upstreamParamsJSON。
- 供应商为
- 静态资产页面已对齐云资产隐藏白名单入口。
- 静态资产页面已对齐云资产新增“调换”按钮和弹窗。
- 调换弹窗已升级为齐云项目/地区/节点联动选择器,同时保留目标节点 ID/名称手动输入兜底。
- 静态资产列表已返回调换节点联动所需字段:
upstreamProviderIdupstreamProductCodeupstreamParams
- 静态资产页面已对齐云资产新增“同步”按钮,可单资产从齐云刷新节点信息。
- 静态资产页面已增加多选和“批量同步”按钮,仅同步选中的齐云资产。
- 静态资产页面已增加“最近同步失败”列:
- 后端从
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更新<link rel="icon">。 - 官网顶部 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.sqljava/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 已补到:会员选择静态套餐 -> 创建订单 -> 钱包余额支付 -> 调齐云开通 -> 生成资产 -> 用户控制台复制使用。
- 后续商业化增强建议:
- 正式支付通道充值和支付回调验签。
- 下单/支付按钮防重复提交的后端幂等键。
- 同步失败告警、独立同步历史页。
- 齐云余额/上游账户状态监控,如果齐云接口支持。
- 请求日志定期归档/清理。
- 齐云项目列表、地区列表、节点列表已经接入后台商品配置联动选择器;保留
upstreamParamsJSON 文本框用于查看和高级手动调整。 - 齐云白名单和远端自动续费文档未提供接口,当前按“不支持远端能力”处理。
- 动态代理相关旧功能结构仍在系统内,但齐云没有动态通道接口,后续如果接其它支持动态的平台,再新增对应
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 模式不应加载它。