56 Commits

Author SHA1 Message Date
fe8206f8d5 fix: reduce module card height (remove cheight, compact padding/icons) 2026-05-30 21:20:49 +08:00
956ae81d49 docs: update api_downapp.md — add curl examples and rl_assets API
- Add curl examples for all 5 APIs (rl_verify, rl_query_groups, rl_upload, rl_status, rl_assets)
- Add new section 5: rl_assets.dspy (list assets by vendor_group_id)
- All curl examples use production baseurl and Bearer token auth
2026-05-30 12:28:14 +08:00
86d2c4edc4 docs: add curl examples to all external APIs
- rl_verify.dspy: vendor param for creating verify session
- rl_upload.dspy: upload asset to vendor_group
- rl_status.dspy: query asset processing status
- rl_assets.dspy: list assets by vendor_group_id
- sync_assets.dspy: sync assets from vendor
- check_validate.dspy: check verify result with apikey/secretkey
2026-05-30 12:24:35 +08:00
9ff6076d5c feat: add rl_assets.dspy — standard API to list assets by vendor_group_id
Standard external API returning {status, data} format.
Requires vendor_group_id param, enforces org_id isolation via get_userorgid().
2026-05-30 12:20:38 +08:00
304e4c4071 fix: wrap rl_asset_results in VScrollPanel for scrolling
When many assets are returned, the results area needs scroll.
Wrap the target VBox in a VScrollPanel with fixed height.
2026-05-30 11:22:53 +08:00
7c3e77e612 fix: view_assets — use actiontype:urlwidget + target + mode:replace
Replace custom JS fetch script with proper bricks-native pattern:
- actiontype: urlwidget, target: app.rl_asset_results, mode: replace
- method: POST in urlwidget options (required for form data)
- Remove duplicate id from dspy response widgets (id belongs to container only)
2026-05-30 10:54:48 +08:00
f94207dd86 fix: view_assets form submit — use script bind instead of urlwidget
Remove submit_url + submited/urlwidget pattern (event.params is Response
object, not widget descriptor, causes silent failure).
Replace with submit event + actiontype:script that manually POSTs form
data via fetch() and renders response widget tree via bricks.widgetBuild.
2026-05-30 10:48:32 +08:00
2440be759d fix: center all popups (anchor:cc), remove download URL from status query
- submit_query_status.dspy: add anchor:cc to all Message/Error widgets,
  remove download URL display from status result
- submit_upload.dspy: add anchor:cc to all Error widgets
- Error popups now centered for consistency
2026-05-30 10:46:22 +08:00
29d2ed2609 fix: center auth popup with anchor:cc 2026-05-30 10:32:04 +08:00
6491182249 feat: add view_assets page — browse media by group with bricks widgets
- init.py: add rl_list_assets_client() — validates org ownership, syncs
  from vendor, returns asset list with status/url/type
- view_assets.ui: dropdown to select vendor_group_id, submit triggers
  asset list display
- submit_list_assets.dspy: returns responsive card grid with Image/
  VideoPlayer/AudioPlayer widgets, per-asset refresh status + download
- index.ui: add '查看素材' card for customers
- load_path.py: register view_assets.ui under logined RBAC
2026-05-30 10:31:08 +08:00
daf82107fb feat: add status query flow after upload (frontend专用 dspy)
- submit_upload.dspy: frontend form handler returning bricks Message widget
  with asset_id, status, and '查询处理状态' button
- submit_query_status.dspy: frontend status query returning Message widget
  with current status, retry button when still processing
