@lovrabet/cli 1.1.20 → 1.1.22

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 (69) hide show
  1. package/lib/add-page/input-page-router.js +1 -1
  2. package/lib/add-page/main.js +1 -1
  3. package/lib/add-page/select-page-template.js +1 -1
  4. package/lib/api/api-doc-ui.js +1 -1
  5. package/lib/api/api-doc.js +1 -1
  6. package/lib/api/api-pull-ui.js +1 -1
  7. package/lib/api/fetch-model-list.js +1 -1
  8. package/lib/api/generate-api-file.js +1 -1
  9. package/lib/api/main.js +1 -1
  10. package/lib/api/pull-silent.js +1 -1
  11. package/lib/app-menu/app-menu-sync-ui.js +1 -1
  12. package/lib/app-menu/create-menu.js +1 -1
  13. package/lib/app-menu/get-local-pages.js +1 -1
  14. package/lib/app-menu/get-online-menu-list.js +1 -1
  15. package/lib/app-menu/valid-url.js +1 -1
  16. package/lib/auth/auth-server-ui.js +1 -1
  17. package/lib/auth/auth-server.js +1 -1
  18. package/lib/auth/constant.js +1 -1
  19. package/lib/auth/get-cookie.js +1 -1
  20. package/lib/auth/is-session-valid.js +1 -1
  21. package/lib/auth/logout.js +1 -1
  22. package/lib/cli.js +1 -1
  23. package/lib/cmd/build-watch.js +1 -1
  24. package/lib/cmd/build.js +1 -1
  25. package/lib/cmd/logs.js +1 -1
  26. package/lib/cmd/preview.js +1 -1
  27. package/lib/cmd/start.js +1 -1
  28. package/lib/config/config-help.js +1 -1
  29. package/lib/config/main.js +1 -1
  30. package/lib/constant/domain.js +1 -1
  31. package/lib/constant/env.js +1 -1
  32. package/lib/create-app/enhanced-guided-create.js +1 -1
  33. package/lib/create-app/format-elapsed.js +1 -1
  34. package/lib/create-app/main.js +1 -1
  35. package/lib/create-app/task-finished.js +1 -1
  36. package/lib/create-app/task-loading.js +1 -1
  37. package/lib/create-app/task-running.js +1 -1
  38. package/lib/create-app/task-time.js +1 -1
  39. package/lib/create-app/use-copy-project-template.js +1 -1
  40. package/lib/create-app/use-format-code.js +1 -1
  41. package/lib/create-app/use-install-dependencies.js +1 -1
  42. package/lib/help.js +1 -1
  43. package/lib/init/main.js +1 -1
  44. package/lib/mcp/cursor.js +1 -1
  45. package/lib/mcp/main.js +1 -1
  46. package/lib/utils/config.js +1 -1
  47. package/lib/utils/copy-directory.js +1 -1
  48. package/lib/utils/http-client.js +1 -1
  49. package/lib/utils/logger.js +1 -1
  50. package/lib/utils/router-updater.js +1 -1
  51. package/lib/utils/sleep.js +1 -1
  52. package/lib/utils/template-replacer.js +1 -1
  53. package/package.json +2 -2
  54. package/templates/README.md +28 -1
  55. package/templates/projects/sub-app-react-demo/CHANGELOG.md +16 -0
  56. package/templates/projects/sub-app-react-demo/README.md +163 -54
  57. package/templates/projects/sub-app-react-demo/package-lock.json +1347 -149
  58. package/templates/projects/sub-app-react-demo/package.json +2 -2
  59. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +286 -55
  60. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +526 -0
  61. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +942 -87
  62. package/templates/projects/sub-app-react-demo/src/pages/intro/index.tsx +560 -0
  63. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +113 -118
  64. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +469 -0
  65. package/templates/projects/sub-app-react-demo/src/style.css +39 -0
  66. package/templates/rules/README.md +178 -0
  67. package/templates/rules/example-project-setup.md +276 -0
  68. package/templates/rules/lovrabet_rules.mdc.tpl +425 -0
  69. package/templates/projects/sub-app-react-demo/bun.lock +0 -600
