@lovrabet/rabetbase-cli 2.5.4 → 2.5.5-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/lib/api/api-doc.js +1 -1
  2. package/lib/api/api-group.js +1 -1
  3. package/lib/api/fetch-model-list.js +1 -1
  4. package/lib/api/generate-api-file.js +1 -1
  5. package/lib/api/generate-sdk-config-file.js +1 -1
  6. package/lib/api/legacy-api-file.js +1 -1
  7. package/lib/api/model-registry-file.js +1 -1
  8. package/lib/api/model-registry-scaffold.js +1 -1
  9. package/lib/api/model-source.js +1 -1
  10. package/lib/auth/auth-server-ui.js +1 -1
  11. package/lib/auth/auth-server.js +1 -1
  12. package/lib/auth/constant.js +1 -1
  13. package/lib/auth/get-cookie.js +1 -1
  14. package/lib/auth/get-session-user.js +1 -1
  15. package/lib/auth/is-session-valid.js +1 -1
  16. package/lib/auth/login-success-html.js +1 -1
  17. package/lib/auth/logout.js +1 -1
  18. package/lib/cli-flags.js +1 -1
  19. package/lib/cli.js +1 -1
  20. package/lib/commands/api/generate.js +1 -1
  21. package/lib/commands/api/index.js +1 -1
  22. package/lib/commands/api/list.js +1 -1
  23. package/lib/commands/api/pull.js +1 -1
  24. package/lib/commands/api/shared.js +1 -1
  25. package/lib/commands/app/detail.js +1 -1
  26. package/lib/commands/app/index.js +1 -1
  27. package/lib/commands/app/list.js +1 -1
  28. package/lib/commands/app/members-list.js +1 -1
  29. package/lib/commands/app/remote-directory.js +1 -1
  30. package/lib/commands/app/shared.js +1 -1
  31. package/lib/commands/app-config/delete.js +1 -1
  32. package/lib/commands/app-config/get.js +1 -1
  33. package/lib/commands/app-config/index.js +1 -1
  34. package/lib/commands/app-config/list.js +1 -1
  35. package/lib/commands/app-config/set.js +1 -1
  36. package/lib/commands/app-config/shared.js +1 -1
  37. package/lib/commands/auth/index.js +1 -1
  38. package/lib/commands/bff/create.js +1 -1
  39. package/lib/commands/bff/delete.js +1 -1
  40. package/lib/commands/bff/detail.js +1 -1
  41. package/lib/commands/bff/index.js +1 -1
  42. package/lib/commands/bff/list.js +1 -1
  43. package/lib/commands/bff/logs.js +1 -1
  44. package/lib/commands/bff/pull.js +1 -1
  45. package/lib/commands/bff/push.js +1 -1
  46. package/lib/commands/bff/status.js +1 -1
  47. package/lib/commands/cli-skill/index.js +1 -1
  48. package/lib/commands/cli-update.js +1 -1
  49. package/lib/commands/codegen/index.js +1 -1
  50. package/lib/commands/codegen/sdk.js +1 -1
  51. package/lib/commands/codegen/sql.js +1 -1
  52. package/lib/commands/common/app-registry.js +1 -1
  53. package/lib/commands/common/app-selector.js +1 -1
  54. package/lib/commands/common/async-task.js +1 -1
  55. package/lib/commands/common/dry-run.js +1 -1
  56. package/lib/commands/common/flags.js +1 -1
  57. package/lib/commands/common/local-file.js +1 -1
  58. package/lib/commands/common/validate.js +1 -1
  59. package/lib/commands/config/delete.js +1 -1
  60. package/lib/commands/config/get.js +1 -1
  61. package/lib/commands/config/index.js +1 -1
  62. package/lib/commands/config/init.js +1 -1
  63. package/lib/commands/config/list.js +1 -1
  64. package/lib/commands/config/set.js +1 -1
  65. package/lib/commands/config/shared.js +1 -1
  66. package/lib/commands/dataset/batch-design.js +1 -1
  67. package/lib/commands/dataset/business-group-update.js +1 -1
  68. package/lib/commands/dataset/business-groups.js +1 -1
  69. package/lib/commands/dataset/capability.js +1 -1
  70. package/lib/commands/dataset/cross-relation-create.js +1 -1
  71. package/lib/commands/dataset/cross-relation-delete.js +1 -1
  72. package/lib/commands/dataset/cross-relation-list.js +1 -1
  73. package/lib/commands/dataset/cross-relation-shared.js +1 -1
  74. package/lib/commands/dataset/cross-relation-update.js +1 -1
  75. package/lib/commands/dataset/delete.js +1 -1
  76. package/lib/commands/dataset/detail.js +1 -1
  77. package/lib/commands/dataset/extend-update.js +1 -1
  78. package/lib/commands/dataset/field-restore.js +1 -1
  79. package/lib/commands/dataset/field-update.js +1 -1
  80. package/lib/commands/dataset/generate.js +1 -1
  81. package/lib/commands/dataset/index.js +1 -1
  82. package/lib/commands/dataset/list.js +1 -1
  83. package/lib/commands/dataset/operations.js +1 -1
  84. package/lib/commands/dataset/relation-audit.js +1 -1
  85. package/lib/commands/dataset/relation-create.js +1 -1
  86. package/lib/commands/dataset/relation-delete.js +1 -1
  87. package/lib/commands/dataset/relation-shared.js +1 -1
  88. package/lib/commands/dataset/relation-update.js +1 -1
  89. package/lib/commands/dataset/relations.js +1 -1
  90. package/lib/commands/dataset/rename.js +1 -1
  91. package/lib/commands/dataset/restore.js +1 -1
  92. package/lib/commands/dataset/user-deleted-field-list.js +1 -1
  93. package/lib/commands/db/analysis-batching.js +1 -1
  94. package/lib/commands/db/analyze-batch-plan.js +1 -1
  95. package/lib/commands/db/analyze-cancel.js +1 -1
  96. package/lib/commands/db/analyze-start.js +1 -1
  97. package/lib/commands/db/analyze-status.js +1 -1
  98. package/lib/commands/db/create.js +1 -1
  99. package/lib/commands/db/delete.js +1 -1
  100. package/lib/commands/db/detail.js +1 -1
  101. package/lib/commands/db/diff-refresh-start.js +1 -1
  102. package/lib/commands/db/diff-refresh-status.js +1 -1
  103. package/lib/commands/db/diff.js +1 -1
  104. package/lib/commands/db/index.js +1 -1
  105. package/lib/commands/db/list.js +1 -1
  106. package/lib/commands/db/shared.js +1 -1
  107. package/lib/commands/db/table-diff-shared.js +1 -1
  108. package/lib/commands/db/tables.js +1 -1
  109. package/lib/commands/db/test.js +1 -1
  110. package/lib/commands/db/update.js +1 -1
  111. package/lib/commands/deployment/index.js +1 -1
  112. package/lib/commands/deployment/sync-all.js +1 -1
  113. package/lib/commands/deployment/sync-jobs.js +1 -1
  114. package/lib/commands/deployment/sync-status.js +1 -1
  115. package/lib/commands/doctor.js +1 -1
  116. package/lib/commands/file/index.js +1 -1
  117. package/lib/commands/flow/create.js +1 -1
  118. package/lib/commands/flow/detail.js +1 -1
  119. package/lib/commands/flow/index.js +1 -1
  120. package/lib/commands/flow/list.js +1 -1
  121. package/lib/commands/flow/publish.js +1 -1
  122. package/lib/commands/flow/runtime-resources-shared.js +1 -1
  123. package/lib/commands/flow/runtime-role-list.js +1 -1
  124. package/lib/commands/flow/runtime-role-user-list.js +1 -1
  125. package/lib/commands/flow/runtime-user-search.js +1 -1
  126. package/lib/commands/flow/shared.js +1 -1
  127. package/lib/commands/flow/update.js +1 -1
  128. package/lib/commands/flow/validate.js +1 -1
  129. package/lib/commands/instant-api-policy/current.js +1 -1
  130. package/lib/commands/instant-api-policy/index.js +1 -1
  131. package/lib/commands/instant-api-policy/init.js +1 -1
  132. package/lib/commands/instant-api-policy/publish.js +1 -1
  133. package/lib/commands/instant-api-policy/pull.js +1 -1
  134. package/lib/commands/instant-api-policy/revision.js +1 -1
  135. package/lib/commands/instant-api-policy/revisions.js +1 -1
  136. package/lib/commands/instant-api-policy/rollback.js +1 -1
  137. package/lib/commands/instant-api-policy/shared.js +1 -1
  138. package/lib/commands/instant-api-policy/validate.js +1 -1
  139. package/lib/commands/issue/index.js +1 -1
  140. package/lib/commands/issue/nudge.js +1 -1
  141. package/lib/commands/issue/report.js +1 -1
  142. package/lib/commands/issue/shared.js +1 -1
  143. package/lib/commands/kb/create.js +1 -1
  144. package/lib/commands/kb/delete.js +1 -1
  145. package/lib/commands/kb/detail.js +1 -1
  146. package/lib/commands/kb/index.js +1 -1
  147. package/lib/commands/kb/list.js +1 -1
  148. package/lib/commands/kb/search.js +1 -1
  149. package/lib/commands/kb/shared.js +1 -1
  150. package/lib/commands/kb/update.js +1 -1
  151. package/lib/commands/logs/index.js +1 -1
  152. package/lib/commands/menu/asset-update.js +1 -1
  153. package/lib/commands/menu/delete.js +1 -1
  154. package/lib/commands/menu/external-link-create.js +1 -1
  155. package/lib/commands/menu/external-link-update.js +1 -1
  156. package/lib/commands/menu/group-create.js +1 -1
  157. package/lib/commands/menu/group-update.js +1 -1
  158. package/lib/commands/menu/index.js +1 -1
  159. package/lib/commands/menu/list.js +1 -1
  160. package/lib/commands/menu/move.js +1 -1
  161. package/lib/commands/menu/regroup-start.js +1 -1
  162. package/lib/commands/menu/rename.js +1 -1
  163. package/lib/commands/menu/shared/compare-table.js +1 -1
  164. package/lib/commands/menu/shared/delete-plan.js +1 -1
  165. package/lib/commands/menu/shared/facts.js +1 -1
  166. package/lib/commands/menu/shared/index.js +1 -1
  167. package/lib/commands/menu/shared/inquirer.js +1 -1
  168. package/lib/commands/menu/shared/local-pages.js +1 -1
  169. package/lib/commands/menu/shared/logic.js +1 -1
  170. package/lib/commands/menu/shared/mutations.js +1 -1
  171. package/lib/commands/menu/shared/path.js +1 -1
  172. package/lib/commands/menu/shared/service.js +1 -1
  173. package/lib/commands/menu/shared/subapp-assets.js +1 -1
  174. package/lib/commands/menu/shared/sync-core.js +1 -1
  175. package/lib/commands/menu/shared/update-core.js +1 -1
  176. package/lib/commands/menu/shared/valid-url.js +1 -1
  177. package/lib/commands/menu/subapp-assets-status.js +1 -1
  178. package/lib/commands/menu/subapp-assets-update.js +1 -1
  179. package/lib/commands/menu/sync.js +1 -1
  180. package/lib/commands/menu/visibility-update.js +1 -1
  181. package/lib/commands/notification/config-create.js +1 -1
  182. package/lib/commands/notification/config-delete.js +1 -1
  183. package/lib/commands/notification/config-list.js +1 -1
  184. package/lib/commands/notification/config-update.js +1 -1
  185. package/lib/commands/notification/index.js +1 -1
  186. package/lib/commands/notification/shared.js +1 -1
  187. package/lib/commands/ocr/index.js +1 -1
  188. package/lib/commands/page/create.js +1 -1
  189. package/lib/commands/page/custom/detail.js +1 -1
  190. package/lib/commands/page/custom/list.js +1 -1
  191. package/lib/commands/page/custom/publish.js +1 -1
  192. package/lib/commands/page/custom/shared.js +1 -1
  193. package/lib/commands/page/custom/syntax.js +1 -1
  194. package/lib/commands/page/custom/update.js +1 -1
  195. package/lib/commands/page/data-list-status.js +1 -1
  196. package/lib/commands/page/generate-start.js +1 -1
  197. package/lib/commands/page/generate-status.js +1 -1
  198. package/lib/commands/page/index.js +1 -1
  199. package/lib/commands/page/pull.js +1 -1
  200. package/lib/commands/page/push.js +1 -1
  201. package/lib/commands/page/relation-audit.js +1 -1
  202. package/lib/commands/page/restore.js +1 -1
  203. package/lib/commands/page/shared.js +1 -1
  204. package/lib/commands/page/sync.js +1 -1
  205. package/lib/commands/project/api-architecture-upgrade.js +1 -1
  206. package/lib/commands/project/create/enhanced-guided-create.js +1 -1
  207. package/lib/commands/project/create/format-elapsed.js +1 -1
  208. package/lib/commands/project/create/main.js +1 -1
  209. package/lib/commands/project/create/materialize-project-template.js +1 -1
  210. package/lib/commands/project/create/project-name.js +1 -1
  211. package/lib/commands/project/create/project-template-archive.js +1 -1
  212. package/lib/commands/project/create/project-template-path.js +1 -1
  213. package/lib/commands/project/create/use-copy-project-template.js +1 -1
  214. package/lib/commands/project/create/use-format-code.js +1 -1
  215. package/lib/commands/project/create/use-install-dependencies.js +1 -1
  216. package/lib/commands/project/domain-routing-sync.js +1 -1
  217. package/lib/commands/project/index.js +1 -1
  218. package/lib/commands/project/upgrade.js +1 -1
  219. package/lib/commands/registry.js +1 -1
  220. package/lib/commands/role/delete.js +1 -1
  221. package/lib/commands/role/detail.js +1 -1
  222. package/lib/commands/role/index.js +1 -1
  223. package/lib/commands/role/list.js +1 -1
  224. package/lib/commands/role/shared.js +1 -1
  225. package/lib/commands/role/update.js +1 -1
  226. package/lib/commands/role/user-add.js +1 -1
  227. package/lib/commands/role/user-remove.js +1 -1
  228. package/lib/commands/role/user-resolve.js +1 -1
  229. package/lib/commands/rule/get.js +1 -1
  230. package/lib/commands/rule/index.js +1 -1
  231. package/lib/commands/rule/list.js +1 -1
  232. package/lib/commands/rule/set.js +1 -1
  233. package/lib/commands/rule/shared.js +1 -1
  234. package/lib/commands/run/index.js +1 -1
  235. package/lib/commands/schema.js +1 -1
  236. package/lib/commands/sql/create.js +1 -1
  237. package/lib/commands/sql/delete.js +1 -1
  238. package/lib/commands/sql/detail.js +1 -1
  239. package/lib/commands/sql/exec.js +1 -1
  240. package/lib/commands/sql/index.js +1 -1
  241. package/lib/commands/sql/list.js +1 -1
  242. package/lib/commands/sql/pull.js +1 -1
  243. package/lib/commands/sql/push.js +1 -1
  244. package/lib/commands/sql/shared.js +1 -1
  245. package/lib/commands/sql/status.js +1 -1
  246. package/lib/commands/sql/validate.js +1 -1
  247. package/lib/commands/task/index.js +1 -1
  248. package/lib/commands/task/status.js +1 -1
  249. package/lib/commands/tenant/index.js +1 -1
  250. package/lib/commands/tenant/members-list.js +1 -1
  251. package/lib/commands/tenant/shared.js +1 -1
  252. package/lib/commands/user-account/dingding-sandbox-bind.js +1 -1
  253. package/lib/commands/user-account/feishu-bind.js +1 -1
  254. package/lib/commands/user-account/index.js +1 -1
  255. package/lib/commands/workspace/add.js +1 -1
  256. package/lib/commands/workspace/index.js +1 -1
  257. package/lib/commands/workspace/remove.js +1 -1
  258. package/lib/config/domain-config.js +1 -1
  259. package/lib/config/project-domain-routing.js +1 -1
  260. package/lib/config/region-config.js +1 -1
  261. package/lib/config/schema.js +1 -1
  262. package/lib/constant/cdn.js +1 -1
  263. package/lib/constant/cli.js +1 -1
  264. package/lib/constant/defaults.js +1 -1
  265. package/lib/constant/domain.js +1 -1
  266. package/lib/constant/env.js +1 -1
  267. package/lib/constant/output.js +1 -1
  268. package/lib/constant/paths.js +1 -1
  269. package/lib/constant/region.js +1 -1
  270. package/lib/constant/risk.js +1 -1
  271. package/lib/constant/routing-profile.js +1 -1
  272. package/lib/context/app-resolver.js +1 -1
  273. package/lib/context/auth-resolver.js +1 -1
  274. package/lib/context/config-loader.js +1 -1
  275. package/lib/context.js +1 -1
  276. package/lib/core/alias-resolver.js +1 -1
  277. package/lib/core/api-client.js +1 -1
  278. package/lib/core/bff/config.js +1 -1
  279. package/lib/core/bff/file-system.js +1 -1
  280. package/lib/core/bff/hash.js +1 -1
  281. package/lib/core/bff/hook-directory.js +1 -1
  282. package/lib/core/bff/lock.js +1 -1
  283. package/lib/core/bff/utils.js +1 -1
  284. package/lib/core/cross-db-relation.js +1 -1
  285. package/lib/core/db-resolver.js +1 -1
  286. package/lib/core/flow-config.js +1 -1
  287. package/lib/core/instant-api-policy/config.js +1 -1
  288. package/lib/core/kb-search-client.js +1 -1
  289. package/lib/core/page/file-system.js +1 -1
  290. package/lib/core/page/hash.js +1 -1
  291. package/lib/core/page/lock.js +1 -1
  292. package/lib/core/page/lr-smart-jsx.js +1 -1
  293. package/lib/core/sql-index-auditor.js +1 -1
  294. package/lib/core/sql-sync/config.js +1 -1
  295. package/lib/core/sql-sync/file-system.js +1 -1
  296. package/lib/core/sql-sync/hash.js +1 -1
  297. package/lib/core/sql-sync/lock.js +1 -1
  298. package/lib/core/sql-sync/utils.js +1 -1
  299. package/lib/core/sql-validator.js +1 -1
  300. package/lib/errors.js +1 -1
  301. package/lib/framework/build-all-flags.js +1 -1
  302. package/lib/framework/error-output.js +1 -1
  303. package/lib/framework/explicit-yes.js +1 -1
  304. package/lib/framework/flags.js +1 -1
  305. package/lib/framework/help.js +1 -1
  306. package/lib/framework/index.js +1 -1
  307. package/lib/framework/output.js +1 -1
  308. package/lib/framework/response.js +1 -1
  309. package/lib/framework/runner-alias.js +1 -1
  310. package/lib/framework/runner.js +1 -1
  311. package/lib/framework/schema-export.js +1 -1
  312. package/lib/framework/supported-flags.js +1 -1
  313. package/lib/framework/types.js +1 -1
  314. package/lib/generated/build-info.d.ts +4 -4
  315. package/lib/generated/build-info.js +1 -1
  316. package/lib/generated/official-routing.js +1 -1
  317. package/lib/generated/routing-contract.js +1 -1
  318. package/lib/help.js +1 -1
  319. package/lib/postinstall.js +1 -1
  320. package/lib/runtime/confirmation.js +1 -1
  321. package/lib/runtime/event.js +1 -1
  322. package/lib/runtime/index.js +1 -1
  323. package/lib/runtime/queue.js +1 -1
  324. package/lib/runtime/resolve.js +1 -1
  325. package/lib/skills/builtin-skill.js +1 -1
  326. package/lib/skills/main.js +1 -1
  327. package/lib/skills/npx-skills-add.js +1 -1
  328. package/lib/skills/skill-presence.js +1 -1
  329. package/lib/telemetry/cli-command-trace.js +1 -1
  330. package/lib/telemetry/cli-help-trace.js +1 -1
  331. package/lib/telemetry/ensure-cli-otel-config.js +1 -1
  332. package/lib/telemetry/register-otel-exit-shutdown.js +1 -1
  333. package/lib/telemetry/send-cli-trace-log.js +1 -1
  334. package/lib/telemetry/send-platform-issue-collect-log.js +1 -1
  335. package/lib/utils/ai_config.js +1 -1
  336. package/lib/utils/apply-jq-filter.js +1 -1
  337. package/lib/utils/cdn-config.js +1 -1
  338. package/lib/utils/check-sdk-version.js +1 -1
  339. package/lib/utils/cli-version-check.js +1 -1
  340. package/lib/utils/cli-version-policy.js +1 -1
  341. package/lib/utils/config.js +1 -1
  342. package/lib/utils/entity-with-id.js +1 -1
  343. package/lib/utils/file-utils.js +1 -1
  344. package/lib/utils/guides-cdn.js +1 -1
  345. package/lib/utils/http-client.js +1 -1
  346. package/lib/utils/is-non-interactive.js +1 -1
  347. package/lib/utils/logger.js +1 -1
  348. package/lib/utils/params.js +1 -1
  349. package/lib/utils/platform.js +1 -1
  350. package/lib/utils/sleep.js +1 -1
  351. package/lib/utils/template-replacer.js +1 -1
  352. package/lib/utils/update-notice.js +1 -1
  353. package/lib/utils/version.js +1 -1
  354. package/lib/utils/with-active-cookie.js +1 -1
  355. package/lib/utils/write-cli-side-channel.js +1 -1
  356. package/package.json +2 -1
  357. package/skills/rabetbase/SKILL.md +1 -1
  358. package/skills/rabetbase-page-generation/SKILL.md +39 -0
  359. package/skills/rabetbase-page-generation/references/component-baseline.md +18 -0
  360. package/skills/rabetbase-page-generation/references/generation.md +126 -0
  361. package/skills/rabetbase-page-generation/templates/onepage/build.mjs +48 -0
  362. package/skills/rabetbase-page-generation/templates/onepage/create/README.md +20 -0
  363. package/skills/rabetbase-page-generation/templates/onepage/create/index.jsx +4 -0
  364. package/skills/rabetbase-page-generation/templates/onepage/create/preview.png +0 -0
  365. package/skills/rabetbase-page-generation/templates/onepage/detail/README.md +20 -0
  366. package/skills/rabetbase-page-generation/templates/onepage/detail/index.jsx +194 -0
  367. package/skills/rabetbase-page-generation/templates/onepage/detail/preview.png +0 -0
  368. package/skills/rabetbase-page-generation/templates/onepage/list/README.md +20 -0
  369. package/skills/rabetbase-page-generation/templates/onepage/list/index.jsx +721 -0
  370. package/skills/rabetbase-page-generation/templates/onepage/list/preview.png +0 -0
  371. package/skills/rabetbase-page-generation/templates/onepage/shared/editor.jsx +395 -0
  372. package/skills/rabetbase-page-generation/templates/onepage/shared/model.js +141 -0
  373. package/skills/rabetbase-page-generation/templates/onepage/shared/page.css +377 -0
  374. package/skills/rabetbase-page-generation/templates/onepage/shared/record-layout.jsx +90 -0
  375. package/skills/rabetbase-page-generation/templates/onepage/shared/responsive.jsx +70 -0
  376. package/skills/rabetbase-page-generation/templates/onepage/update/README.md +21 -0
  377. package/skills/rabetbase-page-generation/templates/onepage/update/index.jsx +4 -0
  378. package/skills/rabetbase-page-generation/templates/onepage/update/preview.png +0 -0
  379. package/skills/rabetbase.manifest.json +3 -3
