Commit Graph

18 Commits

Author SHA1 Message Date
Pine ff234f7071 feat(sms): 迁移 PineSound 阿里云短信+Redis缓存+真实随机数;强制MySQL禁用SQLite;连接池取消请求shield修复 2026-09-08 00:10:16 +08:00
Pine 86c6d24b17 fix(pay): 所有支付小程序码 page 路径修正为 pages-extra 子包路径
统一修正3处支付相关小程序码的 page 参数(之前误写为主包 pages/ 路径,
扫码后微信找不到页面→白屏):

- app/pay/service.py: 算力充值支付 → pages-extra/pay/index
- app/market/service.py: 市场购买支付 → pages-extra/pay/index
- app/training/main.py: 活动报名支付 → pages-extra/pay-qr/index

加上之前修复的 scan-login(auth.py + wechat.py 默认参数),
后端所有 get_wxacode 调用的 page 路径现已全部正确。
2026-09-02 11:47:34 +08:00
Pine 541c60e64f feat(test): 测评逐题答案存储与详情展示
- alembic 0043: tests 表增加 answers 列(TEXT,JSON 格式逐题答案)
- report_test(POST /api/tests): 接收并存储 answers 字段
- get_test: 返回 answers + answer_list(带题目文本/part/选项/用户选择的逐题列表)+ 答题进度
- pack_test: 增加 answers 字段
2026-09-02 10:57:26 +08:00
Pine e346d952c1 fix(training): 驳回报名 status 置 rejected 与审核一致——消除 admin 端「驳回仍显示待审核」
- update_booking:审核 rejected → status=rejected(终态),而非 pending
- _count_enrolled:排除 rejected(被驳回不计入已报名人数)
- 仪表盘 stats 补 rejected 分类
- 历史数据:1 条 rejected+pending 已同步为 rejected
- 冒烟测试同步更新
2026-09-02 10:35:48 +08:00
Pine 4d027db5a8 fix(training): 报名审核状态与生命周期状态联动一致——消除 admin 端「状态全是待审核」
- create_booking:免费+自动审核活动报名即置 status=confirmed(与 audit_status=approved 一致);人工审核/付费活动保持 pending
- update_booking:审核 approved→status=confirmed;rejected→status=pending;显式 status 不覆盖
- 修正历史数据:approved+pending 的报名已同步为 confirmed(4 条)
- 新增冒烟测试 scripts/smoke_booking_status.py
2026-09-02 10:30:44 +08:00
Pine 374767bbca chore: 清理废弃 SQLite 代码与过时注释
- 删除死代码 app/db.py / app/repositories.py / app/dependencies.py(legacy 模块,
  import 即损坏且全仓无引用,活跃实现在 app/infrastructure/)
- 删除废弃库文件 serverdata/data/opc.db(2026-08-24 并入总库前的旧分库)
- 注释措辞同步 SQLite→统一总库(DATABASE_URL 决定方言)
2026-08-31 21:46:22 +08:00
Pine 176bafdfe5 refactor(training): 数据层收编 SQLAlchemy 统一走 DATABASE_URL(去 sqlite3 直连)
- db.py:原生 sqlite3 模块重写为 SQLAlchemy 同步引擎(经 infrastructure.make_sync_engine,
  同源 config.DATABASE_URL,SQLite/MySQL 双方言);保留 get_conn/fetch_one/list_all/
  insert/update_row/delete_row 签名,get_conn 返回「? 占位符兼容 shim」,20+ 调用点零改动
- SCHEMA 常量存档不再执行(表由 alembic 0003+ 管理);新增 reset_engine 供测试/切库
- main.py:删除 sqlite3 直连残余(未支付订单关闭路径)
2026-08-31 21:40:31 +08:00
Pine 614804a0a6 feat(training): 活动体系重构与报名生命周期闭环
- 活动三维标签(区域/类型/模式)+ 发布范围(本园区/公开)+ 审核流(0031):C 端仅展示 approved,园区活动仅本园区可见
- 独立字段:富文本介绍 body、注意事项 notice(0032)、外链报名 signup_mode/external_url、发布者信息
- 审核端点 /api/events/{eid}/review 双身份(operator 任意 / carrier 限本园区)+ /api/events/mine
- 报名生命周期闭环(0033):未支付/待审核=删除,待参加=取消,结束未签到=爽约可申诉,未支付 15 分钟自动关闭删除

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-31 20:36:42 +08:00
Pine 9f57ef25d6 refactor(training): 用户识别支持手机号身份并规范同步旁路注释
Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-30 22:29:44 +08:00
Pine 4f11931143 feat(content): 资讯发布时间/来源/发布人规范 + 点赞/留言/分享互动体系
- published_at 发布时间(迁移0022):运营端不限、园区端禁早于3天前,双方均支持定时发布;C端/大屏到点才可见
- 发布人:运营端可设(留空显示官方)、园区端固定园区名只能填来源
- 点赞/分享/留言(迁移0023-0025):content_likes 去重点赞、like_count/share_count、留言回复+评论点赞
- 各出口(内容/留言/入驻资料 docs)统一 resolve_url 生成 CDN 直链;入库统一 to_object_path 对象路径
2026-08-28 17:17:49 +08:00
Pine cbe0d03357 feat(admission): 园区入驻申请 —— park_admissions表+训练子应用端点+上传放宽
- 模型迁移0012 park_admissions(tenant/user/form_json/docs_json/status)
- app/training: GET /api/park/tenants(公开) / POST /api/park-admission / mine / 运营列表+review
- /api/upload 放宽到 图片/pdf/doc,20MB
2026-08-26 11:59:54 +08:00
Pine 8a00712750 feat(training): 培训子应用接入统一账号——业务鉴权改验平台 JWT + 读写平台 users
阶段3(统一账号落地,小程序侧):
- require_auth 改为解平台 JWT(app.jwt.decode_access_token),返回 {username,sub};
  新增 _current_user(按 sub/username 取 users)、_user_payload(读 users 昵称/手机/
  opc_status/topics/source)、_set_user_phone。
