Your Name and Claude Opus 5
0031f79eb3
管理端补上运营真正要用的那几件事
...
原来 107 个后台接口配的是一套只能看的界面:风险中心 6 行代码全是只读,
动态和消息只能一条一条点,运营想发一句公告没有任何入口。
公告与通知:按全体、会员、城市、喂养者、有宠物的用户或指定名单发系统通知,
发之前能看到会发给多少人,可同时走离线推送。撤回只删还没读的那些——已经
读过的假装收回去只会让统计说谎。
资金总览:把"平台账上哪些钱不是自己的"单独摆出来(任务托管中 + 喂养者余额 +
申诉冻结),旁边才是收入、退款和待打款,最后是按产品和按日的收款。
退款统一到一个入口:会员、代喂、保证金都能分几次退到退完,每笔记一行;
退完最后一分钱才撤销买到的东西,半份会员仍然是会员。
风险中心能动手了:按等级和状态筛,行内直接封禁、冻结、加白(必须写理由)、
跳用户详情,事件可以标记跟进完成。
批量处置:动态、消息、举报支持勾选后批量下架/恢复/驳回,一次最多 100 条。
处罚仍然一条一条来——批量封禁是错封人最快的方式。
敏感词统一词库:消息、动态、送养共用一套,命中是拦截还是转人工由运营定;
转人工的命中会在风险中心留一条,管理端还能拿真实文案先试一遍。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-07 13:07:58 +08:00
Your Name and Claude Opus 5
a889cb42e4
整改三期:退款、后台增改删、悬赏
...
退款原来只有会员那条路,而且只能全额、只改本地状态。现在代喂任务的退款
能分几次退到退完:每一笔单独记一行(谁退的、多少、走哪条通道、为什么),
订单上的 refunded_cent 跟着累加,退完且未结算的任务才关闭。渠道接通时按
金额原路退回并带独立幂等键,没接通或沙箱支付的登记为"线下已退"——假装
调用了渠道比说实话更糟。已结算的任务不能顺手退:钱在喂养者账上,要退只能
由平台承担,必须显式勾选。
后台从"只能通过或驳回"变成能改能删:宠物档案可代建、可编辑、可软删除
(有进行中任务的删不掉),送养与配种能改文案和城市、能下架能删,代喂任务
能改备注、能取消(托管中的钱必须先退)。每一个写操作都进审计日志。
悬赏按方案里的 A 做:主人自愿加的钱跟着任务一起托管,结算时全额给喂养者,
平台服务费只算在基础报酬上。抽悬赏是喂养者一眼能算出来的事。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-07 11:25:02 +08:00
Your Name and Claude Opus 5
ebf7189533
整改一期:发布这条链路先跑顺
...
四条改动都在"发布一个代喂任务"这条路上:
定位拿不到不再把人卡死。地址可以不带坐标保存,界面标成"未核验定位",
这条地址的打卡照常,只是不比对距离——总比逼着用户放弃发布要好。客户端
另外给了两条退路:去系统设置开权限,或者地图选点。
价格从写死的 30 元改成服务端按物种、城市、每次时长算的推荐价,规则放在
配置里,运营改一次不用等发版;用户改过之后就以他填的为准,不再被覆盖。
发布与支付并成一步:底部常驻"合计 ¥x = n 次 × ¥y",主按钮是"支付并发布"。
没付成的任务留在"我的任务"里能接着付,超过 24 小时由后台关掉,不再变成
既看不见又删不掉的孤儿。
选宠物换成带头像的卡片,缺免疫记录或照片的当场标出来,不用等提交才知道。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-07 10:31:39 +08:00
Your Name and Claude Opus 5
9345805133
代喂改走真实订单,并补上打卡纪律与地址明文清除
...
支付原来是个占位:调一下接口任务就算"已付"。现在任务和喂养者保证金都
走会员那套订单与支付网关,一笔订单买到什么由 applyPaidOrderTx 统一决定,
沙箱和真实回调走同一段逻辑。退款能释放托管中的任务,但不会去动已经结算
的那一笔——钱已经在喂养者账上,那种情况必须有人看过再说。
通道接通之前,客服可以在管理端手工标记已托管,必须写明钱怎么收的,进审计日志。
另外补上三件方案里写了但代码没做的事:打卡必须按到达、喂食、离开的顺序,
喂食离到达太近视为摆拍;地址新增紧急联系人与常去医院,随门牌一起只发给
被选中的喂养者;任务结束七天后由后台任务抹掉地址明文,只留城市与街道。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-07 09:07:38 +08:00
Your Name and Claude Opus 5
97351777ec
管理端拆出宠物模块,并给它一个当班概览
...
值班的人打开控制台只想知道两件事:谁在等回复,钱还对不对得上。概览把
待裁定的申诉、待打款的提现、各类待审排在一屏,并把代管中、已结算、
平台服务费和账户余额一起摆出来;余额与流水对不上时先弹红条,因为那
种时候不该继续打款。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-07 08:40:49 +08:00
Your Name and Claude Opus 5
46a60ffac3
宠物板块二到四期:领养、配种、上门代喂与收益账户
...
领养是信息服务:没有金额字段,文案里出现收费话术或短期内连续送养都会转人工,
送出时按 30/90 天建好回访任务。配种同样只做信息展示,且默认关闭。
代喂是这个模块里唯一动钱的部分,顺序是它的安全边界:先付款再进大厅,选定
之后才解密门牌与电话,每次上门按到达/喂食/离开留照片,主人确认或超时自动确认
后才结算。结算只走账本,(user, biz_type, biz_id) 唯一键让重复结算付不出第二次;
申诉会冻结自动确认,由客服裁定全付、部分付或全退。
提现按方案默认关闭:收益先只记账,等分账通道与资质到位再在管理端开闸。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-07 08:14:19 +08:00
Your Name and Claude Opus 5
aee1881e69
宠物板块第一期:宠物档案与后台审核
...
方案第一期的后端部分。宠物档案是整个板块的根——代喂任务、送养帖、
配种信息都会挂在它上面,所以免疫、绝育、体重这些事实只在这里存一份,
不在各业务表里重复填写与互相矛盾。
- pets / pet_media 两张表(迁移 036),另加三个可在管理端调整的配置:
总开关、单账号档案上限、单只宠物照片上限。
- 客户端接口:档案增删改查。日期在校验阶段解析,格式或"未来的免疫日期"
这类问题返回 400 并说明是哪个字段,而不是从写库深处抛出 500。
- 软删除:档案从列表消失但记录保留,将来代喂订单与送养记录仍能追溯。
- 后台审核:列表带主人昵称与星遇号;驳回必须填原因;被驳回的档案对外
不可见,但主人仍能看到并读到原因。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-05 16:53:55 +08:00
Your Name and Claude Opus 5
ce429afcf2
密码强度下限、离线推送下发
...
一、密码规则:至少 8 位且不能全是数字。短信验证可以在后台关掉,关掉之后
密码就是账号质量的唯一门槛,而此前 validUserPassword 只检查非空——"1"
也是合法密码。规则只在「设置密码」时校验(注册、找回、改密、后台建号与
后台重置),登录不再校验,已有账号照常使用。上下限都按字符数计算,否则
43 个汉字的密码会因为字节数超限被拒。各处错误提示改为直接说明规则,
而不是笼统的一句「请填写有效的密码」。
二、离线推送:此前客户端一直在上报 push token,服务端从未下发过任何东西,
App 退到后台或被杀掉时新消息完全没有提醒(MESSAGE_PUSH 只是 WebSocket
帧名)。补上服务端下发:
- 只发给「此刻不在线 + 未对该会话免打扰 + 未关闭消息通知」的接收者,
在线的人已经从实时通道拿到了。
- 鉴权 token 按 provider 的过期时间缓存,个推的 auth 接口限流很紧。
- 失效的 cid(10001/10002)就地停用,不再每条消息重试一次。
- 整个过程在独立 goroutine 与独立 context 上进行,推送服务再慢也不会
拖慢或拖垮一条已经发出的消息。
- 是否显示正文由 push.show_preview 控制,关闭后锁屏上不出现消息内容。
凭据在管理端「离线推送」页填写(迁移 035 先建出配置行——集成配置保存
走的是 UPDATE,行不存在会静默保存不上)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 19:09:33 +08:00
Your Name and Claude Opus 5
acd8933dbb
后端:资料距离、语音图片会员限制、免短信注册、AI 托管回复修复
...
- 单用户资料接口补上距离:此前只有推荐/附近列表会算距离,资料页和
聊天头部因此无内容可显示。沿用同一套 haversine 与隐私开关。
- 语音/图片消息可限定会员发送,两个开关在管理端「运营配置」中修改
(迁移 032)。校验放在 persistMessageContext,HTTP 与 WebSocket
两条发送路径都覆盖;文本消息永不受限。
- 短信服务关闭时注册不再要求验证码:关掉之后没人能拿到验证码,继续
要求就等于关闭注册通道。重置密码不做同样放宽,那里缺验证码等于
凭手机号夺号。app/config 增加 smsVerification 供客户端决定表单形态。
- 修复 AI 托管账号之间不回复:原规则按「发送方是否托管账号」拦截,
把真人操作测试号的正常对话也挡了。改为标记 worker 自己写入的回复,
只对 AI 生成的消息跳过入队。
- ai.default_model_id 同时接受模型 ID 与名称,填名称时不再被 MySQL
静默转成 0 而使配置失效。
- 聊天媒体留存管理与清理任务(迁移 033,两台线上均已应用)。
新增集成测试均针对真实 MySQL:会员限制、免短信注册、AI 入队规则、
默认模型解析、资料距离。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-04 10:00:08 +08:00
Your Name and Claude Opus 5
a024d59827
后端接入 AI 模型并支持测试账号托管回复
...
按协议而不是按厂商做适配,与现有短信、对象存储的做法一致:openai 兼容格式
一个适配器即可覆盖 DeepSeek、通义、智谱、火山方舟、Ollama 等,新增厂商通常
只需在后台加一条模型记录;anthropic、gemini、webhook、debug 各一个适配器。
密钥沿用 integration.go 的 AES-GCM 加密存储。
测试账号托管的回复走 persistMessage 同一条落库和推送路径,因此未读数、
WebSocket 推送和会话排序全部复用现有逻辑,客户端无需改动。为此把
persistMessage 抽出 persistMessageContext,因为 worker 没有 *http.Request。
任务队列用数据库表而非内存:重启不丢回复,多实例不重复消费。领取用 UPDATE
打 claim_token 再回读,没有用 SELECT ... FOR UPDATE SKIP LOCKED——生产存在
MySQL 5.7 环境,那里该语法无法解析。同一会话同时只允许一个待处理任务
(pending_key 生成列 + 唯一键),所以用户连发多条消息只会得到一条回复。
闸门:仅 is_test=1 且在允许批次内的账号生效,托管账号之间不互相触发,三层
配额,调用失败默认静默。会话内是否标注 AI 身份由 ai.disclose_in_chat 控制
并默认开启,关闭前需确认所在地区的监管要求。
app.go、integration.go、im.go 三个文件同时包含本次改动之前工作区里就已存在
的未提交修改,一并带入。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 08:31:04 +08:00
Your Name
334890171e
gengx
2026-08-27 14:04:28 +08:00