@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.
- package/lib/add-page/input-page-router.js +1 -1
- package/lib/add-page/main.js +1 -1
- package/lib/add-page/select-page-template.js +1 -1
- package/lib/api/api-doc-ui.js +1 -1
- package/lib/api/api-doc.js +1 -1
- package/lib/api/api-pull-ui.js +1 -1
- package/lib/api/fetch-model-list.js +1 -1
- package/lib/api/generate-api-file.js +1 -1
- package/lib/api/main.js +1 -1
- package/lib/api/pull-silent.js +1 -1
- package/lib/app-menu/app-menu-sync-ui.js +1 -1
- package/lib/app-menu/create-menu.js +1 -1
- package/lib/app-menu/get-local-pages.js +1 -1
- package/lib/app-menu/get-online-menu-list.js +1 -1
- package/lib/app-menu/valid-url.js +1 -1
- package/lib/auth/auth-server-ui.js +1 -1
- package/lib/auth/auth-server.js +1 -1
- package/lib/auth/constant.js +1 -1
- package/lib/auth/get-cookie.js +1 -1
- package/lib/auth/is-session-valid.js +1 -1
- package/lib/auth/logout.js +1 -1
- package/lib/cli.js +1 -1
- package/lib/cmd/build-watch.js +1 -1
- package/lib/cmd/build.js +1 -1
- package/lib/cmd/logs.js +1 -1
- package/lib/cmd/preview.js +1 -1
- package/lib/cmd/start.js +1 -1
- package/lib/config/config-help.js +1 -1
- package/lib/config/main.js +1 -1
- package/lib/constant/domain.js +1 -1
- package/lib/constant/env.js +1 -1
- package/lib/create-app/enhanced-guided-create.js +1 -1
- package/lib/create-app/format-elapsed.js +1 -1
- package/lib/create-app/main.js +1 -1
- package/lib/create-app/task-finished.js +1 -1
- package/lib/create-app/task-loading.js +1 -1
- package/lib/create-app/task-running.js +1 -1
- package/lib/create-app/task-time.js +1 -1
- package/lib/create-app/use-copy-project-template.js +1 -1
- package/lib/create-app/use-format-code.js +1 -1
- package/lib/create-app/use-install-dependencies.js +1 -1
- package/lib/help.js +1 -1
- package/lib/init/main.js +1 -1
- package/lib/mcp/cursor.js +1 -1
- package/lib/mcp/main.js +1 -1
- package/lib/utils/config.js +1 -1
- package/lib/utils/copy-directory.js +1 -1
- package/lib/utils/http-client.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/router-updater.js +1 -1
- package/lib/utils/sleep.js +1 -1
- package/lib/utils/template-replacer.js +1 -1
- package/package.json +2 -2
- package/templates/README.md +28 -1
- package/templates/projects/sub-app-react-demo/CHANGELOG.md +16 -0
- package/templates/projects/sub-app-react-demo/README.md +163 -54
- package/templates/projects/sub-app-react-demo/package-lock.json +1347 -149
- package/templates/projects/sub-app-react-demo/package.json +2 -2
- package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +286 -55
- package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +526 -0
- package/templates/projects/sub-app-react-demo/src/pages/index.tsx +942 -87
- package/templates/projects/sub-app-react-demo/src/pages/intro/index.tsx +560 -0
- package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +113 -118
- package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +469 -0
- package/templates/projects/sub-app-react-demo/src/style.css +39 -0
- package/templates/rules/README.md +178 -0
- package/templates/rules/example-project-setup.md +276 -0
- package/templates/rules/lovrabet_rules.mdc.tpl +425 -0
- package/templates/projects/sub-app-react-demo/bun.lock +0 -600
package/lib/utils/logger.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
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
|
|
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;}}
|
package/lib/utils/sleep.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function sleep(
|
|
1
|
+
export function sleep(_0x465765){return new Promise(_0x4c2ac4=>setTimeout(_0x4c2ac4,_0x465765));}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
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.
|
|
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",
|
package/templates/README.md
CHANGED
|
@@ -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
|
-
|
|
3
|
+
> ⚠️ **注意**:本项目会阶段性更新,如果 `git pull` 以后无法运行,可以删除 `node_modules` 之后重新 `npm install`
|
|
4
4
|
|
|
5
5
|
# Lovrabet SDK React 演示项目
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
- **
|
|
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
|
-
│ │ ├──
|
|
37
|
-
│ │
|
|
38
|
-
│ │
|
|
39
|
-
│ │ └──
|
|
40
|
-
│ │
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
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
|
-
-
|
|
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
|
-
|
|
91
|
+
lovrabet start
|
|
82
92
|
```
|
|
83
93
|
|
|
84
94
|
应用将在 `https://dev.lovrabet.com:5173` 启动(配置了HTTPS证书)
|
|
85
|
-
|
|
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 支持**:
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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/
|
|
174
|
-
- `src/pages/
|
|
175
|
-
- `src/pages/
|
|
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
|
-
-
|
|
180
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
201
|
-
- Netlify
|
|
202
|
-
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
- [
|
|
209
|
-
- [
|
|
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)
|