- me/update-profile/bind-phone/wx-phone 改为读写平台 users;绑定手机用平台 sms 校验
  (platform_sms.verify) + 写 users.phone;update-profile 映射 name→nickname、
  status→opc_status、topics→JSON。
- 业务(报名/我的报名/查报名/签到)改从 _current_user 取手机号等资料。
- 移除培训端自带登录:register/login/send-code/phone-login/wx-login 返回 410,
  防止再产生 accounts 双套账号(统一走平台 /auth)。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 20:22:24 +08:00
Pine b9b5e2e2ff feat(task): 任务中心扫码接单(多端) —— 服务端任务状态机/端口/迁移
- Task 加 task_code/tags/display_priority/claimed_by/claimed_at/doing_at;新增 TaskClaim 流水表。
- TaskService 加 claimed/doing/completed 状态机(claim/start_doing/complete),grab 并入 claim。
- TaskRepository 加 list_published/get_by_code/update/claim/set_doing + TaskClaimRepository;挂 Database。
- 端口:
  · opc  /tasks/grab-by-code、/tasks/{id}/doing、/tasks/{id}/complete
  · operator POST /tasks(auto task_code) + PATCH /tasks/:id
  · park  /park/api/tasks(大屏展示,含 scan_payload 二维码载荷)
  · training /api/tasks/claim-by-code、/api/tasks/my(小程序 C 端账号→OPC 身份 find-or-create 领单)
- 迁移 0008(tasks 加列 + task_claims)已应用+stamp;seed 补 task_code/tags/grab demo。
- tests/test_task_claim.py(自包含内存库, 状态机+流水+list_published), 直接 async 校验通过。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-25 18:40:35 +08:00
Pine 6de1b5a31b refactor(training): 培训数据层并入唯一总库 app.db(非运行态建表/种子,全列可空)
- 训练 ORM 模型改名回旧表名(accounts/events/bookings/tests/courses/policy_logs/plan_logs/survey_logs)
  并全列可空(兼容按部分字段插入);alembic 0003 丢弃重建并入唯一总库。
- training/db.py 指向 app.db、移除运行时 init_db;main.py lifespan 移除 init_db。
- seed.py 增培训种子(超管账号/排期/在线课程, 幂等)。
- 验证(真实库 migrate+seed+TestClient):auth/me、admin/*、park/*、training /api/health|events|courses 全 200。
2026-08-24 20:31:57 +08:00
Pine 866f82dbc4 feat(admin): 运营端培训业务 P0 — 新增 /admin/courses|activities|bookings|tests
新增 courses 表(app/training/db.py SEED_COURSES),经 training_admin_bridge 桥接
app.training 的课程/活动(events)/报名(bookings)/测评(tests) 数据为统一运营视图;
schemas 增 Course/Activity/Booking/Test 请求模型;rbac_operator.py 增四件套端点
(含 create/status/patch),走 operator 角色 + action:* 权限码 + write_audit。
2026-08-24 16:57:13 +08:00
Pine 1af1ab6c2f feat: 培训子应用异步化(async 路由 + to_thread 同步 db)
- main.py 43 个路由改 async def
- db 保持同步 sqlite3,经 asyncio.to_thread 原子调用(不阻塞事件循环,规避 aiosqlite ASGI 线程/循环脆弱性)
- 依赖分析识别 db 触碰辅助函数(_count_enrolled/_adopt_phone 等),作为原子单元经 to_thread 调用
- db.get_conn 加 check_same_thread=False(每请求独立连接,跨线程安全)
- db.init_db 移入 async lifespan
- 验证:48 路由全通(报名/签到/统计/测评/政策/调研)+ 66 测试全绿
2026-08-24 01:43:52 +08:00
Pine 0c0e2586ed feat: serverdata 资源目录 + serverrun 运维编排
- serverdata/:统一承载全部资源目录(data/logs/files/keys/prompts/uploads)
- data/→serverdata/data、templates/→serverdata/prompts、uploads/→serverdata/uploads
- config.py 集中 serverdata 路径;培训子应用 db/uploads 指到 serverdata
- serverrun/:start.sh(初始化资源目录+启动 dispatcher)、Dockerfile、docker-compose(core+compute-engine+redis+mysql)
- 66 测试全绿
2026-08-24 00:42:35 +08:00
Pine 8b43d3df52 feat: 培训子应用迁入(app/training,/api/*)
- 报名/测评/政策/调研,独立 data/opc.db
- 源自原培训后端,路径调整至 server-core
2026-08-23 22:36:00 +08:00