Commit Graph

196 Commits

Author SHA1 Message Date
zerosaturation
e1326acaf9 fix(backend): service stability — bcrypt off-txn / login anti-enum / MQ stub / aiChat / event reliability / gateway aggregate (batch 3)
- 3.1 bcrypt 移出事务 (Register): repository.HashPassword 前移到 db.Transaction 之前,消除连接池占用。
- 3.2 Login 消除用户枚举 + 限流 + timing 抹平: pkg/errors 加 ErrInvalidCredential
  /ErrTooManyLoginAttempts; 用户不存在/密码错/密码空 三路径统一返回同一错误;
  mobile 5次/ip 20次 per 15min 限流 (Redis, fail-open 降级); user-not-found 走
  dummy bcrypt 抹平 ~100ms 时序差,完全消除枚举侧信道;空密码分支已核实无时序 leak。
- 3.3 MQ streams adapter 停用 → stub: 0 业务调用方, 新 stub EventProducer.Publish no-op;
  pkg/mq/mq.go Init 不再装配 streams; 全仓 grep 验证 11 处硬编码
  'gallery'/'default' 集中到 pkg/queue/consts (值不变, 仅消漂移)。
- 3.5 JWT 密钥治理: pkg/jwt MustInit fail-fast + atomic.Value (见上一个 commit 293c7b1)。
- 3.6 aiChat 健壮性: SaveContext 用 persona.ID(非 req.PersonaId); Redis/memory 错误
  记 WARN 不静默; Dify err 映射稳定用户文案,原始 err 仅服务端日志。
- 3.7 statistic.Client 重构: TrackEvent 改 buffered channel (cap 1024) + dispatchLoop
  worker; 失败 ERROR 日志带字段; drop 记 WARN; Close 可重复调用。
- 3.8 网关聚合: StarCache (60s TTL, singleflight) 替换 5+ 处 GetFanIdentities 链式调用;
  DeleteAccount 改网关直调 userService.DeleteAccount(避免改 hand-written triple.go
  风险,见报告 §5 proto 风险复盘); 铸造双写改异步 channel+consumer (3 retry)。
- 大量单测: 各子项 TDD (RED→GREEN), 关键并发 race_test (50 goroutine)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-23 18:50:40 +08:00
zerosaturation
293c7b14ae fix(security): JWT key governance — MustInit fail-fast + atomic.Value
- pkg/jwt: 删 public SetSecret; 加 MustInit(secret string) 启动时强制注入,
  缺/为空/等于弱默认值时返回 error(运行期不可再改); 密钥用 atomic.Value
  存 []byte,所有读走 mustSecret() 原子 Load,消除 SetSecret/ParseToken 并发
  data race(go test -race 零告警)。
- gateway main + auth_provider: 启动时 MustInit 读 JWT_SECRET env,失败 fatal。
- scripts/loadgen/seed/tokens: 同步 MustInit。
- .env.example: JWT_SECRET 改为 ≥32 字节 base64 示例(原为空,被 MustInit
  立即拒);注释提示生产 MUST replace。
- 测试: 4 个 MustInit 行为 + 1 个 50-goroutine race 覆盖。
- 行为变更: 任何 .env 缺 JWT_SECRET 或用占位 secret 的服务,启动会 panic
  (这是 fail-fast 期望行为);其余 4 个 .env 文件占位由 ops 单独轮换。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-23 18:50:12 +08:00
zerosaturation
3407e30395 refactor(assetService): CreateMintOrder 3-phase txn + orphan reconciliation (P0-2)
- CreateMintOrder 拆三段: txn1(PENDING→PROCESSING,不调RPC/不写asset)
  → 事务外 UpdateCrystalBalance 扣水晶 → txn2(建asset+registry→SUCCESS);
  消除 DB 事务内嵌跨服务 gRPC(连接池占用+跨服务事务风险)。
- 任一步失败 markMintOrderFailed 独立事务标 FAILED(不回滚已扣水晶=审计流水,
  重试靠 Task1 source_id 幂等 + Task2 入口短路防双扣); nil-cause 防御。
- 孤儿订单对账 ReconcileStuckMintOrders: 扫陈旧 PROCESSING 单,查 mint_cost 流水—
  已扣未建→FOR UPDATE 行锁下幂等补完 SUCCESS(串行化并发防双建),未扣→FAILED,绝不退款。
- main.go 接线周期 worker(MINT_RECONCILE_INTERVAL_SEC 默认600s,0关,优雅退出)。
- 测试: RPC失败落FAILED / 对账未扣→FAILED / 已扣未建→补完(含幂等二次跑)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-23 12:28:57 +08:00
zerosaturation
b7022d2dc1 fix(backend): auth boundary — trusted identity from ctx (batch 2)
- 新增 pkg/authctx: 从 Dubbo attachment/gRPC metadata 提取可信 user_id/star_id,
  统一覆盖 req 同名字段, 缺身份返 Unauthenticated。
