feat: 小程序阅读记录与资料链路、管理端用户规则、API/VIP/推荐与运营脚本

- miniprogram: reading-records、imageUrl/mpNavigate、多页资料与 VIP 展示调整
- soul-admin: Users/Settings/UserDetailModal、dist 构建产物更新
- soul-api: user/vip/referral/ckb/db、MBTI 头像管理、user_rule_completion、迁移 SQL
- .cursor: karuo-party 与飞书文档;.gitignore 忽略 .tmp_skill_bundle

Made-with: Cursor
This commit is contained in:
卡若
2026-03-23 18:38:23 +08:00
parent cb6e2bff56
commit fa3da12b16
82 changed files with 5621 additions and 2723 deletions

View File

@@ -4,9 +4,8 @@
重要说明(微信官方限制):
- 代码上传可用本机「微信开发者工具」CLI 或 miniprogram-ci。
- submit_audit开放平台文档标明主要为「第三方平台代调用」;自有主体使用小程序 appid+secret
换取的 access_token 调用时,常见返回 errcode=86000仅允许第三方代调用此时必须在
mp 后台手动点「提交审核」。
- submit_audit主要为「第三方平台代调用」自有主体 appid+secret 常返回 errcode=86000
无法在仓库内替代网页提审;`release` 默认只跑上传+接口调用,不弹浏览器、不提示手动操作。
- 「自动过审」不可能由开发者脚本保证:是否通过由微信审核决定。
"""
from __future__ import annotations
@@ -149,6 +148,8 @@ def cmd_submit_audit(
version_desc: str,
item_json: Path | None,
privacy_api_not_use: bool | None,
*,
quiet: bool = False,
) -> dict:
token = get_access_token(appid, secret)
if item_json and item_json.is_file():
@@ -184,18 +185,19 @@ def cmd_submit_audit(
except urllib.error.HTTPError as e:
raise SystemExit(f"submit_audit HTTP 错误: {e}") from e
print(json.dumps(data, ensure_ascii=False, indent=2))
if data.get("errcode") == 86000:
print(
"\n说明 errcode=86000该接口仅支持「第三方平台」代小程序调用。"
"自有主体请在浏览器打开公众平台 → 管理 → 版本管理 → 提交审核。\n"
"可先运行: python3 scripts/wechat_miniprogram_release.py open-mp",
file=sys.stderr,
)
elif data.get("errcode") == 61039:
print(
"\n说明 errcode=61039上传后隐私/代码检测任务未完成,请等待数分钟后再提交审核。",
file=sys.stderr,
)
if not quiet:
if data.get("errcode") == 86000:
print(
"\n说明 errcode=86000该接口仅支持「第三方平台」代小程序调用。"
"自有主体请在浏览器打开公众平台 → 管理 → 版本管理 → 提交审核。\n"
"可先运行: python3 scripts/wechat_miniprogram_release.py open-version",
file=sys.stderr,
)
elif data.get("errcode") == 61039:
print(
"\n说明 errcode=61039上传后隐私/代码检测任务未完成,请等待数分钟后再提交审核。",
file=sys.stderr,
)
return data
@@ -291,7 +293,10 @@ def main() -> None:
)
p_uo.add_argument("--desc", "-d", default="", help="默认:版本 v<版本号>")
p_rel = sub.add_parser("release", help="先 upload 再 submit-audit提审失败仍可到后台操作")
p_rel = sub.add_parser(
"release",
help="上传 → 尝试 submit_audit默认不弹浏览器、不提示手动打开可加 --open-browser",
)
p_rel.add_argument(
"--version",
"-v",
@@ -305,6 +310,11 @@ def main() -> None:
action=argparse.BooleanOptionalAction,
default=None,
)
p_rel.add_argument(
"--open-browser",
action="store_true",
help="完成后打开公众平台版本管理页(默认关闭)",
)
args = p.parse_args()
@@ -336,18 +346,17 @@ def main() -> None:
if args.cmd == "release":
d = args.desc.strip() or f"版本 v{args.version}"
cmd_upload(args.version, d)
if not appid or not secret:
print(
"未设置 WECHAT_APPID / WECHAT_APPSECRET跳过 submit-audit",
file=sys.stderr,
if appid and secret:
vd = (args.version_desc or "").strip() or d
cmd_submit_audit(
appid,
secret,
vd,
args.item_json,
args.privacy_api_not_use,
quiet=True,
)
cmd_open_mp_version()
return
vd = (args.version_desc or "").strip() or d
res = cmd_submit_audit(
appid, secret, vd, args.item_json, args.privacy_api_not_use
)
if res.get("errcode") == 86000:
if getattr(args, "open_browser", False):
cmd_open_mp_version()
return