- upload_asset.ui: use submit_upload.dspy + submited bind (was missing)
- External APIs (rl_upload.dspy, rl_status.dspy) unchanged for downstream systems
2026-05-30 10:22:25 +08:00
2f1974ae8f feat: upload form shows name for auth groups, file input with media type validation
- get_org_groups.dspy: show name if available, fallback to vendor_group_id
- upload_asset.ui: change source_url from text textarea to file input (accept image/audio/video)
- rl_upload.dspy: auto-detect asset_type from file extension, server-side media type validation
2026-05-30 10:15:50 +08:00
a0d4189cb8 fix: 修复所有sor.U()调用, 合并id到更新字典(sor.U只接受2个参数) 2026-05-30 01:21:44 +08:00
f8de29d8f2 fix: 恢复format_exc()调用, 框架已预加载 2026-05-30 00:43:05 +08:00
fadde32ecc fix: 移除rl_callback中未定义的http_request变量, 直接用params_kw获取GET参数 2026-05-30 00:42:25 +08:00
c9bc2da46b ui: 认证弹窗正文和按钮改为上下排列,点击打开后关闭弹窗 2026-05-30 00:38:46 +08:00
967d1c728c fix: 移除所有dspy文件中多余的import语句, 框架已预加载 2026-05-30 00:32:16 +08:00
38cea985f1 debug: rl_callback添加详细日志和异常捕获 2026-05-30 00:28:47 +08:00
93780ac01d feat: 真人认证增加可选name参数, 记录到rl_org_group供列表展示
- rl_verify_user(): 新增name参数, 存入rl_asset_group.name/title
- rl_handle_callback(): 回调时将name从rl_asset_group复制到rl_org_group
- rl_query_groups(): 返回结果增加name字段
- rl_org_group模型: 新增name字段(str/200)
- rl_verify.dspy/submit_create_validate.dspy: 接收name参数
- create_validate.ui: 表单增加认证名称输入框(可选)
- api_downapp.md: 文档同步更新
2026-05-30 00:20:55 +08:00
5fa1040adc fix: rl_callback支持火山GET回调(bytedToken参数名), 添加调试日志 2026-05-30 00:11:47 +08:00
ccb9430a25 fix: 还原rl_callback.dspy, 供应商回调返回格式由供应商决定 2026-05-29 23:48:04 +08:00
211b628c78 refactor: API响应统一标准格式{status,data}, 前端Form分离
- rl_verify.dspy: 返回{status:ok/data:{id,h5_link,byted_token}}
- rl_upload.dspy: 返回{status:ok/data:{id,vendor_asset_id,status}}
- rl_query_groups.dspy: 返回{status:ok/data:{groups:[...]}}
- rl_status.dspy: 返回{status:ok/data:{status,url}}
- rl_callback.dspy: 返回{status:ok/data:{vendor_group_id}}
- 新增submit_create_validate.dspy: 前端专用,返回bricks Message/Error widget
- create_validate.ui: Form指向新dspy + submited事件绑定
- api_downapp.md: 文档同步更新
2026-05-29 23:40:19 +08:00
2533e4f22e fix: 修正 SQLor 插入方法调用,sor.I() 改为 sor.C() 2026-05-29 19:24:58 +08:00
9ada9a5a77 fix: use 'default' as project name for Volcengine API calls 2026-05-29 19:18:37 +08:00
1b6c51f712 fix: use compact JSON (no spaces) for body hash consistency 2026-05-29 18:48:45 +08:00
2fd15eeb1e fix: rewrite V4 signing to match official Volcengine Python example 2026-05-29 18:43:10 +08:00
073bd711c8 fix: correct V4 signing - URI encode query params, fix canonical headers format 2026-05-29 18:30:32 +08:00
03e1639ffc fix: remove SK decryption, use plaintext AK/SK directly 2026-05-29 18:15:07 +08:00
bd70011c01 feat: rl_verify认证成功后用NewWindow控件在新窗口打开认证链接 2026-05-29 14:39:50 +08:00
414d0e66ed refactor: 移除uapi依赖,改用直接V4签名调用火山引擎API
- 新增 rl_volcengine_client.py: V4 HMAC-SHA256签名 + StreamHttpClient
- rl_vendor_config 表新增 ak/sk 字段,AK/SK直接存储(不再经过uapi/upappkey)
- init.py: _call_vendor 改用 rl_volcengine_client.call_volcengine_api
- api_mapping 改为直接映射Volcengine API Action(如CreateAsset)
- SQL: 移除upappkey部分,ak/sk存入rl_vendor_config
2026-05-29 14:13:47 +08:00
af3368c019 chore: cleanup swp file, add gitignore 2026-05-29 13:29:51 +08:00
39f98a7136 add: 火山引擎AK/SK凭证 2026-05-29 13:28:34 +08:00
1264a6a2fa add: 火山引擎真人人像模块配置SQL
- rl_vendor_config: api_mapping映射内部操作到uapi.name
- upappkey: AK/SK存储(需替换实际凭证)
- appcodes_kv: 供应商下拉代码
2026-05-29 13:27:11 +08:00
da5a67f23b fix: 删除手写list dspy,让Sage CRUD框架自动生成list端点
手写文件遮蔽了框架自动生成的端点,导致:
- get_rl_vendor_config_list 500: org_id不在rl_vendor_config表
- get_rl_org_group_list 403: 手写文件绕过框架RBAC处理
Sage CRUD框架从json/定义自动生成list端点,不需要手写
2026-05-29 11:16:30 +08:00
db881a52e2 fix: 去掉多余的返回首页按钮和外部提交/重置按钮,Form自带 2026-05-29 10:46:33 +08:00
ac50a223b5 fix: 客户UI改用client API,简化表单字段
- create_validate.ui: 去掉callback_url/project_name,只保留vendor下拉,提交到rl_verify.dspy
- rl_verify.dspy: 自动用orgid作为project_name,返回Message widget含h5_link
- upload_asset.ui: 增加vendor下拉,vendor_group_id改为可选下拉(从已认证组合中选)
- 新增get_org_groups.dspy: 返回当前org已认证的vendor_group_id列表
- rl_upload.dspy: 返回Message widget格式
2026-05-29 10:44:19 +08:00
38650389b1 feat: add load_path.py with role-based wildcard % coverage 2026-05-29 00:52:24 +08:00
598ca58a26 fix: wrap cards+content in VScrollPanel 2026-05-29 00:10:55 +08:00
5d17fa5604 refactor(index.ui): 改用cwidth/cheight/cfontsize替代固定px值
- 卡片容器: height:140px/width:280px → cheight:12/cwidth:23
- 卡片标题: fontSize:18px + fontWeight:bold → Title5控件(内置bold)
- 描述文字: fontSize:14px → cfontsize:1.2
- 页面标题: fontSize:24px → Title2控件(内置bold+cfontsize:1.80)
- borderRadius保留px值(8px),已加入widget.js keys支持