@@ -0,0 +1,126 @@
1
+ # 生成、浏览器迭代与发布
2
+
3
+ ## 安装独立 Skill
4
+
5
+ CLI 包内包含 `skills/rabetbase-page-generation`。使用现有 Skill 安装工具从已安装 CLI 包目录安装:
6
+
7
+ ```sh
8
+ npx skills add /path/to/rabetbase-cli/skills/rabetbase-page-generation -g -y
9
+ ```
10
+
11
+ 将路径替换为当前 CLI 包的真实位置,安装后确认 Agent 可发现 `rabetbase-page-generation`。CLI 既有 postinstall 安装的是 `rabetbase` Skill;此独立 Skill 的安装由使用方显式执行。
12
+
13
+ ## 确定应用与页面需求
14
+
15
+ 默认在正式环境(prod)的当前应用完成任务。先核对当前 CLI 路由、用户提供的应用链接、Dataset 和已有页面是否一致;用户明确指定 daily 或企业部署时沿用该目标,不因查不到应用而切换环境试写。命令示例沿用已核验的当前路由,daily 检查不是 prod 交付门禁,也不要求非技术用户选择环境参数。
16
+
17
+ 用户要求创建或重做页面后,按该任务范围完成页面创建、保存、串联、验收和发布,不要求用户逐个批准命令或每个页面。只有业务范围或目标应用不明确时做一次必要的简短确认,例如“我会做一个问卷列表,支持查看和新增,完成后给你入口”。用户只要方案或预览时尊重这个停止点;工具权限拦截时保留已完成成果,不绕过控制、不自行提高风险上限。
18
+
19
+ 先形成内部页面计划,记录需要的能力、入口、页面间跳转、菜单展示和旧页面处理:
20
+
21
+ - `list / detail / create / update` 是可选基础模板。只读场景按需保留列表、详情;仅查看单条记录可以只有详情,仅录入可以只有新增。不可编辑时不创建更新页,也移除所有编辑入口和写入逻辑;“不可修改”与“允许新增”的边界若不明确,用业务语言简短确认。明确只读时同时移除新增、编辑、删除和批量写入能力。
22
+ - 用户需要看板、审批或汇总时可以扩展页面。按实际业务需求决定入口,不强行补齐四页;未选择的页面不创建菜单,不留下链接或按钮。
23
+ - 通过 Dataset 关联页、`menu list` 与对应页面详情识别已有 lowcode 和 CustomJSX 页面。内部记录旧页面到新页面的名称、类型、`pageId`、`menuId`、路径和用途对应关系;旧 lowcode 的 ID 不得用于 `custom-detail`、`custom-update` 或 `custom-publish`。
24
+ - 用户给的链接可能只是定位应用的旧页面。新流程应使用计划内新页面的真实路径,不能把旧页面路径回填成新页面路径;交付时提供新的入口。重试前查已有创建回执和线上页面,不能仅凭同名判断同一页面或重复创建。
25
+
26
+ ## 菜单与旧页面安排
27
+
28
+ 新页面默认只显示业务入口,作为详情、录入、编辑等流程内部节点的页面设为隐藏;独立入口按用户需求显示。扩展或裁剪页面后同步调整菜单策略,不能固定假设永远有四个页面。
29
+
30
+ 新流程验收通过后,可以向用户建议隐藏旧 lowcode 页面,确认不再使用时也可以建议删除。已包含在用户替换要求中的隐藏安排直接执行;未明确要替换旧入口时先建议,不能悄悄隐藏仍在使用的旧页面。删除旧页面需有明确删除意图、核对影响范围和外部引用;保留页面不影响新流程交付。隐藏保留路由,删除不能用来代替隐藏。
31
+
32
+ ## 绑定真实 Dataset
33
+
34
+ 1. 用 `rabetbase dataset detail --code <datasetCode> --format compress` 读取字段、类型、必填、枚举和操作。用 `rabetbase codegen sdk` 核验 SDK 签名;不要从原始接口元信息猜测请求或响应。
35
+ 2. 将 `templates/onepage` 整体复制到页面工作目录。先阅读对应页面目录的 `README.md` 和 `preview.png`,明确布局与交互;`shared/` 保存四页共用代码,复制时一起保留。它是供 Agent 改写的 JSX 模板,不是配置解释器:客户字段展示了分组、数字、枚举、日期、智能筛选和表单的完整写法。按真实 Dataset 改写 `shared/model.js` 的字段与查询、`shared/record-layout.jsx` 的分组说明、`list/index.jsx` 的筛选/标题/手机主字段、`shared/editor.jsx` 的控件/校验/写入字段及 `detail/index.jsx` 的标题/主键读取。不能只替换 Dataset code 就直接发布给其他业务。
36
+ 3. 替换 `shared/model.js` 中 `__APP_CODE__`、`__DATASET_CODE__`;创建前将尚无真实路径的 `__LIST_PATH__`、`__DETAIL_PATH__`、`__CREATE_PATH__`、`__UPDATE_PATH__` 设为空字符串,创建后回填服务端真实路径。计划内页面使用相同绑定;未选页面不保留导航入口。示例以数字 `id` 为主键;其他类型需要同时改写校验、记录导航和 SDK 参数。
37
+ 4. 页面使用宿主 `useSdkClient()`:已核验的 Dataset 模型提供 `filter({where,currentPage,pageSize,orderBy})`、`getOne(id)`、`create(fields)`、`update(id,fields)`。列表读取 `tableData` 和 `paging.totalCount`;若实际 SDK 不同,按真实契约改写。只在已确认需要连接、聚合或业务规则时改用 Custom SQL / Backend Function。
38
+
39
+ 保持零值、枚举、空日期和主键类型正确;数字不加千分位,金额精度按字段定义。列表、详情和表单均区分加载、空数据、错误与重试。分页只使用已提交的筛选;搜索、重置和切换页大小回第一页,忽略过期响应。
40
+
41
+ ## 组装计划内页面目录
42
+
43
+ 确认宿主可解析已发布的 `@lovrabet/components` 版本,并且该版本从包根入口导出 `LrSmartFilter`。模板直接使用这个公共组件,不复制 JSX 或 CSS 源码,也不改写成本地筛选器;不要求 CLI 安装页面构建依赖。若宿主解析失败,停止页面发布,通知用户需要由 `app-platform` 更新依赖或构建模板,不修改该仓库。`build.mjs` 只组装当前目录的四页可读源码,不读取 Dataset、不选模板、不创建平台资源,也不生成 `page.js`。平台保存/发布时使用新的微应用构建模板完成 JSX 编译。
44
+
45
+ ```sh
46
+ node build.mjs ./pages-v1
47
+ ```
48
+
49
+ 输出目录必须尚不存在,避免旧文件混入更新。结果为 `pages-v1/list`、`detail`、`create`、`update`;每页包含可读的 `src/app/index.jsx`、`src/shared` 源码,并通过 `import { LrSmartFilter } from "@lovrabet/components"` 使用公共组件,不包含 `page.js` 或其他预编译 bundle。基础脚本仍输出四个目录,不负责选择页面;只对计划中的目录执行创建、更新和发布,本地多出的目录不代表已创建平台资源。扩展页由 Agent 在工作目录按相同 `src/app/index.jsx` 与所需 `src/shared` 结构组织,不假设脚本自动发现新目录,也不为本次业务改写已安装的 Skill。每个上传页面都拥有完整源码,避免更新一个页面时依赖另一个页面的文件。删除未选页面对应的按钮、导航、字段动作和不可用操作;详情没有编辑页时不能保留“编辑”按钮。组装成功不等于平台编译成功。页面文案默认中文,按应用语言调整源码;需要多语言时使用宿主 `useI18n` 和页面自己的语言资源。
50
+
51
+ 构建脚本不复制组件源码或独立 CSS,也不把它改成简易输入框或预编译 bundle 来规避依赖问题。组件导出已经发布后,真实页面验收必须覆盖智能搜索和结构化筛选;若宿主仍不识别导出,按组件宿主阻断处理,通知用户由 `app-platform` 修复后再继续,不能用页面内副本冒充组件库复用。
52
+
53
+ ## 创建、回填与更新
54
+
55
+ 只对页面计划选中的页面执行已有命令,下面以列表为例:
56
+
57
+ ```sh
58
+ rabetbase page create --name "<页面名称>" --page-dir ./pages-v1/list --appcode <appCode> --dry-run --format compress
59
+ rabetbase page create --name "<页面名称>" --page-dir ./pages-v1/list --appcode <appCode> --format compress
60
+ rabetbase page custom-detail --id <pageId> --appcode <appCode> --format compress
61
+ ```
62
+
63
+ 复用 `page create` 的默认建菜单行为,需要父菜单时使用已有 `--parent-menu-id`。菜单展示通过既有 `rabetbase menu` 命令管理,先查看 `menu list` 和 `menu visibility-update --help` 并按要求预演,再执行授权的调整。隐藏菜单保留路由和资源,不等同于不创建菜单;不得删除页面绑定菜单来模拟隐藏。按页面计划设置菜单可见性并逐项回查;隐藏的子页仍绑定菜单,不要声称只有入口绑定菜单。菜单状态只根据真实返回和回查结果判断。
64
+
65
+ 记录每个计划内页面的 `pageId`、`menuId`、类型与真实路径,回填 `shared/model.js`,重新组装到新的输出目录。发布前逐条比对导航路径和新页面映射,特别检查新增按钮没有指向旧 lowcode 表单。先回读远端当前 `codeContent`,再更新;`--page-dir` 是整目录替换,目录必须完整:
66
+
67
+ ```sh
68
+ rabetbase page custom-update --id <pageId> --appcode <appCode> --page-dir ./pages-v2/list --format compress
69
+ ```
70
+
71
+ ONEPAGE 子页读取 `onePageInfo.innerSearchParams.id`,直接访问时读取 `useLocation().search`。缺少或无效主键时不发数据请求。列表通过 `navigate(pathWithQuery, {onePage:true})` 打开子页;详情的上一条/下一条和详情切编辑使用当前面板替换,避免不断增加层级。更新保存后回原详情或父列表;直接访问返回真实入口。SDK 保存成功才发送按列表路径区分的刷新事件,父列表保留筛选和分页并重新读取数据;取消不写入数据、不发送刷新。
72
+
73
+ 上述导航按实际页面组合改写:没有列表时移除“返回列表”和列表刷新依赖,返回计划内的真实入口,或留在当前独立页面显示保存结果;没有详情时更新不能返回详情。独立详情入口必须有明确的记录选择或参数来源,不能让用户直接面对缺少主键的错误。增加看板等入口时一并调整返回目标和需要刷新的页面。
74
+
75
+ ## 页面与浏览器验收
76
+
77
+ 在当前任务工作目录中预览迭代;页面目录中的 `preview.png` 是随 Skill 分发的效果参考。使用当前可用的浏览器能力,不要求安装桌面客户端、浏览器扩展或切换到外部浏览器。若没有浏览器能力,继续完成可执行的源码、构建和状态检查,清楚记录交互尚未验证;不能把命令成功当成浏览器验收通过。以下检查只应用于计划内能力;被裁剪的能力应检查其按钮、导航和写入调用已移除。
78
+
79
+ - 同 Dataset 对比旧标准页的字段、分组、智能搜索、表单密度与操作位置;覆盖空数据、有数据、无匹配结果和超过一页的数据。
80
+ - 查询、重置、翻页、页大小、勾选和列设置;自然语言查询必须读取真实结果,失败不冒充空结果。
81
+ - 列表打开详情/新增/更新,主键正确;详情上一条/下一条和编辑仍在当前 ONEPAGE 面板。
82
+ - 必填错误、零值、枚举和日期;保存、重置、取消、保存后返回刷新;连续新增清空表单并聚焦首字段,快捷键不重复提交。
83
+ - 桌面及手机窄屏,列表和子页无溢出,底部按钮可访问;父列表保持筛选/分页。实际设备软键盘、深色主题等未覆盖项需明确记录。
84
+ - 仅操作授权的测试数据,写入前保留原值,验收后还原修改并清理本轮测试记录。旧页面只用于对比,不作为新流程的运行依赖。
85
+
86
+ 本地模拟不能证明真实 SDK、权限或 ONEPAGE 宿主正确。按页面计划验证真实数据流后再发布;若正式态暴露问题,修复后重新验收。能力缺失造成的未验证项与明确的验收失败分别记录;用户若接受未验证范围并要求先发布,按该范围继续,仍不得声称完整验收通过。
87
+
88
+ ## 发布与结果回查
89
+
90
+ 对每个计划内 CustomJSX 页面,发布前先 `custom-detail` 核对类型、应用、保存内容和版本:
91
+
92
+ - `status=FORMAL` 且有效的 `draftVersion === formalVersion`:当前保存内容已发布,跳过重复发布并检查运行页面;编辑器或本地尚未保存的改动不算已发布。
93
+ - 有新草稿或首次发布:确认已保存内容对应本轮验收源码,再发布。不能只因 `status=FORMAL` 就忽略较新的草稿。
94
+ - 版本缺失、异常、状态矛盾或远端内容与预期不一致:先回读并核对,不能把两个缺失版本当作相等,也不能覆盖他人的新改动或猜测已发布。
95
+
96
+ ```sh
97
+ rabetbase page custom-detail --id <pageId> --appcode <appCode> --format compress
98
+ # 仅在确有待发布内容且已完成前述检查时执行
99
+ rabetbase page custom-publish --id <pageId> --appcode <appCode> --remark "页面验收通过" --format compress
100
+ rabetbase page custom-detail --id <pageId> --appcode <appCode> --format compress
101
+ ```
102
+
103
+ 发布后逐页检查 `FORMAL`、正式版本是否等于本轮待发布版本、源码和运行地址。用返回的运行 URL 复验入口、子页跳转和菜单展示;命令成功、页面发布和业务交互验收是不同事实。网络超时、响应丢失或 500 时先回读状态,不立即重复发布。
104
+
105
+ ## 失败分类与恢复
106
+
107
+ 内部保留失败发生在哪一步、页面、时间、已脱敏错误及请求标识(若工具提供)。按证据选择恢复动作:
108
+
109
+ | 观察到的事实 | 判断与下一步 |
110
+ | --- | --- |
111
+ | 正式版本已等于预期版本,源码相符 | 目标已发布,停止重复调用并检查运行页;不能据此断言先前 500 的原因就是重复发布。 |
112
+ | 平台编译结果指出源码或组件/依赖错误 | 按构建错误修复,再保存和验证;组件处理遵循组件基线,不把构建失败说成没有数据。 |
113
+ | 页面事实是 lowcode,或 ID/应用与计划不同 | 回到新旧映射选择正确页面及对应命令;不要将旧页面当成新页面重复创建或发布。 |
114
+ | 鉴权、权限或 CLI 风险限制拒绝 | 保留成果,不绕过检查;只说明具体未完成操作和用户能采取的必要动作。 |
115
+ | 页面发布成功,但菜单设置失败 | 分别回查页面和菜单,恢复未完成的菜单步骤;不能把页面称为未发布或把菜单称为已隐藏。 |
116
+ | 只有 HTTP 500、超时或未知错误,回读也未能确定结果 | 原因待确认,保留证据,通过可用且授权的排障入口继续定位;不编造重复发布、组件缺失等根因,不循环重试。 |
117
+
118
+ 用户反馈用业务语言,例如“页面已经发布,可以直接打开”“页面已发布,但侧边栏还没调整完成”“这次发布没有完成,我正在检查原因”。只有确实存在未保存修改时才建议重新保存,不能把“重新保存再发布”当成所有错误的通用解决办法。
119
+
120
+ ## 内部记录与用户交付
121
+
122
+ 内部记录页面计划、新旧映射、页面与菜单标识、源码对应版本、发布结果、菜单实况,以及本轮验收的步骤、结果和未覆盖项。有可写任务目录时和源码一起保存,临时夹具和回执不加入 CLI 仓库或上传到业务页面;没有持久位置时保留在当前任务上下文,不要求用户提供存储目录,不保证任务结束后仍可取回。不记录凭据或完整业务数据,也不把旧回执当成新版本证据。
123
+
124
+ 向非技术用户只交付创建了哪些页面、用途、可直接打开的入口,以及旧页面处理建议和确需人工完成的事项。需要修改页面时提供工具返回的编辑链接,并与访问链接区分;不要自行拼接或沿用旧链接。详情等需要记录参数的页面优先通过入口访问,不把无参数错误页作为正常体验交付。默认不展示 pageId、menuId、接口、版本号、命令和本地验收文件路径;用户明确要求技术细节时再提供相关内容。
125
+
126
+ CLI beta 发布遵循 CLI 发布流程;页面验收不等于 npm 发布成功。安装 CLI beta 及独立 Skill 后,确认执行方能够发现该 Skill,并按页面计划执行生成和端到端验收。
@@ -0,0 +1,48 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ // Assemble uploadable page directories from readable JSX source. The platform
6
+ // micro-app template performs the actual JSX build when the page is saved or
7
+ // published; this script must not upload a precompiled page.js bundle.
8
+ const root = path.dirname(fileURLToPath(import.meta.url));
9
+ const [output] = process.argv.slice(2);
10
+ if (!output) throw Error("Usage: node build.mjs <output directory>");
11
+
12
+ const destination = path.resolve(output);
13
+ await mkdir(destination, { recursive: false });
14
+
15
+ const sharedFiles = [
16
+ "model.js",
17
+ "record-layout.jsx",
18
+ "responsive.jsx",
19
+ "editor.jsx",
20
+ "page.css",
21
+ ];
22
+ const pageKinds = ["list", "detail", "create", "update"];
23
+
24
+ for (const kind of pageKinds) {
25
+ const pageRoot = path.join(destination, kind);
26
+ await mkdir(path.join(pageRoot, "src", "app"), { recursive: true });
27
+ await mkdir(path.join(pageRoot, "src", "shared"), { recursive: true });
28
+
29
+ const pageSource = await readFile(
30
+ path.join(root, kind, "index.jsx"),
31
+ "utf8",
32
+ );
33
+ await writeFile(
34
+ path.join(pageRoot, "src", "app", "index.jsx"),
35
+ pageSource,
36
+ );
37
+
38
+ for (const file of sharedFiles) {
39
+ await writeFile(
40
+ path.join(pageRoot, "src", "shared", file),
41
+ await readFile(path.join(root, "shared", file)),
42
+ );
43
+ }
44
+ }
45
+
46
+ console.log(
47
+ `Assembled four readable CustomJSX page directories in ${destination}`,
48
+ );
@@ -0,0 +1,20 @@
1
+ # 新增页
2
+
3
+ 入口是 `index.jsx`,以 `mode="create"` 使用 `../shared/editor.jsx`。新增与更新共享控件及校验,分别构建成独立 CustomJSX 页面。
4
+
5
+ ![新增页效果示例](preview.png)
6
+
7
+ 图中为本模板空表单的桌面效果,供字段分组与操作位置参考;外层“关闭子页”是本地预览容器,真实运行使用 ONEPAGE 宿主。
8
+
9
+ ## 保留的交互
10
+
11
+ - 按 Dataset 分组展示字段、说明、必填提示;隐藏自动生成的主键。
12
+ - 顶部和底部都可保存,支持 Ctrl/⌘+Enter;必填校验失败时定位字段,提交中阻止重复保存。
13
+ - “保存并返回”关闭子页并刷新列表;“保存并继续新增”保留新增页,清空表单并聚焦首字段。
14
+ - 保存失败保留输入,重置恢复初始表单;手机日期使用适合触控的输入方式。
15
+
16
+ ## 生成时修改
17
+
18
+ 在 `shared/editor.jsx` 中按真实字段调整控件、校验、默认值与写入白名单,在 `shared/record-layout.jsx` 调整分组、说明和必填。需要同步首字段聚焦引用。不要把主键或只读字段提交给创建接口。
19
+
20
+ 零值、枚举及空日期必须正确转换。只有 SDK 创建成功才通知列表刷新;取消不创建记录。完整构建及发布见 [生成流程](../../../references/generation.md)。
@@ -0,0 +1,4 @@
1
+ import EditorPage from "../shared/editor";
2
+ export default function CreatePage() {
3
+ return <EditorPage mode="create" />;
4
+ }
@@ -0,0 +1,20 @@
1
+ # 详情页
2
+
3
+ 入口是 `index.jsx`,是独立的只读页面。通过 `shared/record-layout.jsx` 与表单保持字段分组一致,不使用抽屉。
4
+
5
+ ![详情页效果示例](preview.png)
6
+
7
+ 图中为本模板使用本地示例数据的桌面效果,供布局与组件参考;外层“关闭子页”是本地预览容器,真实运行使用 ONEPAGE 宿主。
8
+
9
+ ## 保留的交互
10
+
11
+ - 顶部显示记录名称和可复制的主键;提供编辑、当前列表页内上一条/下一条,首尾按钮禁用。
12
+ - 按分组显示标签、说明和只读值;枚举显示标签,空值显示 `--`,数字不加千分位。
13
+ - 编辑替换当前 ONEPAGE 面板,保存后回到更新后的详情;关闭返回原列表。
14
+ - 重新读取真实 SDK 记录,区分加载失败、记录不存在与正常数据。
15
+
16
+ ## 生成时修改
17
+
18
+ 根据 Dataset 修改标题字段、主键校验、SDK 模型和分组。ONEPAGE 优先读取 `onePageInfo.innerSearchParams.id`,直接访问再读 URL 查询参数。缺失或无效主键时不发请求。
19
+
20
+ 详情与更新应保持不同的页面 ID/路径,不能用一个页面切换只读状态替代两页。完整构建及发布见 [生成流程](../../../references/generation.md)。
@@ -0,0 +1,194 @@
1
+ import { useEffect, useState } from "react";
2
+ import {
3
+ Alert,
4
+ Button,
5
+ ConfigProvider,
6
+ Form,
7
+ Empty,
8
+ Spin,
9
+ Space,
10
+ Typography,
11
+ theme,
12
+ } from "antd";
13
+ import {
14
+ useAppContext,
15
+ useAppTheme,
16
+ useLocation,
17
+ useNavigate,
18
+ useSdkClient,
19
+ } from "@/context/app-context";
20
+ import { DATASET_CODE, LIST_PATH, childPaths, formatField } from "../shared/model";
21
+ import { RecordGroups, RecordItem, recordTheme } from "../shared/record-layout";
22
+ import "../shared/page.css";
23
+
24
+ function CustomerDetail() {
25
+ const client = useSdkClient();
26
+ const { onePageInfo } = useAppContext();
27
+ const location = useLocation();
28
+ const navigate = useNavigate();
29
+ const rawId =
30
+ onePageInfo?.innerSearchParams?.id ??
31
+ new URLSearchParams(location.search).get("id");
32
+ const recordId = rawId == null ? "" : String(rawId).trim();
33
+ const [state, setState] = useState({
34
+ loading: true,
35
+ record: null,
36
+ error: "",
37
+ });
38
+ const [retry, setRetry] = useState(0);
39
+ const params =
40
+ onePageInfo?.innerSearchParams ??
41
+ Object.fromEntries(new URLSearchParams(location.search));
42
+ const ids = [
43
+ ...new Set(
44
+ String(params.ids || "")
45
+ .split(",")
46
+ .filter((id) => /^\d+$/.test(id)),
47
+ ),
48
+ ].slice(0, 100);
49
+ const position = ids.indexOf(recordId);
50
+ function moveRecord(index) {
51
+ navigate(
52
+ `${childPaths.detail}?${new URLSearchParams({ id: ids[index], ids: ids.join(",") })}`,
53
+ { replace: true },
54
+ );
55
+ }
56
+ useEffect(() => {
57
+ const changed = (event) => {
58
+ if (event.detail === LIST_PATH) setRetry((value) => value + 1);
59
+ };
60
+ window.addEventListener("lovrabet:page-generation:changed", changed);
61
+ return () =>
62
+ window.removeEventListener("lovrabet:page-generation:changed", changed);
63
+ }, []);
64
+
65
+ useEffect(() => {
66
+ let active = true;
67
+ setState({ loading: true, record: null, error: "" });
68
+ (async () => {
69
+ try {
70
+ if (!/^\d+$/.test(recordId))
71
+ throw Error("缺少或无效的客户主键,请从列表重新打开详情");
72
+ const record =
73
+ await client.models[`dataset_${DATASET_CODE}`].getOne(recordId);
74
+ if (
75
+ record != null &&
76
+ (typeof record !== "object" || Array.isArray(record))
77
+ )
78
+ throw Error("详情响应无效,请重试");
79
+ if (active) setState({ loading: false, record, error: "" });
80
+ } catch (cause) {
81
+ if (active)
82
+ setState({
83
+ loading: false,
84
+ record: null,
85
+ error: cause.message || "加载失败,请重试",
86
+ });
87
+ }
88
+ })();
89
+ return () => {
90
+ active = false;
91
+ };
92
+ }, [client, recordId, retry]);
93
+
94
+ return (
95
+ <main className="customer-record customer-detail">
96
+ {!onePageInfo && (
97
+ <Button className="record-back" onClick={() => navigate(LIST_PATH)}>
98
+ 返回列表
99
+ </Button>
100
+ )}
101
+ <header className="record-heading">
102
+ <div className="record-heading-title">
103
+ <h1>{state.record?.customer_name || "客户详情"}</h1>
104
+ <Typography.Text
105
+ type="secondary"
106
+ copyable={
107
+ recordId
108
+ ? { text: recordId, tooltips: ["复制主键", "已复制"] }
109
+ : false
110
+ }
111
+ >
112
+ 主键 {recordId || "—"}
113
+ </Typography.Text>
114
+ </div>
115
+ <Space wrap>
116
+ <Button
117
+ type="primary"
118
+ disabled={!state.record || state.loading}
119
+ onClick={() =>
120
+ navigate(
121
+ `${childPaths.update}?${new URLSearchParams({ id: recordId, returnDetail: "1", ids: ids.join(",") })}`,
122
+ { replace: true },
123
+ )
124
+ }
125
+ >
126
+ 编辑客户
127
+ </Button>
128
+ {position >= 0 && (
129
+ <span className="record-sequence" aria-label="当前页记录导航">
130
+ <Button
131
+ disabled={position === 0 || state.loading}
132
+ onClick={() => moveRecord(position - 1)}
133
+ >
134
+ 上一条
135
+ </Button>
136
+ <span>
137
+ 本页 {position + 1}/{ids.length}
138
+ </span>
139
+ <Button
140
+ disabled={position === ids.length - 1 || state.loading}
141
+ onClick={() => moveRecord(position + 1)}
142
+ >
143
+ 下一条
144
+ </Button>
145
+ </span>
146
+ )}
147
+ </Space>
148
+ </header>
149
+ {state.loading ? (
150
+ <Spin aria-label="正在加载客户详情" />
151
+ ) : state.error ? (
152
+ <Alert
153
+ type="error"
154
+ showIcon
155
+ message="详情加载失败"
156
+ description={state.error}
157
+ action={
158
+ <Button onClick={() => setRetry((value) => value + 1)}>重试</Button>
159
+ }
160
+ />
161
+ ) : state.record ? (
162
+ <Form layout="vertical" className="record-readonly" component="div">
163
+ <RecordGroups>
164
+ {(field) => (
165
+ <RecordItem key={field.key} field={field}>
166
+ <div className="record-value">
167
+ {formatField(state.record[field.key], field)}
168
+ </div>
169
+ </RecordItem>
170
+ )}
171
+ </RecordGroups>
172
+ </Form>
173
+ ) : (
174
+ <Empty description="客户不存在或已被删除" />
175
+ )}
176
+ </main>
177
+ );
178
+ }
179
+
180
+ export default function DetailPage() {
181
+ const hostTheme = useAppTheme();
182
+ return (
183
+ <ConfigProvider
184
+ theme={recordTheme(
185
+ hostTheme,
186
+ hostTheme?.mode === "dark"
187
+ ? theme.darkAlgorithm
188
+ : theme.defaultAlgorithm,
189
+ )}
190
+ >
191
+ <CustomerDetail />
192
+ </ConfigProvider>
193
+ );
194
+ }
@@ -0,0 +1,20 @@
1
+ # 列表页
2
+
3
+ 入口是 `index.jsx`,数据绑定、查询和格式化来自 `../shared/model.js`。列表是四页包的入口,通过 ONEPAGE 打开详情、新增与更新。
4
+
5
+ ![列表页效果示例](preview.png)
6
+
7
+ 图中为本模板使用本地示例数据的桌面效果,供布局与组件参考;不是业务数据或真实环境验收凭证。
8
+
9
+ ## 保留的交互
10
+
11
+ - 顶部使用 LrSmartFilter 智能搜索组合,支持自然语言与结构化筛选;查询结果交给真实 SDK。
12
+ - 工具栏包含勾选摘要、导出、刷新、列设置和新增;列偏好按应用与 Dataset 区分。
13
+ - AntD 表格使用服务端总数分页,查询及页大小变更回到第一页;错误、空数据、无匹配结果分别反馈。
14
+ - 名称点击打开详情;操作列提供更新、详情和删除确认。手机使用卡片,保留勾选、分页及主要操作。
15
+
16
+ ## 生成时修改
17
+
18
+ 按 Dataset 改写 `shared/model.js` 中字段、枚举、排序、查询和页面路径;同步修改本页筛选控件、主显示字段、手机卡片字段、标题及导出名称。数字不加千分位,金额精度遵循字段定义。不要把图中的客户字段或测试数据写入其他业务。
19
+
20
+ 保存后的刷新通知以真实列表路径区分。返回列表应保留已提交的筛选和分页,并读取最新数据。完整构建及发布见 [生成流程](../../../references/generation.md);应整体构建四页,而不是单独上传本目录。