- 各 provider 接入(堵身份伪造/越权):
  * moderation SubmitReport 等 6 RPC(举报人伪造)
  * asset CheckAssetLike/GetAssetQrcode/TrackShare(点赞/分享归因伪造)
  * social CheckFriendship(修 starID=0 隐私预言机)
  * activity PurchaseItem/BatchPurchaseItem(水晶扣费伪造)等 5 RPC
  * gallery/aiChat/task/notification 迁移 authctx, 删散落 extractUserInfo*
- social 正确性: GetUserLikedAssets OR 显式分组(防御); GetRandomUsersByStar 真随机(去 rand.Seed)。
- gateway: /auth/validate 移入 AuthMiddleware 保护组(/refresh 保留,依赖注入身份)。
- 删 userService 已迁移死函数; notification 缺身份错误码统一为 Unauthenticated。
- 各 provider 单测(伪造身份被覆盖 + 缺身份拒绝)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-23 01:12:35 +08:00
zerosaturation
878bd46399 fix(backend): financial correctness — settlement/hours/mint idempotency (batch 1)
- settlement(1.1): exhibition_revenue_records 加 UNIQUE(exhibition_id,cycle_start_time)
  + CreateRevenueRecord ON CONFLICT DO NOTHING; MQ 用 settled_at 替代复用 is_processed;
  恢复扫描器过滤改 settled_at IS NULL; created_at 统一毫秒; 删死代码 cleanup_worker.go。
- hours(1.2): 新增 exhibition_hours_log/asset_exhibition_hours_log(source_id 唯一)幂等表;
  fan_profile/assetLevel 的 AddExhibitionHours 按 sourceID 幂等(事务包裹); 存量重算脚本。
- mint(1.4/1.5/1.6): crystal_transaction_records (source_id,change_type) 部分唯一索引
  + UpdateCrystalBalance/CreateMintOrder 幂等; 保底改 crypto/rand; 下线伪 tx_hash;
  doMint Redis Lua 原子限流。