所有尺寸基于charsize响应式缩放,浏览器放大缩小时保持一致
2026-05-28 23:46:53 +08:00
57383dfa7b chore: remove vim swap file 2026-05-28 23:36:16 +08:00
0371bf3a12 refactor(index.ui): 卡片从Button改为VBox容器
Button在bricks中不是容器控件,不支持subwidgets嵌套。
改用VBox作为卡片容器,支持click事件+嵌套Text子控件。
固定尺寸: height=140px, width=280px
2026-05-28 23:36:07 +08:00
8f0c2a84e2 bugfix 2026-05-28 22:17:02 +08:00
19bae64494 bugfix 2026-05-28 22:16:26 +08:00
9ebd8e7a80 fix(index.ui): 客户卡片用customer.*角色控制显示
- customer.*角色: 看到真人认证、上传素材(2张)
- owner.superuser/reseller.operator: 看到全部6张
- 无角色/未登录: 不显示任何卡片
2026-05-28 22:08:06 +08:00
54184aedfe feat(index.ui): 功能卡片固定高度140px + 角色分级显示
- 所有卡片固定height:140px,布局整齐统一
- 客户(已登录用户): 可见真人认证、上传素材(2张)
- 管理员(owner.superuser/reseller.operator): 可见全部6张卡片
  额外: 素材组合管理、素材资产管理、供应商配置、机构映射管理
