vome-core 0.0.18 → 0.0.20

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 (47) hide show
  1. package/dist/admin/config/plugin-dev.d.ts +7 -6
  2. package/dist/admin/config/plugin-dev.js +1 -1
  3. package/dist/admin/crud/config.js +1 -1
  4. package/dist/admin/crud/confirm.js +1 -1
  5. package/dist/admin/crud/dict.js +1 -1
  6. package/dist/admin/crud/index.d.ts +1 -0
  7. package/dist/admin/crud/index.js +1 -1
  8. package/dist/admin/crud/key.js +1 -1
  9. package/dist/admin/crud/mitt.js +1 -1
  10. package/dist/admin/crud/plugins.js +1 -1
  11. package/dist/admin/crud/span.js +1 -1
  12. package/dist/admin/crud/style.js +1 -1
  13. package/dist/admin/crud/validate.js +1 -1
  14. package/dist/admin/crud/vm-dialog.vue +1 -1
  15. package/dist/admin/crud/vm-export-btn.vue +169 -0
  16. package/dist/admin/crud/vm-search.vue +18 -3
  17. package/dist/admin/crud/vm-toolbar.vue +20 -0
  18. package/dist/admin/crud/vm-upsert.vue +163 -33
  19. package/dist/admin/directives/perm.js +1 -1
  20. package/dist/admin/hooks/useUpload.js +1 -1
  21. package/dist/admin/lib/browser.js +1 -1
  22. package/dist/admin/lib/cn.js +1 -1
  23. package/dist/admin/lib/dialog-float.js +1 -1
  24. package/dist/admin/lib/export-excel.d.ts +11 -0
  25. package/dist/admin/lib/export-excel.js +1 -0
  26. package/dist/admin/lib/menu.js +1 -1
  27. package/dist/admin/lib/tree.js +1 -1
  28. package/dist/admin/lib/upload.js +1 -1
  29. package/dist/index.js +1 -1
  30. package/dist/server/index.js +1 -1
  31. package/dist/shared/excel.d.ts +13 -0
  32. package/dist/shared/excel.js +1 -0
  33. package/dist/shared/index.js +1 -1
  34. package/dist/shared/tree.js +1 -1
  35. package/dist/src/core/context/index.d.ts +11 -1
  36. package/dist/src/core/host-infra.d.ts +3 -3
  37. package/dist/src/routing/base.d.ts +2 -0
  38. package/dist/src/server/index.d.ts +2 -0
  39. package/dist/src/shared/excel.d.ts +13 -0
  40. package/dist/src/shared/index.d.ts +2 -0
  41. package/dist/typings/routing/crud.d.ts +2 -0
  42. package/package.json +3 -2
  43. package/src/shared/excel.d.ts +13 -0
  44. package/src/shared/excel.ts +46 -0
  45. package/src/shared/index.ts +6 -0
  46. package/typings/admin/comm/crud.d.ts +6 -0
  47. package/typings/admin/comm/crud.ts +6 -0
