vome-core 0.0.19 → 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 (45) hide show
  1. package/dist/admin/config/plugin-dev.js +1 -1
  2. package/dist/admin/crud/config.js +1 -1
  3. package/dist/admin/crud/confirm.js +1 -1
  4. package/dist/admin/crud/dict.js +1 -1
  5. package/dist/admin/crud/index.d.ts +1 -0
  6. package/dist/admin/crud/index.js +1 -1
  7. package/dist/admin/crud/key.js +1 -1
  8. package/dist/admin/crud/mitt.js +1 -1
  9. package/dist/admin/crud/plugins.js +1 -1
  10. package/dist/admin/crud/span.js +1 -1
  11. package/dist/admin/crud/style.js +1 -1
  12. package/dist/admin/crud/validate.js +1 -1
  13. package/dist/admin/crud/vm-dialog.vue +1 -1
  14. package/dist/admin/crud/vm-export-btn.vue +169 -0
  15. package/dist/admin/crud/vm-search.vue +18 -3
  16. package/dist/admin/crud/vm-toolbar.vue +20 -0
  17. package/dist/admin/crud/vm-upsert.vue +163 -33
  18. package/dist/admin/directives/perm.js +1 -1
  19. package/dist/admin/hooks/useUpload.js +1 -1
  20. package/dist/admin/lib/browser.js +1 -1
  21. package/dist/admin/lib/cn.js +1 -1
  22. package/dist/admin/lib/dialog-float.js +1 -1
  23. package/dist/admin/lib/export-excel.d.ts +11 -0
  24. package/dist/admin/lib/export-excel.js +1 -0
  25. package/dist/admin/lib/menu.js +1 -1
  26. package/dist/admin/lib/tree.js +1 -1
  27. package/dist/admin/lib/upload.js +1 -1
  28. package/dist/index.js +1 -1
  29. package/dist/server/index.js +1 -1
  30. package/dist/shared/excel.d.ts +13 -0
  31. package/dist/shared/excel.js +1 -0
  32. package/dist/shared/index.js +1 -1
  33. package/dist/shared/tree.js +1 -1
  34. package/dist/src/core/context/index.d.ts +11 -1
  35. package/dist/src/routing/base.d.ts +2 -0
  36. package/dist/src/server/index.d.ts +2 -0
  37. package/dist/src/shared/excel.d.ts +13 -0
  38. package/dist/src/shared/index.d.ts +2 -0
  39. package/dist/typings/routing/crud.d.ts +2 -0
  40. package/package.json +3 -2
  41. package/src/shared/excel.d.ts +13 -0
  42. package/src/shared/excel.ts +46 -0
  43. package/src/shared/index.ts +6 -0
  44. package/typings/admin/comm/crud.d.ts +6 -0
  45. 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(_0x53f6a4,_0x320314){var _0x4c990a=_0x5723,_0x1f7f47=_0x53f6a4();while(!![]){try{var _0x5e0bda=-parseInt(_0x4c990a(0x1f1))/0x1*(parseInt(_0x4c990a(0x1ef))/0x2)+parseInt(_0x4c990a(0x1f3))/0x3*(-parseInt(_0x4c990a(0x1ee))/0x4)+-parseInt(_0x4c990a(0x1f5))/0x5+-parseInt(_0x4c990a(0x1f2))/0x6*(-parseInt(_0x4c990a(0x1ed))/0x7)+parseInt(_0x4c990a(0x1ea))/0x8*(-parseInt(_0x4c990a(0x1f4))/0x9)+-parseInt(_0x4c990a(0x1ec))/0xa*(parseInt(_0x4c990a(0x1eb))/0xb)+parseInt(_0x4c990a(0x1f0))/0xc;if(_0x5e0bda===_0x320314)break;else _0x1f7f47['push'](_0x1f7f47['shift']());}catch(_0x49f6ee){_0x1f7f47['push'](_0x1f7f47['shift']());}}}(_0x85a3,0x38ea4));export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';function _0x85a3(){var _0x44a72=['mKXutMfZyW','mtG5mJG2nJHXBM9xrfq','mZG1mtiZBfPVte5Z','ndm3nZCYtwr5tu1u','nMPUu3P2CG','mZC4zK56tKzx','odyXntGWBfbPA05t','mZmZnJHtz3nZDMm','mtaWmtmZsNDtqun4','ndqWDe1cEgXi','mtrAr2juCNq','nZe0mdCYBNrdBNjn'];_0x85a3=function(){return _0x44a72;};return _0x85a3();}function _0x5723(_0x1701d5,_0x4c1361){_0x1701d5=_0x1701d5-0x1ea;var _0x85a363=_0x85a3();var _0x5723a7=_0x85a363[_0x1701d5];if(_0x5723['sJCvyR']===undefined){var _0x1439da=function(_0x166c78){var _0x5cd1e5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0xe1d4fd='',_0x84e382='';for(var _0xb2d7d5=0x0,_0x1e113d,_0x3e9c5a,_0x1dc635=0x0;_0x3e9c5a=_0x166c78['charAt'](_0x1dc635++);~_0x3e9c5a&&(_0x1e113d=_0xb2d7d5%0x4?_0x1e113d*0x40+_0x3e9c5a:_0x3e9c5a,_0xb2d7d5++%0x4)?_0xe1d4fd+=String['fromCharCode'](0xff&_0x1e113d>>(-0x2*_0xb2d7d5&0x6)):0x0){_0x3e9c5a=_0x5cd1e5['indexOf'](_0x3e9c5a);}for(var _0x6bad4b=0x0,_0x54f852=_0xe1d4fd['length'];_0x6bad4b<_0x54f852;_0x6bad4b++){_0x84e382+='%'+('00'+_0xe1d4fd['charCodeAt'](_0x6bad4b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x84e382);};_0x5723['xsuaJi']=_0x1439da,_0x5723['mGyNlZ']={},_0x5723['sJCvyR']=!![];}var _0x2dbfa2=_0x85a363[0x0],_0x3089e2=_0x1701d5+_0x2dbfa2,_0x525eb6=_0x5723['mGyNlZ'][_0x3089e2];return!_0x525eb6?(_0x5723a7=_0x5723['xsuaJi'](_0x5723a7),_0x5723['mGyNlZ'][_0x3089e2]=_0x5723a7):_0x5723a7=_0x525eb6,_0x5723a7;}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 _0x3db6a6=_0x54d7;function _0x51fc(){const _0x186bad=['y2HPBgrYzw4','zgvZyW','yxnJ','AgfZ','ntq4odK5mJbJuKL0y2e','C29YDa','ndyZnti3mKj0C0juCW','nhnru2jpsq','ChvZAa','BgvUz3rO','B3jKzxjoDw0','mZC4nZC1nNnfDffcBq','DMfSDwvZ','nJKZodffs2v0B08','CgfYzw50swq','mtrRuhfprgm','mtG3ntK2muv1tKnSAW','mJv1q05lwva','mJe5mJmZnfbAsuLfwq','mJK0mJe3mLrNyNjkvq'];_0x51fc=function(){return _0x186bad;};return _0x51fc();}function _0x54d7(_0x56cda3,_0x18c911){_0x56cda3=_0x56cda3-0xaf;const _0x51fc96=_0x51fc();let _0x54d79b=_0x51fc96[_0x56cda3];if(_0x54d7['cfRMgR']===undefined){var _0x3202f2=function(_0x20b4cb){const _0x81a90d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x55a8ec='',_0x364e40='';for(let _0x4f4958=0x0,_0x378587,_0x198f64,_0x5ee779=0x0;_0x198f64=_0x20b4cb['charAt'](_0x5ee779++);~_0x198f64&&(_0x378587=_0x4f4958%0x4?_0x378587*0x40+_0x198f64:_0x198f64,_0x4f4958++%0x4)?_0x55a8ec+=String['fromCharCode'](0xff&_0x378587>>(-0x2*_0x4f4958&0x6)):0x0){_0x198f64=_0x81a90d['indexOf'](_0x198f64);}for(let _0x1ae4b0=0x0,_0x5ec948=_0x55a8ec['length'];_0x1ae4b0<_0x5ec948;_0x1ae4b0++){_0x364e40+='%'+('00'+_0x55a8ec['charCodeAt'](_0x1ae4b0)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x364e40);};_0x54d7['nohwAe']=_0x3202f2,_0x54d7['xDGcjX']={},_0x54d7['cfRMgR']=!![];}const _0x3bf8dc=_0x51fc96[0x0],_0x522b71=_0x56cda3+_0x3bf8dc,_0xd5806a=_0x54d7['xDGcjX'][_0x522b71];return!_0xd5806a?(_0x54d79b=_0x54d7['nohwAe'](_0x54d79b),_0x54d7['xDGcjX'][_0x522b71]=_0x54d79b):_0x54d79b=_0xd5806a,_0x54d79b;}(function(_0x36a998,_0x535430){const _0x11e3f5=_0x54d7,_0x34463f=_0x36a998();while(!![]){try{const _0x535a3f=parseInt(_0x11e3f5(0xb6))/0x1+parseInt(_0x11e3f5(0xb1))/0x2+-parseInt(_0x11e3f5(0xb3))/0x3*(-parseInt(_0x11e3f5(0xc1))/0x4)+parseInt(_0x11e3f5(0xb7))/0x5*(parseInt(_0x11e3f5(0xb8))/0x6)+parseInt(_0x11e3f5(0xb5))/0x7*(parseInt(_0x11e3f5(0xc0))/0x8)+-parseInt(_0x11e3f5(0xb9))/0x9+-parseInt(_0x11e3f5(0xbe))/0xa;if(_0x535a3f===_0x535430)break;else _0x34463f['push'](_0x34463f['shift']());}catch(_0x319d2e){_0x34463f['push'](_0x34463f['shift']());}}}(_0x51fc,0xeb10d));export function deepTree(_0x55a8ec,_0x364e40=_0x3db6a6(0xbc)){const _0x2d6be7=_0x3db6a6,_0x4f4958=new Map();for(const _0x5ee779 of _0x55a8ec){if(_0x5ee779['id']==null)continue;_0x4f4958['set'](_0x5ee779['id'],{..._0x5ee779,'children':[]});}const _0x378587=[];for(const _0x1ae4b0 of _0x4f4958[_0x2d6be7(0xb2)]()){const _0x5ec948=_0x1ae4b0[_0x2d6be7(0xb4)];_0x5ec948!=null&&_0x5ec948!==''&&_0x4f4958['has'](_0x5ec948)?_0x4f4958['get'](_0x5ec948)[_0x2d6be7(0xba)][_0x2d6be7(0xc2)](_0x1ae4b0):_0x378587[_0x2d6be7(0xc2)](_0x1ae4b0);}const _0x198f64=_0x241a0c=>{const _0x2e34d0=_0x2d6be7;_0x241a0c[_0x2e34d0(0xbf)]((_0x44303f,_0xaddabe)=>{const _0x2ec564=_0x2e34d0,_0x613e6b=_0x44303f['orderNum']??0x0,_0x464405=_0xaddabe[_0x2ec564(0xb0)]??0x0,_0x568e24=_0x364e40===_0x2ec564(0xbb)?_0x464405-_0x613e6b:_0x613e6b-_0x464405;return _0x568e24||Number(_0x44303f['id'])-Number(_0xaddabe['id']);});for(const _0x25ad78 of _0x241a0c)if(_0x25ad78['children']?.[_0x2e34d0(0xaf)])_0x198f64(_0x25ad78['children']);};return _0x198f64(_0x378587),_0x378587;}export function flattenTree(_0x385f4e,_0x3124c3,_0x1675bf=0x0,_0x7dde34=[]){const _0x12971e=_0x3db6a6;for(const _0x47546a of _0x385f4e){const _0x1efde9=_0x47546a[_0x12971e(0xba)]||[];_0x7dde34[_0x12971e(0xc2)]({..._0x47546a,'depth':_0x1675bf,'hasChildren':_0x1efde9[_0x12971e(0xaf)]>0x0});if(_0x1efde9[_0x12971e(0xaf)]&&_0x3124c3[_0x12971e(0xbd)](_0x47546a['id']))flattenTree(_0x1efde9,_0x3124c3,_0x1675bf+0x1,_0x7dde34);}return _0x7dde34;}
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 用,覆盖后续异步链) */
@@ -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.19",
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