- 移除描述文字硬编码color:#666,跟随主题
2026-05-28 22:02:40 +08:00
a21eabbb11 refactor(reallife_asset): uapi网关架构重构 + UI全面修复
架构变更:
- 废弃volcengine_client.py直连,改为通过Sage uapi网关调用供应商API
- rl_vendor_config表新增upappid和api_mapping(JSON)字段
- 新增_call_vendor()统一路由: vendor→upappid→apiname→UpAppApi.call()
- 支持多供应商灵活映射,各家API数量/逻辑不同通过api_mapping配置

管理端UI:
- vendor_config_manage.ui: Tabular列表展示供应商配置
- vendor_config_edit.ui: 供应商配置编辑页(AK/SK通过upapp/upappkey管理)
- org_group_manage.ui: 机构映射管理页
- 新增api/get_upapp_list.dspy获取上位系统下拉选项
- 新增api/get_status_list.dspy获取状态下拉选项

客户端UI:
- create_validate.ui: 真人认证页面,支持选择供应商创建H5认证
- upload_asset.ui: 上传素材页面,支持URL/base64上传
- index.ui: 新增客户端入口卡片(真人认证、上传素材)
- 所有Form字段使用正确uitype(code/str/text),确保可输入

清理:
- 废弃rl_app_user表,统一使用rl_asset_group+rl_org_group
- 简化API签名,去除冗余apikey/secretkey透传
2026-05-28 18:49:46 +08:00
1d05b7e36b feat: support base64 file upload in rl_upload, clarify API docs
- rl_upload.dspy: use b64media2url to convert base64/local path to
  public URL before calling vendor API
- docs/api_downapp.md:
  - Clarify dapi Bearer Token auth flow (dapi middleware -> get_user/get_userorgid)
  - Add base64 upload example for rl_upload
  - Clarify rl_status URL is a temporary signed download link (12h),
    asset is permanently stored on volcengine, permanent ref is vendor_asset_id
  - Update overview with auth, upload, and key management sections
2026-05-28 17:45:07 +08:00
36be53699d fix: replace local_group_id with vendor_group_id in all client-facing APIs
- rl_upload_user: accept vendor_group_id instead of group_id,
  validate directly via rl_org_group(org_id, vendor_group_id)
- rl_query_groups: remove local_group_id from response, only return
  vendor_group_id, vendor, status, create_time
- rl_handle_callback: remove local_group_id from return value
- rl_upload.dspy: rename param group_id -> vendor_group_id
- docs/api_downapp.md: update all examples and descriptions
2026-05-28 17:27:26 +08:00
dbf8473b1b fix: remove downapp_id parameter from all APIs, use Bearer token auth
- All APIs now identify caller via Bearer Token, dapi module
  automatically provides user_id and org_id
- rl_verify.dspy: use (await get_user()) instead of downapp_id param
- rl_verify_user: rename downapp_id -> user_id param
- rl_upload_user: rename downapp_id -> user_id param
- rl_sync_asset_status_user: rename downapp_id -> user_id param
- Update docs/api_downapp.md: remove all downapp_id references,
  add Bearer token auth description, add rl_query_groups and
  rl_callback documentation
2026-05-28 17:21:02 +08:00
af65c307f8 feat: add callback handler and group query API for client auth flow
- Add rl_handle_callback() to init.py: handles Volcengine H5 auth callback,
  queries vendor for result, registers rl_org_group mapping
- Add rl_query_groups() to init.py: client API to query authenticated
  group_ids for an org
- Add wwwroot/api/rl_callback.dspy endpoint (no auth required for vendor POST)
- Add wwwroot/api/rl_query_groups.dspy endpoint (login required)
- Remove deprecated rl_app_user_* files (no longer used)
- Update scripts/load_path.py: rl_callback -> any role, rl_query_groups -> logined
2026-05-28 16:57:04 +08:00