@@ -0,0 +1,13 @@
1
+ export type ExcelColumn = {
2
+ prop: string;
3
+ label: string;
4
+ };
5
+ export type ExcelFormatCell = (prop: string, row: Record<string, unknown>) => string;
6
+ /** 二维表 → xlsx 二进制 */
7
+ export declare function buildExcelBuffer(columns: ExcelColumn[], rows: Record<string, unknown>[], formatCell?: ExcelFormatCell): Uint8Array;
8
+ export declare function excelFilename(name: string): string;
9
+ /** Service 下载响应头 */
10
+ export declare function excelResponseHeaders(filename: string): {
11
+ 'Content-Type': string;
12
+ 'Content-Disposition': string;
13
+ };
@@ -0,0 +1 @@
1
+ (function(_0x2b35ab,_0x36cc0e){const _0x7f9064=_0x5e74,_0x167388=_0x2b35ab();while(!![]){try{const _0x2e49f6=parseInt(_0x7f9064(0x71))/0x1*(parseInt(_0x7f9064(0x6b))/0x2)+parseInt(_0x7f9064(0x6f))/0x3+-parseInt(_0x7f9064(0x7a))/0x4+parseInt(_0x7f9064(0x75))/0x5*(parseInt(_0x7f9064(0x72))/0x6)+-parseInt(_0x7f9064(0x77))/0x7*(-parseInt(_0x7f9064(0x70))/0x8)+parseInt(_0x7f9064(0x6c))/0x9*(-parseInt(_0x7f9064(0x74))/0xa)+-parseInt(_0x7f9064(0x69))/0xb;if(_0x2e49f6===_0x36cc0e)break;else _0x167388['push'](_0x167388['shift']());}catch(_0x12d41d){_0x167388['push'](_0x167388['shift']());}}}(_0x25a2,0xda68d));function _0x5e74(_0x29469e,_0x19f609){_0x29469e=_0x29469e-0x69;const _0x25a2e9=_0x25a2();let _0x5e743c=_0x25a2e9[_0x29469e];if(_0x5e74['XQQQmg']===undefined){var _0x3039f3=function(_0x2ce634){const _0x3a4a27='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2aaa67='',_0x442cf9='';for(let _0x486a37=0x0,_0x4e7150,_0xe8659c,_0xb8ed52=0x0;_0xe8659c=_0x2ce634['charAt'](_0xb8ed52++);~_0xe8659c&&(_0x4e7150=_0x486a37%0x4?_0x4e7150*0x40+_0xe8659c:_0xe8659c,_0x486a37++%0x4)?_0x2aaa67+=String['fromCharCode'](0xff&_0x4e7150>>(-0x2*_0x486a37&0x6)):0x0){_0xe8659c=_0x3a4a27['indexOf'](_0xe8659c);}for(let _0x1e5d65=0x0,_0x22f858=_0x2aaa67['length'];_0x1e5d65<_0x22f858;_0x1e5d65++){_0x442cf9+='%'+('00'+_0x2aaa67['charCodeAt'](_0x1e5d65)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x442cf9);};_0x5e74['cyOPsu']=_0x3039f3,_0x5e74['lgPKUl']={},_0x5e74['XQQQmg']=!![];}const _0x22f458=_0x25a2e9[0x0],_0x5be6ff=_0x29469e+_0x22f458,_0x357169=_0x5e74['lgPKUl'][_0x5be6ff];return!_0x357169?(_0x5e743c=_0x5e74['cyOPsu'](_0x5e743c),_0x5e74['lgPKUl'][_0x5be6ff]=_0x5e743c):_0x5e743c=_0x357169,_0x5e743c;}import*as _0x2aaa67 from'xlsx';export function buildExcelBuffer(_0x442cf9,_0x486a37,_0x4e7150){const _0x760d1c=_0x5e74,_0xe8659c=_0x442cf9['map'](_0x484461=>_0x484461['label']||_0x484461[_0x760d1c(0x6d)]),_0xb8ed52=_0x486a37[_0x760d1c(0x6a)](_0x4f6e57=>_0x442cf9[_0x760d1c(0x6a)](_0x3db046=>{const _0x220059=_0x760d1c;if(_0x4e7150)return _0x4e7150(_0x3db046[_0x220059(0x6d)],_0x4f6e57);const _0x17e38e=_0x4f6e57[_0x3db046[_0x220059(0x6d)]];if(_0x17e38e==null)return'';return String(_0x17e38e);})),_0x1e5d65=_0x2aaa67[_0x760d1c(0x79)]['aoa_to_sheet']([_0xe8659c,..._0xb8ed52]),_0x22f858=_0x2aaa67[_0x760d1c(0x79)][_0x760d1c(0x7c)]();return _0x2aaa67['utils'][_0x760d1c(0x76)](_0x22f858,_0x1e5d65,_0x760d1c(0x78)),_0x2aaa67[_0x760d1c(0x73)](_0x22f858,{'bookType':_0x760d1c(0x6e),'type':'array'});}export function excelFilename(_0x5057a9){const _0x42026f=_0x5e74;return _0x5057a9[_0x42026f(0x7b)]('.xlsx')?_0x5057a9:_0x5057a9+'.xlsx';}function _0x25a2(){const _0x888b54=['yM9VA19HChbLBMrFC2HLzxq','nZC2mduWmwLPuKvnvq','u2HLzxqX','DxrPBhm','mtu1mte2mffvALrOvq','zw5KC1DPDgG','yM9VA19UzxC','mtu5nJG3mJjNAxDzyuy','BwfW','ngDbtefQwa','mJy1nw5cz29kAq','ChjVCa','EgXZEa','ndKXmZe4muznthbpDa','ogfWAw93sq','mtGZmJCZt2vVq1vd','mZy0mMXftLvrCa','D3jPDgu','ndG1mdbLvwnXy0m','ody2nxzXEvzPEG'];_0x25a2=function(){return _0x888b54;};return _0x25a2();}export function excelResponseHeaders(_0x349ae6){const _0x5d15c9=excelFilename(_0x349ae6);return{'Content-Type':'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','Content-Disposition':'attachment;\x20filename*=UTF-8\x27\x27'+encodeURIComponent(_0x5d15c9)};}
@@ -1 +1 @@
1
- (function(_0x59f7eb,_0xf723d5){var _0x2ce33c=_0x573a,_0x5ac725=_0x59f7eb();while(!![]){try{var _0x41d7ea=-parseInt(_0x2ce33c(0x9e))/0x1+parseInt(_0x2ce33c(0x9f))/0x2+-parseInt(_0x2ce33c(0x98))/0x3*(parseInt(_0x2ce33c(0x9c))/0x4)+-parseInt(_0x2ce33c(0x99))/0x5+parseInt(_0x2ce33c(0x97))/0x6*(parseInt(_0x2ce33c(0x9a))/0x7)+parseInt(_0x2ce33c(0x9d))/0x8*(parseInt(_0x2ce33c(0x9b))/0x9)+parseInt(_0x2ce33c(0xa0))/0xa;if(_0x41d7ea===_0xf723d5)break;else _0x5ac725['push'](_0x5ac725['shift']());}catch(_0x10d308){_0x5ac725['push'](_0x5ac725['shift']());}}}(_0x13a4,0x86b4e));function _0x13a4(){var _0x203ed0=['mZqZz3PrrK1V','mtq0odK3m0fyy0HAzW','mZaXote0ngnNruLmua','ndbesgPRrMC','nZq0mJC4y2PrC0vK','ndGWmda2zhvxwezo','mZu4nZKYmeL1CM9rrW','otm5nJzqyurbEuK','m3P4EwHjzq','nJaXnZm1rNHerw5p'];_0x13a4=function(){return _0x203ed0;};return _0x13a4();}function _0x573a(_0x20dfa0,_0x3655c9){_0x20dfa0=_0x20dfa0-0x97;var _0x13a4d2=_0x13a4();var _0x573a16=_0x13a4d2[_0x20dfa0];if(_0x573a['LPuaHU']===undefined){var _0x2d67ae=function(_0x2a67c3){var _0x20f8f0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x2fdfee='',_0xf87eac='';for(var _0x3a0ee1=0x0,_0xf13b1a,_0x2a7d1c,_0x50d835=0x0;_0x2a7d1c=_0x2a67c3['charAt'](_0x50d835++);~_0x2a7d1c&&(_0xf13b1a=_0x3a0ee1%0x4?_0xf13b1a*0x40+_0x2a7d1c:_0x2a7d1c,_0x3a0ee1++%0x4)?_0x2fdfee+=String['fromCharCode'](0xff&_0xf13b1a>>(-0x2*_0x3a0ee1&0x6)):0x0){_0x2a7d1c=_0x20f8f0['indexOf'](_0x2a7d1c);}for(var _0x52780f=0x0,_0x8ba591=_0x2fdfee['length'];_0x52780f<_0x8ba591;_0x52780f++){_0xf87eac+='%'+('00'+_0x2fdfee['charCodeAt'](_0x52780f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xf87eac);};_0x573a['RAlqFy']=_0x2d67ae,_0x573a['TqbwFO']={},_0x573a['LPuaHU']=!![];}var _0x1b4982=_0x13a4d2[0x0],_0x31afb8=_0x20dfa0+_0x1b4982,_0x5a7c35=_0x573a['TqbwFO'][_0x31afb8];return!_0x5a7c35?(_0x573a16=_0x573a['RAlqFy'](_0x573a16),_0x573a['TqbwFO'][_0x31afb8]=_0x573a16):_0x573a16=_0x5a7c35,_0x573a16;}export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';export{RES_CODE}from'../routing/base';
1
+ function _0x41dc(_0x26fc37,_0x49000d){_0x26fc37=_0x26fc37-0x116;var _0x3d33ef=_0x3d33();var _0x41dc93=_0x3d33ef[_0x26fc37];if(_0x41dc['IGYCUw']===undefined){var _0x39c058=function(_0x288ac2){var _0x39aa38='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4ff0dc='',_0x96ff77='';for(var _0x3acd2a=0x0,_0x549317,_0x4dfd48,_0x34e621=0x0;_0x4dfd48=_0x288ac2['charAt'](_0x34e621++);~_0x4dfd48&&(_0x549317=_0x3acd2a%0x4?_0x549317*0x40+_0x4dfd48:_0x4dfd48,_0x3acd2a++%0x4)?_0x4ff0dc+=String['fromCharCode'](0xff&_0x549317>>(-0x2*_0x3acd2a&0x6)):0x0){_0x4dfd48=_0x39aa38['indexOf'](_0x4dfd48);}for(var _0x3aea48=0x0,_0x434ede=_0x4ff0dc['length'];_0x3aea48<_0x434ede;_0x3aea48++){_0x96ff77+='%'+('00'+_0x4ff0dc['charCodeAt'](_0x3aea48)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x96ff77);};_0x41dc['FIPnkI']=_0x39c058,_0x41dc['TYHCIt']={},_0x41dc['IGYCUw']=!![];}var _0x2ab67d=_0x3d33ef[0x0],_0x29b370=_0x26fc37+_0x2ab67d,_0x31367d=_0x41dc['TYHCIt'][_0x29b370];return!_0x31367d?(_0x41dc93=_0x41dc['FIPnkI'](_0x41dc93),_0x41dc['TYHCIt'][_0x29b370]=_0x41dc93):_0x41dc93=_0x31367d,_0x41dc93;}function _0x3d33(){var _0x5096ab=['mZyYmti1oezAr0jcDG','mZe0mJDor2HOz1K','mZmWndK3nvfKAK9XCq','mtq5mZKZnNbuCe5wta','ofbpvKDYqG','nJuXntG3nfzpr2nwsW','mwnSuLHJrW','n09oqNjRsG','mJC0mtGYnKLyENLkCW','ndCZmJi5nMnMrMPHra','mJGYmfLxqKjPsq'];_0x3d33=function(){return _0x5096ab;};return _0x3d33();}(function(_0xee138e,_0x374eb9){var _0x39d96f=_0x41dc,_0x5a545c=_0xee138e();while(!![]){try{var _0x4a565a=parseInt(_0x39d96f(0x11a))/0x1*(-parseInt(_0x39d96f(0x11c))/0x2)+-parseInt(_0x39d96f(0x11d))/0x3+parseInt(_0x39d96f(0x118))/0x4*(parseInt(_0x39d96f(0x116))/0x5)+parseInt(_0x39d96f(0x119))/0x6+-parseInt(_0x39d96f(0x11b))/0x7*(-parseInt(_0x39d96f(0x117))/0x8)+parseInt(_0x39d96f(0x11f))/0x9+parseInt(_0x39d96f(0x11e))/0xa*(parseInt(_0x39d96f(0x120))/0xb);if(_0x4a565a===_0x374eb9)break;else _0x5a545c['push'](_0x5a545c['shift']());}catch(_0x4f7499){_0x5a545c['push'](_0x5a545c['shift']());}}}(_0x3d33,0xd0982));export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';export{RES_CODE}from'../routing/base';export{buildExcelBuffer,excelFilename,excelResponseHeaders}from'./excel';
@@ -1 +1 @@
1
- const _0x2d3177=_0x353b;(function(_0x591699,_0x12ef41){const _0x357a06=_0x353b,_0x26c4b1=_0x591699();while(!![]){try{const _0x3a184b=-parseInt(_0x357a06(0x138))/0x1+-parseInt(_0x357a06(0x13c))/0x2+-parseInt(_0x357a06(0x133))/0x3*(-parseInt(_0x357a06(0x139))/0x4)+-parseInt(_0x357a06(0x137))/0x5+parseInt(_0x357a06(0x141))/0x6*(-parseInt(_0x357a06(0x12f))/0x7)+-parseInt(_0x357a06(0x142))/0x8+parseInt(_0x357a06(0x132))/0x9;if(_0x3a184b===_0x12ef41)break;else _0x26c4b1['push'](_0x26c4b1['shift']());}catch(_0x5cae04){_0x26c4b1['push'](_0x26c4b1['shift']());}}}(_0x5e03,0xcee0e));function _0x353b(_0x15710f,_0xfdb332){_0x15710f=_0x15710f-0x12f;const _0x5e03d9=_0x5e03();let _0x353b2b=_0x5e03d9[_0x15710f];if(_0x353b['evSuzJ']===undefined){var _0x9a16db=function(_0x154ca4){const _0x13c7e7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x33aa90='',_0x143d2e='';for(let _0x516bc5=0x0,_0x58ce9a,_0x1238c7,_0x2532bd=0x0;_0x1238c7=_0x154ca4['charAt'](_0x2532bd++);~_0x1238c7&&(_0x58ce9a=_0x516bc5%0x4?_0x58ce9a*0x40+_0x1238c7:_0x1238c7,_0x516bc5++%0x4)?_0x33aa90+=String['fromCharCode'](0xff&_0x58ce9a>>(-0x2*_0x516bc5&0x6)):0x0){_0x1238c7=_0x13c7e7['indexOf'](_0x1238c7);}for(let _0x488bbc=0x0,_0x316181=_0x33aa90['length'];_0x488bbc<_0x316181;_0x488bbc++){_0x143d2e+='%'+('00'+_0x33aa90['charCodeAt'](_0x488bbc)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x143d2e);};_0x353b['JwKXKk']=_0x9a16db,_0x353b['ckXNmj']={},_0x353b['evSuzJ']=!![];}const _0x21df95=_0x5e03d9[0x0],_0x449144=_0x15710f+_0x21df95,_0x573b9c=_0x353b['ckXNmj'][_0x449144];return!_0x573b9c?(_0x353b2b=_0x353b['JwKXKk'](_0x353b2b),_0x353b['ckXNmj'][_0x449144]=_0x353b2b):_0x353b2b=_0x573b9c,_0x353b2b;}export function deepTree(_0x33aa90,_0x143d2e=_0x2d3177(0x140)){const _0x3d0424=_0x2d3177,_0x516bc5=new Map();for(const _0x2532bd of _0x33aa90){if(_0x2532bd['id']==null)continue;_0x516bc5[_0x3d0424(0x13f)](_0x2532bd['id'],{..._0x2532bd,'children':[]});}const _0x58ce9a=[];for(const _0x488bbc of _0x516bc5['values']()){const _0x316181=_0x488bbc[_0x3d0424(0x131)];_0x316181!=null&&_0x316181!==''&&_0x516bc5[_0x3d0424(0x134)](_0x316181)?_0x516bc5[_0x3d0424(0x13d)](_0x316181)[_0x3d0424(0x13b)][_0x3d0424(0x130)](_0x488bbc):_0x58ce9a[_0x3d0424(0x130)](_0x488bbc);}const _0x1238c7=_0x4e722d=>{const _0x1be4c8=_0x3d0424;_0x4e722d[_0x1be4c8(0x135)]((_0x2b6dce,_0x4b3b59)=>{const _0x1cea17=_0x1be4c8,_0x392b4e=_0x2b6dce[_0x1cea17(0x13a)]??0x0,_0x51a04f=_0x4b3b59[_0x1cea17(0x13a)]??0x0,_0x1975c2=_0x143d2e===_0x1cea17(0x136)?_0x51a04f-_0x392b4e:_0x392b4e-_0x51a04f;return _0x1975c2||Number(_0x2b6dce['id'])-Number(_0x4b3b59['id']);});for(const _0x37c840 of _0x4e722d)if(_0x37c840[_0x1be4c8(0x13b)]?.['length'])_0x1238c7(_0x37c840[_0x1be4c8(0x13b)]);};return _0x1238c7(_0x58ce9a),_0x58ce9a;}export function flattenTree(_0x2f5d55,_0x157707,_0x355c4b=0x0,_0xef9973=[]){const _0x53f032=_0x2d3177;for(const _0x313e0e of _0x2f5d55){const _0x13090e=_0x313e0e['children']||[];_0xef9973[_0x53f032(0x130)]({..._0x313e0e,'depth':_0x355c4b,'hasChildren':_0x13090e[_0x53f032(0x13e)]>0x0});if(_0x13090e[_0x53f032(0x13e)]&&_0x157707[_0x53f032(0x134)](_0x313e0e['id']))flattenTree(_0x13090e,_0x157707,_0x355c4b+0x1,_0xef9973);}return _0xef9973;}function _0x5e03(){const _0x6151ff=['C2v0','yxnJ','nNDryLnnEq','mta3nZq1odrevfnvzLu','mZe4nJqYmuPctNvMBW','ChvZAa','CgfYzw50swq','mZmXnZy3nZjMwgLcA0O','mtmYD211DhjS','AgfZ','C29YDa','zgvZyW','mty2odC0mhnKBhr6wq','nde4ntuZzejZDNbq','mta1odu2ugD2uuXI','B3jKzxjoDw0','y2HPBgrYzw4','mJG5oda0nLv4yKT0Dq','z2v0','BgvUz3rO'];_0x5e03=function(){return _0x6151ff;};return _0x5e03();}
1
+ const _0x557f43=_0x1892;function _0x1892(_0x4d4020,_0x379a68){_0x4d4020=_0x4d4020-0x1af;const _0x54c7b6=_0x54c7();let _0x1892ec=_0x54c7b6[_0x4d4020];if(_0x1892['JElKWK']===undefined){var _0x93447a=function(_0x50938e){const _0x1cdd9f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x46e496='',_0x2aba72='';for(let _0x56ce17=0x0,_0x46cf83,_0x301528,_0x597cb8=0x0;_0x301528=_0x50938e['charAt'](_0x597cb8++);~_0x301528&&(_0x46cf83=_0x56ce17%0x4?_0x46cf83*0x40+_0x301528:_0x301528,_0x56ce17++%0x4)?_0x46e496+=String['fromCharCode'](0xff&_0x46cf83>>(-0x2*_0x56ce17&0x6)):0x0){_0x301528=_0x1cdd9f['indexOf'](_0x301528);}for(let _0x53487c=0x0,_0x7fb25f=_0x46e496['length'];_0x53487c<_0x7fb25f;_0x53487c++){_0x2aba72+='%'+('00'+_0x46e496['charCodeAt'](_0x53487c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2aba72);};_0x1892['ZeTeVS']=_0x93447a,_0x1892['qZJpVA']={},_0x1892['JElKWK']=!![];}const _0x5978ea=_0x54c7b6[0x0],_0x571272=_0x4d4020+_0x5978ea,_0x32d244=_0x1892['qZJpVA'][_0x571272];return!_0x32d244?(_0x1892ec=_0x1892['ZeTeVS'](_0x1892ec),_0x1892['qZJpVA'][_0x571272]=_0x1892ec):_0x1892ec=_0x32d244,_0x1892ec;}(function(_0x4f8902,_0x59a638){const _0x427f30=_0x1892,_0x118fed=_0x4f8902();while(!![]){try{const _0x1c6cb4=-parseInt(_0x427f30(0x1bc))/0x1+-parseInt(_0x427f30(0x1c2))/0x2+-parseInt(_0x427f30(0x1b3))/0x3*(parseInt(_0x427f30(0x1b6))/0x4)+parseInt(_0x427f30(0x1b2))/0x5*(-parseInt(_0x427f30(0x1c0))/0x6)+parseInt(_0x427f30(0x1bf))/0x7*(-parseInt(_0x427f30(0x1b0))/0x8)+parseInt(_0x427f30(0x1b8))/0x9+parseInt(_0x427f30(0x1bd))/0xa;if(_0x1c6cb4===_0x59a638)break;else _0x118fed['push'](_0x118fed['shift']());}catch(_0x35bb34){_0x118fed['push'](_0x118fed['shift']());}}}(_0x54c7,0xc8d65));function _0x54c7(){const _0x11024c=['otGYmfzNqLLWsG','mZu4nJe5n1nYtLr6zq','yxnJ','ChvZAa','ngPbrwjJzq','CgfYzw50swq','mtm2otC5mvzjAvL5Aq','C2v0','DMfSDwvZ','AgfZ','nti4mtC2sxfpyLLi','nta4mZqYmJbxDMH4Axq','y2HPBgrYzw4','mZyWndGWnhzosMDiDa','mJa3nMPNEeHLDG','C29YDa','mJK4otGWmLvHueHeBG','BgvUz3rO','B3jKzxjoDw0','ofLWAgfVyW','z2v0'];_0x54c7=function(){return _0x11024c;};return _0x54c7();}export function deepTree(_0x46e496,_0x2aba72=_0x557f43(0x1b4)){const _0x3b89a0=_0x557f43,_0x56ce17=new Map();for(const _0x597cb8 of _0x46e496){if(_0x597cb8['id']==null)continue;_0x56ce17[_0x3b89a0(0x1b9)](_0x597cb8['id'],{..._0x597cb8,'children':[]});}const _0x46cf83=[];for(const _0x53487c of _0x56ce17[_0x3b89a0(0x1ba)]()){const _0x7fb25f=_0x53487c[_0x3b89a0(0x1b7)];_0x7fb25f!=null&&_0x7fb25f!==''&&_0x56ce17[_0x3b89a0(0x1bb)](_0x7fb25f)?_0x56ce17[_0x3b89a0(0x1b1)](_0x7fb25f)[_0x3b89a0(0x1be)][_0x3b89a0(0x1b5)](_0x53487c):_0x46cf83['push'](_0x53487c);}const _0x301528=_0x19821c=>{const _0x2aa4a6=_0x3b89a0;_0x19821c[_0x2aa4a6(0x1c1)]((_0xafa4c5,_0x5a8be8)=>{const _0x33bd0f=_0x2aa4a6,_0x38544e=_0xafa4c5['orderNum']??0x0,_0x4da066=_0x5a8be8[_0x33bd0f(0x1af)]??0x0,_0x144cd5=_0x2aba72==='desc'?_0x4da066-_0x38544e:_0x38544e-_0x4da066;return _0x144cd5||Number(_0xafa4c5['id'])-Number(_0x5a8be8['id']);});for(const _0x204e2b of _0x19821c)if(_0x204e2b[_0x2aa4a6(0x1be)]?.[_0x2aa4a6(0x1c3)])_0x301528(_0x204e2b[_0x2aa4a6(0x1be)]);};return _0x301528(_0x46cf83),_0x46cf83;}export function flattenTree(_0x5e937a,_0x191028,_0x5864d3=0x0,_0xfa3715=[]){const _0x50df96=_0x557f43;for(const _0x4af8ac of _0x5e937a){const _0x2a4a5e=_0x4af8ac[_0x50df96(0x1be)]||[];_0xfa3715[_0x50df96(0x1b5)]({..._0x4af8ac,'depth':_0x5864d3,'hasChildren':_0x2a4a5e['length']>0x0});if(_0x2a4a5e[_0x50df96(0x1c3)]&&_0x191028[_0x50df96(0x1bb)](_0x4af8ac['id']))flattenTree(_0x2a4a5e,_0x191028,_0x5864d3+0x1,_0xfa3715);}return _0xfa3715;}
@@ -1,7 +1,17 @@
1
1
  import type { ContextData } from '../../../typings/context/data';
2
2
  export type { ContextData };
3
+ /** 从请求头 / 连接解析客户端 IP(不丢弃本机与内网) */
4
+ export declare function resolveClientIp(request: Request, server?: {
5
+ requestIP?: (request: Request) => {
6
+ address?: string;
7
+ } | null;
8
+ } | null): string;
3
9
  /** @internal ALS 插件:从 Request 初始化上下文 */
4
- export declare function initContextFromRequest(request: Request): ContextData;
10
+ export declare function initContextFromRequest(request: Request, server?: {
11
+ requestIP?: (request: Request) => {
12
+ address?: string;
13
+ } | null;
14
+ } | null): ContextData;
5
15
  /** @internal ALS 插件:在指定上下文中执行 */
6
16
  export declare function enterContext<T>(ctx: ContextData, fn: () => T): T;
7
17
  /** @internal 进入请求上下文(onRequest 用,覆盖后续异步链) */
@@ -1,7 +1,7 @@
1
1
  import type { AnyElysia } from 'elysia';
2
2
  /**
3
- * 内置基建:Db → Cache → Auth
4
- * 约定路径:src/lib/{db,cache,auth}/index.ts
3
+ * 内置基建:Db → Cache → Queue → Auth
4
+ * 约定路径:src/lib/{db,cache,queue,auth}/index.ts
5
5
  */
6
6
  export declare function bootstrapHostInfra(): Promise<void>;
7
7
  /** IoC 就绪后:定时任务(src/lib/task/index.ts) */
@@ -11,7 +11,7 @@ export declare function bootstrapHostPlugins(): Promise<void>;
11
11
  /** IoC 就绪后:业务模块 .vome(src/lib/module/index.ts) */
12
12
  export declare function bootstrapHostModules(): Promise<void>;
13
13
  export declare function shutdownHostTasks(): Promise<void>;
14
- /** 关闭顺序:Task → Cache → Db */
14
+ /** 关闭顺序:Task → Queue → Cache → Db */
15
15
  export declare function shutdownHostInfra(): Promise<void>;
16
16
  /**
17
17
  * 内置鉴权中间件:webAuth + adminAuth;请求监控 requestLog
@@ -24,4 +24,6 @@ export type ApiResult<T = unknown> = ApiSuccess<T> | ApiFail;
24
24
  export declare class BaseController {
25
25
  ok<T = unknown>(data?: T): ApiSuccess<T | null>;
26
26
  fail(message?: string, code?: number): ApiFail;
27
+ /** 返回 Excel 文件下载响应 */
28
+ excel(buffer: Uint8Array, filename?: string): Response;
27
29
  }
@@ -5,6 +5,8 @@
5
5
  * 宿主须:`import 'reflect-metadata'`,并开启 `experimentalDecorators` + `emitDecoratorMetadata`。
6
6
  */
7
7
  export { App, appendInjectMeta, BaseController, Body, CommException, Context, Controller, Delete, Eps, isEpsEnabled, Get, getEnv, Inject, Ioc, isCommException, listControllers, listProviders, Logger, Param, Patch, Post, Provide, Public, Perms, IgnorePerms, Put, Query, RES_CODE, scanFiles, ScopeEnum, Use, vome, VomeConfig, DbStore, baseColumns, BASE_COLUMN_COMMENTS, entitySchemas, columnComments, getColumnComments, syncColumnCommentsToPg, Repository, getRepository, InjectRepository, BaseService, q, attachCrudRoutes, isTenantEnabled, noTenant, normalizeHost, resolveTenantScope, tableHasDepartmentId, resolveDataScope, applyDataScopeWhere, applyRowScopes, noDataScope, BasePlugin, loadPluginClass, readPluginScript, pDataPath, pPluginPath, pModulesPath, pModulePath, ModuleRegistry, loadModuleHandlers, microApps, createModuleGateway, defineAuthMacro, } from '../core';
8
+ export { buildExcelBuffer, excelFilename, excelResponseHeaders, } from '../shared/excel';
9
+ export type { ExcelColumn, ExcelFormatCell } from '../shared/excel';
8
10
  export type { ApiFail, ApiResult, ApiSuccess, ClassToken, ContextData, ControllerCrudOptions, ControllerMeta, ControllerRouteMeta, ControllerSide, CrudApi, CrudBeforeFn, CrudRegistrar, CrudUpsertMode, CrudModifyType, CrudWriteOptions, CrudTrashQueryOptions, CrudDeleteOptions, PageQuery, PagePagination, PageResult, PluginManifest, PluginInfo, PluginPayload, PluginCheckResult, ModuleRouteDef, ModuleMenuDef, ModuleManifest, ModuleHandlerCtx, ModuleHandler, ModuleInstalled, EpsApiItem, EpsColumn, EpsEntity, EpsModuleMap, HttpMethod, InjectionToken, InjectMeta, InsertParamFn, ProvideOptions, ProviderToken, QueryExtendFn, QueryExtendQb, QueryFieldRef, QueryJoin, QueryJoinType, QueryOp, QueryOpCtx, QueryWhereFn, QueryWhereResult, ResCode, RouteMiddleware, RouteParamMeta, RouteParamSource, ScanOptions, } from '../core';
9
11
  /** 与 package.json version 同步 */
10
12
  export declare const version: string;
@@ -0,0 +1,13 @@
1
+ export type ExcelColumn = {
2
+ prop: string;
3
+ label: string;
4
+ };
5
+ export type ExcelFormatCell = (prop: string, row: Record<string, unknown>) => string;
6
+ /** 二维表 → xlsx 二进制 */
7
+ export declare function buildExcelBuffer(columns: ExcelColumn[], rows: Record<string, unknown>[], formatCell?: ExcelFormatCell): Uint8Array;
8
+ export declare function excelFilename(name: string): string;
9
+ /** Service 下载响应头 */
10
+ export declare function excelResponseHeaders(filename: string): {
11
+ 'Content-Type': string;
12
+ 'Content-Disposition': string;
13
+ };
@@ -6,3 +6,5 @@ export { deepTree, flattenTree } from './tree';
6
6
  export type { Loose } from '../../typings/common';
7
7
  export type { PageQuery, PagePagination, PageResult } from '../../typings/comm/page';
8
8
  export { RES_CODE, type ResCode, type ApiSuccess, type ApiFail, type ApiResult, } from '../routing/base';
9
+ export { buildExcelBuffer, excelFilename, excelResponseHeaders, } from './excel';
10
+ export type { ExcelColumn, ExcelFormatCell } from './excel';
@@ -23,6 +23,8 @@ export type QueryFieldRange = {
23
23
  min: string;
24
24
  max: string;
25
25
  type: FieldRangeType;
26
+ /** 覆盖实体注释,用于搜索 label / placeholder 前缀 */
27
+ label?: string;
26
28
  /** true:后端支持区间,admin 不自动出控件 */
27
29
  none?: boolean;
28
30
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vome-core",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "description": "Vome framework — shared + Bun/Elysia server + Vue admin",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -144,6 +144,7 @@
144
144
  "@bogeychan/elysia-logger": "^0.1.10",
145
145
  "@elysiajs/openapi": "^1.4.15",
146
146
  "pino": "^10.3.1",
147
- "pino-pretty": "^13.1.3"
147
+ "pino-pretty": "^13.1.3",
148
+ "xlsx": "^0.18.5"
148
149
  }
149
150
  }
@@ -0,0 +1,13 @@
1
+ export type ExcelColumn = {
2
+ prop: string;
3
+ label: string;
4
+ };
5
+ export type ExcelFormatCell = (prop: string, row: Record<string, unknown>) => string;
6
+ /** 二维表 → xlsx 二进制 */
7
+ export declare function buildExcelBuffer(columns: ExcelColumn[], rows: Record<string, unknown>[], formatCell?: ExcelFormatCell): Uint8Array;
8
+ export declare function excelFilename(name: string): string;
9
+ /** Service 下载响应头 */
10
+ export declare function excelResponseHeaders(filename: string): {
11
+ 'Content-Type': string;
12
+ 'Content-Disposition': string;
13
+ };
@@ -0,0 +1,46 @@
1
+ import * as XLSX from 'xlsx'
2
+
3
+ export type ExcelColumn = {
4
+ prop: string
5
+ label: string
6
+ }
7
+
8
+ export type ExcelFormatCell = (
9
+ prop: string,
10
+ row: Record<string, unknown>,
11
+ ) => string
12
+
13
+ /** 二维表 → xlsx 二进制 */
14
+ export function buildExcelBuffer(
15
+ columns: ExcelColumn[],
16
+ rows: Record<string, unknown>[],
17
+ formatCell?: ExcelFormatCell,
18
+ ): Uint8Array {
19
+ const headers = columns.map((c) => c.label || c.prop)
20
+ const body = rows.map((row) =>
21
+ columns.map((col) => {
22
+ if (formatCell) return formatCell(col.prop, row)
23
+ const val = row[col.prop]
24
+ if (val == null) return ''
25
+ return String(val)
26
+ }),
27
+ )
28
+ const sheet = XLSX.utils.aoa_to_sheet([headers, ...body])
29
+ const book = XLSX.utils.book_new()
30
+ XLSX.utils.book_append_sheet(book, sheet, 'Sheet1')
31
+ return XLSX.write(book, { bookType: 'xlsx', type: 'array' }) as Uint8Array
32
+ }
33
+
34
+ export function excelFilename(name: string) {
35
+ return name.endsWith('.xlsx') ? name : `${name}.xlsx`
36
+ }
37
+
38
+ /** Service 下载响应头 */
39
+ export function excelResponseHeaders(filename: string) {
40
+ const file = excelFilename(filename)
41
+ return {
42
+ 'Content-Type':
43
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
44
+ 'Content-Disposition': `attachment; filename*=UTF-8''${encodeURIComponent(file)}`,
45
+ }
46
+ }
@@ -12,3 +12,9 @@ export {
12
12
  type ApiFail,
13
13
  type ApiResult,
14
14
  } from '../routing/base'
15
+ export {
16
+ buildExcelBuffer,
17
+ excelFilename,
18
+ excelResponseHeaders,
19
+ } from './excel'
20
+ export type { ExcelColumn, ExcelFormatCell } from './excel'
@@ -180,6 +180,12 @@ export type CrudUpsertOptions = {
180
180
  title?: string;
181
181
  /** 显式 false 强制隐藏确定;未设时仍按 info 模式自动隐藏 */
182
182
  confirm?: boolean;
183
+ /** 显式 false 隐藏关闭;默认 true */
184
+ close?: boolean;
185
+ /** 弹窗高度,如 800 / '800px';最高 800px */
186
+ height?: string | number;
187
+ confirmText?: string;
188
+ closeText?: string;
183
189
  };
184
190
  sync?: boolean;
185
191
  onOpen?: (data: Record<string, unknown>) => void;
@@ -180,6 +180,12 @@ export type CrudUpsertOptions = {
180
180
  title?: string
181
181
  /** 显式 false 强制隐藏确定;未设时仍按 info 模式自动隐藏 */
182
182
  confirm?: boolean
183
+ /** 显式 false 隐藏关闭;默认 true */
184
+ close?: boolean
185
+ /** 弹窗高度,如 800 / '800px';最高 800px */
186
+ height?: string | number
187
+ confirmText?: string
188
+ closeText?: string
183
189
  }
184
190
  sync?: boolean
185
191
  onOpen?: (data: Record<string, unknown>) => void