- migrations 001/002/003; 各服务单测(自包含, 缺 DB t.Skip)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-23 01:11:54 +08:00
zerosaturation
d554d7be83 feat:修改周边验证 2026-07-17 16:53:57 +08:00
zerosaturation
99775f1d11 feat:修改详细页面,修改为每个类型的页面不对 2026-07-15 19:16:28 +08:00
zerosaturation
18aff3b682 fix:修改bug 2026-07-15 13:12:27 +08:00
365f783ea0 feat:修改分享url 2026-07-15 12:40:39 +08:00
zerosaturation
c0b577dd40 feat:增加邮箱管理功能 2026-07-14 21:59:15 +08:00
zerosaturation
d900c0d8b2 feat:增加验证真伪访问次数和首次验证 2026-07-13 14:24:42 +08:00
zerosaturation
74853800b6 feat:增加二维码验证真伪的功能 2026-07-13 11:22:56 +08:00
zerosaturation
e5bd0c854c feat:增加忘记密码的功能 2026-07-09 19:00:03 +08:00
fbf3e6c63c feat:增加分享页下载 2026-07-09 15:49:06 +08:00
zerosaturation
a1e92448f1 feat:修改陀螺仪控制为手动控制 2026-07-06 21:20:24 +08:00
zerosaturation
958c867309 fix:修改举报/反馈的bug 2026-07-06 16:22:26 +08:00
zerosaturation
dcb4e451a1 fix:修改合并后bug 2026-07-06 10:25:06 +08:00
66d226948f Merge pull request 'feat/actvity' (#4) from feat/actvity into dev
Reviewed-on: https://git.liantu.tech/xiaoyu/topfans/pulls/4
合并feat/actvity
2026-07-03 16:28:30 +00:00
zerosaturation
ba44041e55 feat:修改websocket的性能和相关的问题 2026-07-03 22:08:43 +08:00
zerosaturation
8376afc5d6 feat:修改websocket的性能和相关的问题 2026-07-03 22:04:11 +08:00
zerosaturation
1afee2de73 feat:修改的欢迎页的冷启动和系统重启的错误触发和一键登录页的路径修改 2026-07-03 18:54:03 +08:00
zerosaturation
4c3388ed36 feat:新增注销账号功能,然后修改前端注册页面 2026-07-03 16:40:53 +08:00
zerosaturation
c07e8e9c19 fix:修改数据看板bug 2026-07-03 14:57:14 +08:00
zerosaturation
d12a84c1f0 feat:增加队列修改收益方面把轮询改为MQ队列,修改数据看板的数据问题出错 2026-07-03 12:34:55 +08:00
zerosaturation
355ac4393b feat:修改收益的计算 2026-07-03 12:34:55 +08:00
Lenticular Studio Agent
65ce6bba12 feat: Dify 部署脚本修复 + AI 搭子 MVP 接入
主要改动:

fix(docker/dify-deploy): 修复脚本核心功能
- heredoc 单引号 bug: 'ENVEOF' 改为 ENVEOF,变量正确展开
- 端口默认值 8083/8084/8085 对齐 .env.prod 生产配置
- 加 dc_cmd() 兼容 docker-compose v1/v2 plugin
- openssl rand 生成强随机密码与 SECRET_KEY(42 字符)
- install 跳过已存在 .env,保护用户配置(管理员密码/SECRET_KEY)
- read -p < /dev/tty 兼容非 tty 环境(CI/CD)
- show-config 改用 DIFY_NGINX_PORT(nginx 入口)而非 APP_WEB_PORT

docs(mvp-design): 修正 §3.2 workflow inputs 描述
- 实际只有 query,删除错误的 user_id input 声明
- 节点序列图同步更新

feat(aiChatService): 新增 Dify 客户端与适配器
- service/dify_client.go: Dify Workflow 调用 + SSE 解析
- service/dify_adapter.go: 与现有 chat_service 桥接
- provider/ai_chat_provider.go: Dubbo 入口简化
- main.go: 装配 ConversationRepository + DifyClient

feat(migrations): 新增 AI 搭子会话表 ai_chat.sql
- ai_conversations / ai_messages 表 + 索引

docs: 新增 Dify 集成设计文档
- 2026-06-29-ai-chat-dify-mvp-design.md (MVP 实施级)
- 2026-06-29-ai-chat-dify-integration-v2-design.md (V2 演进路线图)
- docs/dify/角角.yml (Workflow DSL 导出)

config: 更新 env 模板与 docker 配置
- backend/.env.example: DIFY_* 环境变量声明
- docker/.env.prod: DIFY_API_BASE 对齐 8083
- docker/build.sh: 微调
- CLAUDE.md: 项目规范补充

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 12:32:34 +08:00
zerosaturation
9c3fe6d695 feat:修复点赞收益的问题 2026-07-01 11:03:50 +08:00
zerosaturation
3cd68acf6d feat:完善计算点赞押注收益 2026-06-29 14:47:32 +08:00
c02e53fc0e feat:修改h5地址 2026-06-26 18:10:51 +08:00
946e204573 feat:修改canvas合成图 2026-06-26 17:58:37 +08:00
zerosaturation
2032246fd0 feat:增加分享界面,完善的保存图片功能 2026-06-26 16:45:29 +08:00
zerosaturation
0d6b7a9e95 feat:增加购买道具的聚合功能 2026-06-24 19:51:13 +08:00
zerosaturation
b7e2aee399 feat:修改活动 TOP3 + 我的排名 2026-06-24 18:10:12 +08:00
zerosaturation
64b501102b feat:修改docekt配置添加ossCROS的配置 2026-06-24 16:30:00 +08:00
Lenticular Studio Agent
a96c9cf04f feat:修复路径 2026-06-24 02:34:06 +08:00
Lenticular Studio Agent
063d940edd feat:修复部分问题 2026-06-24 00:59:23 +08:00
Lenticular Studio Agent
fd5e317e05 merge: 解决 docker-compose 和 SocketManager 冲突
Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 23:06:24 +08:00
Lenticular Studio Agent
67cf3d4177 chore: 清理 laserCompositor 微服务残留
- 删除已弃用的 compositor_client.go
- 删除激光合成微服务代码
- 添加 gateway 合成控制器和测试文件
- 添加 Dify prompt 补丁脚本

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 22:44:03 +08:00
Lenticular Studio Agent
af7908e72e feat: 接入微达API中转站,重构镭射卡生图流程
- 替换中转站从 xbcl.link 到 weda.cc
- prompt 模板改为镭射卡全图生成(去掉 6 层合成/抠图依赖)
- 4 路并发调用 + 原图展示 = 5 张 variant
- 前端提示词中译英支持
- 全局 Vue errorHandler
- WebSocket 鉴权失败跳登录
- 删除已弃用的 laserCompositor 微服务

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 22:43:49 +08:00
zerosaturation
37a3f292df feat:访问他人展览页面修改 2026-06-23 22:29:39 +08:00
zerosaturation
12571eedba feat:修改活动弹窗bug 2026-06-23 18:57:50 +08:00
zerosaturation
75ab617c6c feat:增加实时留言功能和修改轮询道具购买记录显示改为websocket显示 2026-06-23 18:13:55 +08:00
zerosaturation
b4d34f9ec1 docs:增加文档 2026-06-22 20:02:00 +08:00
zerosaturation
7eb6dad434 feat:新增举报和反馈功能 2026-06-22 17:19:48 +08:00
b1fe1aea50 feat:新增头像框显示 2026-06-22 14:36:24 +08:00
zerosaturation
ef0a4f6afd feat:修改通知系统的消息 2026-06-17 11:59:51 +08:00
ddc5b89a6c frat:增加uniPush的配置 2026-06-16 23:49:40 +08:00
zerosaturation
8ccb4e2565 feat:修改压缩工具的配置 2026-06-16 23:00:07 +08:00
zerosaturation
c6ce7d2d25 feat:修改压缩工具的配置 2026-06-16 22:48:32 +08:00
zerosaturation
792c891158 feat:修改压测 2026-06-16 22:19:44 +08:00