@@ -1 +1 @@
1
- const a49_0x111bdd=a49_0x2bd6;(function(_0x195ec5,_0x4d9a5a){const _0x22ce35=a49_0x2bd6,_0x478349=_0x195ec5();while(!![]){try{const _0x18a1ae=parseInt(_0x22ce35(0x1e3))/0x1*(-parseInt(_0x22ce35(0x1e5))/0x2)+parseInt(_0x22ce35(0x1c9))/0x3+-parseInt(_0x22ce35(0x1ce))/0x4*(-parseInt(_0x22ce35(0x1cc))/0x5)+-parseInt(_0x22ce35(0x1d1))/0x6*(parseInt(_0x22ce35(0x1be))/0x7)+parseInt(_0x22ce35(0x1e8))/0x8+parseInt(_0x22ce35(0x1c1))/0x9+-parseInt(_0x22ce35(0x1f2))/0xa*(parseInt(_0x22ce35(0x1f0))/0xb);if(_0x18a1ae===_0x4d9a5a)break;else _0x478349['push'](_0x478349['shift']());}catch(_0x3870bd){_0x478349['push'](_0x478349['shift']());}}}(a49_0x5a7a,0x4482c));import a49_0x30d639 from'winston';import a49_0x7cb3ad from'node:fs';import a49_0x3f895f from'node:path';function a49_0x2bd6(_0x2c9955,_0x4736c9){const _0x5a7a21=a49_0x5a7a();return a49_0x2bd6=function(_0x2bd6a3,_0xe65b14){_0x2bd6a3=_0x2bd6a3-0x1bb;let _0x2a4c26=_0x5a7a21[_0x2bd6a3];return _0x2a4c26;},a49_0x2bd6(_0x2c9955,_0x4736c9);}function a49_0x5a7a(){const _0xf7dfda=['19935MHIdbQ','initWinstonLogger','268lwTAqD','yellow','message','24420qEuveF','errors','rawCommand','green','readLogs','combine','setRawCommand','.lovrabet.log','stringify','timestamp','setLogPath','format','existsSync','getWinstonInstance','filter','log','utf8','error','156663AwerUr','split','2NyXkxW','currentRawCommand','unknown','1050704PsUIyv','readFileSync','logFilePath','addColors','map','完成:\x20','duration','File','344311RsKmLV','失败:\x20','80gqoJPq','winstonLogger','warn','info','Failed\x20to\x20read\x20logs:','504nLajji','level','now','1807317zYfoqL','transports','parse','clearLogs','writeFileSync','createLogger','trim','printf','1144353kdiKdg','red','success'];a49_0x5a7a=function(){return _0xf7dfda;};return a49_0x5a7a();}class Logger{[a49_0x111bdd(0x1f3)];[a49_0x111bdd(0x1ea)];[a49_0x111bdd(0x1e6)]='';constructor(){const _0x541e2f=a49_0x111bdd;this[_0x541e2f(0x1ea)]='';}[a49_0x111bdd(0x1d7)](_0x343b9b){this['currentRawCommand']=_0x343b9b;}[a49_0x111bdd(0x1cd)](){const _0x14892f=a49_0x111bdd,_0x588436=a49_0x3f895f['dirname'](this[_0x14892f(0x1ea)]);!a49_0x7cb3ad[_0x14892f(0x1dd)](_0x588436)&&a49_0x7cb3ad['mkdirSync'](_0x588436,{'recursive':!![]});const _0x4732ea=a49_0x30d639[_0x14892f(0x1dc)][_0x14892f(0x1d6)](a49_0x30d639[_0x14892f(0x1dc)][_0x14892f(0x1da)](),a49_0x30d639['format'][_0x14892f(0x1d2)]({'stack':!![]}),a49_0x30d639['format'][_0x14892f(0x1c8)](_0x44c615=>{const _0x20d4c1=_0x14892f,_0x4ffb6f={'timestamp':_0x44c615[_0x20d4c1(0x1da)]||new Date()['toISOString'](),'level':_0x44c615[_0x20d4c1(0x1bf)]||'info','command':_0x44c615['command']||_0x20d4c1(0x1e7),'rawCommand':_0x44c615[_0x20d4c1(0x1d3)]||this[_0x20d4c1(0x1e6)]||undefined,'message':_0x44c615['message']||'','duration':_0x44c615[_0x20d4c1(0x1ee)]||undefined,'details':_0x44c615['details']||undefined};return JSON[_0x20d4c1(0x1d9)](_0x4ffb6f);}));this[_0x14892f(0x1f3)]=a49_0x30d639[_0x14892f(0x1c6)]({'level':_0x14892f(0x1bc),'format':_0x4732ea,'transports':[new a49_0x30d639[(_0x14892f(0x1c2))][(_0x14892f(0x1ef))]({'filename':this[_0x14892f(0x1ea)],'level':_0x14892f(0x1bc)})],'silent':![]}),a49_0x30d639[_0x14892f(0x1eb)]({'success':_0x14892f(0x1d4),'error':_0x14892f(0x1ca),'warn':_0x14892f(0x1cf),'info':'blue'});}[a49_0x111bdd(0x1db)](_0x59467f){const _0x5983de=a49_0x111bdd;this[_0x5983de(0x1ea)]=a49_0x3f895f['join'](_0x59467f,_0x5983de(0x1d8)),this[_0x5983de(0x1f3)]&&this[_0x5983de(0x1f3)]['clear'](),this[_0x5983de(0x1cd)]();}[a49_0x111bdd(0x1bc)](_0x7d5f39,_0x15a3eb,_0x1cb60a){const _0x2b4318=a49_0x111bdd;if(!this['logFilePath']||!this[_0x2b4318(0x1f3)])return;this[_0x2b4318(0x1f3)]['info'](_0x15a3eb,{'command':_0x7d5f39,'details':_0x1cb60a});}[a49_0x111bdd(0x1cb)](_0x58e47f,_0x598661,_0x5eedc4,_0x44bf02){const _0x553444=a49_0x111bdd;if(!this[_0x553444(0x1ea)]||!this['winstonLogger'])return;this[_0x553444(0x1f3)][_0x553444(0x1e0)](_0x553444(0x1bc),_0x598661,{'level':_0x553444(0x1cb),'command':_0x58e47f,'duration':_0x5eedc4,'details':_0x44bf02});}['error'](_0x42cbf4,_0x136081,_0x26c3ba){const _0x1d4dcd=a49_0x111bdd;if(!this[_0x1d4dcd(0x1ea)]||!this[_0x1d4dcd(0x1f3)])return;this[_0x1d4dcd(0x1f3)][_0x1d4dcd(0x1e2)](_0x136081,{'command':_0x42cbf4,'details':_0x26c3ba});}[a49_0x111bdd(0x1bb)](_0x1f9a2f,_0x28e851,_0x19afdc){const _0x2c844c=a49_0x111bdd;if(!this['logFilePath']||!this[_0x2c844c(0x1f3)])return;this[_0x2c844c(0x1f3)][_0x2c844c(0x1bb)](_0x28e851,{'command':_0x1f9a2f,'details':_0x19afdc});}async['logTask'](_0x34fc60,_0x5241e3,_0x4826af){const _0x4941e8=a49_0x111bdd,_0xceb8fe=Date['now']();this['info'](_0x34fc60,'开始执行:\x20'+_0x5241e3);try{const _0x4e4d0d=await _0x4826af(),_0x35d829=Date['now']()-_0xceb8fe;return this[_0x4941e8(0x1cb)](_0x34fc60,_0x4941e8(0x1ed)+_0x5241e3,_0x35d829),_0x4e4d0d;}catch(_0x32e4e6){const _0x35d13d=Date[_0x4941e8(0x1c0)]()-_0xceb8fe;this[_0x4941e8(0x1e2)](_0x34fc60,_0x4941e8(0x1f1)+_0x5241e3,{'error':_0x32e4e6 instanceof Error?_0x32e4e6[_0x4941e8(0x1d0)]:String(_0x32e4e6),'duration':_0x35d13d});throw _0x32e4e6;}}[a49_0x111bdd(0x1d5)](){const _0x5ddc27=a49_0x111bdd;try{if(!a49_0x7cb3ad['existsSync'](this['logFilePath']))return[];const _0x53cb5c=a49_0x7cb3ad[_0x5ddc27(0x1e9)](this[_0x5ddc27(0x1ea)],'utf8');return _0x53cb5c[_0x5ddc27(0x1e4)]('\x0a')[_0x5ddc27(0x1df)](_0x13a4cf=>_0x13a4cf[_0x5ddc27(0x1c7)]())[_0x5ddc27(0x1ec)](_0x5f0e9b=>JSON[_0x5ddc27(0x1c3)](_0x5f0e9b));}catch(_0x587b6c){return console[_0x5ddc27(0x1bb)](_0x5ddc27(0x1bd),_0x587b6c),[];}}[a49_0x111bdd(0x1c4)](){const _0x33cd3c=a49_0x111bdd;try{a49_0x7cb3ad[_0x33cd3c(0x1dd)](this[_0x33cd3c(0x1ea)])&&a49_0x7cb3ad[_0x33cd3c(0x1c5)](this[_0x33cd3c(0x1ea)],'',_0x33cd3c(0x1e1));}catch(_0x1682e2){console[_0x33cd3c(0x1bb)]('Failed\x20to\x20clear\x20logs:',_0x1682e2);}}[a49_0x111bdd(0x1de)](){const _0xd7d403=a49_0x111bdd;return this[_0xd7d403(0x1f3)];}}export const logger=new Logger();
1
+ function a49_0x4ba6(_0x15e296,_0x11889f){const _0x13f8ab=a49_0x13f8();return a49_0x4ba6=function(_0x4ba642,_0x546408){_0x4ba642=_0x4ba642-0x1b0;let _0x5b471b=_0x13f8ab[_0x4ba642];return _0x5b471b;},a49_0x4ba6(_0x15e296,_0x11889f);}const a49_0xed6b86=a49_0x4ba6;(function(_0x386555,_0x4af9ff){const _0x3cfe04=a49_0x4ba6,_0x337f76=_0x386555();while(!![]){try{const _0x3f9ea1=parseInt(_0x3cfe04(0x1c1))/0x1+parseInt(_0x3cfe04(0x1d9))/0x2*(-parseInt(_0x3cfe04(0x1c6))/0x3)+-parseInt(_0x3cfe04(0x1b8))/0x4*(-parseInt(_0x3cfe04(0x1d3))/0x5)+parseInt(_0x3cfe04(0x1b1))/0x6+-parseInt(_0x3cfe04(0x1c7))/0x7+parseInt(_0x3cfe04(0x1b4))/0x8+parseInt(_0x3cfe04(0x1e3))/0x9*(-parseInt(_0x3cfe04(0x1d0))/0xa);if(_0x3f9ea1===_0x4af9ff)break;else _0x337f76['push'](_0x337f76['shift']());}catch(_0x1c0555){_0x337f76['push'](_0x337f76['shift']());}}}(a49_0x13f8,0x32a1b));function a49_0x13f8(){const _0x50d548=['636237YFxfWJ','parse','rawCommand','blue','stringify','Failed\x20to\x20clear\x20logs:','errors','File','完成:\x20','10sPgCFY','utf8','duration','50JUVAKN','log','开始执行:\x20','winstonLogger','mkdirSync','trim','33954TmWKvT','.lovrabet.log','now','error','initWinstonLogger','writeFileSync','addColors','warn','currentRawCommand','logFilePath','4475043anGeWn','printf','map','yellow','transports','format','filter','message','232584dlOoJI','green','readFileSync','255696LfEAeh','timestamp','失败:\x20','dirname','160496YmNVNd','clear','join','combine','toISOString','existsSync','success','details','unknown','340516VIsJgT','info','readLogs','clearLogs','red','3YhgHQi'];a49_0x13f8=function(){return _0x50d548;};return a49_0x13f8();}import a49_0x31f568 from'winston';import a49_0xd990a from'node:fs';import a49_0x208d6b from'node:path';class Logger{[a49_0xed6b86(0x1d6)];[a49_0xed6b86(0x1e2)];[a49_0xed6b86(0x1e1)]='';constructor(){const _0x4c2e03=a49_0xed6b86;this[_0x4c2e03(0x1e2)]='';}['setRawCommand'](_0x53aa0a){const _0x1e0a53=a49_0xed6b86;this[_0x1e0a53(0x1e1)]=_0x53aa0a;}[a49_0xed6b86(0x1dd)](){const _0x33e304=a49_0xed6b86,_0x44ac0f=a49_0x208d6b[_0x33e304(0x1b7)](this[_0x33e304(0x1e2)]);!a49_0xd990a[_0x33e304(0x1bd)](_0x44ac0f)&&a49_0xd990a[_0x33e304(0x1d7)](_0x44ac0f,{'recursive':!![]});const _0x33aace=a49_0x31f568[_0x33e304(0x1e8)][_0x33e304(0x1bb)](a49_0x31f568['format'][_0x33e304(0x1b5)](),a49_0x31f568[_0x33e304(0x1e8)][_0x33e304(0x1cd)]({'stack':!![]}),a49_0x31f568[_0x33e304(0x1e8)][_0x33e304(0x1e4)](_0x3fcd2d=>{const _0x1b9d9b=_0x33e304,_0x34683d={'timestamp':_0x3fcd2d[_0x1b9d9b(0x1b5)]||new Date()[_0x1b9d9b(0x1bc)](),'level':_0x3fcd2d['level']||_0x1b9d9b(0x1c2),'command':_0x3fcd2d['command']||_0x1b9d9b(0x1c0),'rawCommand':_0x3fcd2d[_0x1b9d9b(0x1c9)]||this[_0x1b9d9b(0x1e1)]||undefined,'message':_0x3fcd2d[_0x1b9d9b(0x1b0)]||'','duration':_0x3fcd2d[_0x1b9d9b(0x1d2)]||undefined,'details':_0x3fcd2d[_0x1b9d9b(0x1bf)]||undefined};return JSON[_0x1b9d9b(0x1cb)](_0x34683d);}));this[_0x33e304(0x1d6)]=a49_0x31f568['createLogger']({'level':_0x33e304(0x1c2),'format':_0x33aace,'transports':[new a49_0x31f568[(_0x33e304(0x1e7))][(_0x33e304(0x1ce))]({'filename':this[_0x33e304(0x1e2)],'level':_0x33e304(0x1c2)})],'silent':![]}),a49_0x31f568[_0x33e304(0x1df)]({'success':_0x33e304(0x1b2),'error':_0x33e304(0x1c5),'warn':_0x33e304(0x1e6),'info':_0x33e304(0x1ca)});}['setLogPath'](_0xf2d781){const _0x4a482d=a49_0xed6b86;this[_0x4a482d(0x1e2)]=a49_0x208d6b[_0x4a482d(0x1ba)](_0xf2d781,_0x4a482d(0x1da)),this[_0x4a482d(0x1d6)]&&this['winstonLogger'][_0x4a482d(0x1b9)](),this[_0x4a482d(0x1dd)]();}[a49_0xed6b86(0x1c2)](_0x58783b,_0x148ebd,_0x5f34fb){const _0x14d611=a49_0xed6b86;if(!this[_0x14d611(0x1e2)]||!this['winstonLogger'])return;this[_0x14d611(0x1d6)]['info'](_0x148ebd,{'command':_0x58783b,'details':_0x5f34fb});}['success'](_0x38cd2d,_0x402180,_0x42f2eb,_0x21d52e){const _0x170778=a49_0xed6b86;if(!this[_0x170778(0x1e2)]||!this[_0x170778(0x1d6)])return;this[_0x170778(0x1d6)][_0x170778(0x1d4)](_0x170778(0x1c2),_0x402180,{'level':_0x170778(0x1be),'command':_0x38cd2d,'duration':_0x42f2eb,'details':_0x21d52e});}[a49_0xed6b86(0x1dc)](_0x154f45,_0x2e49cc,_0x51eab2){const _0x4ffcfd=a49_0xed6b86;if(!this[_0x4ffcfd(0x1e2)]||!this['winstonLogger'])return;this[_0x4ffcfd(0x1d6)]['error'](_0x2e49cc,{'command':_0x154f45,'details':_0x51eab2});}[a49_0xed6b86(0x1e0)](_0x4a7d2c,_0x4a7830,_0xaa28af){const _0x4ceb45=a49_0xed6b86;if(!this['logFilePath']||!this[_0x4ceb45(0x1d6)])return;this[_0x4ceb45(0x1d6)][_0x4ceb45(0x1e0)](_0x4a7830,{'command':_0x4a7d2c,'details':_0xaa28af});}async['logTask'](_0xd64a59,_0x15d135,_0x547d4f){const _0x2d30f3=a49_0xed6b86,_0x42a81e=Date[_0x2d30f3(0x1db)]();this['info'](_0xd64a59,_0x2d30f3(0x1d5)+_0x15d135);try{const _0x2b26a9=await _0x547d4f(),_0x1fdad3=Date[_0x2d30f3(0x1db)]()-_0x42a81e;return this[_0x2d30f3(0x1be)](_0xd64a59,_0x2d30f3(0x1cf)+_0x15d135,_0x1fdad3),_0x2b26a9;}catch(_0x55bb91){const _0x32ebb1=Date[_0x2d30f3(0x1db)]()-_0x42a81e;this[_0x2d30f3(0x1dc)](_0xd64a59,_0x2d30f3(0x1b6)+_0x15d135,{'error':_0x55bb91 instanceof Error?_0x55bb91[_0x2d30f3(0x1b0)]:String(_0x55bb91),'duration':_0x32ebb1});throw _0x55bb91;}}[a49_0xed6b86(0x1c3)](){const _0x8a4cd9=a49_0xed6b86;try{if(!a49_0xd990a['existsSync'](this[_0x8a4cd9(0x1e2)]))return[];const _0x4963e9=a49_0xd990a[_0x8a4cd9(0x1b3)](this['logFilePath'],_0x8a4cd9(0x1d1));return _0x4963e9['split']('\x0a')[_0x8a4cd9(0x1e9)](_0x5d6b52=>_0x5d6b52[_0x8a4cd9(0x1d8)]())[_0x8a4cd9(0x1e5)](_0x38ffce=>JSON[_0x8a4cd9(0x1c8)](_0x38ffce));}catch(_0x41339b){return console[_0x8a4cd9(0x1e0)]('Failed\x20to\x20read\x20logs:',_0x41339b),[];}}[a49_0xed6b86(0x1c4)](){const _0x46148f=a49_0xed6b86;try{a49_0xd990a[_0x46148f(0x1bd)](this[_0x46148f(0x1e2)])&&a49_0xd990a[_0x46148f(0x1de)](this[_0x46148f(0x1e2)],'',_0x46148f(0x1d1));}catch(_0x3d77dd){console[_0x46148f(0x1e0)](_0x46148f(0x1cc),_0x3d77dd);}}['getWinstonInstance'](){const _0x44f2cd=a49_0xed6b86;return this[_0x44f2cd(0x1d6)];}}export const logger=new Logger();
@@ -1 +1 @@
1
- const a50_0x2c749d=a50_0x38c4;(function(_0x17cd4c,_0x226f86){const _0x4ff812=a50_0x38c4,_0x5935c8=_0x17cd4c();while(!![]){try{const _0x2a92f6=-parseInt(_0x4ff812(0x1a1))/0x1+-parseInt(_0x4ff812(0x1a9))/0x2*(-parseInt(_0x4ff812(0x1b1))/0x3)+parseInt(_0x4ff812(0x18f))/0x4+-parseInt(_0x4ff812(0x1a7))/0x5*(parseInt(_0x4ff812(0x195))/0x6)+-parseInt(_0x4ff812(0x1b0))/0x7*(-parseInt(_0x4ff812(0x18c))/0x8)+-parseInt(_0x4ff812(0x198))/0x9+-parseInt(_0x4ff812(0x1ae))/0xa;if(_0x2a92f6===_0x226f86)break;else _0x5935c8['push'](_0x5935c8['shift']());}catch(_0x42d24a){_0x5935c8['push'](_0x5935c8['shift']());}}}(a50_0x28ec,0x79cb6));import a50_0x288fc1 from'node:fs';function a50_0x38c4(_0x3f2104,_0x5caad6){const _0x28ec4d=a50_0x28ec();return a50_0x38c4=function(_0x38c4f1,_0x72b4af){_0x38c4f1=_0x38c4f1-0x188;let _0x533c16=_0x28ec4d[_0x38c4f1];return _0x533c16;},a50_0x38c4(_0x3f2104,_0x5caad6);}import a50_0x12c51e from'node:path';import{logger}from'./logger.js';function a50_0x28ec(){const _0x440072=['includes','656218ihoESY','\x20\x20\x20\x20\x20\x20\x20\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20path:\x20\x22','路由配置更新失败','import\x20','utf8','success','20InryAB','未找到路由配置的\x20children\x20数组','6ajYYDp','index','toLowerCase','info','toComponentName','674780bhikef','length','99659wLRUZA','377703DmEnJp','split','lastIndexOf','路由配置更新完成','src','join','slice','readFile','now','routerFilePath','496mDsPRD','existsSync','error','3613100qzGxKc','writeFile','match','\x22,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20element:\x20<','开始更新路由配置','路由文件不存在:\x20','1062108ssTVMZ','indexOf','\x20/>,\x0a\x20\x20\x20\x20\x20\x20\x20\x20},','2097306OcpayN','addPageRoute','message','addImport','promises','charAt','addRoute','router'];a50_0x28ec=function(){return _0x440072;};return a50_0x28ec();}export class RouterUpdater{[a50_0x2c749d(0x18b)];constructor(_0x36d190){const _0x39d11f=a50_0x2c749d;this[_0x39d11f(0x18b)]=a50_0x12c51e[_0x39d11f(0x1b6)](_0x36d190,_0x39d11f(0x1b5),_0x39d11f(0x19f),'index.tsx');}async[a50_0x2c749d(0x199)](_0x454f5b,_0x227bce){const _0x5b6041=a50_0x2c749d;if(!a50_0x288fc1[_0x5b6041(0x18d)](this[_0x5b6041(0x18b)]))throw new Error(_0x5b6041(0x194)+this[_0x5b6041(0x18b)]);const _0x1d452f=Date[_0x5b6041(0x18a)]();logger[_0x5b6041(0x1ac)]('router',_0x5b6041(0x193),{'pageName':_0x454f5b,'routePath':_0x227bce,'file':this['routerFilePath']});try{const _0x3a3295=await a50_0x288fc1[_0x5b6041(0x19c)][_0x5b6041(0x189)](this[_0x5b6041(0x18b)],_0x5b6041(0x1a5)),_0x2fcfd6=this[_0x5b6041(0x1ad)](_0x454f5b),_0xb90851=this['addImport'](_0x3a3295,_0x2fcfd6,_0x454f5b),_0x42d0bd=this['addRoute'](_0xb90851,_0x227bce,_0x2fcfd6);await a50_0x288fc1[_0x5b6041(0x19c)][_0x5b6041(0x190)](this['routerFilePath'],_0x42d0bd,_0x5b6041(0x1a5));const _0x1f081d=Date['now']()-_0x1d452f;logger[_0x5b6041(0x1a6)](_0x5b6041(0x19f),_0x5b6041(0x1b4),_0x1f081d,{'pageName':_0x454f5b,'routePath':_0x227bce,'componentName':_0x2fcfd6});}catch(_0x544ca7){const _0x144540=Date[_0x5b6041(0x18a)]()-_0x1d452f;logger[_0x5b6041(0x18e)](_0x5b6041(0x19f),_0x5b6041(0x1a3),{'pageName':_0x454f5b,'routePath':_0x227bce,'error':_0x544ca7 instanceof Error?_0x544ca7[_0x5b6041(0x19a)]:String(_0x544ca7),'duration':_0x144540});throw _0x544ca7;}}['toComponentName'](_0xca4c00){const _0x6026c4=a50_0x2c749d;return _0xca4c00[_0x6026c4(0x1b2)]('-')['map'](_0x38bae9=>_0x38bae9[_0x6026c4(0x19d)](0x0)['toUpperCase']()+_0x38bae9[_0x6026c4(0x188)](0x1)[_0x6026c4(0x1ab)]())[_0x6026c4(0x1b6)]('');}[a50_0x2c749d(0x19b)](_0x4e91b1,_0x388316,_0x4980c9){const _0x508f03=a50_0x2c749d,_0x257723=/import\s+\w+\s+from\s+["']\.\.\/pages\/\w+["'];?\n/g,_0x4fe400=_0x4e91b1['match'](_0x257723)||[],_0x2cae85=_0x508f03(0x1a4)+_0x388316+'\x20from\x20\x22../pages/'+_0x4980c9+'\x22;';if(_0x4e91b1[_0x508f03(0x1a0)](_0x2cae85))return _0x4e91b1;if(_0x4fe400[_0x508f03(0x1af)]>0x0){const _0x42c8d4=_0x4fe400[_0x4fe400[_0x508f03(0x1af)]-0x1];if(_0x42c8d4){const _0x15c8c1=_0x4e91b1[_0x508f03(0x1b3)](_0x42c8d4),_0x24fd30=_0x15c8c1+_0x42c8d4[_0x508f03(0x1af)];return _0x4e91b1['slice'](0x0,_0x24fd30)+_0x2cae85+'\x0a'+_0x4e91b1[_0x508f03(0x188)](_0x24fd30);}}const _0x6574c4=_0x4e91b1[_0x508f03(0x191)](/import\s+\w+\s+from\s+["']\.\.\/layouts\/\w+["'];?\n/);if(_0x6574c4&&_0x6574c4[_0x508f03(0x1aa)]!==undefined){const _0x21338e=_0x6574c4[_0x508f03(0x1aa)]+_0x6574c4[0x0]['length'];return _0x4e91b1[_0x508f03(0x188)](0x0,_0x21338e)+_0x2cae85+'\x0a'+_0x4e91b1['slice'](_0x21338e);}return _0x4e91b1;}[a50_0x2c749d(0x19e)](_0x591262,_0x51ce6a,_0x27e818){const _0x53f290=a50_0x2c749d,_0x56bed7=_0x53f290(0x1a2)+_0x51ce6a+_0x53f290(0x192)+_0x27e818+_0x53f290(0x197);if(_0x591262[_0x53f290(0x1a0)]('path:\x20\x22'+_0x51ce6a+'\x22'))return _0x591262;const _0x3608ab=/children:\s*\[([\s\S]*?)\]/,_0x2458d9=_0x591262['match'](_0x3608ab);if(!_0x2458d9||_0x2458d9[_0x53f290(0x1aa)]===undefined)throw new Error(_0x53f290(0x1a8));const _0x5266f0=_0x2458d9[0x1],_0x456957=_0x2458d9[_0x53f290(0x1aa)]+_0x2458d9[0x0][_0x53f290(0x196)]('[')+0x1,_0x2c0e95=_0x5266f0?.[_0x53f290(0x191)](/\{[\s\S]*?\},/g)||[];if(_0x2c0e95['length']>0x0){const _0x36b73e=_0x2c0e95[_0x2c0e95[_0x53f290(0x1af)]-0x1];if(_0x36b73e){const _0x2deb5a=_0x591262[_0x53f290(0x1b3)](_0x36b73e),_0x59d5a4=_0x2deb5a+_0x36b73e[_0x53f290(0x1af)];return _0x591262[_0x53f290(0x188)](0x0,_0x59d5a4)+'\x0a'+_0x56bed7+_0x591262[_0x53f290(0x188)](_0x59d5a4);}}return _0x591262['slice'](0x0,_0x456957)+'\x0a'+_0x56bed7+_0x591262['slice'](_0x456957);}async['previewChanges'](_0x2cd688,_0x4b1071){const _0x491aa7=a50_0x2c749d;if(!a50_0x288fc1[_0x491aa7(0x18d)](this['routerFilePath']))throw new Error('路由文件不存在:\x20'+this[_0x491aa7(0x18b)]);const _0xfd16cf=await a50_0x288fc1[_0x491aa7(0x19c)][_0x491aa7(0x189)](this[_0x491aa7(0x18b)],_0x491aa7(0x1a5)),_0x1d4742=this['toComponentName'](_0x2cd688);let _0x59b6ea=this['addImport'](_0xfd16cf,_0x1d4742,_0x2cd688);return _0x59b6ea=this[_0x491aa7(0x19e)](_0x59b6ea,_0x4b1071,_0x1d4742),_0x59b6ea;}}
1
+ const a50_0xc3f308=a50_0xe5b3;(function(_0x38a9af,_0xc2f4b8){const _0x24425c=a50_0xe5b3,_0x132596=_0x38a9af();while(!![]){try{const _0x4cce54=parseInt(_0x24425c(0xc5))/0x1*(parseInt(_0x24425c(0xdc))/0x2)+-parseInt(_0x24425c(0xc7))/0x3*(parseInt(_0x24425c(0xc1))/0x4)+parseInt(_0x24425c(0xcd))/0x5*(parseInt(_0x24425c(0xb7))/0x6)+parseInt(_0x24425c(0xd7))/0x7*(parseInt(_0x24425c(0xe6))/0x8)+-parseInt(_0x24425c(0xe1))/0x9*(parseInt(_0x24425c(0xc2))/0xa)+-parseInt(_0x24425c(0xe7))/0xb*(-parseInt(_0x24425c(0xdb))/0xc)+-parseInt(_0x24425c(0xba))/0xd;if(_0x4cce54===_0xc2f4b8)break;else _0x132596['push'](_0x132596['shift']());}catch(_0x3a2cb2){_0x132596['push'](_0x132596['shift']());}}}(a50_0x277e,0x62c49));import a50_0x12e34d from'node:fs';function a50_0x277e(){const _0x1fe9f9=['map','lastIndexOf','now','router','276gVxaJZ','\x20/>,\x0a\x20\x20\x20\x20\x20\x20\x20\x20},','路由配置更新失败','6650956TnWslY','routerFilePath','toComponentName','existsSync','\x22,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20element:\x20<','charAt','match','17032SvCERT','1284380PPsNEQ','path:\x20\x22','index','46741sCyQgT','previewChanges','342GtBmeX','开始更新路由配置','length','路由文件不存在:\x20','addRoute','join','13365AIeDYO','slice','\x20\x20\x20\x20\x20\x20\x20\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20path:\x20\x22','路由配置更新完成','message','split','toLowerCase','未找到路由配置的\x20children\x20数组','src','utf8','77lZOOkH','import\x20','\x20from\x20\x22../pages/','promises','3999780yAWmEV','28CQOerA','info','addImport','success','index.tsx','9ukSwBR','includes','error','toUpperCase','readFile','62584MwtDTn','22tZRzls'];a50_0x277e=function(){return _0x1fe9f9;};return a50_0x277e();}function a50_0xe5b3(_0xc58625,_0x183620){const _0x277e99=a50_0x277e();return a50_0xe5b3=function(_0xe5b37c,_0x1abdb1){_0xe5b37c=_0xe5b37c-0xb7;let _0x1331cb=_0x277e99[_0xe5b37c];return _0x1331cb;},a50_0xe5b3(_0xc58625,_0x183620);}import a50_0x58688d from'node:path';import{logger}from'./logger.js';export class RouterUpdater{[a50_0xc3f308(0xbb)];constructor(_0x313d41){const _0x105f2d=a50_0xc3f308;this['routerFilePath']=a50_0x58688d[_0x105f2d(0xcc)](_0x313d41,_0x105f2d(0xd5),_0x105f2d(0xeb),_0x105f2d(0xe0));}async['addPageRoute'](_0x2544d4,_0x4de597){const _0x765b2b=a50_0xc3f308;if(!a50_0x12e34d[_0x765b2b(0xbd)](this[_0x765b2b(0xbb)]))throw new Error(_0x765b2b(0xca)+this[_0x765b2b(0xbb)]);const _0x15c190=Date[_0x765b2b(0xea)]();logger[_0x765b2b(0xdd)](_0x765b2b(0xeb),_0x765b2b(0xc8),{'pageName':_0x2544d4,'routePath':_0x4de597,'file':this['routerFilePath']});try{const _0x38074e=await a50_0x12e34d[_0x765b2b(0xda)]['readFile'](this[_0x765b2b(0xbb)],_0x765b2b(0xd6)),_0x311418=this[_0x765b2b(0xbc)](_0x2544d4),_0x38be56=this[_0x765b2b(0xde)](_0x38074e,_0x311418,_0x2544d4),_0x36e346=this['addRoute'](_0x38be56,_0x4de597,_0x311418);await a50_0x12e34d[_0x765b2b(0xda)]['writeFile'](this[_0x765b2b(0xbb)],_0x36e346,_0x765b2b(0xd6));const _0x1c3b73=Date['now']()-_0x15c190;logger[_0x765b2b(0xdf)](_0x765b2b(0xeb),_0x765b2b(0xd0),_0x1c3b73,{'pageName':_0x2544d4,'routePath':_0x4de597,'componentName':_0x311418});}catch(_0x5307fa){const _0x1e97bf=Date[_0x765b2b(0xea)]()-_0x15c190;logger[_0x765b2b(0xe3)](_0x765b2b(0xeb),_0x765b2b(0xb9),{'pageName':_0x2544d4,'routePath':_0x4de597,'error':_0x5307fa instanceof Error?_0x5307fa[_0x765b2b(0xd1)]:String(_0x5307fa),'duration':_0x1e97bf});throw _0x5307fa;}}[a50_0xc3f308(0xbc)](_0x213a57){const _0x2b4776=a50_0xc3f308;return _0x213a57[_0x2b4776(0xd2)]('-')[_0x2b4776(0xe8)](_0x37bcaa=>_0x37bcaa[_0x2b4776(0xbf)](0x0)[_0x2b4776(0xe4)]()+_0x37bcaa['slice'](0x1)[_0x2b4776(0xd3)]())[_0x2b4776(0xcc)]('');}[a50_0xc3f308(0xde)](_0x549ca0,_0x46cc81,_0x195757){const _0x3b4c1a=a50_0xc3f308,_0x4807b2=/import\s+\w+\s+from\s+["']\.\.\/pages\/\w+["'];?\n/g,_0xe8fd68=_0x549ca0[_0x3b4c1a(0xc0)](_0x4807b2)||[],_0x3e4e52=_0x3b4c1a(0xd8)+_0x46cc81+_0x3b4c1a(0xd9)+_0x195757+'\x22;';if(_0x549ca0[_0x3b4c1a(0xe2)](_0x3e4e52))return _0x549ca0;if(_0xe8fd68[_0x3b4c1a(0xc9)]>0x0){const _0x1d7ee4=_0xe8fd68[_0xe8fd68[_0x3b4c1a(0xc9)]-0x1];if(_0x1d7ee4){const _0x4d4960=_0x549ca0['lastIndexOf'](_0x1d7ee4),_0x501ac3=_0x4d4960+_0x1d7ee4[_0x3b4c1a(0xc9)];return _0x549ca0[_0x3b4c1a(0xce)](0x0,_0x501ac3)+_0x3e4e52+'\x0a'+_0x549ca0[_0x3b4c1a(0xce)](_0x501ac3);}}const _0x4fca24=_0x549ca0[_0x3b4c1a(0xc0)](/import\s+\w+\s+from\s+["']\.\.\/layouts\/\w+["'];?\n/);if(_0x4fca24&&_0x4fca24['index']!==undefined){const _0x47f562=_0x4fca24[_0x3b4c1a(0xc4)]+_0x4fca24[0x0][_0x3b4c1a(0xc9)];return _0x549ca0[_0x3b4c1a(0xce)](0x0,_0x47f562)+_0x3e4e52+'\x0a'+_0x549ca0['slice'](_0x47f562);}return _0x549ca0;}[a50_0xc3f308(0xcb)](_0x2b6ee5,_0x3af021,_0x4f356c){const _0x478427=a50_0xc3f308,_0x1d1d7d=_0x478427(0xcf)+_0x3af021+_0x478427(0xbe)+_0x4f356c+_0x478427(0xb8);if(_0x2b6ee5[_0x478427(0xe2)](_0x478427(0xc3)+_0x3af021+'\x22'))return _0x2b6ee5;const _0x562f95=/children:\s*\[([\s\S]*?)\]/,_0x1aa463=_0x2b6ee5['match'](_0x562f95);if(!_0x1aa463||_0x1aa463[_0x478427(0xc4)]===undefined)throw new Error(_0x478427(0xd4));const _0x54b80e=_0x1aa463[0x1],_0x30f032=_0x1aa463[_0x478427(0xc4)]+_0x1aa463[0x0]['indexOf']('[')+0x1,_0x40cb9=_0x54b80e?.['match'](/\{[\s\S]*?\},/g)||[];if(_0x40cb9['length']>0x0){const _0x3d2137=_0x40cb9[_0x40cb9['length']-0x1];if(_0x3d2137){const _0x103260=_0x2b6ee5[_0x478427(0xe9)](_0x3d2137),_0x41c9d4=_0x103260+_0x3d2137[_0x478427(0xc9)];return _0x2b6ee5[_0x478427(0xce)](0x0,_0x41c9d4)+'\x0a'+_0x1d1d7d+_0x2b6ee5[_0x478427(0xce)](_0x41c9d4);}}return _0x2b6ee5['slice'](0x0,_0x30f032)+'\x0a'+_0x1d1d7d+_0x2b6ee5[_0x478427(0xce)](_0x30f032);}async[a50_0xc3f308(0xc6)](_0x3d7c5d,_0x5915ba){const _0x5b0ff7=a50_0xc3f308;if(!a50_0x12e34d[_0x5b0ff7(0xbd)](this[_0x5b0ff7(0xbb)]))throw new Error(_0x5b0ff7(0xca)+this[_0x5b0ff7(0xbb)]);const _0x379763=await a50_0x12e34d[_0x5b0ff7(0xda)][_0x5b0ff7(0xe5)](this[_0x5b0ff7(0xbb)],'utf8'),_0x5b1045=this[_0x5b0ff7(0xbc)](_0x3d7c5d);let _0x54d019=this[_0x5b0ff7(0xde)](_0x379763,_0x5b1045,_0x3d7c5d);return _0x54d019=this['addRoute'](_0x54d019,_0x5915ba,_0x5b1045),_0x54d019;}}
@@ -1 +1 @@
1
- export function sleep(_0x2fe9fc){return new Promise(_0x28b749=>setTimeout(_0x28b749,_0x2fe9fc));}
1
+ export function sleep(_0x465765){return new Promise(_0x4c2ac4=>setTimeout(_0x4c2ac4,_0x465765));}
@@ -1 +1 @@
1
- const a52_0x5d75f4=a52_0x239a;(function(_0x2650f1,_0xc2fb2e){const _0x47b5b6=a52_0x239a,_0x48dbdf=_0x2650f1();while(!![]){try{const _0x26ad69=parseInt(_0x47b5b6(0xba))/0x1*(-parseInt(_0x47b5b6(0xb4))/0x2)+-parseInt(_0x47b5b6(0xa2))/0x3*(parseInt(_0x47b5b6(0xac))/0x4)+-parseInt(_0x47b5b6(0x84))/0x5*(parseInt(_0x47b5b6(0x85))/0x6)+parseInt(_0x47b5b6(0xb1))/0x7+parseInt(_0x47b5b6(0xa7))/0x8+-parseInt(_0x47b5b6(0x90))/0x9*(-parseInt(_0x47b5b6(0xa8))/0xa)+parseInt(_0x47b5b6(0xa6))/0xb;if(_0x26ad69===_0xc2fb2e)break;else _0x48dbdf['push'](_0x48dbdf['shift']());}catch(_0x2cc857){_0x48dbdf['push'](_0x48dbdf['shift']());}}}(a52_0x5966,0x7e65e));import a52_0x6ff76d from'node:fs';function a52_0x239a(_0x25b308,_0x1f51d5){const _0x59665c=a52_0x5966();return a52_0x239a=function(_0x239ab8,_0x2a8f9f){_0x239ab8=_0x239ab8-0x84;let _0x127a1a=_0x59665c[_0x239ab8];return _0x127a1a;},a52_0x239a(_0x25b308,_0x1f51d5);}import a52_0x4faec8 from'node:path';function a52_0x5966(){const _0xa71f8c=['copyFile','1042279NFvPwE','promises','template','1602rBCMJT','extname','toLocaleTimeString','toISOString','message','charAt','1229oJALRW','writeFile','info','default','error','replaceContent','25rWpFIF','663486jLsNIB','.css','mkdir','replace','模板内容替换失败','toLowerCase','readFile','toLocaleDateString','join','endsWith','now','36KqDJmN','.ts','includes','.md','isFile','processFile','api','map','numeric','toUpperCase','.json','toComponentName','utf8','toDisplayTitle','.jsx','name','slice','2-digit','1710102BsTkWA','toLocaleString','processDirectory','.tpl','12257311VUWjCh','5686720WeUwPM','1627640mTsWXc','.tsx','replaceApiContent','readdir','4iTxTWl','split','keys','pop'];a52_0x5966=function(){return _0xa71f8c;};return a52_0x5966();}import{logger}from'./logger.js';export class TemplateReplacer{static[a52_0x5d75f4(0x9b)](_0x5a82f1){const _0x5ba3b1=a52_0x5d75f4,_0x5f430d=_0x5a82f1['split']('/')['pop']()||_0x5a82f1;return _0x5f430d[_0x5ba3b1(0xad)]('-')['map'](_0x4e447b=>_0x4e447b[_0x5ba3b1(0xb9)](0x0)['toUpperCase']()+_0x4e447b[_0x5ba3b1(0xa0)](0x1)[_0x5ba3b1(0x8a)]())['join']('');}static['toDisplayTitle'](_0x1166fc){const _0x4e50ce=a52_0x5d75f4,_0x43ba02=_0x1166fc[_0x4e50ce(0xad)]('/')[_0x4e50ce(0xaf)]()||_0x1166fc;return _0x43ba02[_0x4e50ce(0xad)]('-')['map'](_0x389e01=>_0x389e01[_0x4e50ce(0xb9)](0x0)[_0x4e50ce(0x99)]()+_0x389e01['slice'](0x1)['toLowerCase']())[_0x4e50ce(0x8d)]('\x20');}static[a52_0x5d75f4(0xbf)](_0x390809,_0x2c201b,_0x535a5d){const _0x51df92=a52_0x5d75f4,_0x165aad=this['toComponentName'](_0x2c201b),_0x4cbe67=this[_0x51df92(0x9d)](_0x2c201b),_0x1f7977=new Date(),_0x259b8b=_0x1f7977[_0x51df92(0xa3)](undefined,{'year':_0x51df92(0x98),'month':_0x51df92(0xa1),'day':_0x51df92(0xa1),'hour':'2-digit','minute':_0x51df92(0xa1),'second':_0x51df92(0xa1),'hour12':![]})[_0x51df92(0x88)](/\//g,'-'),_0x27ccea=_0x1f7977[_0x51df92(0x8c)](undefined,{'year':_0x51df92(0x98),'month':_0x51df92(0xa1),'day':'2-digit'})[_0x51df92(0x88)](/\//g,'-'),_0x4885d9=_0x1f7977[_0x51df92(0xb6)](undefined,{'hour12':![]});let _0x3c76df=_0x390809[_0x51df92(0x88)](/\{ComponentName\}/g,_0x165aad)[_0x51df92(0x88)](/\{DisplayTitle\}/g,_0x4cbe67)[_0x51df92(0x88)](/\{PageName\}/g,_0x2c201b)[_0x51df92(0x88)](/\{TemplateName\}/g,_0x535a5d)[_0x51df92(0x88)](/\{CreatedAt\}/g,_0x259b8b)[_0x51df92(0x88)](/\{CreatedDate\}/g,_0x27ccea)[_0x51df92(0x88)](/\{CreatedTime\}/g,_0x4885d9);return _0x3c76df;}static[a52_0x5d75f4(0xaa)](_0x112aff,_0x41cb21,_0x58d6e1,_0x53677d,_0x5b4324,_0x50ac67,_0xe7d6ca){const _0x5c292a=a52_0x5d75f4,_0xc3b394=new Date(),_0x5a33f3=_0xc3b394[_0x5c292a(0xb7)](),_0x1929c5=JSON['stringify'](_0x58d6e1,null,0x2)[_0x5c292a(0xad)]('\x0a')[_0x5c292a(0xa0)](0x1,-0x1)[_0x5c292a(0x97)](_0x2a662b=>_0x2a662b[_0x5c292a(0x88)](/^ /,'\x20\x20\x20\x20'))[_0x5c292a(0x8d)]('\x0a'),_0x19f736=_0x53677d||Object[_0x5c292a(0xae)](_0x58d6e1)[0x0]||'YourModel';let _0x450988=_0x112aff[_0x5c292a(0x88)](/\{AppCode\}/g,_0x41cb21)['replace'](/\{ModelConfigs\}/g,_0x1929c5)[_0x5c292a(0x88)](/\{ExampleModelName\}/g,_0x19f736)[_0x5c292a(0x88)](/\{ApiFileName\}/g,_0x5b4324||_0x5c292a(0x96))[_0x5c292a(0x88)](/\{ConfigName\}/g,_0x50ac67||_0x5c292a(0xbd))[_0x5c292a(0x88)](/\{ClientConfigParam\}/g,_0xe7d6ca||'')['replace'](/\{CreatedAt\}/g,_0x5a33f3);return _0x450988;}static async['processTemplate'](_0x6a1f1b,_0x352940,_0x1d97a0,_0x4cd656,_0x318b15=!![]){const _0x23e8bb=a52_0x5d75f4,_0x184eac=Date[_0x23e8bb(0x8f)]();try{_0x318b15&&logger[_0x23e8bb(0xbc)](_0x23e8bb(0xb3),'开始处理模板内容替换',{'templatePath':_0x6a1f1b,'targetPath':_0x352940,'pageName':_0x1d97a0,'templateName':_0x4cd656});await a52_0x6ff76d[_0x23e8bb(0xb2)][_0x23e8bb(0x87)](_0x352940,{'recursive':!![]}),await this[_0x23e8bb(0xa4)](_0x6a1f1b,_0x352940,_0x1d97a0,_0x4cd656);if(_0x318b15){const _0xbedb45=Date[_0x23e8bb(0x8f)]()-_0x184eac;logger['success'](_0x23e8bb(0xb3),'模板内容替换完成',_0xbedb45,{'pageName':_0x1d97a0,'templateName':_0x4cd656});}}catch(_0xeebcb2){if(_0x318b15){const _0x55d5a8=Date['now']()-_0x184eac;logger[_0x23e8bb(0xbe)]('template',_0x23e8bb(0x89),{'templatePath':_0x6a1f1b,'targetPath':_0x352940,'pageName':_0x1d97a0,'templateName':_0x4cd656,'error':_0xeebcb2 instanceof Error?_0xeebcb2[_0x23e8bb(0xb8)]:String(_0xeebcb2),'duration':_0x55d5a8});}throw _0xeebcb2;}}static async[a52_0x5d75f4(0xa4)](_0xbe8e65,_0x2dd8ce,_0x13a810,_0x3d1d02){const _0x2e587b=a52_0x5d75f4,_0x56e0ef=await a52_0x6ff76d['promises'][_0x2e587b(0xab)](_0xbe8e65,{'withFileTypes':!![]});for(const _0x6eefb of _0x56e0ef){const _0x47b500=a52_0x4faec8['join'](_0xbe8e65,_0x6eefb[_0x2e587b(0x9f)]);let _0x3066f4=a52_0x4faec8[_0x2e587b(0x8d)](_0x2dd8ce,_0x6eefb[_0x2e587b(0x9f)]);_0x6eefb[_0x2e587b(0x9f)][_0x2e587b(0x8e)](_0x2e587b(0xa5))&&(_0x3066f4=a52_0x4faec8[_0x2e587b(0x8d)](_0x2dd8ce,_0x6eefb[_0x2e587b(0x9f)][_0x2e587b(0x88)](/\.tpl$/,'')));if(_0x6eefb['isDirectory']())await a52_0x6ff76d[_0x2e587b(0xb2)][_0x2e587b(0x87)](_0x3066f4,{'recursive':!![]}),await this[_0x2e587b(0xa4)](_0x47b500,_0x3066f4,_0x13a810,_0x3d1d02);else _0x6eefb[_0x2e587b(0x94)]()&&await this['processFile'](_0x47b500,_0x3066f4,_0x13a810,_0x3d1d02);}}static async[a52_0x5d75f4(0x95)](_0x3470cb,_0x1ea8df,_0x2ab56d,_0x1690e8){const _0x125281=a52_0x5d75f4,_0x4811e5=a52_0x4faec8[_0x125281(0xb5)](_0x3470cb)[_0x125281(0x8a)]();_0x3470cb[_0x125281(0x8e)](_0x125281(0xa5))&&(_0x1ea8df=_0x1ea8df[_0x125281(0x88)](/\.tpl$/,''));const _0x40bcf2=[_0x125281(0xa9),_0x125281(0x91),_0x125281(0x9e),'.js',_0x125281(0x9a),_0x125281(0x93),_0x125281(0x86),'.scss',_0x125281(0xa5)];if(_0x40bcf2[_0x125281(0x92)](_0x4811e5)||_0x3470cb['endsWith'](_0x125281(0xa5))){const _0x270a94=await a52_0x6ff76d[_0x125281(0xb2)][_0x125281(0x8b)](_0x3470cb,_0x125281(0x9c)),_0x395fba=this[_0x125281(0xbf)](_0x270a94,_0x2ab56d,_0x1690e8);await a52_0x6ff76d['promises'][_0x125281(0xbb)](_0x1ea8df,_0x395fba,_0x125281(0x9c));}else await a52_0x6ff76d[_0x125281(0xb2)][_0x125281(0xb0)](_0x3470cb,_0x1ea8df);}}
1
+ const a52_0x552ac0=a52_0x2e9a;(function(_0x120e18,_0x5822f6){const _0x38fdc6=a52_0x2e9a,_0x2b11da=_0x120e18();while(!![]){try{const _0x4fbef0=parseInt(_0x38fdc6(0xb7))/0x1+parseInt(_0x38fdc6(0xb4))/0x2+-parseInt(_0x38fdc6(0xd2))/0x3*(-parseInt(_0x38fdc6(0xb5))/0x4)+-parseInt(_0x38fdc6(0xb3))/0x5*(parseInt(_0x38fdc6(0xaa))/0x6)+-parseInt(_0x38fdc6(0xa1))/0x7*(-parseInt(_0x38fdc6(0xca))/0x8)+-parseInt(_0x38fdc6(0xb8))/0x9*(-parseInt(_0x38fdc6(0xa9))/0xa)+-parseInt(_0x38fdc6(0xc7))/0xb;if(_0x4fbef0===_0x5822f6)break;else _0x2b11da['push'](_0x2b11da['shift']());}catch(_0x4fd6b5){_0x2b11da['push'](_0x2b11da['shift']());}}}(a52_0x3faa,0x677f4));import a52_0x471eb0 from'node:fs';function a52_0x2e9a(_0x5c720a,_0x1234d8){const _0x3faafa=a52_0x3faa();return a52_0x2e9a=function(_0x2e9a5d,_0x4d666f){_0x2e9a5d=_0x2e9a5d-0xa0;let _0x109fcd=_0x3faafa[_0x2e9a5d];return _0x109fcd;},a52_0x2e9a(_0x5c720a,_0x1234d8);}import a52_0x30689b from'node:path';function a52_0x3faa(){const _0x397f98=['mkdir','toISOString','YourModel','split','charAt','10404383MoJCqS','toLocaleTimeString','writeFile','122496lQBttc','numeric','模板内容替换完成','replaceContent','template','promises','\x20\x20\x20\x20','isDirectory','16908JWZXGd','stringify','processFile','name','toUpperCase','toComponentName','error','toLocaleString','175CMcTon','utf8','keys','join','.tpl','extname','.jsx','slice','3307190cnjyhb','82146MlMBfp','toDisplayTitle','default','toLowerCase','now','.js','.ts','2-digit','api','265dBBaCX','139728omtnsP','344ZKEKug','success','496602FWgHVX','18mctIkg','info','processDirectory','pop','map','.scss','replace','.json','readFile','endsWith'];a52_0x3faa=function(){return _0x397f98;};return a52_0x3faa();}import{logger}from'./logger.js';export class TemplateReplacer{static[a52_0x552ac0(0xd7)](_0x434d85){const _0x14b3b8=a52_0x552ac0,_0x326761=_0x434d85[_0x14b3b8(0xc5)]('/')[_0x14b3b8(0xbb)]()||_0x434d85;return _0x326761[_0x14b3b8(0xc5)]('-')[_0x14b3b8(0xbc)](_0x444b0b=>_0x444b0b[_0x14b3b8(0xc6)](0x0)[_0x14b3b8(0xd6)]()+_0x444b0b['slice'](0x1)['toLowerCase']())[_0x14b3b8(0xa4)]('');}static['toDisplayTitle'](_0x5a0a04){const _0x454e93=a52_0x552ac0,_0x592039=_0x5a0a04[_0x454e93(0xc5)]('/')[_0x454e93(0xbb)]()||_0x5a0a04;return _0x592039['split']('-')['map'](_0x584751=>_0x584751[_0x454e93(0xc6)](0x0)[_0x454e93(0xd6)]()+_0x584751[_0x454e93(0xa8)](0x1)[_0x454e93(0xad)]())['join']('\x20');}static['replaceContent'](_0xd7250,_0x4d41a2,_0x27ee38){const _0x1cfc6e=a52_0x552ac0,_0x11203f=this[_0x1cfc6e(0xd7)](_0x4d41a2),_0x86396d=this[_0x1cfc6e(0xab)](_0x4d41a2),_0x109a65=new Date(),_0x313ed0=_0x109a65[_0x1cfc6e(0xa0)](undefined,{'year':'numeric','month':_0x1cfc6e(0xb1),'day':_0x1cfc6e(0xb1),'hour':_0x1cfc6e(0xb1),'minute':_0x1cfc6e(0xb1),'second':'2-digit','hour12':![]})['replace'](/\//g,'-'),_0x51b752=_0x109a65['toLocaleDateString'](undefined,{'year':_0x1cfc6e(0xcb),'month':_0x1cfc6e(0xb1),'day':'2-digit'})['replace'](/\//g,'-'),_0x16b18a=_0x109a65[_0x1cfc6e(0xc8)](undefined,{'hour12':![]});let _0x5d6ffd=_0xd7250[_0x1cfc6e(0xbe)](/\{ComponentName\}/g,_0x11203f)[_0x1cfc6e(0xbe)](/\{DisplayTitle\}/g,_0x86396d)['replace'](/\{PageName\}/g,_0x4d41a2)[_0x1cfc6e(0xbe)](/\{TemplateName\}/g,_0x27ee38)['replace'](/\{CreatedAt\}/g,_0x313ed0)[_0x1cfc6e(0xbe)](/\{CreatedDate\}/g,_0x51b752)[_0x1cfc6e(0xbe)](/\{CreatedTime\}/g,_0x16b18a);return _0x5d6ffd;}static['replaceApiContent'](_0x1e83fe,_0x3fdecb,_0x3184c4,_0x2c7a4c,_0x5a5f0c,_0xfe337f,_0x141041){const _0x312e4f=a52_0x552ac0,_0x3e92c6=new Date(),_0x13df6e=_0x3e92c6[_0x312e4f(0xc3)](),_0x2749d5=JSON[_0x312e4f(0xd3)](_0x3184c4,null,0x2)['split']('\x0a')[_0x312e4f(0xa8)](0x1,-0x1)[_0x312e4f(0xbc)](_0x5ded88=>_0x5ded88[_0x312e4f(0xbe)](/^ /,_0x312e4f(0xd0)))['join']('\x0a'),_0xc9eee9=_0x2c7a4c||Object[_0x312e4f(0xa3)](_0x3184c4)[0x0]||_0x312e4f(0xc4);let _0x323eed=_0x1e83fe[_0x312e4f(0xbe)](/\{AppCode\}/g,_0x3fdecb)['replace'](/\{ModelConfigs\}/g,_0x2749d5)[_0x312e4f(0xbe)](/\{ExampleModelName\}/g,_0xc9eee9)['replace'](/\{ApiFileName\}/g,_0x5a5f0c||_0x312e4f(0xb2))[_0x312e4f(0xbe)](/\{ConfigName\}/g,_0xfe337f||_0x312e4f(0xac))[_0x312e4f(0xbe)](/\{ClientConfigParam\}/g,_0x141041||'')[_0x312e4f(0xbe)](/\{CreatedAt\}/g,_0x13df6e);return _0x323eed;}static async['processTemplate'](_0x4098f5,_0xf4689c,_0x48cc03,_0x59c0bd,_0x2f3809=!![]){const _0x3d4e56=a52_0x552ac0,_0x28f444=Date[_0x3d4e56(0xae)]();try{_0x2f3809&&logger[_0x3d4e56(0xb9)](_0x3d4e56(0xce),'开始处理模板内容替换',{'templatePath':_0x4098f5,'targetPath':_0xf4689c,'pageName':_0x48cc03,'templateName':_0x59c0bd});await a52_0x471eb0[_0x3d4e56(0xcf)][_0x3d4e56(0xc2)](_0xf4689c,{'recursive':!![]}),await this[_0x3d4e56(0xba)](_0x4098f5,_0xf4689c,_0x48cc03,_0x59c0bd);if(_0x2f3809){const _0x4a426f=Date[_0x3d4e56(0xae)]()-_0x28f444;logger[_0x3d4e56(0xb6)](_0x3d4e56(0xce),_0x3d4e56(0xcc),_0x4a426f,{'pageName':_0x48cc03,'templateName':_0x59c0bd});}}catch(_0x4e6cf0){if(_0x2f3809){const _0x30f232=Date['now']()-_0x28f444;logger[_0x3d4e56(0xd8)](_0x3d4e56(0xce),'模板内容替换失败',{'templatePath':_0x4098f5,'targetPath':_0xf4689c,'pageName':_0x48cc03,'templateName':_0x59c0bd,'error':_0x4e6cf0 instanceof Error?_0x4e6cf0['message']:String(_0x4e6cf0),'duration':_0x30f232});}throw _0x4e6cf0;}}static async[a52_0x552ac0(0xba)](_0x2cba5a,_0x5538b8,_0x33f0ca,_0x38587c){const _0x14f7cd=a52_0x552ac0,_0xf7d8cf=await a52_0x471eb0[_0x14f7cd(0xcf)]['readdir'](_0x2cba5a,{'withFileTypes':!![]});for(const _0xd859f8 of _0xf7d8cf){const _0x2a8a35=a52_0x30689b[_0x14f7cd(0xa4)](_0x2cba5a,_0xd859f8['name']);let _0x365392=a52_0x30689b['join'](_0x5538b8,_0xd859f8[_0x14f7cd(0xd5)]);_0xd859f8[_0x14f7cd(0xd5)][_0x14f7cd(0xc1)]('.tpl')&&(_0x365392=a52_0x30689b['join'](_0x5538b8,_0xd859f8[_0x14f7cd(0xd5)][_0x14f7cd(0xbe)](/\.tpl$/,'')));if(_0xd859f8[_0x14f7cd(0xd1)]())await a52_0x471eb0[_0x14f7cd(0xcf)][_0x14f7cd(0xc2)](_0x365392,{'recursive':!![]}),await this[_0x14f7cd(0xba)](_0x2a8a35,_0x365392,_0x33f0ca,_0x38587c);else _0xd859f8['isFile']()&&await this['processFile'](_0x2a8a35,_0x365392,_0x33f0ca,_0x38587c);}}static async[a52_0x552ac0(0xd4)](_0x58c3a6,_0x25dee3,_0x38b080,_0x24bc4c){const _0x1d6d64=a52_0x552ac0,_0x380ff6=a52_0x30689b[_0x1d6d64(0xa6)](_0x58c3a6)[_0x1d6d64(0xad)]();_0x58c3a6[_0x1d6d64(0xc1)]('.tpl')&&(_0x25dee3=_0x25dee3['replace'](/\.tpl$/,''));const _0x5dd3e1=['.tsx',_0x1d6d64(0xb0),_0x1d6d64(0xa7),_0x1d6d64(0xaf),_0x1d6d64(0xbf),'.md','.css',_0x1d6d64(0xbd),_0x1d6d64(0xa5)];if(_0x5dd3e1['includes'](_0x380ff6)||_0x58c3a6[_0x1d6d64(0xc1)](_0x1d6d64(0xa5))){const _0x28f572=await a52_0x471eb0[_0x1d6d64(0xcf)][_0x1d6d64(0xc0)](_0x58c3a6,_0x1d6d64(0xa2)),_0xdfec0d=this[_0x1d6d64(0xcd)](_0x28f572,_0x38b080,_0x24bc4c);await a52_0x471eb0[_0x1d6d64(0xcf)][_0x1d6d64(0xc9)](_0x25dee3,_0xdfec0d,'utf8');}else await a52_0x471eb0[_0x1d6d64(0xcf)]['copyFile'](_0x58c3a6,_0x25dee3);}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovrabet/cli",
3
- "version": "1.1.20",
3
+ "version": "1.1.22",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "bin": {
6
6
  "lovrabet": "lib/cli.js"
@@ -18,7 +18,7 @@
18
18
  "sync-template": "node scripts/sync-template.js",
19
19
  "beta-release": "bun run build && sh scripts/update-beta-version.sh && git push && git push origin --tag && bun publish",
20
20
  "release": "bun run build && sh scripts/update-latest-version.sh && git push && git push origin --tag && bun publish",
21
- "test": "vitest",
21
+ "test": "vitest run",
22
22
  "test:run": "vitest run",
23
23
  "test:coverage": "vitest run --coverage",
24
24
  "test:ui": "vitest --ui",
@@ -112,4 +112,31 @@ git submodule update --init --recursive
112
112
  - 模板在页面/项目生成过程中被复制和处理
113
113
  - CLI 使用 `TemplateReplacer` 工具进行标签替换
114
114
  - 生成的文件包含显示生成元数据的头部注释
115
- - 所有模板支持国际化并可根据需要扩展
115
+ - 所有模板支持国际化并可根据需要扩展
116
+ ## Cursor Rules 模板
117
+
118
+ ### 用途
119
+
120
+ `rules/` 目录包含 Cursor Rules 模板,用于指导 AI 助手(Claude、GPT 等)正确使用 Lovrabet SDK 和 MCP。
121
+
122
+ ### 功能特性
123
+
124
+ - ✅ **SDK 使用规范** - 完整的 API 调用指南
125
+ - ✅ **MCP Tools 指南** - 7 个 MCP 工具的详细说明
126
+ - ✅ **性能优化** - 避免不必要的 API 调用
127
+ - ✅ **错误处理** - 完善的错误处理模式
128
+ - ✅ **类型安全** - TypeScript 最佳实践
129
+ - ✅ **用户体验** - 加载状态、乐观更新等
130
+ - ✅ **常见错误避免** - 清单式检查
131
+
132
+ ### 使用方法
133
+
134
+ ```bash
135
+ # 项目级别配置(推荐)
136
+ cp templates/rules/.cursorrules ./
137
+
138
+ # 全局配置
139
+ cp templates/rules/.cursorrules ~/.cursorrules
140
+ ```
141
+
142
+ 详细说明请参考 `rules/README.md`。
@@ -1,5 +1,21 @@
1
1
  # 更新记录
2
2
 
3
+ ## 2025-11-30
4
+
5
+ ### 📝 完善项目文档
6
+
7
+ 全面更新 README.md,使其准确反映当前项目状态。
8
+
9
+ **变更**:
10
+
11
+ - **项目结构更新**:更新为实际目录结构,包含所有现有页面(intro、workbench、dashboard、data-screen 等)
12
+ - **功能特性完善**:分为核心功能和技术特性两部分,详细描述各页面功能
13
+ - **SDK 使用指南**:更新为实际的 SDK 调用方式(filter、getOne、create、update、delete),添加动态获取模型列表说明
14
+ - **路由说明更新**:更新为当前实际的路由映射,补充布局系统说明
15
+ - **部署指南完善**:添加 CDN 部署的两种方式(标准部署和版本化部署),补充主应用集成步骤
16
+ - **新增开发注意事项**:添加环境要求、常见问题、代码规范等章节
17
+ - **添加相关资源链接**:补充 Lovrabet 开放平台和相关文档链接
18
+
3
19
  ## 2025-09-14
4
20
 
5
21
  ### 🔧 实现自动路由生成
@@ -1,10 +1,10 @@
1
1
  [📝 项目更新记录 CHANGELOG](./CHANGELOG.md)
2
2
 
3
- 注意:本项目会阶段性更新,如果git pull以后无法运行,可以删除 node_modules之后重新 npm install
3
+ > ⚠️ **注意**:本项目会阶段性更新,如果 `git pull` 以后无法运行,可以删除 `node_modules` 之后重新 `npm install`
4
4
 
5
5
  # Lovrabet SDK React 演示项目
6
6
 
7
- 项目展示了如何在现代 React 应用中集成 Lovrabet SDK,以及如何使用 icestark 微前端方案嵌入到 Lovrabet 主应用中。
7
+ 这是一个完整的 React 微前端演示项目,展示了如何在现代 React 应用中集成 Lovrabet SDK,以及如何使用 icestark 微前端方案嵌入到 Lovrabet 主应用中。
8
8
 
9
9
  ## 技术栈
10
10
 
@@ -14,8 +14,9 @@
14
14
  - **React Router v6** - 现代化的路由解决方案
15
15
  - **Ant Design v5** - 企业级 UI 设计语言
16
16
  - **Vite v7** - 下一代前端构建工具
17
- - **icestark** - 阿里飞冰微前端框架
17
+ - **@ice/stark-app** - 阿里飞冰微前端框架
18
18
  - **ECharts** - 数据可视化图表库
19
+ - **vite-plugin-pages** - 基于文件系统的约定式路由
19
20
 
20
21
  ## 项目结构
21
22
 
@@ -24,28 +25,29 @@
24
25
  │ ├── api/ # SDK 配置和客户端
25
26
  │ │ ├── api.ts # CLI 生成的 SDK 配置文件
26
27
  │ │ └── client.ts # SDK 客户端实例
27
- │ ├── components/ # 通用组件
28
- │ │ ├── ApiUrlDisplay.tsx # API URL 展示组件
29
- │ │ └── PageHeader.tsx # 页面头部组件
30
28
  │ ├── layouts/ # 布局组件
31
- │ │ └── MainLayout.tsx
29
+ │ │ └── MainLayout.tsx # 主布局(包含侧边栏、头部、面包屑等)
32
30
  │ ├── pages/ # 页面组件(基于文件系统自动路由)
33
- │ │ ├── index.tsx # 首页 - 项目概述(/ 路由)
31
+ │ │ ├── index.tsx # 首页 - 项目概述和二开说明(/ 路由)
32
+ │ │ ├── intro/ # 介绍页面
33
+ │ │ │ └── index.tsx # 介绍页(/intro 路由)
34
34
  │ │ ├── sdk-demo/ # SDK 演示页面
35
35
  │ │ │ └── index.tsx # SDK 调用演示(/sdk-demo 路由)
36
- │ │ ├── table-display.tsx # 表格展示(/table-display 路由)
37
- │ │ ├── chart-fetch/ # 图表页面目录
38
- │ │ │ └── index.tsx # 图表展示(/chart-fetch 路由)
39
- │ │ └── dashboard/ # 仪表板页面
40
- │ │ └── index.tsx # 数据看板(/dashboard 路由)
36
+ │ │ ├── workbench/ # 工作台页面
37
+ │ │ │ └── index.tsx # 工作台(/workbench 路由)
38
+ │ │ ├── dashboard/ # 数据看板页面
39
+ │ │ └── index.tsx # 数据看板(/dashboard 路由)
40
+ │ │ └── data-screen/ # 数据大屏页面
41
+ │ │ └── index.tsx # 数据大屏(/data-screen 路由)
41
42
  │ ├── router/ # 路由配置(自动生成)
42
- │ │ └── index.tsx
43
+ │ │ └── index.tsx # 路由配置,使用 vite-plugin-pages 自动生成
43
44
  │ ├── utils/ # 工具函数
44
45
  │ │ └── api.ts # API 请求封装
45
- │ ├── main.tsx # 微前端应用入口
46
+ │ ├── main.tsx # 微前端应用入口(导出 mount/unmount)
46
47
  │ ├── style.css # 全局样式
47
48
  │ └── vite-env.d.ts # Vite 类型定义
48
49
  ├── docs/ # 项目文档
50
+ │ ├── quick-start.md # 快速开始指南
49
51
  │ └── API_RULE_CHANGE.md # API 变更指南
50
52
  ├── vite.config.ts # Vite 配置文件(含微前端配置)
51
53
  ├── tsconfig.json # TypeScript 配置
@@ -55,17 +57,25 @@
55
57
 
56
58
  ## 功能特性
57
59
 
58
- - 🎯 **SDK 调用演示** - 展示 @lovrabet/sdk 的核心 CRUD 操作方法
59
- - 🏠 **项目概述页** - 清晰介绍项目目的、功能和技术栈
60
- - 📊 **数据图表** - 真实API调用的 ECharts 饼图,展示字段类型分布
61
- - 📋 **数据表格** - 支持分页、排序、筛选的动态数据表格
62
- - 📈 **仪表板展示** - 静态数据可视化演示页面
63
- - 🚀 **自动路由生成** - 基于文件系统的约定式路由,零配置开发
64
- - 🔌 **微前端支持** - 通过 icestark 实现与主应用的无缝集成
60
+ ### 核心功能
61
+
62
+ - 🎯 **SDK 调用演示** - 展示 @lovrabet/sdk 的核心 CRUD 操作方法,支持动态选择数据模型
63
+ - 🏠 **项目概述页** - 清晰介绍项目目的、功能和技术栈,包含完整的二开说明
64
+ - 💼 **工作台** - 展示工作台页面示例,包含统计卡片、任务列表、进度跟踪等
65
+ - 📊 **数据看板** - 数据可视化看板,展示各类业务指标和图表
66
+ - 📈 **数据大屏** - 大屏数据展示页面,适合数据大屏场景
67
+ - 📖 **介绍页** - 项目介绍和说明页面
68
+
69
+ ### 技术特性
70
+
71
+ - 🚀 **自动路由生成** - 基于 `vite-plugin-pages` 的文件系统约定式路由,零配置开发
72
+ - 🔌 **微前端支持** - 通过 `@ice/stark-app` 实现与主应用的无缝集成
65
73
  - 📱 **响应式设计** - 支持桌面端和移动端,自适应布局
66
- - 🎨 **现代化 UI** - 基于 Ant Design v5 的美观界面
74
+ - 🎨 **现代化 UI** - 基于 Ant Design v5 的美观界面,包含完整的布局系统
67
75
  - ⚡ **极速构建** - Vite v7 + ES Modules,开发体验极佳
68
- - 🧩 **组件复用** - 抽取通用组件如 PageHeader,提高代码复用性
76
+ - 🔒 **HTTPS 开发环境** - 开发环境自动配置 HTTPS,解决跨域问题
77
+ - 📦 **外部依赖优化** - React、Ant Design 等通过 CDN 加载,减小包体积
78
+ - 🌐 **CDN 部署支持** - 支持版本化 CDN 部署,便于多版本管理
69
79
 
70
80
  ## 快速开始
71
81
 
@@ -78,26 +88,29 @@ npm install
78
88
  ### 开发模式
79
89
 
80
90
  ```bash
81
- npm run start
91
+ lovrabet start
82
92
  ```
83
93
 
84
94
  应用将在 `https://dev.lovrabet.com:5173` 启动(配置了HTTPS证书)
85
- 说明:https://dev.lovrabet.com:${port} port不限5173端口,任意端口号都支持跨域
95
+
96
+ > 💡 **说明**:`https://dev.lovrabet.com:${port}` 中 port 不限于 5173 端口,任意端口号都支持跨域。可以通过环境变量 `PORT` 自定义端口号。
86
97
 
87
98
  ### 微前端核心配置
88
99
 
89
100
  项目包含完整的微前端配置 (`vite.config.ts`):
90
101
 
91
102
  - **icestark 集成**: 通过 `vite-plugin-index-html` 实现微前端打包
92
- - **外部依赖**: React、ReactDOM、Ant Design 通过 CDN 加载
93
- - **ES Modules 输出**: 支持主应用动态加载
94
- - **HTTPS 支持**: 开发环境配置 HTTPS 证书,解决跨域问题
103
+ - **外部依赖**: React、ReactDOM、Ant Design、dayjs 通过 CDN 加载,减小包体积
104
+ - **ES Modules 输出**: 支持主应用动态加载,Tree Shaking 友好
105
+ - **HTTPS 支持**: 开发环境自动获取 HTTPS 证书,解决跨域问题
95
106
  - **路径别名**: `@` 指向 `src` 目录
107
+ - **约定式路由**: 使用 `vite-plugin-pages` 实现基于文件系统的自动路由生成
108
+ - **CDN 部署**: 支持版本化 CDN 部署(通过 `CDN_DOMAIN` 环境变量配置)
96
109
 
97
110
  ### 构建生产版本
98
111
 
99
112
  ```bash
100
- npm run build
113
+ lovrabet build
101
114
  ```
102
115
 
103
116
  ### 预览生产版本
@@ -123,24 +136,46 @@ npm run preview
123
136
  - 导出供整个应用使用
124
137
 
125
138
  3. **SDK 调用示例** (`src/pages/sdk-demo/index.tsx`):
126
- - 展示 `getList()` 获取数据列表
139
+ - 动态获取可用的数据模型列表
140
+ - 展示 `filter()` 查询数据(支持分页、排序、筛选)
141
+ - 展示 `getOne()` 获取单条记录
127
142
  - 展示 `create()` 创建新数据
128
- - 包含完整的错误处理
143
+ - 展示 `update()` 更新数据
144
+ - 展示 `delete()` 删除数据
145
+ - 包含完整的错误处理和加载状态
129
146
 
130
147
  **典型使用模式**:
131
148
 
132
149
  ```typescript
133
- // 获取数据列表
134
- const data = await lovrabetClient.models.Requirements.getList({
150
+ import { lovrabetClient } from "@/api/client";
151
+
152
+ // 获取可用的数据模型列表
153
+ const models = lovrabetClient.getModelList();
154
+
155
+ // 使用 filter 查询数据(推荐)
156
+ const data = await lovrabetClient.models.Requirements.filter({
135
157
  currentPage: 1,
136
158
  pageSize: 20,
159
+ orderBy: "createdAt",
160
+ orderDirection: "desc",
137
161
  });
138
162
 
163
+ // 获取单条记录
164
+ const item = await lovrabetClient.models.Requirements.getOne("record-id");
165
+
139
166
  // 创建新数据
140
- await lovrabetClient.models.Requirements.create({
167
+ const newItem = await lovrabetClient.models.Requirements.create({
141
168
  title: "需求标题",
142
169
  description: "需求描述",
143
170
  });
171
+
172
+ // 更新数据
173
+ await lovrabetClient.models.Requirements.update("record-id", {
174
+ title: "更新后的标题",
175
+ });
176
+
177
+ // 删除数据
178
+ await lovrabetClient.models.Requirements.delete("record-id");
144
179
  ```
145
180
 
146
181
  ### 微前端集成要点
@@ -166,26 +201,31 @@ await lovrabetClient.models.Requirements.create({
166
201
 
167
202
  基于 `vite-plugin-pages` 的文件系统路由,支持以下约定:
168
203
 
169
- **文件路由映射**:
204
+ **当前路由映射**:
170
205
 
171
- - `src/pages/index.tsx` → `/` (首页 - 项目概述)
206
+ - `src/pages/index.tsx` → `/` (首页 - 项目概述和二开说明)
207
+ - `src/pages/intro/index.tsx` → `/intro` (介绍页)
172
208
  - `src/pages/sdk-demo/index.tsx` → `/sdk-demo` (SDK 调用演示)
173
- - `src/pages/table-display.tsx` → `/table-display` (数据表格展示)
174
- - `src/pages/chart-fetch/index.tsx` → `/chart-fetch` (图表数据获取)
175
- - `src/pages/dashboard/index.tsx` → `/dashboard` (数据可视化仪表板)
209
+ - `src/pages/workbench/index.tsx` → `/workbench` (工作台)
210
+ - `src/pages/dashboard/index.tsx` → `/dashboard` (数据看板)
211
+ - `src/pages/data-screen/index.tsx` → `/data-screen` (数据大屏)
176
212
 
177
- **动态路由**:
213
+ **路由规则**:
178
214
 
179
- - `src/pages/[id].tsx` → `/:id`
180
- - `src/pages/user/[userId]/profile.tsx` → `/user/:userId/profile`
215
+ - 文件路由:`src/pages/about.tsx` → `/about`
216
+ - 目录路由:`src/pages/user/index.tsx` → `/user`
217
+ - 嵌套路由:`src/pages/user/profile.tsx` → `/user/profile`
218
+ - 动态路由:`src/pages/user/[id].tsx` → `/user/:id`
219
+ - 索引路由:`src/pages/index.tsx` → `/`(根路径)
181
220
 
182
- **嵌套路由**:
221
+ **布局系统**:
183
222
 
184
- - 使用目录结构创建嵌套路由
185
- - 支持 `layout.tsx` 文件作为嵌套布局
223
+ - 所有页面都包裹在 `MainLayout` 中(在 `src/router/index.tsx` 中配置)
224
+ - 在微前端环境中,`MainLayout` 会自动隐藏,只渲染页面内容
225
+ - 独立运行时,显示完整的布局(侧边栏、头部、面包屑等)
186
226
 
187
227
  **新增页面**:
188
- 只需在 `src/pages/` 目录下创建 `.tsx` 文件,路由会自动生成,无需手动配置。
228
+ 只需在 `src/pages/` 目录下创建 `.tsx` 文件或目录,路由会自动生成,无需手动配置。
189
229
 
190
230
  ### 样式规范
191
231
 
@@ -195,15 +235,84 @@ await lovrabetClient.models.Requirements.create({
195
235
 
196
236
  ## 部署
197
237
 
238
+ ### 构建生产版本
239
+
240
+ ```bash
241
+ lovrabet build
242
+ ```
243
+
244
+ 构建产物会输出到 `dist/` 目录(或根据 `CDN_DOMAIN` 环境变量输出到版本化目录)。
245
+
246
+ ### CDN 部署
247
+
248
+ 项目支持两种部署方式:
249
+
250
+ #### 方式一:标准部署
251
+
252
+ ```bash
253
+ lovrabet build
254
+ # 将 dist/ 目录内容上传到您的 CDN
255
+ ```
256
+
257
+ #### 方式二:版本化 CDN 部署
258
+
259
+ ```bash
260
+ CDN_DOMAIN=https://your-cdn.com lovrabet build
261
+ # 构建产物会输出到 dist/sub-app-react-demo/1.0.0/
262
+ # 便于多版本管理和回滚
263
+ ```
264
+
265
+ ### 部署平台
266
+
198
267
  项目使用 Vite 构建,可以部署到任何静态文件服务器:
199
268
 
200
- - Vercel
201
- - Netlify
202
- - GitHub Pages
203
- - 阿里云 OSS
204
- - 腾讯云 COS
269
+ - **CDN 服务**:阿里云 OSS、腾讯云 COS、AWS S3 等
270
+ - **静态托管**:Vercel、Netlify、GitHub Pages
271
+ - **自建服务器**:Nginx、Apache
272
+
273
+ ### 主应用集成
274
+
275
+ 构建完成后,需要在 Lovrabet 主应用中配置页面:
276
+
277
+ 1. 访问页面配置:`https://app.lovrabet.com/app/{appCode}/pages/`
278
+ 2. 配置路由路径(必须与代码中的路由一致)
279
+ 3. 选择资源加载方式:`import`(Vite 项目必须选择此方式)
280
+ 4. 配置资源加载列表:
281
+ - `https://your-cdn.com/path/to/assets/main.js`
282
+ - `https://your-cdn.com/path/to/assets/main.css`
283
+
284
+ 详细步骤请参考 [快速开始指南](./docs/quick-start.md)。
285
+
286
+ ## 开发注意事项
287
+
288
+ ### 环境要求
289
+
290
+ - Node.js >= 16
291
+ - npm >= 7 或 yarn >= 1.22 或 pnpm >= 7
292
+
293
+ ### 常见问题
294
+
295
+ 1. **端口被占用**:修改 `.env` 文件中的 `PORT` 环境变量,或使用 `PORT=3000 npm start`
296
+ 2. **HTTPS 证书获取失败**:检查网络连接,确保能访问 `https://g.yuntooai.com/cert/lovrabet-dev.json`
297
+ 3. **路由不生效**:确保页面文件在 `src/pages/` 目录下,且文件扩展名为 `.tsx`
298
+ 4. **SDK 调用失败**:检查 `src/api/api.ts` 是否正确配置,确保已通过 Lovrabet CLI 生成
299
+
300
+ ### 代码规范
301
+
302
+ - 使用 TypeScript 编写代码
303
+ - 遵循 ESLint 和 Prettier 配置
304
+ - 组件使用函数式组件 + Hooks
305
+ - 优先使用 Ant Design 组件
205
306
 
206
307
  ## 文档链接
207
308
 
208
- - [开发者手册 quick-start](./docs/quick-start.md)
209
- - [更新记录 CHANGELOG](./CHANGELOG.md)
309
+ - [快速开始指南](./docs/quick-start.md) - 详细的接入和开发指南
310
+ - [API 变更指南](./docs/API_RULE_CHANGE.md) - API 地址规则变更说明
311
+ - [更新记录](./CHANGELOG.md) - 项目更新历史
312
+
313
+ ## 相关资源
314
+
315
+ - [Lovrabet 开放平台](https://open.lovrabet.com)
316
+ - [CLI 前端脚手架文档](https://open.lovrabet.com/docs/lovrabet-cli/)
317
+ - [TypeScript SDK 文档](https://open.lovrabet.com/docs/category/lovrabet-node-sdk)
318
+ - [OpenAPI 文档](https://open.lovrabet.com/docs/category/openapi)