@sugarat/easypicker2-client 2.7.3 → 2.8.1
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/dist/assets/aria-legacy-B70JmEZA.js.map +1 -1
- package/dist/assets/aria-nkjrUMQ-.js.map +1 -1
- package/dist/assets/config-CDHxxo7b.js +2 -0
- package/dist/assets/config-CDHxxo7b.js.map +1 -0
- package/dist/assets/config-CnEgj70a.css +1 -0
- package/dist/assets/config-legacy-n3sQ5kGn.js +2 -0
- package/dist/assets/config-legacy-n3sQ5kGn.js.map +1 -0
- package/dist/assets/{data-analysis-Bnq_VWU8.js → data-analysis-DBnVKJmJ.js} +2 -2
- package/dist/assets/data-analysis-DBnVKJmJ.js.map +1 -0
- package/dist/assets/{data-analysis-legacy-_KcR253K.js → data-analysis-legacy-4qD1YhB2.js} +2 -2
- package/dist/assets/data-analysis-legacy-4qD1YhB2.js.map +1 -0
- package/dist/assets/{data-board-L3s5ouKd.js → data-board-DeJXppeB.js} +2 -2
- package/dist/assets/data-board-DeJXppeB.js.map +1 -0
- package/dist/assets/{data-board-legacy-BFxWeFnQ.js → data-board-legacy-8OJulkyJ.js} +2 -2
- package/dist/assets/data-board-legacy-8OJulkyJ.js.map +1 -0
- package/dist/assets/delete-filled-DvkAD61M.js +2 -0
- package/dist/assets/delete-filled-DvkAD61M.js.map +1 -0
- package/dist/assets/delete-filled-legacy-BhHT0v2W.js +2 -0
- package/dist/assets/delete-filled-legacy-BhHT0v2W.js.map +1 -0
- package/dist/assets/el-date-picker-BX8jtnY2.js +2 -0
- package/dist/assets/el-date-picker-BX8jtnY2.js.map +1 -0
- package/dist/assets/el-date-picker-legacy-iQW0501V.js +2 -0
- package/dist/assets/el-date-picker-legacy-iQW0501V.js.map +1 -0
- package/dist/assets/el-dropdown-item-BQ-7lFIb.js +2 -0
- package/dist/assets/el-dropdown-item-BQ-7lFIb.js.map +1 -0
- package/dist/assets/el-dropdown-item-legacy-D5N_3F3d.js +2 -0
- package/dist/assets/el-dropdown-item-legacy-D5N_3F3d.js.map +1 -0
- package/dist/assets/el-empty-BZNyAlA7.js +2 -0
- package/dist/assets/el-empty-BZNyAlA7.js.map +1 -0
- package/dist/assets/el-empty-C2yupmrg.css +1 -0
- package/dist/assets/el-empty-legacy--8JR0M1C.js +2 -0
- package/dist/assets/el-empty-legacy--8JR0M1C.js.map +1 -0
- package/dist/assets/el-input-number-C0Bp8kfg.js +2 -0
- package/dist/assets/el-input-number-C0Bp8kfg.js.map +1 -0
- package/dist/assets/el-input-number-CU7OpiYS.css +1 -0
- package/dist/assets/el-input-number-legacy-CaZROy3J.js +2 -0
- package/dist/assets/el-input-number-legacy-CaZROy3J.js.map +1 -0
- package/dist/assets/{el-loading-DNzUD85e.js → el-loading-DgUVClxn.js} +2 -2
- package/dist/assets/el-loading-DgUVClxn.js.map +1 -0
- package/dist/assets/el-loading-legacy-BpxkUp1m.js +2 -0
- package/dist/assets/el-loading-legacy-BpxkUp1m.js.map +1 -0
- package/dist/assets/el-pagination-DX6u100-.js +2 -0
- package/dist/assets/el-pagination-DX6u100-.js.map +1 -0
- package/dist/assets/el-pagination-legacy-BcfQQTNs.js +2 -0
- package/dist/assets/el-pagination-legacy-BcfQQTNs.js.map +1 -0
- package/dist/assets/el-scrollbar-D2RZSJkX.js +2 -0
- package/dist/assets/el-scrollbar-D2RZSJkX.js.map +1 -0
- package/dist/assets/el-scrollbar-DFu7lMno.css +1 -0
- package/dist/assets/el-scrollbar-legacy-CLEobATW.js +2 -0
- package/dist/assets/el-scrollbar-legacy-CLEobATW.js.map +1 -0
- package/dist/assets/el-select-DWyBOD47.js +2 -0
- package/dist/assets/el-select-DWyBOD47.js.map +1 -0
- package/dist/assets/el-select-Dm4tLYz8.css +1 -0
- package/dist/assets/el-select-legacy-Cvxrwg7z.js +2 -0
- package/dist/assets/el-select-legacy-Cvxrwg7z.js.map +1 -0
- package/dist/assets/el-switch-c6xoppF3.js +2 -0
- package/dist/assets/el-switch-c6xoppF3.js.map +1 -0
- package/dist/assets/el-switch-legacy-DCF_46l4.js +2 -0
- package/dist/assets/el-switch-legacy-DCF_46l4.js.map +1 -0
- package/dist/assets/el-tab-pane-DWJdeyqN.js +2 -0
- package/dist/assets/el-tab-pane-DWJdeyqN.js.map +1 -0
- package/dist/assets/{el-tab-pane-legacy-DMdhUCHY.js → el-tab-pane-legacy-Cgd5IxXQ.js} +2 -2
- package/dist/assets/el-tab-pane-legacy-Cgd5IxXQ.js.map +1 -0
- package/dist/assets/{el-table-column-tkbtgrcD.js → el-table-column-DdhVw628.js} +3 -3
- package/dist/assets/el-table-column-DdhVw628.js.map +1 -0
- package/dist/assets/el-table-column-legacy-D1aU2dQP.js +24 -0
- package/dist/assets/el-table-column-legacy-D1aU2dQP.js.map +1 -0
- package/dist/assets/el-tag-Bgje3_SF.css +1 -0
- package/dist/assets/el-tag-legacy-DxOZcEw1.js +2 -0
- package/dist/assets/el-tag-legacy-DxOZcEw1.js.map +1 -0
- package/dist/assets/el-tag-uk6aooq0.js +2 -0
- package/dist/assets/el-tag-uk6aooq0.js.map +1 -0
- package/dist/assets/el-upload-B2Zxm6X5.css +1 -0
- package/dist/assets/el-upload-BxExG7hd.js +2 -0
- package/dist/assets/el-upload-BxExG7hd.js.map +1 -0
- package/dist/assets/el-upload-legacy-D8KH6HBU.js +2 -0
- package/dist/assets/el-upload-legacy-D8KH6HBU.js.map +1 -0
- package/dist/assets/index--nCmso-n.js +2 -0
- package/dist/assets/index--nCmso-n.js.map +1 -0
- package/dist/assets/index-2qujr45D.js +2 -0
- package/dist/assets/index-2qujr45D.js.map +1 -0
- package/dist/assets/index-6fj8rr7z.js +2 -0
- package/dist/assets/index-6fj8rr7z.js.map +1 -0
- package/dist/assets/index-8vfFTV-B.css +1 -0
- package/dist/assets/index-B-yBTqWJ.js +2 -0
- package/dist/assets/index-B-yBTqWJ.js.map +1 -0
- package/dist/assets/index-BC_fnfOg.js +2 -0
- package/dist/assets/index-BC_fnfOg.js.map +1 -0
- package/dist/assets/{index-C4H-Ptjt.css → index-BDkChTag.css} +1 -1
- package/dist/assets/index-BDsN2eKB.js +2 -0
- package/dist/assets/index-BDsN2eKB.js.map +1 -0
- package/dist/assets/index-BSIRw8UD.js +2 -0
- package/dist/assets/index-BSIRw8UD.js.map +1 -0
- package/dist/assets/index-BSMNPGJ5.css +1 -0
- package/dist/assets/index-BVEIUX2D.js +2 -0
- package/dist/assets/index-BVEIUX2D.js.map +1 -0
- package/dist/assets/index-BVp20vyj.css +1 -0
- package/dist/assets/index-BcJxc1ki.css +1 -0
- package/dist/assets/index-BgihxBmj.css +1 -0
- package/dist/assets/index-BjSgvXxj.css +1 -0
- package/dist/assets/index-BmheqIC4.js +2 -0
- package/dist/assets/index-BmheqIC4.js.map +1 -0
- package/dist/assets/index-BrOLxzFM.js.map +1 -1
- package/dist/assets/{index-ehQnwCE_.css → index-Bxvzu7zF.css} +1 -1
- package/dist/assets/index-CFpIdG49.css +1 -0
- package/dist/assets/index-CKVj2mCd.js +2 -0
- package/dist/assets/index-CKVj2mCd.js.map +1 -0
- package/dist/assets/index-CLt64lxI.js +2 -0
- package/dist/assets/index-CLt64lxI.js.map +1 -0
- package/dist/assets/index-COI3CDfm.js +2 -0
- package/dist/assets/index-COI3CDfm.js.map +1 -0
- package/dist/assets/index-CQud0ONT.css +1 -0
- package/dist/assets/index-CkyNID7q.css +1 -0
- package/dist/assets/index-CsTsOuFs.js +2 -0
- package/dist/assets/index-CsTsOuFs.js.map +1 -0
- package/dist/assets/index-CsfbnGni.css +1 -0
- package/dist/assets/index-D5EKLT5I.js +2 -0
- package/dist/assets/index-D5EKLT5I.js.map +1 -0
- package/dist/assets/index-D94P-51I.css +1 -0
- package/dist/assets/index-DBQzOZB-.js +23 -0
- package/dist/assets/index-DBQzOZB-.js.map +1 -0
- package/dist/assets/index-DC08DNQQ.js +2 -0
- package/dist/assets/index-DC08DNQQ.js.map +1 -0
- package/dist/assets/index-DLuR61Hw.css +1 -0
- package/dist/assets/index-DT7ciPLb.js +2 -0
- package/dist/assets/index-DT7ciPLb.js.map +1 -0
- package/dist/assets/index-DYTxk2nM.js +2 -0
- package/dist/assets/index-DYTxk2nM.js.map +1 -0
- package/dist/assets/index-DbhWmXsj.js +40 -0
- package/dist/assets/index-DbhWmXsj.js.map +1 -0
- package/dist/assets/index-DcUtl6Nq.css +1 -0
- package/dist/assets/index-DpoyDAhf.js +2 -0
- package/dist/assets/index-DpoyDAhf.js.map +1 -0
- package/dist/assets/index-Ds7mlGo_.js +2 -0
- package/dist/assets/index-Ds7mlGo_.js.map +1 -0
- package/dist/assets/index-FISBGs_l.css +1 -0
- package/dist/assets/index-FkvPFOBZ.js +2 -0
- package/dist/assets/index-FkvPFOBZ.js.map +1 -0
- package/dist/assets/index-HJwe3MZ4.js +2 -0
- package/dist/assets/index-HJwe3MZ4.js.map +1 -0
- package/dist/assets/index-LKJh-8oZ.css +1 -0
- package/dist/assets/index-Q8b92C8V.css +1 -0
- package/dist/assets/index-legacy-0p9exu0M.js +2 -0
- package/dist/assets/index-legacy-0p9exu0M.js.map +1 -0
- package/dist/assets/index-legacy-2gZknrAr.js +2 -0
- package/dist/assets/index-legacy-2gZknrAr.js.map +1 -0
- package/dist/assets/index-legacy-AH8uXlwH.js +2 -0
- package/dist/assets/index-legacy-AH8uXlwH.js.map +1 -0
- package/dist/assets/index-legacy-BTvagK_v.js +2 -0
- package/dist/assets/index-legacy-BTvagK_v.js.map +1 -0
- package/dist/assets/index-legacy-BUrH0Ubh.js +2 -0
- package/dist/assets/index-legacy-BUrH0Ubh.js.map +1 -0
- package/dist/assets/index-legacy-BVk27mxb.js +2 -0
- package/dist/assets/index-legacy-BVk27mxb.js.map +1 -0
- package/dist/assets/index-legacy-BnfLqgKz.js +2 -0
- package/dist/assets/index-legacy-BnfLqgKz.js.map +1 -0
- package/dist/assets/index-legacy-BsWj1xV2.js +54 -0
- package/dist/assets/index-legacy-BsWj1xV2.js.map +1 -0
- package/dist/assets/index-legacy-Bvis80MO.js +2 -0
- package/dist/assets/index-legacy-Bvis80MO.js.map +1 -0
- package/dist/assets/index-legacy-BxqvVJh6.js +16 -0
- package/dist/assets/index-legacy-BxqvVJh6.js.map +1 -0
- package/dist/assets/index-legacy-C-gHf8SN.js.map +1 -1
- package/dist/assets/index-legacy-C8OALizf.js +2 -0
- package/dist/assets/index-legacy-C8OALizf.js.map +1 -0
- package/dist/assets/index-legacy-Ca1NdJPm.js +2 -0
- package/dist/assets/index-legacy-Ca1NdJPm.js.map +1 -0
- package/dist/assets/index-legacy-D3Gbb8pX.js +2 -0
- package/dist/assets/index-legacy-D3Gbb8pX.js.map +1 -0
- package/dist/assets/index-legacy-DFUJlpQR.js +2 -0
- package/dist/assets/index-legacy-DFUJlpQR.js.map +1 -0
- package/dist/assets/index-legacy-DNPnYZJW.js +2 -0
- package/dist/assets/index-legacy-DNPnYZJW.js.map +1 -0
- package/dist/assets/index-legacy-DaUa56O-.js +2 -0
- package/dist/assets/index-legacy-DaUa56O-.js.map +1 -0
- package/dist/assets/index-legacy-DqfRlqrq.js +2 -0
- package/dist/assets/index-legacy-DqfRlqrq.js.map +1 -0
- package/dist/assets/index-legacy-DyJmAPRK.js +2 -0
- package/dist/assets/index-legacy-DyJmAPRK.js.map +1 -0
- package/dist/assets/index-legacy-DziFQjpX.js +2 -0
- package/dist/assets/index-legacy-DziFQjpX.js.map +1 -0
- package/dist/assets/index-legacy-N9COO-uZ.js +2 -0
- package/dist/assets/index-legacy-N9COO-uZ.js.map +1 -0
- package/dist/assets/index-legacy-P9gt2mpu.js +2 -0
- package/dist/assets/index-legacy-P9gt2mpu.js.map +1 -0
- package/dist/assets/index-legacy-c8lop5xr.js +2 -0
- package/dist/assets/index-legacy-c8lop5xr.js.map +1 -0
- package/dist/assets/index-legacy-npRizjoU.js +2 -0
- package/dist/assets/index-legacy-npRizjoU.js.map +1 -0
- package/dist/assets/index-legacy-xL9mLEDR.js +2 -0
- package/dist/assets/index-legacy-xL9mLEDR.js.map +1 -0
- package/dist/assets/index-mtfctTgx.css +1 -0
- package/dist/assets/index-oKiyEdt0.js +2 -0
- package/dist/assets/index-oKiyEdt0.js.map +1 -0
- package/dist/assets/linkDialog-D30VnNS0.js +2 -0
- package/dist/assets/linkDialog-D30VnNS0.js.map +1 -0
- package/dist/assets/linkDialog-Dida934t.css +1 -0
- package/dist/assets/linkDialog-legacy-CCHpjX0B.js +2 -0
- package/dist/assets/linkDialog-legacy-CCHpjX0B.js.map +1 -0
- package/dist/assets/other-BiIe9Z0L.js +2 -0
- package/dist/assets/other-BiIe9Z0L.js.map +1 -0
- package/dist/assets/other-legacy-Bfm4KL87.js +2 -0
- package/dist/assets/other-legacy-Bfm4KL87.js.map +1 -0
- package/dist/assets/polyfills-legacy-DqO_DCwg.js +1 -0
- package/dist/assets/{refresh-DPuuDO9h.js → refresh-Cccf8YoS.js} +2 -2
- package/dist/assets/refresh-Cccf8YoS.js.map +1 -0
- package/dist/assets/{refresh-legacy-DOts-8Wc.js → refresh-legacy-BwFA7z7t.js} +2 -2
- package/dist/assets/refresh-legacy-BwFA7z7t.js.map +1 -0
- package/dist/assets/tip-Nu5QmDDd.js +2 -0
- package/dist/assets/tip-Nu5QmDDd.js.map +1 -0
- package/dist/assets/tip-legacy-D_0YSCxT.js +2 -0
- package/dist/assets/tip-legacy-D_0YSCxT.js.map +1 -0
- package/dist/assets/tipInfo-BPHCIpRm.css +1 -0
- package/dist/assets/tipInfo-D75KJpWg.js +2 -0
- package/dist/assets/tipInfo-D75KJpWg.js.map +1 -0
- package/dist/assets/tipInfo-legacy-CV235bKZ.js +2 -0
- package/dist/assets/tipInfo-legacy-CV235bKZ.js.map +1 -0
- package/dist/index.html +105 -128
- package/package.json +13 -34
- package/README.md +0 -86
- package/dist/assets/data-analysis-Bnq_VWU8.js.map +0 -1
- package/dist/assets/data-analysis-legacy-_KcR253K.js.map +0 -1
- package/dist/assets/data-board-L3s5ouKd.js.map +0 -1
- package/dist/assets/data-board-legacy-BFxWeFnQ.js.map +0 -1
- package/dist/assets/el-date-picker-legacy-Uk9x97L5.js +0 -2
- package/dist/assets/el-date-picker-legacy-Uk9x97L5.js.map +0 -1
- package/dist/assets/el-date-picker-mhY2RJMG.js +0 -2
- package/dist/assets/el-date-picker-mhY2RJMG.js.map +0 -1
- package/dist/assets/el-dialog-Cu2jwelC.css +0 -1
- package/dist/assets/el-dialog-PRccau6N.js +0 -2
- package/dist/assets/el-dialog-PRccau6N.js.map +0 -1
- package/dist/assets/el-dialog-legacy-BRLM43ZY.js +0 -2
- package/dist/assets/el-dialog-legacy-BRLM43ZY.js.map +0 -1
- package/dist/assets/el-dropdown-item-Cr71teRg.js +0 -2
- package/dist/assets/el-dropdown-item-Cr71teRg.js.map +0 -1
- package/dist/assets/el-dropdown-item-legacy-B0ufpHvy.js +0 -2
- package/dist/assets/el-dropdown-item-legacy-B0ufpHvy.js.map +0 -1
- package/dist/assets/el-form-item-Cc9R0dZ1.css +0 -1
- package/dist/assets/el-form-item-DOwM4Mv8.js +0 -2
- package/dist/assets/el-form-item-DOwM4Mv8.js.map +0 -1
- package/dist/assets/el-form-item-legacy-CvQy7syv.js +0 -2
- package/dist/assets/el-form-item-legacy-CvQy7syv.js.map +0 -1
- package/dist/assets/el-loading-DNzUD85e.js.map +0 -1
- package/dist/assets/el-loading-legacy-B3RLcjwN.js +0 -2
- package/dist/assets/el-loading-legacy-B3RLcjwN.js.map +0 -1
- package/dist/assets/el-pagination-iCicJonH.js +0 -2
- package/dist/assets/el-pagination-iCicJonH.js.map +0 -1
- package/dist/assets/el-pagination-legacy-Bf-Bzx7n.js +0 -2
- package/dist/assets/el-pagination-legacy-Bf-Bzx7n.js.map +0 -1
- package/dist/assets/el-progress-1hLO5hs0.js +0 -2
- package/dist/assets/el-progress-1hLO5hs0.js.map +0 -1
- package/dist/assets/el-progress-legacy-QmxDezwR.js +0 -2
- package/dist/assets/el-progress-legacy-QmxDezwR.js.map +0 -1
- package/dist/assets/el-progress-njCW9-w4.css +0 -1
- package/dist/assets/el-select-BSO0hXRI.css +0 -1
- package/dist/assets/el-select-CVjQdC39.js +0 -2
- package/dist/assets/el-select-CVjQdC39.js.map +0 -1
- package/dist/assets/el-select-legacy-DSGgSQYX.js +0 -2
- package/dist/assets/el-select-legacy-DSGgSQYX.js.map +0 -1
- package/dist/assets/el-switch-B76QvbJN.js +0 -2
- package/dist/assets/el-switch-B76QvbJN.js.map +0 -1
- package/dist/assets/el-switch-legacy-CHkEgavQ.js +0 -2
- package/dist/assets/el-switch-legacy-CHkEgavQ.js.map +0 -1
- package/dist/assets/el-tab-pane-BhVByOfe.js +0 -2
- package/dist/assets/el-tab-pane-BhVByOfe.js.map +0 -1
- package/dist/assets/el-tab-pane-legacy-DMdhUCHY.js.map +0 -1
- package/dist/assets/el-table-column-legacy-N_oU_-0P.js +0 -24
- package/dist/assets/el-table-column-legacy-N_oU_-0P.js.map +0 -1
- package/dist/assets/el-table-column-tkbtgrcD.js.map +0 -1
- package/dist/assets/index-3yen43So.js +0 -2
- package/dist/assets/index-3yen43So.js.map +0 -1
- package/dist/assets/index-5sS3uHi0.css +0 -1
- package/dist/assets/index-9zuSLjpa.js +0 -2
- package/dist/assets/index-9zuSLjpa.js.map +0 -1
- package/dist/assets/index-B-6zRvEX.js +0 -2
- package/dist/assets/index-B-6zRvEX.js.map +0 -1
- package/dist/assets/index-B5tZv3FB.css +0 -1
- package/dist/assets/index-BN1f1UM3.js +0 -2
- package/dist/assets/index-BN1f1UM3.js.map +0 -1
- package/dist/assets/index-BUmkgniE.js +0 -2
- package/dist/assets/index-BUmkgniE.js.map +0 -1
- package/dist/assets/index-BbfnoqK6.js +0 -2
- package/dist/assets/index-BbfnoqK6.js.map +0 -1
- package/dist/assets/index-BghihfR3.css +0 -1
- package/dist/assets/index-C3IckGNL.js +0 -2
- package/dist/assets/index-C3IckGNL.js.map +0 -1
- package/dist/assets/index-CYAf_OTx.js +0 -40
- package/dist/assets/index-CYAf_OTx.js.map +0 -1
- package/dist/assets/index-Cb6-p2hG.js +0 -2
- package/dist/assets/index-Cb6-p2hG.js.map +0 -1
- package/dist/assets/index-CbkKWoQA.css +0 -1
- package/dist/assets/index-CeWnhlkq.css +0 -1
- package/dist/assets/index-Cfg2jkVw.css +0 -1
- package/dist/assets/index-CkMvb3wF.css +0 -1
- package/dist/assets/index-Cl4G6EQO.js +0 -2
- package/dist/assets/index-Cl4G6EQO.js.map +0 -1
- package/dist/assets/index-CnbFxlpi.css +0 -1
- package/dist/assets/index-Cyb1OjRN.js +0 -2
- package/dist/assets/index-Cyb1OjRN.js.map +0 -1
- package/dist/assets/index-D2p3cWtM.css +0 -1
- package/dist/assets/index-D7aZxhM6.js +0 -2
- package/dist/assets/index-D7aZxhM6.js.map +0 -1
- package/dist/assets/index-DI41wbky.js +0 -2
- package/dist/assets/index-DI41wbky.js.map +0 -1
- package/dist/assets/index-DaSb9EV4.css +0 -1
- package/dist/assets/index-DcOjlpKI.js +0 -2
- package/dist/assets/index-DcOjlpKI.js.map +0 -1
- package/dist/assets/index-DjO-nUIS.js +0 -2
- package/dist/assets/index-DjO-nUIS.js.map +0 -1
- package/dist/assets/index-DnxF29eG.css +0 -1
- package/dist/assets/index-DrKX0cCg.js +0 -2
- package/dist/assets/index-DrKX0cCg.js.map +0 -1
- package/dist/assets/index-F3S0vKOW.js +0 -2
- package/dist/assets/index-F3S0vKOW.js.map +0 -1
- package/dist/assets/index-I78Ur1Md.js +0 -2
- package/dist/assets/index-I78Ur1Md.js.map +0 -1
- package/dist/assets/index-L0LtrfyP.js +0 -2
- package/dist/assets/index-L0LtrfyP.js.map +0 -1
- package/dist/assets/index-XNFQHmLL.css +0 -1
- package/dist/assets/index-dEAnfrhp.css +0 -1
- package/dist/assets/index-hhTdfxnD.css +0 -1
- package/dist/assets/index-lTmxAqnX.js +0 -2
- package/dist/assets/index-lTmxAqnX.js.map +0 -1
- package/dist/assets/index-legacy-BJNK4MqF.js +0 -2
- package/dist/assets/index-legacy-BJNK4MqF.js.map +0 -1
- package/dist/assets/index-legacy-BLlk8iq-.js +0 -42
- package/dist/assets/index-legacy-BLlk8iq-.js.map +0 -1
- package/dist/assets/index-legacy-BmWYm3m_.js +0 -2
- package/dist/assets/index-legacy-BmWYm3m_.js.map +0 -1
- package/dist/assets/index-legacy-Bnp7569A.js +0 -2
- package/dist/assets/index-legacy-Bnp7569A.js.map +0 -1
- package/dist/assets/index-legacy-CQ24Si-w.js +0 -2
- package/dist/assets/index-legacy-CQ24Si-w.js.map +0 -1
- package/dist/assets/index-legacy-CT1nF7s9.js +0 -2
- package/dist/assets/index-legacy-CT1nF7s9.js.map +0 -1
- package/dist/assets/index-legacy-CeVzo60P.js +0 -2
- package/dist/assets/index-legacy-CeVzo60P.js.map +0 -1
- package/dist/assets/index-legacy-Cf0w_PNA.js +0 -2
- package/dist/assets/index-legacy-Cf0w_PNA.js.map +0 -1
- package/dist/assets/index-legacy-DZSQUiaj.js +0 -2
- package/dist/assets/index-legacy-DZSQUiaj.js.map +0 -1
- package/dist/assets/index-legacy-D_K0eXFb.js +0 -2
- package/dist/assets/index-legacy-D_K0eXFb.js.map +0 -1
- package/dist/assets/index-legacy-Da3YyHW_.js +0 -2
- package/dist/assets/index-legacy-Da3YyHW_.js.map +0 -1
- package/dist/assets/index-legacy-Da4s_D85.js +0 -2
- package/dist/assets/index-legacy-Da4s_D85.js.map +0 -1
- package/dist/assets/index-legacy-DhNaKknk.js +0 -2
- package/dist/assets/index-legacy-DhNaKknk.js.map +0 -1
- package/dist/assets/index-legacy-Dm1CXog1.js +0 -2
- package/dist/assets/index-legacy-Dm1CXog1.js.map +0 -1
- package/dist/assets/index-legacy-DpNNn-Dy.js +0 -2
- package/dist/assets/index-legacy-DpNNn-Dy.js.map +0 -1
- package/dist/assets/index-legacy-PkF4cKK9.js +0 -2
- package/dist/assets/index-legacy-PkF4cKK9.js.map +0 -1
- package/dist/assets/index-legacy-QHDmYAB8.js +0 -2
- package/dist/assets/index-legacy-QHDmYAB8.js.map +0 -1
- package/dist/assets/index-legacy-_M1-0586.js +0 -2
- package/dist/assets/index-legacy-_M1-0586.js.map +0 -1
- package/dist/assets/index-legacy-m0dvnwGi.js +0 -2
- package/dist/assets/index-legacy-m0dvnwGi.js.map +0 -1
- package/dist/assets/index-legacy-vRS79jKS.js +0 -2
- package/dist/assets/index-legacy-vRS79jKS.js.map +0 -1
- package/dist/assets/index-ypHH_Z_A.css +0 -1
- package/dist/assets/isEqual-BHpVKj_X.js +0 -2
- package/dist/assets/isEqual-BHpVKj_X.js.map +0 -1
- package/dist/assets/isEqual-legacy-BWUPR8bV.js +0 -2
- package/dist/assets/isEqual-legacy-BWUPR8bV.js.map +0 -1
- package/dist/assets/other-legacy-DjiCmSH4.js +0 -2
- package/dist/assets/other-legacy-DjiCmSH4.js.map +0 -1
- package/dist/assets/other-yMAyytYx.js +0 -2
- package/dist/assets/other-yMAyytYx.js.map +0 -1
- package/dist/assets/polyfills-legacy-CPmsgIAF.js +0 -4
- package/dist/assets/refresh-DPuuDO9h.js.map +0 -1
- package/dist/assets/refresh-legacy-DOts-8Wc.js.map +0 -1
- package/dist/assets/tip-CH7nBVXc.js +0 -2
- package/dist/assets/tip-CH7nBVXc.js.map +0 -1
- package/dist/assets/tip-legacy-DiCk_qP1.js +0 -2
- package/dist/assets/tip-legacy-DiCk_qP1.js.map +0 -1
- package/dist/assets/validator-BMr-jeUB.js +0 -2
- package/dist/assets/validator-BMr-jeUB.js.map +0 -1
- package/dist/assets/validator-legacy-CacjPWoF.js +0 -2
- package/dist/assets/validator-legacy-CacjPWoF.js.map +0 -1
- /package/dist/assets/{el-date-picker-NjWHL2Br.css → el-date-picker-C36c2CGO.css} +0 -0
- /package/dist/assets/{el-dropdown-item-CUgTpiu6.css → el-dropdown-item-5b6bMUQF.css} +0 -0
- /package/dist/assets/{el-loading-Uv12lkco.css → el-loading-BPl8mdQ3.css} +0 -0
- /package/dist/assets/{el-pagination-MvCAleW2.css → el-pagination-DMHBWKFj.css} +0 -0
- /package/dist/assets/{el-switch-D6dVIPlw.css → el-switch-CH9HekZJ.css} +0 -0
- /package/dist/assets/{el-tab-pane-kUw7IczA.css → el-tab-pane-CO1C5qCV.css} +0 -0
- /package/dist/assets/{el-table-column-DMXHP8sd.css → el-table-column-x3grTP_N.css} +0 -0
- /package/dist/assets/{tip-ovQu2XSt.css → tip-rRSL6nZ2.css} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-legacy-DaUa56O-.js","sources":["../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/tokens/collapse.mjs","../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse/src/collapse.mjs","../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse/src/collapse2.mjs","../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse/src/collapse-item.mjs","../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse/src/collapse-item2.mjs","../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse/index.mjs","../../src/apis/modules/config.ts","../../src/pages/dashboard/config/index.vue"],"sourcesContent":["const collapseContextKey = Symbol(\"collapseContextKey\");\n\nexport { collapseContextKey };\n//# sourceMappingURL=collapse.mjs.map\n","import '../../../utils/index.mjs';\nimport '../../../constants/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { buildProps, definePropType } from '../../../utils/vue/props/runtime.mjs';\nimport { mutable } from '../../../utils/typescript.mjs';\nimport { UPDATE_MODEL_EVENT, CHANGE_EVENT } from '../../../constants/event.mjs';\n\nconst emitChangeFn = (value) => typeof isNumber(value);\nconst collapseProps = buildProps({\n accordion: Boolean,\n modelValue: {\n type: definePropType([Array, String, Number]),\n default: () => mutable([])\n }\n});\nconst collapseEmits = {\n [UPDATE_MODEL_EVENT]: emitChangeFn,\n [CHANGE_EVENT]: emitChangeFn\n};\n\nexport { collapseEmits, collapseProps, emitChangeFn };\n//# sourceMappingURL=collapse.mjs.map\n","import { defineComponent, ref, watch, provide, openBlock, createElementBlock, normalizeClass, unref, renderSlot } from 'vue';\nimport '../../../utils/index.mjs';\nimport '../../../constants/index.mjs';\nimport '../../../hooks/index.mjs';\nimport '../../../tokens/index.mjs';\nimport { collapseProps, collapseEmits } from './collapse.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\nimport { castArray } from 'lodash-unified';\nimport { UPDATE_MODEL_EVENT, CHANGE_EVENT } from '../../../constants/event.mjs';\nimport { collapseContextKey } from '../../../tokens/collapse.mjs';\n\nconst __default__ = {\n name: \"ElCollapse\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: collapseProps,\n emits: collapseEmits,\n setup(__props, { expose, emit }) {\n const props = __props;\n const ns = useNamespace(\"collapse\");\n const activeNames = ref(castArray(props.modelValue));\n const setActiveNames = (_activeNames) => {\n activeNames.value = _activeNames;\n const value = props.accordion ? activeNames.value[0] : activeNames.value;\n emit(UPDATE_MODEL_EVENT, value);\n emit(CHANGE_EVENT, value);\n };\n const handleItemClick = (name) => {\n if (props.accordion) {\n setActiveNames([\n (activeNames.value[0] || activeNames.value[0] === 0) && activeNames.value[0] === name ? \"\" : name\n ]);\n } else {\n const _activeNames = [...activeNames.value];\n const index = _activeNames.indexOf(name);\n if (index > -1) {\n _activeNames.splice(index, 1);\n } else {\n _activeNames.push(name);\n }\n setActiveNames(_activeNames);\n }\n };\n watch(() => props.modelValue, () => activeNames.value = castArray(props.modelValue), { deep: true });\n provide(collapseContextKey, {\n activeNames,\n handleItemClick\n });\n expose({\n activeNames,\n setActiveNames\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass(unref(ns).b()),\n role: \"tablist\",\n \"aria-multiselectable\": \"true\"\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 2);\n };\n }\n});\nvar Collapse = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/collapse/src/collapse.vue\"]]);\n\nexport { Collapse as default };\n//# sourceMappingURL=collapse2.mjs.map\n","import '../../../utils/index.mjs';\nimport { buildProps, definePropType } from '../../../utils/vue/props/runtime.mjs';\nimport { generateId } from '../../../utils/rand.mjs';\n\nconst collapseItemProps = buildProps({\n title: {\n type: String,\n default: \"\"\n },\n name: {\n type: definePropType([String, Number]),\n default: () => generateId()\n },\n disabled: Boolean\n});\n\nexport { collapseItemProps };\n//# sourceMappingURL=collapse-item.mjs.map\n","import { defineComponent, inject, ref, computed, openBlock, createElementBlock, normalizeClass, unref, createElementVNode, withKeys, withModifiers, renderSlot, createTextVNode, toDisplayString, createVNode, withCtx, withDirectives, vShow } from 'vue';\nimport '../../../utils/index.mjs';\nimport _CollapseTransition from '../../collapse-transition/index.mjs';\nimport { ElIcon } from '../../icon/index.mjs';\nimport { ArrowRight } from '@element-plus/icons-vue';\nimport '../../../hooks/index.mjs';\nimport '../../../tokens/index.mjs';\nimport { collapseItemProps } from './collapse-item.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { collapseContextKey } from '../../../tokens/collapse.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\nimport { generateId } from '../../../utils/rand.mjs';\n\nconst _hoisted_1 = [\"aria-expanded\", \"aria-controls\", \"aria-describedby\"];\nconst _hoisted_2 = [\"id\", \"tabindex\", \"onKeypress\"];\nconst _hoisted_3 = [\"id\", \"aria-hidden\", \"aria-labelledby\"];\nconst __default__ = {\n name: \"ElCollapseItem\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: collapseItemProps,\n setup(__props, { expose }) {\n const props = __props;\n const collapse = inject(collapseContextKey);\n const ns = useNamespace(\"collapse\");\n const focusing = ref(false);\n const isClick = ref(false);\n const id = ref(generateId());\n const isActive = computed(() => collapse == null ? void 0 : collapse.activeNames.value.includes(props.name));\n const handleFocus = () => {\n setTimeout(() => {\n if (!isClick.value) {\n focusing.value = true;\n } else {\n isClick.value = false;\n }\n }, 50);\n };\n const handleHeaderClick = () => {\n if (props.disabled)\n return;\n collapse == null ? void 0 : collapse.handleItemClick(props.name);\n focusing.value = false;\n isClick.value = true;\n };\n const handleEnterClick = () => {\n collapse == null ? void 0 : collapse.handleItemClick(props.name);\n };\n expose({\n isActive\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\n unref(ns).b(\"item\"),\n unref(ns).is(\"active\", unref(isActive)),\n unref(ns).is(\"disabled\", _ctx.disabled)\n ])\n }, [\n createElementVNode(\"div\", {\n role: \"tab\",\n \"aria-expanded\": unref(isActive),\n \"aria-controls\": unref(ns).b(`content-${id.value}`),\n \"aria-describedby\": unref(ns).b(`content-${id.value}`)\n }, [\n createElementVNode(\"div\", {\n id: unref(ns).b(`head-${id.value}`),\n class: normalizeClass([\n unref(ns).be(\"item\", \"header\"),\n unref(ns).is(\"active\", unref(isActive)),\n { focusing: focusing.value && !_ctx.disabled }\n ]),\n role: \"button\",\n tabindex: _ctx.disabled ? -1 : 0,\n onClick: handleHeaderClick,\n onKeypress: withKeys(withModifiers(handleEnterClick, [\"stop\", \"prevent\"]), [\"space\", \"enter\"]),\n onFocus: handleFocus,\n onBlur: _cache[0] || (_cache[0] = ($event) => focusing.value = false)\n }, [\n renderSlot(_ctx.$slots, \"title\", {}, () => [\n createTextVNode(toDisplayString(_ctx.title), 1)\n ]),\n createVNode(unref(ElIcon), {\n class: normalizeClass([unref(ns).be(\"item\", \"arrow\"), unref(ns).is(\"active\", unref(isActive))])\n }, {\n default: withCtx(() => [\n createVNode(unref(ArrowRight))\n ]),\n _: 1\n }, 8, [\"class\"])\n ], 42, _hoisted_2)\n ], 8, _hoisted_1),\n createVNode(unref(_CollapseTransition), null, {\n default: withCtx(() => [\n withDirectives(createElementVNode(\"div\", {\n id: unref(ns).b(`content-${id.value}`),\n class: normalizeClass(unref(ns).be(\"item\", \"wrap\")),\n role: \"tabpanel\",\n \"aria-hidden\": !unref(isActive),\n \"aria-labelledby\": unref(ns).b(`head-${id.value}`)\n }, [\n createElementVNode(\"div\", {\n class: normalizeClass(unref(ns).be(\"item\", \"content\"))\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 2)\n ], 10, _hoisted_3), [\n [vShow, unref(isActive)]\n ])\n ]),\n _: 3\n })\n ], 2);\n };\n }\n});\nvar CollapseItem = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/collapse/src/collapse-item.vue\"]]);\n\nexport { CollapseItem as default };\n//# sourceMappingURL=collapse-item2.mjs.map\n","import '../../utils/index.mjs';\nimport Collapse from './src/collapse2.mjs';\nimport CollapseItem from './src/collapse-item2.mjs';\nexport { collapseEmits, collapseProps, emitChangeFn } from './src/collapse.mjs';\nexport { collapseItemProps } from './src/collapse-item.mjs';\nimport { withInstall, withNoopInstall } from '../../utils/vue/install.mjs';\n\nconst ElCollapse = withInstall(Collapse, {\n CollapseItem\n});\nconst ElCollapseItem = withNoopInstall(CollapseItem);\n\nexport { ElCollapse, ElCollapseItem, ElCollapse as default };\n//# sourceMappingURL=index.mjs.map\n","import ajax from '../ajax'\n\nfunction getServiceOverview(): ConfigServiceAPITypes.getServiceOverview {\n return ajax.get('/config/service/overview')\n}\n\nfunction getMysqlSchema(): ConfigServiceAPITypes.getMysqlSchema {\n return ajax.get('/config/service/mysql/schema')\n}\n\nfunction getMysqlSchemaExportSql(): ConfigServiceAPITypes.getMysqlSchemaExportSql {\n return ajax.get('/config/service/mysql/schema/export-sql')\n}\n\nfunction applyMysqlSchema(): ConfigServiceAPITypes.applyMysqlSchema {\n return ajax.post('/config/service/mysql/schema/apply')\n}\n\nfunction getMysqlLiveIntrospect(): ConfigServiceAPITypes.getMysqlLiveIntrospect {\n return ajax.get('/config/service/mysql/introspect')\n}\n\nfunction checkMysqlDatabase(\n body: ConfigServiceAPITypes.MysqlCheckDatabaseBody,\n): ConfigServiceAPITypes.checkMysqlDatabase {\n return ajax.post('/config/service/mysql/check-database', body)\n}\n\nfunction listConfigAdminUsers(): ConfigServiceAPITypes.listConfigAdminUsers {\n return ajax.get('/config/service/admin-users')\n}\n\nfunction createConfigAdminUser(\n body: ConfigServiceAPITypes.CreateConfigAdminUserBody,\n): ConfigServiceAPITypes.createConfigAdminUser {\n return ajax.post('/config/service/admin-users', body)\n}\n\nfunction resetConfigAdminUserPassword(\n body: ConfigServiceAPITypes.ResetConfigAdminUserPasswordBody,\n): ConfigServiceAPITypes.resetConfigAdminUserPassword {\n return ajax.post('/config/service/admin-users/reset-password', body)\n}\n\nfunction getServiceConfig(): ConfigServiceAPITypes.getServiceConfig {\n return ajax.get('/config/service/config')\n}\n\nfunction updateCfg(data: ConfigServiceAPITypes.ServiceConfigItem | ConfigServiceAPITypes.ServiceConfigItem[]) {\n return ajax.put('/config/service/config', data)\n}\n\nexport default {\n getServiceOverview,\n getMysqlSchema,\n getMysqlSchemaExportSql,\n applyMysqlSchema,\n getMysqlLiveIntrospect,\n checkMysqlDatabase,\n listConfigAdminUsers,\n createConfigAdminUser,\n resetConfigAdminUserPassword,\n getServiceConfig,\n updateCfg,\n}\n","<script lang=\"ts\" setup>\nimport { Refresh } from '@element-plus/icons-vue'\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, onMounted, reactive, ref, watch } from 'vue'\nimport { ConfigServiceAPI, PublicApi, UserApi } from '@/apis'\nimport { useSiteConfig } from '@/composables'\nimport { rAccount, rMobilePhone, rPassword, rVerCode } from '@/utils/regExp'\nimport Tip from '../tasks/components/infoPanel/tip.vue'\n\ntype ConfigData = ConfigServiceAPITypes.ConfigData\ntype ServiceConfigItem = ConfigServiceAPITypes.ServiceConfigItem\ntype ServiceOverviewItem = ConfigServiceAPITypes.ServiceOverviewItem\ntype MysqlSchemaOverview = ConfigServiceAPITypes.MysqlSchemaOverview\ntype MysqlLiveIntrospection = ConfigServiceAPITypes.MysqlLiveIntrospection\ntype MysqlLiveTable = ConfigServiceAPITypes.MysqlLiveTable\n\n/** 与 MySQL 相关的子 Tab(连接配置仍在 name=mysql 的主 Tab);结构与脚本已与「在线库表」合并 */\nconst MYSQL_INTROSPECT_TAB = 'mysql-introspect'\nconst CONFIG_ADMIN_USERS_TAB = 'config-admin-users'\n\nconst { value: siteConfig } = useSiteConfig()\n\nconst mysqlSchema = ref<MysqlSchemaOverview | null>(null)\nconst schemaLoading = ref(false)\n\n/** 建表 SQL 全屏预览 */\nconst mysqlExportDialogVisible = ref(false)\nconst mysqlExportLoading = ref(false)\nconst mysqlExportSql = ref('')\nconst mysqlExportDescription = ref('')\nconst mysqlExportError = ref('')\n\nconst serviceOverview = ref<ServiceOverviewItem[]>([])\nconst serverConfig = ref<ConfigData[]>([])\nconst loading = ref(false)\nconst configLoading = ref(false)\nconst activeConfigTab = ref('')\nconst savingMap = reactive<Record<string, boolean>>({})\n\nconst overviewStats = computed(() => {\n const total = serviceOverview.value.length\n const running = serviceOverview.value.filter(item => item.status).length\n const required = serviceOverview.value.filter(item => item.required).length\n const optional = total - required\n return {\n total,\n running,\n required,\n optional,\n abnormal: total - running,\n }\n})\nconst showErrorList = computed(() => serviceOverview.value.filter(item => item.errMsg))\nconst showMysqlToolTabs = computed(() => serverConfig.value.some(s => s.type === 'mysql'))\nconst mysqlLive = ref<MysqlLiveIntrospection | null>(null)\nconst mysqlLiveLoading = ref(false)\nconst mysqlLiveOpenNames = ref<string[]>([])\n\nconst currentConfig = computed(() => serverConfig.value.find(item => item.type === activeConfigTab.value))\n\nfunction isActiveConfigTabValid(name: string) {\n if (name === CONFIG_ADMIN_USERS_TAB)\n return true\n if (serverConfig.value.some(item => item.type === name))\n return true\n if (showMysqlToolTabs.value && name === MYSQL_INTROSPECT_TAB)\n return true\n return false\n}\n\nfunction getServiceTagType(service: ServiceOverviewItem) {\n if (service.status) {\n return 'success'\n }\n return service.required ? 'danger' : 'warning'\n}\n\nfunction getServiceTagText(service: ServiceOverviewItem) {\n if (service.status) {\n return '运行中'\n }\n return service.required ? '异常' : '未就绪'\n}\n\nfunction isBooleanConfig(item: ServiceConfigItem) {\n return (\n typeof item.value === 'boolean'\n || item.key === 'auth'\n || item.key === 'autoCreateDatabase'\n || item.key === 'autoSyncSchemaOnStartup'\n )\n}\n\nfunction isNumberConfig(item: ServiceConfigItem) {\n return typeof item.value === 'number' || item.key === 'port'\n}\n\nfunction updateConfigValue(item: ServiceConfigItem, value: string | number | boolean) {\n item.value = value\n}\n\nasync function loadMysqlSchema() {\n schemaLoading.value = true\n try {\n const { data } = await ConfigServiceAPI.getMysqlSchema()\n mysqlSchema.value = data ?? null\n }\n catch {\n mysqlSchema.value = null\n }\n finally {\n schemaLoading.value = false\n }\n}\n\nasync function loadMysqlLiveIntrospect() {\n mysqlLiveLoading.value = true\n try {\n const { data } = await ConfigServiceAPI.getMysqlLiveIntrospect()\n mysqlLive.value = data ?? null\n }\n catch {\n mysqlLive.value = null\n }\n finally {\n mysqlLiveLoading.value = false\n }\n}\n\nfunction formatBytes(n: number | null) {\n if (n == null || Number.isNaN(n))\n return '—'\n if (n < 1024)\n return `${n} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let v = n / 1024\n let i = 0\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024\n i++\n }\n return `${v < 10 ? v.toFixed(1) : Math.round(v)} ${units[i]}`\n}\n\nfunction indexColumnsLabel(idx: MysqlLiveTable['indexes'][number]) {\n return idx.columns\n .map((c) => {\n const p = c.subPart != null ? `(${c.subPart})` : ''\n return `${c.column}${p}`\n })\n .join(', ')\n}\n\nasync function copyMysqlTableDdl(tbl: MysqlLiveTable) {\n const text = tbl.createSql?.trim() ?? ''\n if (!text) {\n ElMessage.warning('建表语句为空')\n return\n }\n try {\n await navigator.clipboard.writeText(text)\n ElMessage.success(`已复制 ${tbl.name} 的建表 SQL`)\n }\n catch {\n ElMessage.error('复制失败,请手动选取文本框中的内容')\n }\n}\n\nasync function applyMysqlSchema() {\n schemaLoading.value = true\n try {\n await ConfigServiceAPI.applyMysqlSchema()\n await loadMysqlSchema()\n await loadMysqlLiveIntrospect()\n await refreshStatus(false)\n ElMessage.success('已按 mysql-schema.json 对齐缺列及列类型')\n }\n catch {\n ElMessage.error('执行失败,请查看服务端日志')\n }\n finally {\n schemaLoading.value = false\n }\n}\n\nasync function openMysqlExportDialog() {\n mysqlExportDialogVisible.value = true\n mysqlExportSql.value = ''\n mysqlExportDescription.value = ''\n mysqlExportError.value = ''\n mysqlExportLoading.value = true\n try {\n const { data } = await ConfigServiceAPI.getMysqlSchemaExportSql()\n if (!data?.sql?.trim() || data?.error) {\n mysqlExportError.value = data?.error || '未生成 SQL'\n return\n }\n mysqlExportSql.value = data.sql\n mysqlExportDescription.value = data.description?.trim() ?? ''\n }\n catch {\n mysqlExportError.value = '加载失败,请稍后重试'\n }\n finally {\n mysqlExportLoading.value = false\n }\n}\n\nfunction onMysqlExportDialogClosed() {\n mysqlExportSql.value = ''\n mysqlExportDescription.value = ''\n mysqlExportError.value = ''\n}\n\nfunction closeMysqlExportDialog() {\n mysqlExportDialogVisible.value = false\n onMysqlExportDialogClosed()\n}\n\nconst adminUsersLoading = ref(false)\nconst adminUsersList = ref<ConfigServiceAPITypes.ConfigAdminUserRow[]>([])\nconst loginIsSuper = ref(false)\nconst loginIsSystem = ref(false)\nconst canOperateConfigAdmins = computed(() => loginIsSuper.value || loginIsSystem.value)\n\nconst adminCreateForm = reactive({\n account: '',\n pwd1: '',\n pwd2: '',\n bindPhone: false,\n phone: '',\n code: '',\n})\nconst adminCreateSubmitting = ref(false)\nconst adminResetVisible = ref(false)\nconst adminResetRow = ref<ConfigServiceAPITypes.ConfigAdminUserRow | null>(null)\nconst adminResetPwd1 = ref('')\nconst adminResetPwd2 = ref('')\nconst adminResetSubmitting = ref(false)\nconst adminCodeText = ref('获取验证码')\nconst adminCodeTime = ref(0)\n\nfunction refreshAdminCodeText() {\n if (adminCodeTime.value === 0) {\n adminCodeText.value = '获取验证码'\n return\n }\n adminCodeText.value = `${adminCodeTime.value}s`\n adminCodeTime.value -= 1\n setTimeout(refreshAdminCodeText, 1000)\n}\n\nfunction getAdminCreateCode() {\n if (!rMobilePhone.test(adminCreateForm.phone)) {\n ElMessage.warning('手机号格式不正确')\n return\n }\n PublicApi.getCode(adminCreateForm.phone).then(() => {\n adminCodeTime.value = 120\n refreshAdminCodeText()\n ElMessage.success('验证码已发送')\n })\n}\n\nfunction adminStatusLabel(status: number) {\n if (status === 0)\n return '正常'\n if (status === 1)\n return '冻结'\n if (status === 2)\n return '封禁'\n return String(status)\n}\n\nasync function loadLoginPower() {\n try {\n const { data } = await UserApi.checkPower()\n loginIsSuper.value = Boolean(data?.power)\n loginIsSystem.value = Boolean(data?.system)\n }\n catch {\n loginIsSuper.value = false\n loginIsSystem.value = false\n }\n}\n\nasync function loadAdminUsers() {\n adminUsersLoading.value = true\n try {\n const { data } = await ConfigServiceAPI.listConfigAdminUsers()\n adminUsersList.value = data?.list ?? []\n }\n catch {\n adminUsersList.value = []\n }\n finally {\n adminUsersLoading.value = false\n }\n}\n\nwatch(() => siteConfig.value?.needBindPhone, (need) => {\n if (need)\n adminCreateForm.bindPhone = true\n}, { immediate: true })\n\nfunction checkAdminCreateForm(): boolean {\n if (!canOperateConfigAdmins.value) {\n ElMessage.warning('当前账号无权创建超级管理员')\n return false\n }\n if (!rAccount.test(adminCreateForm.account)) {\n ElMessage.warning('帐号格式不正确(4-11位 数字字母)')\n return false\n }\n if (!rPassword.test(adminCreateForm.pwd1)) {\n ElMessage.warning('密码格式不正确(6-16位 支持字母/数字/下划线)')\n return false\n }\n if (adminCreateForm.pwd1 !== adminCreateForm.pwd2) {\n ElMessage.warning('两次输入的密码不一致')\n return false\n }\n if (adminCreateForm.bindPhone) {\n if (!rMobilePhone.test(adminCreateForm.phone)) {\n ElMessage.warning('手机号格式不正确')\n return false\n }\n if (!rVerCode.test(adminCreateForm.code)) {\n ElMessage.warning('验证码不正确(4位 数字)')\n return false\n }\n }\n return true\n}\n\nasync function submitCreateAdminUser() {\n if (!checkAdminCreateForm())\n return\n adminCreateSubmitting.value = true\n try {\n const { data } = await ConfigServiceAPI.createConfigAdminUser({\n account: adminCreateForm.account,\n pwd: adminCreateForm.pwd1,\n bindPhone: adminCreateForm.bindPhone,\n phone: adminCreateForm.phone,\n code: adminCreateForm.code,\n })\n if (!data?.ok) {\n ElMessage.error(data?.error || '创建失败')\n return\n }\n ElMessage.success('管理员账号已创建')\n adminCreateForm.account = ''\n adminCreateForm.pwd1 = ''\n adminCreateForm.pwd2 = ''\n adminCreateForm.phone = ''\n adminCreateForm.code = ''\n await loadAdminUsers()\n }\n catch {\n ElMessage.error('请求失败')\n }\n finally {\n adminCreateSubmitting.value = false\n }\n}\n\nfunction openAdminResetDialog(row: ConfigServiceAPITypes.ConfigAdminUserRow) {\n adminResetRow.value = row\n adminResetPwd1.value = ''\n adminResetPwd2.value = ''\n adminResetVisible.value = true\n}\n\nfunction closeAdminResetDialog() {\n adminResetVisible.value = false\n adminResetRow.value = null\n}\n\nasync function submitAdminResetPassword() {\n if (!adminResetRow.value) {\n return\n }\n if (!rPassword.test(adminResetPwd1.value)) {\n ElMessage.warning('密码格式不正确(6-16位 支持字母/数字/下划线)')\n return\n }\n if (adminResetPwd1.value !== adminResetPwd2.value) {\n ElMessage.warning('两次输入的密码不一致')\n return\n }\n adminResetSubmitting.value = true\n try {\n const { data } = await ConfigServiceAPI.resetConfigAdminUserPassword({\n id: adminResetRow.value.id,\n pwd: adminResetPwd1.value,\n })\n if (!data?.ok) {\n ElMessage.error(data?.error || '重置失败')\n return\n }\n ElMessage.success('密码已重置')\n closeAdminResetDialog()\n }\n catch {\n ElMessage.error('请求失败')\n }\n finally {\n adminResetSubmitting.value = false\n }\n}\n\nwatch(mysqlExportDialogVisible, (open) => {\n if (typeof document === 'undefined')\n return\n document.body.style.overflow = open ? 'hidden' : ''\n})\n\nasync function copyMysqlExportSqlAll() {\n const text = mysqlExportSql.value?.trim?.() ?? ''\n if (!text) {\n ElMessage.warning('暂无 SQL 可复制')\n return\n }\n try {\n await navigator.clipboard.writeText(mysqlExportSql.value)\n ElMessage.success('已复制全部 SQL')\n }\n catch {\n ElMessage.error('复制失败,请手动在文本框中选取复制')\n }\n}\n\nasync function refreshStatus(showSuccess = true) {\n if (loading.value)\n return\n loading.value = true\n try {\n const { data } = await ConfigServiceAPI.getServiceOverview()\n serviceOverview.value = data || []\n if (showSuccess) {\n ElMessage.success('服务状态刷新完成')\n }\n }\n catch {\n ElMessage.error('服务状态刷新失败')\n }\n finally {\n loading.value = false\n }\n}\n\nasync function getServiceConfig() {\n configLoading.value = true\n try {\n const { data } = await ConfigServiceAPI.getServiceConfig()\n serverConfig.value = data || []\n if (!activeConfigTab.value || !isActiveConfigTabValid(activeConfigTab.value)) {\n activeConfigTab.value = serverConfig.value[0]?.type || CONFIG_ADMIN_USERS_TAB\n }\n }\n catch {\n ElMessage.error('服务配置加载失败')\n }\n finally {\n configLoading.value = false\n }\n}\n\nfunction configMysqlDataToCheckBody(\n items: ServiceConfigItem[],\n): ConfigServiceAPITypes.MysqlCheckDatabaseBody {\n const pick = ['host', 'port', 'user', 'password', 'database'] as const\n const body: ConfigServiceAPITypes.MysqlCheckDatabaseBody = {}\n for (const it of items) {\n if (it.type !== 'mysql' || !pick.includes(it.key as typeof pick[number]))\n continue\n const k = it.key as keyof ConfigServiceAPITypes.MysqlCheckDatabaseBody\n body[k] = it.value as never\n }\n return body\n}\n\nasync function updateCfgGroup(group?: ConfigData) {\n if (!group || savingMap[group.type])\n return\n\n if (group.type === 'mysql') {\n let check: ConfigServiceAPITypes.MysqlCheckDatabaseResult | null = null\n try {\n const { data } = await ConfigServiceAPI.checkMysqlDatabase(configMysqlDataToCheckBody(group.data))\n check = data ?? null\n }\n catch {\n ElMessage.error('检测数据库状态失败')\n return\n }\n if (!check) {\n ElMessage.error('检测数据库状态失败')\n return\n }\n if (!check.canConnect) {\n ElMessage.error(check.error || '无法连接 MySQL,请检查地址与账号')\n return\n }\n if (!check.databaseExists) {\n const autoItem = group.data.find(i => i.key === 'autoCreateDatabase')\n const autoOn = Boolean(autoItem?.value)\n if (!autoOn) {\n const dbName = group.data.find(i => i.key === 'database')?.value\n const name = dbName != null ? String(dbName).trim() : ''\n const msg = name\n ? `服务器上不存在名为「${name}」的数据库。是否开启「无库时自动建库并按模板导入全部表结构」并保存?`\n : `服务器上不存在该数据库。是否开启「无库时自动建库并按模板导入全部表结构」并保存?`\n try {\n await ElMessageBox.confirm(\n msg,\n '数据库不存在',\n {\n type: 'warning',\n confirmButtonText: '开启并保存',\n cancelButtonText: '取消',\n },\n )\n }\n catch {\n return\n }\n if (autoItem) {\n autoItem.value = true\n }\n else {\n group.data.push({\n type: 'mysql',\n key: 'autoCreateDatabase',\n value: true,\n label: '无库时自动建库并按模板导入全部表结构',\n isSecret: false,\n })\n }\n }\n }\n }\n\n savingMap[group.type] = true\n try {\n await ConfigServiceAPI.updateCfg(group.data)\n ElMessage.success(`${group.title} 配置已保存`)\n await getServiceConfig()\n await refreshStatus(false)\n if (group.type === 'mysql') {\n await loadMysqlSchema()\n await loadMysqlLiveIntrospect()\n }\n }\n catch {\n ElMessage.error(`${group.title} 配置保存失败`)\n }\n finally {\n savingMap[group.type] = false\n }\n}\n\nonMounted(() => {\n refreshStatus(false)\n getServiceConfig()\n})\n\nasync function refreshMysqlToolsTab() {\n await loadMysqlSchema()\n await loadMysqlLiveIntrospect()\n}\n\nwatch(activeConfigTab, (t) => {\n if (t === MYSQL_INTROSPECT_TAB)\n refreshMysqlToolsTab()\n if (t === CONFIG_ADMIN_USERS_TAB) {\n loadLoginPower()\n loadAdminUsers()\n }\n})\n</script>\n\n<template>\n <div class=\"config-page\">\n <section class=\"hero-card\">\n <div>\n <p class=\"eyebrow\">\n 服务配置\n </p>\n <h1>依赖服务概况</h1>\n <p class=\"hero-desc\">\n 按服务端当前实际启用的能力展示依赖状态;未启用的 Redis 不展示,MongoDB 异常也不会影响本页配置管理。\n </p>\n </div>\n <div class=\"hero-stats\">\n <div>\n <strong>{{ overviewStats.running }}</strong>\n <span>运行中</span>\n </div>\n <div>\n <strong>{{ overviewStats.abnormal }}</strong>\n <span>需关注</span>\n </div>\n <div>\n <strong>{{ overviewStats.optional }}</strong>\n <span>可选服务</span>\n </div>\n </div>\n </section>\n\n <section class=\"panel\">\n <div class=\"section-head\">\n <div>\n <h2>总体依赖服务概况</h2>\n <Tip>这里只检查当前服务端正在使用或已配置的依赖服务。</Tip>\n </div>\n <el-button :loading=\"loading\" :icon=\"Refresh\" @click=\"refreshStatus()\">\n 刷新状态\n </el-button>\n </div>\n\n <el-empty v-if=\"!loading && !serviceOverview.length\" description=\"暂无可展示的服务依赖\" />\n <div v-else v-loading=\"loading\" class=\"service-grid\">\n <article\n v-for=\"service in serviceOverview\"\n :key=\"service.type\"\n class=\"service-card\"\n :class=\"{ error: !service.status }\"\n >\n <div class=\"service-card-head\">\n <div>\n <h3>{{ service.title }}</h3>\n <p>{{ service.description }}</p>\n </div>\n <el-tag :type=\"getServiceTagType(service)\" effect=\"dark\">\n {{ getServiceTagText(service) }}\n </el-tag>\n </div>\n <div class=\"service-meta\">\n <span>{{ service.required ? '核心依赖' : '可选依赖' }}</span>\n <span v-if=\"service.errMsg\" class=\"error-text\">{{ service.errMsg }}</span>\n </div>\n </article>\n </div>\n </section>\n\n <section v-show=\"showErrorList.length\" class=\"panel\">\n <div class=\"section-head compact\">\n <div>\n <h2>异常信息</h2>\n <p>以下服务未通过状态检查,可在对应配置 Tab 中集中修改后保存。</p>\n </div>\n </div>\n <div class=\"error-list\">\n <p v-for=\"err in showErrorList\" :key=\"err.type\">\n <strong>{{ err.title }}:</strong>\n <span>{{ err.errMsg }}</span>\n </p>\n </div>\n </section>\n\n <section class=\"panel\">\n <div class=\"section-head\">\n <div>\n <h2>服务相关配置</h2>\n <Tip>\n 各类服务按 Tab 展开编辑,同一类服务修改完成后统一保存。\n <a\n href=\"https://docs.ep.sugarat.top/deploy/online-new.html#_5-%E6%9C%80%E5%90%8E%E6%9B%B4%E6%96%B0%E9%85%8D%E7%BD%AE\"\n >\n <el-button type=\"primary\" link>配置手册?</el-button></a>\n </Tip>\n </div>\n </div>\n\n <el-empty v-if=\"!configLoading && !serverConfig.length\" description=\"暂无可编辑的服务配置\" />\n <div v-else v-loading=\"configLoading\">\n <el-tabs v-model=\"activeConfigTab\" class=\"config-tabs\">\n <el-tab-pane\n v-for=\"serverItem in serverConfig\"\n :key=\"serverItem.type\"\n :label=\"serverItem.title\"\n :name=\"serverItem.type\"\n >\n <div class=\"tab-head\">\n <div>\n <h3>{{ serverItem.title }}</h3>\n <p>{{ serverItem.description }}</p>\n </div>\n <el-button\n type=\"primary\"\n :loading=\"savingMap[serverItem.type]\"\n @click=\"updateCfgGroup(serverItem)\"\n >\n 保存 {{ serverItem.title }}\n </el-button>\n </div>\n\n <el-form label-position=\"top\" class=\"config-form\">\n <div class=\"field-list\">\n <el-form-item\n v-for=\"cfgItem in serverItem.data\"\n :key=\"cfgItem.key\"\n class=\"field-item\"\n >\n <template #label>\n <span class=\"field-label\">{{ cfgItem.label || cfgItem.key }}</span>\n <span v-if=\"cfgItem.isSecret\" class=\"field-desc\">敏感项未修改时会保持原值</span>\n </template>\n\n <el-switch\n v-if=\"isBooleanConfig(cfgItem)\"\n :model-value=\"Boolean(cfgItem.value)\"\n inline-prompt\n active-text=\"开\"\n inactive-text=\"关\"\n @update:model-value=\"updateConfigValue(cfgItem, $event)\"\n />\n <el-input-number\n v-else-if=\"isNumberConfig(cfgItem)\"\n :model-value=\"Number(cfgItem.value)\"\n :min=\"0\"\n controls-position=\"right\"\n class=\"full-control\"\n @update:model-value=\"updateConfigValue(cfgItem, Number($event))\"\n />\n <el-input\n v-else\n :model-value=\"String(cfgItem.value)\"\n :type=\"cfgItem.isSecret ? 'password' : 'text'\"\n :show-password=\"cfgItem.isSecret\"\n :placeholder=\"cfgItem.isSecret ? '留空则保持原值' : '请输入'\"\n clearable\n @update:model-value=\"updateConfigValue(cfgItem, $event)\"\n />\n </el-form-item>\n </div>\n </el-form>\n </el-tab-pane>\n\n <el-tab-pane\n v-if=\"showMysqlToolTabs\"\n label=\"MySQL · 在线库表\"\n :name=\"MYSQL_INTROSPECT_TAB\"\n >\n <div class=\"tab-head\">\n <div>\n <h3>MySQL 在线库表与结构脚本</h3>\n <p>\n 上半部分与发布包内 <code>mysql-schema.json</code> 对照,可预览整库建表 SQL、检测漂移并一键对齐;下半部分读取当前连接库的真实结构(可与上方对照)。\n </p>\n </div>\n <el-button :loading=\"schemaLoading || mysqlLiveLoading\" :icon=\"Refresh\" @click=\"refreshMysqlToolsTab\">\n 刷新\n </el-button>\n </div>\n\n <div class=\"mysql-merged-section mysql-tool-block mysql-tool-block--solo\">\n <div class=\"mysql-merged-section__head\">\n <h4 class=\"mysql-merged-section__title\">\n 结构与脚本\n </h4>\n <p class=\"mysql-merged-section__desc\">\n 基于 canonical 定义检测缺表、缺列与类型漂移;弹窗可预览完整建库 SQL。\n </p>\n </div>\n <div v-loading=\"schemaLoading\" class=\"mysql-schema-hints mysql-schema-hints--in-tab\">\n <template v-if=\"mysqlSchema\">\n <div v-if=\"!mysqlSchema.error\" class=\"mysql-export-actions\">\n <el-button size=\"small\" :loading=\"mysqlExportLoading\" @click=\"openMysqlExportDialog\">\n 预览建表 SQL(全屏)\n </el-button>\n <span class=\"mysql-export-actions__hint\">\n 弹窗内可浏览、框选复制片段,或使用「复制全部」。\n </span>\n </div>\n <el-alert\n v-if=\"mysqlSchema.error\"\n :closable=\"false\"\n show-icon\n type=\"error\"\n title=\"MySQL schema 检测失败\"\n class=\"mysql-schema-alert\"\n >\n <p>{{ mysqlSchema.error }}</p>\n </el-alert>\n <el-alert\n v-else-if=\"mysqlSchema.pending\"\n type=\"warning\"\n :closable=\"false\"\n show-icon\n class=\"mysql-schema-alert\"\n >\n <div class=\"schema-drift-body\">\n <p>当前数据库与发布包 docs/schema/mysql-schema.json 期望结构不一致。</p>\n <p v-if=\"(mysqlSchema.missingTables ?? []).length\" style=\"margin: 8px 0 0 0;\">\n <strong>缺表:</strong>\n </p>\n <ul v-if=\"(mysqlSchema.missingTables ?? []).length\">\n <li v-for=\"t in (mysqlSchema.missingTables ?? [])\" :key=\"t\">\n {{ t }}\n </li>\n </ul>\n <p v-if=\"(mysqlSchema.missingColumns ?? []).length\" style=\"margin: 8px 0 0 0;\">\n <strong>缺列:</strong>\n </p>\n <ul v-if=\"(mysqlSchema.missingColumns ?? []).length\">\n <li v-for=\"c in mysqlSchema.missingColumns\" :key=\"`${c.table}.${c.column}`\">\n {{ c.table }}.{{ c.column }}\n </li>\n </ul>\n <p v-if=\"(mysqlSchema.typeMismatches ?? []).length\" style=\"margin: 8px 0 0 0;\">\n <strong>列类型不符(normalized):</strong>\n </p>\n <ul v-if=\"(mysqlSchema.typeMismatches ?? []).length\">\n <li v-for=\"m in mysqlSchema.typeMismatches\" :key=\"`${m.table}.${m.column}`\">\n {{ m.table }}.{{ m.column }}\n :库 {{ m.actualComparable }} /\n 期望 {{ m.expectedComparable }}\n </li>\n </ul>\n <el-button type=\"primary\" :loading=\"schemaLoading\" style=\"margin-top: 8px\" @click=\"applyMysqlSchema\">\n 一键对齐表结构\n </el-button>\n </div>\n </el-alert>\n <el-alert\n v-else-if=\"!mysqlSchema.autoSyncSchemaOnStartup\"\n type=\"info\"\n :closable=\"false\"\n show-icon\n title=\"未开启启动时自动同步\"\n class=\"mysql-schema-alert\"\n >\n <p style=\"margin: 0 0 8px 0;\">\n 当前关闭「启动时自动补齐表结构」;建议在版本升级后轮询此处并手动执行对齐。\n </p>\n <el-button size=\"small\" type=\"primary\" :loading=\"schemaLoading\" @click=\"applyMysqlSchema\">\n 检查并补齐表结构\n </el-button>\n </el-alert>\n </template>\n </div>\n </div>\n\n <div class=\"mysql-tool-block mysql-tool-block--solo mysql-merged-section mysql-merged-section--live\">\n <div class=\"mysql-merged-section__head\">\n <h4 class=\"mysql-merged-section__title\">\n 在线库表\n </h4>\n <p class=\"mysql-merged-section__desc\">\n 读取 information_schema(InnoDB 行数为估算);每张表含字段、索引与 SHOW CREATE TABLE。\n </p>\n </div>\n <div v-loading=\"mysqlLiveLoading\" class=\"mysql-live-panel\">\n <el-alert\n v-if=\"mysqlLive?.error\"\n type=\"error\"\n :closable=\"false\"\n show-icon\n title=\"无法读取库表信息\"\n >\n <p>{{ mysqlLive.error }}</p>\n </el-alert>\n <template v-else-if=\"mysqlLive\">\n <p class=\"mysql-live-summary\">\n <span>MySQL {{ mysqlLive.mysqlVersion }}</span>\n <span>库 <strong>{{ mysqlLive.database }}</strong></span>\n <span>共 {{ mysqlLive.tables.length }} 张表</span>\n </p>\n <el-empty v-if=\"!mysqlLive.tables.length\" description=\"当前库中暂无业务表\" />\n <el-collapse v-else v-model=\"mysqlLiveOpenNames\" class=\"mysql-live-collapse\">\n <el-collapse-item v-for=\"tbl in mysqlLive.tables\" :key=\"tbl.name\" :name=\"tbl.name\">\n <template #title>\n <span class=\"mysql-live-collapse-title\">\n <strong>{{ tbl.name }}</strong>\n <span class=\"mysql-live-collapse-meta\">\n {{ tbl.engine || '—' }}\n <span v-if=\"tbl.rowEstimate != null\"> · 约 {{ tbl.rowEstimate.toLocaleString() }} 行</span>\n <span v-if=\"tbl.dataLength != null\"> · 数据 {{ formatBytes(tbl.dataLength) }}</span>\n <span v-if=\"tbl.indexLength != null\"> · 索引 {{ formatBytes(tbl.indexLength) }}</span>\n </span>\n </span>\n </template>\n\n <div class=\"mysql-live-block\">\n <h4>字段</h4>\n <el-table :data=\"tbl.columns\" size=\"small\" border stripe class=\"mysql-live-table\">\n <el-table-column prop=\"name\" label=\"列名\" min-width=\"120\" />\n <el-table-column prop=\"columnType\" label=\"类型\" min-width=\"140\" />\n <el-table-column label=\"可空\" width=\"72\" align=\"center\">\n <template #default=\"{ row }\">\n {{ row.nullable ? 'YES' : 'NO' }}\n </template>\n </el-table-column>\n <el-table-column prop=\"key\" label=\"键\" width=\"84\" />\n <el-table-column label=\"默认值\" min-width=\"100\" show-overflow-tooltip>\n <template #default=\"{ row }\">\n {{ row.default ?? 'NULL' }}\n </template>\n </el-table-column>\n <el-table-column prop=\"extra\" label=\"额外\" width=\"120\" />\n <el-table-column prop=\"comment\" label=\"注释\" min-width=\"120\" show-overflow-tooltip />\n </el-table>\n </div>\n\n <div class=\"mysql-live-block\">\n <h4>索引</h4>\n <el-table v-if=\"tbl.indexes.length\" :data=\"tbl.indexes\" size=\"small\" border stripe class=\"mysql-live-table\">\n <el-table-column prop=\"name\" label=\"索引名\" min-width=\"120\" />\n <el-table-column label=\"唯一\" width=\"72\" align=\"center\">\n <template #default=\"{ row }\">\n {{ row.unique ? '是' : '否' }}\n </template>\n </el-table-column>\n <el-table-column prop=\"indexType\" label=\"类型\" width=\"100\" />\n <el-table-column label=\"列(序)\" min-width=\"200\">\n <template #default=\"{ row }\">\n {{ indexColumnsLabel(row) }}\n </template>\n </el-table-column>\n </el-table>\n <p v-else class=\"mysql-live-muted\">\n 无二级索引(或仅剩主键于信息模式中已展示于「键」列)\n </p>\n </div>\n\n <div class=\"mysql-live-block\">\n <div class=\"mysql-live-ddl-head\">\n <h4>SHOW CREATE TABLE</h4>\n <el-button size=\"small\" @click=\"copyMysqlTableDdl(tbl)\">\n 复制建表 SQL\n </el-button>\n </div>\n <el-input\n :model-value=\"tbl.createSql\"\n type=\"textarea\"\n readonly\n :rows=\"10\"\n class=\"mysql-live-ddl\"\n spellcheck=\"false\"\n />\n </div>\n </el-collapse-item>\n </el-collapse>\n </template>\n </div>\n </div>\n </el-tab-pane>\n\n <el-tab-pane label=\"系统管理员\" :name=\"CONFIG_ADMIN_USERS_TAB\">\n <div class=\"tab-head\">\n <div>\n <h3>系统管理员账号</h3>\n <p>\n 来自业务库 <code>user</code> 表,列出超级管理员与系统管理员。<strong>系统管理员与超级管理员</strong>均可在此新增超级管理员、重置管理员密码;新增规则与「注册」一致(不受站点「关闭注册」影响)。\n </p>\n </div>\n <el-button :loading=\"adminUsersLoading\" :icon=\"Refresh\" @click=\"loadAdminUsers\">\n 刷新列表\n </el-button>\n </div>\n <div v-loading=\"adminUsersLoading\" class=\"admin-users-panel\">\n <el-table :data=\"adminUsersList\" size=\"small\" border stripe class=\"admin-users-table\">\n <el-table-column prop=\"account\" label=\"账号\" min-width=\"120\" />\n <el-table-column prop=\"powerLabel\" label=\"权限\" width=\"120\" />\n <el-table-column prop=\"phoneMasked\" label=\"手机号\" min-width=\"120\" />\n <el-table-column label=\"状态\" width=\"88\">\n <template #default=\"{ row }\">\n {{ adminStatusLabel(row.status) }}\n </template>\n </el-table-column>\n <el-table-column label=\"注册时间\" min-width=\"160\" show-overflow-tooltip>\n <template #default=\"{ row }\">\n {{ row.joinTime || '—' }}\n </template>\n </el-table-column>\n <el-table-column v-if=\"canOperateConfigAdmins\" label=\"操作\" width=\"100\" fixed=\"right\">\n <template #default=\"{ row }\">\n <el-button type=\"primary\" link size=\"small\" @click=\"openAdminResetDialog(row)\">\n 重置密码\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n\n <div v-if=\"canOperateConfigAdmins\" class=\"mysql-tool-block mysql-tool-block--solo admin-create-block\">\n <h3 class=\"mysql-tool-block__title\">\n 新增超级管理员\n </h3>\n <p class=\"mysql-tool-block__desc\">\n 创建后账号权限为「超级管理员」。若站点开启须绑定手机,则需按注册流程校验手机号。\n </p>\n <el-form label-position=\"top\" class=\"admin-create-form\">\n <div class=\"admin-create-grid\">\n <el-form-item label=\"登录账号\">\n <el-input v-model=\"adminCreateForm.account\" maxlength=\"11\" placeholder=\"4-11 位数字或字母\" clearable />\n </el-form-item>\n <el-form-item label=\"密码\">\n <el-input v-model=\"adminCreateForm.pwd1\" type=\"password\" show-password clearable />\n </el-form-item>\n <el-form-item label=\"确认密码\">\n <el-input v-model=\"adminCreateForm.pwd2\" type=\"password\" show-password clearable />\n </el-form-item>\n <el-form-item label=\"绑定手机\">\n <el-checkbox v-model=\"adminCreateForm.bindPhone\" :disabled=\"siteConfig?.needBindPhone\">\n 绑定手机号(与注册一致)\n </el-checkbox>\n </el-form-item>\n <template v-if=\"adminCreateForm.bindPhone\">\n <el-form-item label=\"手机号\">\n <el-input v-model=\"adminCreateForm.phone\" maxlength=\"11\" clearable />\n </el-form-item>\n <el-form-item label=\"验证码\">\n <div class=\"code-row\">\n <el-input v-model=\"adminCreateForm.code\" maxlength=\"4\" clearable />\n <el-button :disabled=\"adminCodeTime > 0\" @click=\"getAdminCreateCode\">\n {{ adminCodeText }}\n </el-button>\n </div>\n </el-form-item>\n </template>\n </div>\n <el-button type=\"primary\" :loading=\"adminCreateSubmitting\" @click=\"submitCreateAdminUser\">\n 创建超级管理员\n </el-button>\n </el-form>\n </div>\n </div>\n\n <el-dialog\n v-model=\"adminResetVisible\"\n title=\"重置管理员密码\"\n width=\"420px\"\n destroy-on-close\n @closed=\"closeAdminResetDialog\"\n >\n <p v-if=\"adminResetRow\" class=\"admin-reset-hint\">\n 账号 <strong>{{ adminResetRow.account }}</strong>({{ adminResetRow.powerLabel }})\n </p>\n <el-form label-position=\"top\" class=\"admin-reset-form\">\n <el-form-item label=\"新密码\">\n <el-input v-model=\"adminResetPwd1\" type=\"password\" show-password clearable autocomplete=\"new-password\" />\n </el-form-item>\n <el-form-item label=\"确认新密码\">\n <el-input v-model=\"adminResetPwd2\" type=\"password\" show-password clearable autocomplete=\"new-password\" />\n </el-form-item>\n </el-form>\n <template #footer>\n <el-button @click=\"closeAdminResetDialog\">\n 取消\n </el-button>\n <el-button type=\"primary\" :loading=\"adminResetSubmitting\" @click=\"submitAdminResetPassword\">\n 确定重置\n </el-button>\n </template>\n </el-dialog>\n </el-tab-pane>\n </el-tabs>\n\n <div v-if=\"currentConfig\" class=\"bottom-actions-row\">\n <p class=\"bottom-actions-hint\">\n 与当前 Tab 右上角「保存 {{ currentConfig.title }}」是同一功能;表单项较多时滚到此处保存即可。\n </p>\n <el-button\n type=\"primary\"\n :loading=\"savingMap[currentConfig.type]\"\n @click=\"updateCfgGroup(currentConfig)\"\n >\n 保存当前服务配置\n </el-button>\n </div>\n </div>\n </section>\n\n <Teleport to=\"body\">\n <div\n v-if=\"mysqlExportDialogVisible\"\n class=\"mysql-export-fs\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mysql-export-fs-title\"\n >\n <div class=\"mysql-export-fs__shell\">\n <header class=\"mysql-export-fs__head\">\n <h2 id=\"mysql-export-fs-title\" class=\"mysql-export-fs__title\">\n 完整建表 SQL(mysql-schema.json)\n </h2>\n <div class=\"mysql-export-fs__head-actions\">\n <el-button size=\"small\" @click=\"closeMysqlExportDialog\">\n 关闭\n </el-button>\n </div>\n </header>\n <div v-loading=\"mysqlExportLoading\" class=\"mysql-export-fs__main\">\n <el-alert\n v-if=\"mysqlExportError\"\n type=\"error\"\n :closable=\"false\"\n show-icon\n :title=\"mysqlExportError\"\n />\n <template v-else>\n <p v-if=\"mysqlExportDescription\" class=\"mysql-export-fs__desc\">\n {{ mysqlExportDescription }}\n </p>\n <p class=\"mysql-export-fs__hint\">\n 在下方可直接框选复制局部语句;需要整段请点底部「复制全部」。\n </p>\n <textarea\n v-model=\"mysqlExportSql\"\n readonly\n spellcheck=\"false\"\n class=\"mysql-export-fs__textarea\"\n placeholder=\"正在加载…\"\n />\n </template>\n </div>\n <footer class=\"mysql-export-fs__foot\">\n <el-button @click=\"closeMysqlExportDialog\">\n 关闭\n </el-button>\n <el-button\n type=\"primary\"\n :disabled=\"!mysqlExportSql.trim() || !!mysqlExportError\"\n @click=\"copyMysqlExportSqlAll\"\n >\n 复制全部\n </el-button>\n </footer>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.config-page {\n max-width: 1256px;\n margin: 10px auto;\n color: #1f2937;\n}\n\n.hero-card,\n.panel {\n box-sizing: border-box;\n border: 1px solid #edf0f5;\n border-radius: 18px;\n background: #fff;\n box-shadow: 0 10px 30px rgb(31 41 55 / 8%);\n}\n\n.hero-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n padding: 28px 32px;\n overflow: hidden;\n background:\n radial-gradient(circle at 88% 20%, rgb(64 158 255 / 18%), transparent 28%),\n linear-gradient(135deg, #fff 0%, #f6f9ff 100%);\n\n h1 {\n margin: 6px 0 10px;\n font-size: 30px;\n line-height: 1.2;\n }\n}\n\n.eyebrow {\n margin: 0;\n color: #409eff;\n font-size: 13px;\n font-weight: 700;\n letter-spacing: 0.12em;\n}\n\n.hero-desc {\n max-width: 640px;\n margin: 0;\n color: #6b7280;\n line-height: 1.7;\n}\n\n.hero-stats {\n display: grid;\n grid-template-columns: repeat(3, 92px);\n gap: 10px;\n\n div {\n display: grid;\n place-items: center;\n min-height: 92px;\n border-radius: 20px;\n background: rgb(255 255 255 / 74%);\n box-shadow: inset 0 0 0 1px rgb(64 158 255 / 12%);\n }\n\n strong {\n color: #2563eb;\n font-size: 32px;\n line-height: 1;\n }\n\n span {\n color: #6b7280;\n font-size: 13px;\n }\n}\n\n.panel {\n margin-top: 18px;\n padding: 24px;\n}\n\n.section-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 20px;\n\n &.compact {\n margin-bottom: 12px;\n }\n\n h2 {\n margin: 0 0 6px;\n font-size: 20px;\n }\n\n p {\n margin: 0;\n color: #6b7280;\n line-height: 1.6;\n }\n}\n\n.service-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 14px;\n}\n\n.service-card {\n padding: 16px;\n border: 1px solid #e8edf5;\n border-radius: 14px;\n background: #fbfdff;\n\n &.error {\n background: #fff8f8;\n }\n}\n\n.service-card-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n\n h3 {\n margin: 0 0 6px;\n font-size: 17px;\n }\n\n p {\n margin: 0;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n }\n}\n\n.service-meta {\n display: grid;\n gap: 8px;\n margin-top: 14px;\n color: #8a94a6;\n font-size: 13px;\n}\n\n.error-text,\n.error-list span {\n color: #d03050;\n word-break: break-all;\n}\n\n.error-list {\n display: grid;\n gap: 8px;\n\n p {\n margin: 0;\n line-height: 1.6;\n }\n}\n\n.config-tabs {\n :deep(.el-tabs__header) {\n margin-bottom: 14px;\n }\n\n :deep(.el-tabs__nav-wrap::after) {\n height: 1px;\n background-color: #edf0f5;\n }\n\n :deep(.el-tabs__item) {\n height: 36px;\n padding: 0 18px;\n color: #6b7280;\n font-weight: 700;\n }\n}\n\n.tab-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 14px;\n padding: 12px 14px;\n border-radius: 12px;\n background: #f7faff;\n\n h3 {\n margin: 0 0 5px;\n font-size: 16px;\n }\n\n p {\n margin: 0;\n color: #6b7280;\n line-height: 1.5;\n }\n}\n\n.field-list {\n display: grid;\n gap: 12px;\n}\n\n.config-form :deep(.el-form-item) {\n margin-bottom: 0;\n}\n\n.field-item {\n min-width: 0;\n display: grid;\n grid-template-columns: minmax(180px, 1fr) minmax(220px, 380px);\n align-items: center;\n gap: 16px;\n padding: 12px 14px;\n border: 1px solid #edf0f5;\n border-radius: 12px;\n background: #fff;\n\n :deep(.el-form-item__label) {\n margin-bottom: 0;\n padding-right: 0;\n line-height: 1.4;\n }\n\n :deep(.el-form-item__content) {\n min-width: 0;\n }\n}\n\n.field-label,\n.field-desc {\n display: block;\n}\n\n.field-label {\n color: #1f2937;\n font-size: 14px;\n font-weight: 700;\n}\n\n.field-desc {\n margin-top: 3px;\n color: #8a94a6;\n font-size: 13px;\n}\n\n.full-control {\n width: 100%;\n}\n\n.bottom-actions-row {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-wrap: wrap;\n gap: 12px 16px;\n margin-top: 18px;\n}\n\n.bottom-actions-hint {\n flex: 1 1 220px;\n margin: 0;\n margin-right: auto;\n min-width: 0;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n}\n\n.mysql-live-panel {\n min-height: 120px;\n}\n\n.mysql-tool-block {\n margin-top: 28px;\n padding: 20px 18px;\n border: 1px solid #edf0f5;\n border-radius: 14px;\n background: #fbfdff;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.mysql-tool-block__head {\n margin-bottom: 14px;\n\n &--row {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px 20px;\n }\n}\n\n.mysql-tool-block__title {\n margin: 0 0 6px;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.mysql-tool-block__desc {\n margin: 0;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n}\n\n.mysql-schema-hints--in-tab {\n margin-top: 4px;\n}\n\n.mysql-export-actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 12px;\n margin-bottom: 12px;\n}\n\n.mysql-export-actions__hint {\n color: var(--el-text-color-secondary);\n font-size: 13px;\n}\n\n.mysql-schema-alert {\n margin-bottom: 12px;\n}\n\n.mysql-tool-block--solo {\n margin-top: 16px;\n}\n\n.mysql-merged-section {\n margin-top: 0;\n}\n\n.mysql-merged-section--live {\n margin-top: 20px;\n}\n\n.mysql-merged-section__head {\n margin-bottom: 12px;\n}\n\n.mysql-merged-section__title {\n margin: 0 0 6px;\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n}\n\n.mysql-merged-section__desc {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: #606266;\n}\n\n.admin-users-panel {\n margin-top: 8px;\n}\n\n.admin-users-table {\n width: 100%;\n margin-bottom: 24px;\n}\n\n.admin-create-block {\n margin-top: 8px;\n}\n\n.admin-create-form {\n max-width: 720px;\n}\n\n.admin-create-grid {\n display: grid;\n gap: 4px 20px;\n grid-template-columns: repeat(2, minmax(200px, 1fr));\n margin-bottom: 12px;\n}\n\n.code-row {\n display: flex;\n gap: 10px;\n align-items: center;\n width: 100%;\n\n .el-input {\n flex: 1;\n }\n}\n\n.field-hint-muted {\n margin: 6px 0 0;\n color: #8a94a6;\n font-size: 12px;\n}\n\n.admin-reset-hint {\n margin: 0 0 12px;\n color: #606266;\n font-size: 14px;\n}\n\n@media screen and (max-width: 700px) {\n .admin-create-grid {\n grid-template-columns: 1fr;\n }\n}\n\n.mysql-live-summary {\n display: flex;\n flex-wrap: wrap;\n gap: 10px 18px;\n margin: 0 0 14px;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n}\n\n.mysql-live-collapse {\n border: none;\n\n :deep(.el-collapse-item__header) {\n height: auto;\n min-height: 48px;\n padding: 10px 12px;\n line-height: 1.4;\n background: #fbfdff;\n }\n\n :deep(.el-collapse-item__wrap) {\n border-bottom: 1px solid #edf0f5;\n }\n\n :deep(.el-collapse-item__content) {\n padding-bottom: 16px;\n }\n}\n\n.mysql-live-collapse-title {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: 8px 14px;\n width: 100%;\n padding-right: 8px;\n}\n\n.mysql-live-collapse-meta {\n color: #8a94a6;\n font-size: 13px;\n font-weight: 400;\n}\n\n.mysql-live-block {\n margin-top: 16px;\n\n h4 {\n margin: 0 0 10px;\n font-size: 14px;\n color: #374151;\n }\n}\n\n.mysql-live-table {\n width: 100%;\n}\n\n.mysql-live-muted {\n margin: 0;\n color: #8a94a6;\n font-size: 13px;\n}\n\n.mysql-live-ddl-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.mysql-live-ddl {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\n font-size: 12px;\n}\n\n.tab-head code {\n padding: 1px 6px;\n border-radius: 4px;\n background: rgb(64 158 255 / 12%);\n font-size: 12px;\n}\n\n@media screen and (max-width: 900px) {\n .config-page {\n margin-top: 40px;\n }\n\n .hero-card {\n align-items: flex-start;\n flex-direction: column;\n padding: 22px;\n }\n\n .hero-stats {\n width: 100%;\n grid-template-columns: repeat(3, 1fr);\n }\n\n .field-item {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n}\n\n@media screen and (max-width: 700px) {\n .config-page {\n margin: 40px 10px 0;\n }\n\n .panel {\n padding: 18px;\n border-radius: 14px;\n }\n\n .section-head,\n .tab-head {\n display: block;\n }\n\n .section-head .el-button,\n .tab-head .el-button {\n width: 100%;\n margin-top: 14px;\n }\n\n .hero-stats {\n grid-template-columns: 1fr;\n }\n\n .config-tabs :deep(.el-tabs__nav-scroll) {\n overflow-x: auto;\n }\n\n .field-item {\n padding: 12px;\n }\n\n .bottom-actions-row {\n flex-direction: column;\n align-items: stretch;\n }\n\n .bottom-actions-hint {\n margin-right: 0;\n }\n\n .bottom-actions-row .el-button {\n width: 100%;\n }\n}\n</style>\n\n<!-- Teleport 全屏预览:挂载到 body,样式独立于 scoped -->\n<style lang=\"scss\">\n.mysql-export-fs {\n position: fixed;\n inset: 0;\n z-index: 3000;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n background: var(--el-bg-color, #fff);\n}\n\n.mysql-export-fs__shell {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n min-width: 0;\n width: 100%;\n height: 100%;\n background: inherit;\n}\n\n.mysql-export-fs__head {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 14px 18px;\n border-bottom: 1px solid var(--el-border-color-lighter, #ebeef5);\n box-sizing: border-box;\n}\n\n.mysql-export-fs__title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--el-text-color-primary);\n}\n\n.mysql-export-fs__main {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 18px;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n.mysql-export-fs__desc {\n margin: 0;\n flex-shrink: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--el-text-color-secondary);\n}\n\n.mysql-export-fs__hint {\n margin: 0;\n flex-shrink: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--el-text-color-regular);\n}\n\n.mysql-export-fs__textarea {\n flex: 1 1 0;\n min-height: 0;\n width: 100%;\n resize: none;\n box-sizing: border-box;\n padding: 12px 14px;\n border: 1px solid var(--el-border-color, #dcdfe6);\n border-radius: var(--el-border-radius-base, 4px);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\n font-size: 13px;\n line-height: 1.5;\n tab-size: 2;\n color: var(--el-text-color-primary);\n background: var(--el-fill-color-blank, #fff);\n cursor: text;\n overflow-y: auto;\n}\n\n.mysql-export-fs__textarea:focus-visible {\n outline: 2px solid var(--el-color-primary);\n outline-offset: 0;\n}\n\n.mysql-export-fs__foot {\n flex-shrink: 0;\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 12px 18px;\n border-top: 1px solid var(--el-border-color-lighter, #ebeef5);\n box-sizing: border-box;\n}\n</style>\n"],"names":["collapseContextKey","Symbol","emitChangeFn","value","isNumber","collapseProps","buildProps","accordion","Boolean","modelValue","type","definePropType","Array","String","Number","default","mutable","_sfc_main","defineComponent","name","props","emits","UPDATE_MODEL_EVENT","CHANGE_EVENT","setup","__props","expose","emit","ns","useNamespace","activeNames","ref","castArray","setActiveNames","_activeNames","watch","deep","provide","handleItemClick","index","indexOf","splice","push","_ctx","_cache","openBlock","createElementBlock","class","normalizeClass","unref","b","role","renderSlot","$slots","Collapse","_export_sfc","collapseItemProps","title","generateId","disabled","_hoisted_1","_hoisted_2","_hoisted_3","CollapseItem","collapse","inject","focusing","isClick","id","isActive","computed","includes","handleFocus","setTimeout","handleHeaderClick","handleEnterClick","is","createElementVNode","be","tabindex","onClick","onKeypress","withKeys","withModifiers","onFocus","onBlur","$event","createTextVNode","toDisplayString","createVNode","ElIcon","withCtx","ArrowRight","_","_CollapseTransition","withDirectives","vShow","ElCollapse","withInstall","ElCollapseItem","withNoopInstall","ConfigServiceAPI","getServiceOverview","ajax","get","getMysqlSchema","getMysqlSchemaExportSql","applyMysqlSchema","post","getMysqlLiveIntrospect","checkMysqlDatabase","body","listConfigAdminUsers","createConfigAdminUser","resetConfigAdminUserPassword","getServiceConfig","updateCfg","data","put","MYSQL_INTROSPECT_TAB","CONFIG_ADMIN_USERS_TAB","siteConfig","useSiteConfig","mysqlSchema","schemaLoading","mysqlExportDialogVisible","mysqlExportLoading","mysqlExportSql","mysqlExportDescription","mysqlExportError","serviceOverview","serverConfig","loading","configLoading","activeConfigTab","savingMap","reactive","overviewStats","total","length","running","filter","item","status","required","optional","abnormal","showErrorList","errMsg","showMysqlToolTabs","some","s","mysqlLive","mysqlLiveLoading","mysqlLiveOpenNames","currentConfig","find","getServiceTagType","service","getServiceTagText","isNumberConfig","key","updateConfigValue","async","loadMysqlSchema","loadMysqlLiveIntrospect","formatBytes","n","isNaN","units","v","i","toFixed","Math","round","refreshStatus","ElMessage","success","error","openMysqlExportDialog","sql","trim","description","closeMysqlExportDialog","adminUsersLoading","adminUsersList","loginIsSuper","loginIsSystem","canOperateConfigAdmins","adminCreateForm","account","pwd1","pwd2","bindPhone","phone","code","adminCreateSubmitting","adminResetVisible","adminResetRow","adminResetPwd1","adminResetPwd2","adminResetSubmitting","adminCodeText","adminCodeTime","refreshAdminCodeText","getAdminCreateCode","rMobilePhone","test","PublicApi","getCode","then","warning","loadAdminUsers","list","submitCreateAdminUser","rAccount","rPassword","rVerCode","checkAdminCreateForm","pwd","ok","closeAdminResetDialog","submitAdminResetPassword","copyMysqlExportSqlAll","navigator","clipboard","writeText","showSuccess","updateCfgGroup","group","check","items","pick","it","configMysqlDataToCheckBody","canConnect","databaseExists","autoItem","dbName","msg","ElMessageBox","confirm","confirmButtonText","cancelButtonText","label","isSecret","refreshMysqlToolsTab","needBindPhone","need","immediate","open","document","style","overflow","onMounted","t","UserApi","checkPower","power","system","loadLoginPower","idx","columns","map","c","p","subPart","column","join","tbl","text","createSql","row"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
System.register(["./index-legacy-BsWj1xV2.js"],(function(t,e){"use strict";var a,o,d,l,s,n,i,r,g,p,m;return{setters:[t=>{a=t.L,o=t.d,d=t.N,l=t.a,s=t.B,n=t.w,i=t.R,r=t.S,g=t.bi,p=t.j,m=t.b4}],execute:function(){var e=a(o({name:"ElCollapseTransition",setup(t){const e=d("collapse-transition"),a={beforeEnter(t){t.dataset||(t.dataset={}),t.dataset.oldPaddingTop=t.style.paddingTop,t.dataset.oldPaddingBottom=t.style.paddingBottom,t.style.maxHeight=0,t.style.paddingTop=0,t.style.paddingBottom=0},enter(t){t.dataset.oldOverflow=t.style.overflow,0!==t.scrollHeight?(t.style.maxHeight=`${t.scrollHeight}px`,t.style.paddingTop=t.dataset.oldPaddingTop,t.style.paddingBottom=t.dataset.oldPaddingBottom):(t.style.maxHeight=0,t.style.paddingTop=t.dataset.oldPaddingTop,t.style.paddingBottom=t.dataset.oldPaddingBottom),t.style.overflow="hidden"},afterEnter(t){t.style.maxHeight="",t.style.overflow=t.dataset.oldOverflow},beforeLeave(t){t.dataset||(t.dataset={}),t.dataset.oldPaddingTop=t.style.paddingTop,t.dataset.oldPaddingBottom=t.style.paddingBottom,t.dataset.oldOverflow=t.style.overflow,t.style.maxHeight=`${t.scrollHeight}px`,t.style.overflow="hidden"},leave(t){0!==t.scrollHeight&&(t.style.maxHeight=0,t.style.paddingTop=0,t.style.paddingBottom=0)},afterLeave(t){t.style.maxHeight="",t.style.overflow=t.dataset.oldOverflow,t.style.paddingTop=t.dataset.oldPaddingTop,t.style.paddingBottom=t.dataset.oldPaddingBottom}};return(t,o)=>(l(),s(m,r({name:p(e).b()},g(a)),{default:n((()=>[i(t.$slots,"default")])),_:3},16,["name"]))}}),[["__file","/home/runner/work/element-plus/element-plus/packages/components/collapse-transition/src/collapse-transition.vue"]]);e.install=t=>{t.component(e.name,e)},t("_",e)}}}));
|
|
2
|
+
//# sourceMappingURL=index-legacy-DqfRlqrq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-legacy-DqfRlqrq.js","sources":["../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse-transition/src/collapse-transition.mjs","../../../../node_modules/.pnpm/element-plus@2.2.13_vue@3.5.12_typescript@4.9.5_/node_modules/element-plus/es/components/collapse-transition/index.mjs"],"sourcesContent":["import { defineComponent, openBlock, createBlock, Transition, mergeProps, unref, toHandlers, withCtx, renderSlot } from 'vue';\nimport '../../../hooks/index.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\n\nconst __default__ = {\n name: \"ElCollapseTransition\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n setup(__props) {\n const ns = useNamespace(\"collapse-transition\");\n const on = {\n beforeEnter(el) {\n if (!el.dataset)\n el.dataset = {};\n el.dataset.oldPaddingTop = el.style.paddingTop;\n el.dataset.oldPaddingBottom = el.style.paddingBottom;\n el.style.maxHeight = 0;\n el.style.paddingTop = 0;\n el.style.paddingBottom = 0;\n },\n enter(el) {\n el.dataset.oldOverflow = el.style.overflow;\n if (el.scrollHeight !== 0) {\n el.style.maxHeight = `${el.scrollHeight}px`;\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n } else {\n el.style.maxHeight = 0;\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n }\n el.style.overflow = \"hidden\";\n },\n afterEnter(el) {\n el.style.maxHeight = \"\";\n el.style.overflow = el.dataset.oldOverflow;\n },\n beforeLeave(el) {\n if (!el.dataset)\n el.dataset = {};\n el.dataset.oldPaddingTop = el.style.paddingTop;\n el.dataset.oldPaddingBottom = el.style.paddingBottom;\n el.dataset.oldOverflow = el.style.overflow;\n el.style.maxHeight = `${el.scrollHeight}px`;\n el.style.overflow = \"hidden\";\n },\n leave(el) {\n if (el.scrollHeight !== 0) {\n el.style.maxHeight = 0;\n el.style.paddingTop = 0;\n el.style.paddingBottom = 0;\n }\n },\n afterLeave(el) {\n el.style.maxHeight = \"\";\n el.style.overflow = el.dataset.oldOverflow;\n el.style.paddingTop = el.dataset.oldPaddingTop;\n el.style.paddingBottom = el.dataset.oldPaddingBottom;\n }\n };\n return (_ctx, _cache) => {\n return openBlock(), createBlock(Transition, mergeProps({\n name: unref(ns).b()\n }, toHandlers(on)), {\n default: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\")\n ]),\n _: 3\n }, 16, [\"name\"]);\n };\n }\n});\nvar CollapseTransition = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/collapse-transition/src/collapse-transition.vue\"]]);\n\nexport { CollapseTransition as default };\n//# sourceMappingURL=collapse-transition.mjs.map\n","import CollapseTransition from './src/collapse-transition.mjs';\n\nCollapseTransition.install = (app) => {\n app.component(CollapseTransition.name, CollapseTransition);\n};\nconst _CollapseTransition = CollapseTransition;\nconst ElCollapseTransition = _CollapseTransition;\n\nexport { ElCollapseTransition, _CollapseTransition as default };\n//# sourceMappingURL=index.mjs.map\n"],"names":["CollapseTransition","_export_sfc","defineComponent","name","setup","__props","ns","useNamespace","on","beforeEnter","el","dataset","oldPaddingTop","style","paddingTop","oldPaddingBottom","paddingBottom","maxHeight","enter","oldOverflow","overflow","scrollHeight","afterEnter","beforeLeave","leave","afterLeave","_ctx","_cache","openBlock","createBlock","Transition","mergeProps","unref","b","toHandlers","default","withCtx","renderSlot","$slots","_","install","app","component","exports"],"mappings":"kNA0EA,IAAIA,EAAqCC,EAlEPC,EAAgB,CAFhDC,KAAM,uBAINC,KAAAA,CAAMC,GACJ,MAAMC,EAAKC,EAAa,uBAClBC,EAAK,CACTC,WAAAA,CAAYC,GACLA,EAAGC,UACND,EAAGC,QAAU,IACfD,EAAGC,QAAQC,cAAgBF,EAAGG,MAAMC,WACpCJ,EAAGC,QAAQI,iBAAmBL,EAAGG,MAAMG,cACvCN,EAAGG,MAAMI,UAAY,EACrBP,EAAGG,MAAMC,WAAa,EACtBJ,EAAGG,MAAMG,cAAgB,CAC1B,EACDE,KAAAA,CAAMR,GACJA,EAAGC,QAAQQ,YAAcT,EAAGG,MAAMO,SACV,IAApBV,EAAGW,cACLX,EAAGG,MAAMI,UAAY,GAAGP,EAAGW,iBAC3BX,EAAGG,MAAMC,WAAaJ,EAAGC,QAAQC,cACjCF,EAAGG,MAAMG,cAAgBN,EAAGC,QAAQI,mBAEpCL,EAAGG,MAAMI,UAAY,EACrBP,EAAGG,MAAMC,WAAaJ,EAAGC,QAAQC,cACjCF,EAAGG,MAAMG,cAAgBN,EAAGC,QAAQI,kBAEtCL,EAAGG,MAAMO,SAAW,QACrB,EACDE,UAAAA,CAAWZ,GACTA,EAAGG,MAAMI,UAAY,GACrBP,EAAGG,MAAMO,SAAWV,EAAGC,QAAQQ,WAChC,EACDI,WAAAA,CAAYb,GACLA,EAAGC,UACND,EAAGC,QAAU,IACfD,EAAGC,QAAQC,cAAgBF,EAAGG,MAAMC,WACpCJ,EAAGC,QAAQI,iBAAmBL,EAAGG,MAAMG,cACvCN,EAAGC,QAAQQ,YAAcT,EAAGG,MAAMO,SAClCV,EAAGG,MAAMI,UAAY,GAAGP,EAAGW,iBAC3BX,EAAGG,MAAMO,SAAW,QACrB,EACDI,KAAAA,CAAMd,GACoB,IAApBA,EAAGW,eACLX,EAAGG,MAAMI,UAAY,EACrBP,EAAGG,MAAMC,WAAa,EACtBJ,EAAGG,MAAMG,cAAgB,EAE5B,EACDS,UAAAA,CAAWf,GACTA,EAAGG,MAAMI,UAAY,GACrBP,EAAGG,MAAMO,SAAWV,EAAGC,QAAQQ,YAC/BT,EAAGG,MAAMC,WAAaJ,EAAGC,QAAQC,cACjCF,EAAGG,MAAMG,cAAgBN,EAAGC,QAAQI,gBACrC,GAEH,MAAO,CAACW,EAAMC,KACLC,IAAaC,EAAYC,EAAYC,EAAW,CACrD5B,KAAM6B,EAAM1B,GAAI2B,KACfC,EAAW1B,IAAM,CAClB2B,QAASC,GAAQ,IAAM,CACrBC,EAAWX,EAAKY,OAAQ,cAE1BC,EAAG,GACF,GAAI,CAAC,SAEX,IAE6D,CAAC,CAAC,SAAU,qHCxE5EvC,EAAmBwC,QAAWC,IAC5BA,EAAIC,UAAU1C,EAAmBG,KAAMH,EAAmB,EAEhC2C,EAAA,IAAA3C","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
System.register(["./index-legacy-BsWj1xV2.js","./el-tab-pane-legacy-Cgd5IxXQ.js","./el-input-number-legacy-CaZROy3J.js","./el-date-picker-legacy-iQW0501V.js","./el-scrollbar-legacy-CLEobATW.js","./el-switch-legacy-DCF_46l4.js","./index-legacy-BUrH0Ubh.js","./index-legacy-BTvagK_v.js","./index-legacy-Ca1NdJPm.js","./aria-legacy-B70JmEZA.js"],(function(e,a){"use strict";var t,i,l,n,r,o,d,s,p,c,m,f,u,g,b,x,y,h,v,k,P,w,S,L,C,T,N,B,_,q,E,j,V,z;return{setters:[e=>{t=e.d,i=e.u,l=e.M,n=e.X,r=e.r,o=e.cu,d=e.Y,s=e.o,p=e.bj,c=e.a,m=e.c,f=e.b,u=e.t,g=e.F,b=e.A,x=e.D,y=e.Q,h=e.i,v=e.w,k=e.e,P=e.B,w=e.cv,S=e.E,L=e.s,C=e.q,T=e.ag,N=e.ah,B=e._},e=>{_=e.E,q=e.a},e=>{E=e.E},e=>{j=e.E},null,e=>{V=e.E},e=>{z=e.E},null,null,null],execute:function(){var a=document.createElement("style");a.textContent=".config-page[data-v-aba76797]{max-width:1256px;margin:10px auto;color:#1f2937}.hero-card[data-v-aba76797],.panel[data-v-aba76797]{box-sizing:border-box;border:1px solid #edf0f5;border-radius:18px;background:#fff;box-shadow:0 10px 30px rgba(31,41,55,.08)}.hero-card[data-v-aba76797]{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:28px 32px;overflow:hidden;background:radial-gradient(circle at 88% 20%,rgba(64,158,255,.18),transparent 28%),linear-gradient(135deg,#fff,#f6f9ff)}.hero-card h1[data-v-aba76797]{margin:6px 0 10px;font-size:30px;line-height:1.2}.eyebrow[data-v-aba76797]{margin:0;color:#409eff;font-size:13px;font-weight:700;letter-spacing:.12em}.hero-desc[data-v-aba76797]{max-width:560px;margin:0;color:#6b7280;line-height:1.7}.hero-stat[data-v-aba76797]{display:grid;place-items:center;min-width:132px;min-height:132px;border-radius:28px;background:rgba(255,255,255,.72);box-shadow:inset 0 0 0 1px rgba(64,158,255,.12)}.hero-stat strong[data-v-aba76797]{color:#2563eb;font-size:42px;line-height:1}.hero-stat span[data-v-aba76797]{color:#6b7280;font-size:13px}.panel[data-v-aba76797]{margin-top:18px;padding:24px}.section-head[data-v-aba76797]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:20px}.section-head h2[data-v-aba76797]{margin:0 0 6px;font-size:20px}.section-head p[data-v-aba76797]{margin:0;color:#6b7280;line-height:1.6}.actions[data-v-aba76797]{display:flex;flex-shrink:0;gap:10px}.route-grid[data-v-aba76797]{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}.route-item[data-v-aba76797]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px;border:1px solid #e8edf5;border-radius:14px;background:#fbfdff;transition:border-color .2s,box-shadow .2s,transform .2s}.route-item[data-v-aba76797]:hover{border-color:rgba(64,158,255,.45);box-shadow:0 8px 24px rgba(64,158,255,.1);transform:translateY(-1px)}.route-item.disabled[data-v-aba76797]{background:#fff8f8}.route-main[data-v-aba76797]{display:grid;gap:5px}.route-main strong[data-v-aba76797]{font-size:16px}.route-main span[data-v-aba76797],.route-main small[data-v-aba76797]{color:#6b7280;font-size:13px}.config-tabs[data-v-aba76797] .el-tabs__header{margin-bottom:14px}.config-tabs[data-v-aba76797] .el-tabs__nav-wrap:after{height:1px;background-color:#edf0f5}.config-tabs[data-v-aba76797] .el-tabs__item{height:36px;padding:0 18px;color:#6b7280;font-weight:700}.tab-desc[data-v-aba76797]{margin-bottom:12px;padding:10px 12px;border-radius:10px;background:#f7faff;color:#6b7280;font-size:13px;line-height:1.5}.field-list[data-v-aba76797]{display:grid;gap:12px}.config-form[data-v-aba76797] .el-form-item{margin-bottom:0}.config-form[data-v-aba76797] .el-form-item__label{display:block;margin-bottom:4px;line-height:1.4}.field-item[data-v-aba76797]{min-width:0;display:grid;grid-template-columns:minmax(180px,1fr) minmax(220px,320px);align-items:center;gap:16px;padding:12px 14px;border:1px solid #edf0f5;border-radius:12px;background:#fff}.field-item[data-v-aba76797] .el-form-item__label{margin-bottom:0;padding-right:0}.field-item[data-v-aba76797] .el-form-item__content{min-width:0}.field-label[data-v-aba76797],.field-desc[data-v-aba76797]{display:block}.field-label[data-v-aba76797]{color:#1f2937;font-size:14px;font-weight:700}.field-desc[data-v-aba76797]{margin-top:3px;color:#8a94a6;font-size:13px}.field-control[data-v-aba76797]{display:flex;align-items:center;gap:8px}.full-control[data-v-aba76797],.number-control[data-v-aba76797]{flex:1;width:100%;min-width:0}.suffix[data-v-aba76797]{flex-shrink:0;color:#6b7280;font-size:13px}@media screen and (max-width: 900px){.config-page[data-v-aba76797]{margin-top:40px}.hero-card[data-v-aba76797]{align-items:flex-start;flex-direction:column;padding:22px}.hero-stat[data-v-aba76797]{display:flex;justify-content:center;width:100%;min-height:auto;padding:18px;gap:10px;border-radius:18px}.field-item[data-v-aba76797]{grid-template-columns:1fr;gap:8px}}@media screen and (max-width: 700px){.config-page[data-v-aba76797]{margin:40px 10px 0}.panel[data-v-aba76797]{padding:18px;border-radius:14px}.form-head[data-v-aba76797],.section-head[data-v-aba76797]{display:block}.actions[data-v-aba76797]{margin-top:14px}.actions .el-button[data-v-aba76797]{flex:1}.route-grid[data-v-aba76797]{grid-template-columns:1fr}.route-item[data-v-aba76797]{align-items:flex-start}.config-tabs[data-v-aba76797] .el-tabs__nav-scroll{overflow-x:auto}.field-item[data-v-aba76797]{padding:12px}}\n/*$vite$:1*/",document.head.appendChild(a);const D={class:"config-page"},U={class:"hero-card"},O={class:"hero-stat"},$={class:"panel"},H={class:"route-grid"},G={class:"route-main"},F={key:0},I={class:"panel"},M={class:"section-head form-head"},R={class:"actions"},W={class:"tab-desc"},J={class:"field-list"},Y={class:"field-label"},A={class:"field-desc"},Q={class:"field-control"},X={key:5,class:"suffix"};e("default",B(t({__name:"index",setup(e){const a={...w},t=[{title:"基础体验",description:"控制站点名称、表单规模和用户可输入内容。",fields:[{key:"appName",label:"应用名称",description:"展示在前台页面的产品名称。",type:"text"},{key:"maxInputLength",label:"输入长度上限",description:"单个表单项允许输入的最大字符数。",type:"number",min:1,step:1},{key:"formLength",label:"表单项数量",description:"用户创建取件表单时可配置的字段数量。",type:"number",min:1,step:1},{key:"openPraise",label:"赞赏提示",description:"是否在前台显示赞赏相关提示文案。",type:"switch"},{key:"feedbackEntryEnabled",label:"问题反馈入口",description:"是否在页面右下角展示问题反馈浮动入口。",type:"switch"},{key:"filePageFloatingContactEnabled",label:"右下角联系入口",description:"开启后在文件页和任务页右下角固定展示联系作者快捷入口。",type:"switch"}]},{title:"上传与下载",description:"管理文件下载有效期和压缩包大小限制。",fields:[{key:"downloadOneExpired",label:"单文件链接有效期",description:"单个文件下载链接的过期时间。",type:"number",min:1,step:1,suffix:"分钟"},{key:"downloadCompressExpired",label:"归档链接有效期",description:"打包下载链接的过期时间。",type:"number",min:1,step:1,suffix:"分钟"},{key:"compressSizeLimit",label:"压缩包大小限制",description:"允许创建压缩包的最大体积。",type:"number",min:1,step:1,suffix:"GB"}]},{title:"访问限制",description:"控制用户使用前的校验与资源限制策略。",fields:[{key:"needBindPhone",label:"强制绑定手机号",description:"开启后用户需要先绑定手机号。",type:"switch"},{key:"enableCodeLogin",label:"验证码登录",description:"开启后且腾讯云短信配置完整时,前台展示验证码登录入口。",type:"switch"},{key:"limitSpace",label:"限制存储空间",description:"开启后按用户空间额度限制上传。",type:"switch"},{key:"limitWallet",label:"限制钱包余额",description:"开启后按钱包余额限制资源消耗。",type:"switch"}]},{title:"成本计费",description:"配置七牛云与压缩相关的成本计算参数。",fields:[{key:"moneyStartDay",label:"计费开始日期",description:"费用统计从该日期开始计算。",type:"date"},{key:"qiniuOSSPrice",label:"七牛云存储单价",description:"对象存储计费单价。",type:"number",min:0,step:.001,precision:3,suffix:"元/GB"},{key:"qiniuCDNPrice",label:"七牛云 CDN 单价",description:"CDN 流量计费单价。",type:"number",min:0,step:.001,precision:3,suffix:"元/GB"},{key:"qiniuBackhaulTrafficPrice",label:"回源流量单价",description:"回源流量计费单价。",type:"number",min:0,step:.001,precision:3,suffix:"元/GB"},{key:"qiniuBackhaulTrafficPercentage",label:"回源流量占比",description:"用于估算回源流量的比例。",type:"number",min:0,max:1,step:.01,precision:2},{key:"qiniuCompressPrice",label:"压缩处理单价",description:"压缩服务的成本单价。",type:"number",min:0,step:.001,precision:3,suffix:"元/GB"}]},{title:"文件页提示",description:"配置文件列表页的赞赏提示、联系入口和资源限制说明。",fields:[{key:"filePagePraiseText",label:"赞赏前置文案",description:"展示在赞赏链接前的说明。",type:"textarea",maxlength:120},{key:"filePagePraiseLinkText",label:"赞赏链接文案",description:"赞赏入口的链接文字。",type:"textarea",maxlength:80},{key:"filePagePraiseLink",label:"赞赏链接",description:"点击赞赏入口后打开的地址。",type:"url",maxlength:300},{key:"filePageContactText",label:"联系前置文案",description:"展示在联系入口前的说明。",type:"textarea",maxlength:120},{key:"filePageContactLinkText",label:"联系链接文案",description:"联系入口的链接文字。",type:"textarea",maxlength:80},{key:"filePageContactLink",label:"联系链接",description:"点击联系入口后打开的地址。",type:"url",maxlength:300},{key:"filePageLimitText",label:"限制说明",description:"赞赏提示开启时展示的资源限制说明。",type:"textarea",maxlength:300},{key:"filePageSponsorText",label:"赞助说明前缀",description:"展示在赞助联系链接前的文案。",type:"textarea",maxlength:120},{key:"filePageSponsorLinkText",label:"赞助链接文案",description:"赞助联系入口的链接文字。",type:"textarea",maxlength:100},{key:"filePageSponsorLink",label:"赞助链接",description:"点击赞助联系入口后打开的地址。",type:"url",maxlength:300},{key:"filePageSponsorSuffix",label:"赞助说明后缀",description:"展示在赞助联系链接后的文案。",type:"textarea",maxlength:120},{key:"filePageSelfHostLinkText",label:"自建链接文案",description:"自建文档入口的链接文字。",type:"textarea",maxlength:100},{key:"filePageSelfHostLink",label:"自建链接",description:"点击自建文档入口后打开的地址。",type:"url",maxlength:300}]}],B=i(),K=l((()=>B.options.routes.filter((e=>e.meta?.allowDisabled)))),Z=n([]),ee=l((()=>Z.filter((e=>!e.disabled)).length)),ae=r(),te=r(!1),ie=r(t[0].title),le=n({...a}),{value:ne,updateValue:re}=o(),oe=new Map(t.flatMap((e=>e.fields)).map((e=>[e.key,e]))),de={appName:[{required:!0,message:"请输入应用名称",trigger:"blur"}],maxInputLength:[{required:!0,message:"请输入输入长度上限",trigger:"blur"}],formLength:[{required:!0,message:"请输入表单项数量",trigger:"blur"}],downloadOneExpired:[{required:!0,message:"请输入单文件链接有效期",trigger:"blur"}],downloadCompressExpired:[{required:!0,message:"请输入归档链接有效期",trigger:"blur"}],compressSizeLimit:[{required:!0,message:"请输入压缩包大小限制",trigger:"blur"}],moneyStartDay:[{required:!0,message:"请选择计费开始日期",trigger:"change"}]};function se(e={}){Object.assign(le,{...a,...e})}function pe(e){return le[e]}function ce(e,a){le[e]=a}function me(){se(ne.value),S.info("已恢复为当前线上配置")}function fe(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function ue(e,a){const t=oe.get(e);if("switch"===t?.type)return a?"开启":"关闭";if("date"===t?.type)return Number.isNaN(Number(a))?"-":new Date(Number(a)).toLocaleDateString();const i=String(a??"");return i.length>120?`${i.slice(0,120)}...`:i}async function ge(){try{await(ae.value?.validate())}catch{return void S.error("保存失败,请检查配置项后重试")}const e={...a,...ne.value,appName:le.appName.trim(),maxInputLength:Number(le.maxInputLength),openPraise:Boolean(le.openPraise),feedbackEntryEnabled:Boolean(le.feedbackEntryEnabled),formLength:Number(le.formLength),downloadOneExpired:Number(le.downloadOneExpired),downloadCompressExpired:Number(le.downloadCompressExpired),compressSizeLimit:Number(le.compressSizeLimit),needBindPhone:Boolean(le.needBindPhone),enableCodeLogin:Boolean(le.enableCodeLogin),limitSpace:Boolean(le.limitSpace),limitWallet:Boolean(le.limitWallet),qiniuOSSPrice:Number(le.qiniuOSSPrice),qiniuCDNPrice:Number(le.qiniuCDNPrice),qiniuBackhaulTrafficPrice:Number(le.qiniuBackhaulTrafficPrice),qiniuBackhaulTrafficPercentage:Number(le.qiniuBackhaulTrafficPercentage),qiniuCompressPrice:Number(le.qiniuCompressPrice),moneyStartDay:Number(le.moneyStartDay),filePagePraiseText:le.filePagePraiseText.trim(),filePagePraiseLinkText:le.filePagePraiseLinkText.trim(),filePagePraiseLink:le.filePagePraiseLink.trim(),filePageContactText:le.filePageContactText.trim(),filePageContactLinkText:le.filePageContactLinkText.trim(),filePageContactLink:le.filePageContactLink.trim(),filePageFloatingContactEnabled:Boolean(le.filePageFloatingContactEnabled),filePageLimitText:le.filePageLimitText.trim(),filePageSponsorText:le.filePageSponsorText.trim(),filePageSponsorLinkText:le.filePageSponsorLinkText.trim(),filePageSponsorLink:le.filePageSponsorLink.trim(),filePageSponsorSuffix:le.filePageSponsorSuffix.trim(),filePageSelfHostLinkText:le.filePageSelfHostLinkText.trim(),filePageSelfHostLink:le.filePageSelfHostLink.trim()},t=function(e){const t={...a,...ne.value};return Object.keys(a).map((a=>{const i=a,l=t[i],n=e[i];return l===n?null:{key:i,label:oe.get(i)?.label||i,oldValue:ue(i,l),newValue:ue(i,n)}})).filter(Boolean)}(e);if(0!==t.length){try{await z.confirm(function(e){const a=e.map((e=>`<li><strong>${fe(String(e.label))}</strong>:<span>${fe(e.oldValue)}</span> → <span>${fe(e.newValue)}</span></li>`)).join("");return`<div class="config-change-confirm">\n <p>本次将修改以下 ${e.length} 项配置,请确认后再提交:</p>\n <ul>${a}</ul>\n </div>`}(t),"确认保存配置",{confirmButtonText:"确认保存",cancelButtonText:"取消",type:"warning",dangerouslyUseHTMLString:!0})}catch{return void S.info("已取消保存")}try{te.value=!0,ne.value=e,await re(),se(ne.value),S.success("全局配置已保存")}catch{S.error("保存失败,请稍后重试")}finally{te.value=!1}}else S.info("暂无配置变更")}return d(ne,(e=>se(e)),{immediate:!0,deep:!0}),s((()=>{for(const e of K.value)p.checkDisabledRoute(e.path).then((a=>{Z.push({path:e.path,name:String(e.name),title:String(e.meta?.title||e.name||e.path),disabled:!!a.data?.status})}))})),(e,a)=>{const i=V,l=L,n=j,r=E,o=C,d=T,s=_,w=q,B=N;return c(),m("div",D,[f("section",U,[a[2]||(a[2]=f("div",null,[f("p",{class:"eyebrow"}," 系统配置 "),f("h1",null,"配置中心"),f("p",{class:"hero-desc"}," 统一管理可禁用路由与全局站点参数,表单化编辑后会直接写入服务端配置。 ")],-1)),f("div",O,[f("strong",null,u(ee.value),1),a[1]||(a[1]=f("span",null,"个路由启用中",-1))])]),f("section",$,[a[3]||(a[3]=f("div",{class:"section-head"},[f("div",null,[f("h2",null,"禁用路由管理"),f("p",null,"关闭后对应页面将无法访问,注册页关闭时会同步禁用注册能力。")])],-1)),f("div",H,[(c(!0),m(g,null,b(Z,(e=>(c(),m("article",{key:e.name,class:x(["route-item",{disabled:e.disabled}])},[f("div",G,[f("strong",null,u(e.title),1),f("span",null,u(e.path),1),"/register"===e.path?(c(),m("small",F,"关闭后将同时禁用注册功能")):y("",!0)]),h(i,{"model-value":!e.disabled,"inline-prompt":"","active-text":"开","inactive-text":"关",style:{"--el-switch-on-color":"#13ce66","--el-switch-off-color":"#ff6b6b"},onChange:a=>function(e){p.addDisabledRoute(e.path,!e.disabled).then((()=>{e.disabled=!e.disabled,S.success("切换成功")}))}(e)},null,8,["model-value","onChange"])],2)))),128))])]),f("section",I,[f("div",M,[a[6]||(a[6]=f("div",null,[f("h2",null,"全局配置管理"),f("p",null,"按场景维护站点参数,无需直接编辑 JSON。")],-1)),f("div",R,[h(l,{onClick:me},{default:v((()=>a[4]||(a[4]=[k(" 重置 ")]))),_:1}),h(l,{type:"primary",loading:te.value,onClick:ge},{default:v((()=>a[5]||(a[5]=[k(" 保存配置 ")]))),_:1},8,["loading"])])]),h(B,{ref_key:"siteFormRef",ref:ae,model:le,rules:de,"label-position":"top",class:"config-form"},{default:v((()=>[h(w,{modelValue:ie.value,"onUpdate:modelValue":a[0]||(a[0]=e=>ie.value=e),class:"config-tabs"},{default:v((()=>[(c(),m(g,null,b(t,(e=>h(s,{key:e.title,label:e.title,name:e.title},{default:v((()=>[f("div",W,u(e.description),1),f("div",J,[(c(!0),m(g,null,b(e.fields,(e=>(c(),P(d,{key:e.key,prop:e.key,class:"field-item"},{label:v((()=>[f("span",Y,u(e.label),1),f("span",A,u(e.description),1)])),default:v((()=>[f("div",Q,["switch"===e.type?(c(),P(i,{key:0,"model-value":Boolean(pe(e.key)),"inline-prompt":"","active-text":"开","inactive-text":"关","onUpdate:modelValue":a=>ce(e.key,a)},null,8,["model-value","onUpdate:modelValue"])):"date"===e.type?(c(),P(n,{key:1,"model-value":Number(pe(e.key)),type:"date","value-format":"x",placeholder:"请选择日期",class:"full-control","onUpdate:modelValue":a=>ce(e.key,Number(a))},null,8,["model-value","onUpdate:modelValue"])):"number"===e.type?(c(),P(r,{key:2,"model-value":Number(pe(e.key)),min:e.min,max:e.max,step:e.step||1,precision:e.precision,"controls-position":"right",class:"number-control","onUpdate:modelValue":a=>ce(e.key,Number(a))},null,8,["model-value","min","max","step","precision","onUpdate:modelValue"])):"textarea"===e.type?(c(),P(o,{key:3,"model-value":String(pe(e.key)),type:"textarea",rows:3,maxlength:e.maxlength||300,"show-word-limit":"",placeholder:"请输入","onUpdate:modelValue":a=>ce(e.key,a)},null,8,["model-value","maxlength","onUpdate:modelValue"])):(c(),P(o,{key:4,"model-value":String(pe(e.key)),type:"url"===e.type?"url":"text",maxlength:e.maxlength||30,"show-word-limit":"",placeholder:"请输入","onUpdate:modelValue":a=>ce(e.key,a)},null,8,["model-value","type","maxlength","onUpdate:modelValue"])),e.suffix?(c(),m("span",X,u(e.suffix),1)):y("",!0)])])),_:2},1032,["prop"])))),128))])])),_:2},1032,["label","name"]))),64))])),_:1},8,["modelValue"])])),_:1},8,["model"])])])}}}),[["__scopeId","data-v-aba76797"]]))}}}));
|
|
2
|
+
//# sourceMappingURL=index-legacy-DyJmAPRK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-legacy-DyJmAPRK.js","sources":["../../src/pages/dashboard/manage/config/index.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { FormInstance, FormRules } from 'element-plus'\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, onMounted, reactive, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { SuperOverviewApi } from '@/apis'\nimport { defaultSiteConfig as baseDefaultSiteConfig, useSiteAllConfig } from '@/composables'\n\ninterface SiteConfig extends OverviewApiTypes.GlobalSiteConfig {}\ninterface RouteItem {\n path: string\n name: string\n title: string\n disabled: boolean\n}\ninterface ConfigField {\n key: keyof SiteConfig\n label: string\n description: string\n type: 'text' | 'textarea' | 'url' | 'number' | 'switch' | 'date'\n suffix?: string\n maxlength?: number\n min?: number\n max?: number\n step?: number\n precision?: number\n}\ninterface ConfigSection {\n title: string\n description: string\n fields: ConfigField[]\n}\n\nconst defaultSiteConfig: SiteConfig = { ...baseDefaultSiteConfig }\n\nconst configSections: ConfigSection[] = [\n {\n title: '基础体验',\n description: '控制站点名称、表单规模和用户可输入内容。',\n fields: [\n { key: 'appName', label: '应用名称', description: '展示在前台页面的产品名称。', type: 'text' },\n { key: 'maxInputLength', label: '输入长度上限', description: '单个表单项允许输入的最大字符数。', type: 'number', min: 1, step: 1 },\n { key: 'formLength', label: '表单项数量', description: '用户创建取件表单时可配置的字段数量。', type: 'number', min: 1, step: 1 },\n { key: 'openPraise', label: '赞赏提示', description: '是否在前台显示赞赏相关提示文案。', type: 'switch' },\n { key: 'feedbackEntryEnabled', label: '问题反馈入口', description: '是否在页面右下角展示问题反馈浮动入口。', type: 'switch' },\n { key: 'filePageFloatingContactEnabled', label: '右下角联系入口', description: '开启后在文件页和任务页右下角固定展示联系作者快捷入口。', type: 'switch' },\n ],\n },\n {\n title: '上传与下载',\n description: '管理文件下载有效期和压缩包大小限制。',\n fields: [\n { key: 'downloadOneExpired', label: '单文件链接有效期', description: '单个文件下载链接的过期时间。', type: 'number', min: 1, step: 1, suffix: '分钟' },\n { key: 'downloadCompressExpired', label: '归档链接有效期', description: '打包下载链接的过期时间。', type: 'number', min: 1, step: 1, suffix: '分钟' },\n { key: 'compressSizeLimit', label: '压缩包大小限制', description: '允许创建压缩包的最大体积。', type: 'number', min: 1, step: 1, suffix: 'GB' },\n ],\n },\n {\n title: '访问限制',\n description: '控制用户使用前的校验与资源限制策略。',\n fields: [\n { key: 'needBindPhone', label: '强制绑定手机号', description: '开启后用户需要先绑定手机号。', type: 'switch' },\n { key: 'enableCodeLogin', label: '验证码登录', description: '开启后且腾讯云短信配置完整时,前台展示验证码登录入口。', type: 'switch' },\n { key: 'limitSpace', label: '限制存储空间', description: '开启后按用户空间额度限制上传。', type: 'switch' },\n { key: 'limitWallet', label: '限制钱包余额', description: '开启后按钱包余额限制资源消耗。', type: 'switch' },\n ],\n },\n {\n title: '成本计费',\n description: '配置七牛云与压缩相关的成本计算参数。',\n fields: [\n { key: 'moneyStartDay', label: '计费开始日期', description: '费用统计从该日期开始计算。', type: 'date' },\n { key: 'qiniuOSSPrice', label: '七牛云存储单价', description: '对象存储计费单价。', type: 'number', min: 0, step: 0.001, precision: 3, suffix: '元/GB' },\n { key: 'qiniuCDNPrice', label: '七牛云 CDN 单价', description: 'CDN 流量计费单价。', type: 'number', min: 0, step: 0.001, precision: 3, suffix: '元/GB' },\n { key: 'qiniuBackhaulTrafficPrice', label: '回源流量单价', description: '回源流量计费单价。', type: 'number', min: 0, step: 0.001, precision: 3, suffix: '元/GB' },\n { key: 'qiniuBackhaulTrafficPercentage', label: '回源流量占比', description: '用于估算回源流量的比例。', type: 'number', min: 0, max: 1, step: 0.01, precision: 2 },\n { key: 'qiniuCompressPrice', label: '压缩处理单价', description: '压缩服务的成本单价。', type: 'number', min: 0, step: 0.001, precision: 3, suffix: '元/GB' },\n ],\n },\n {\n title: '文件页提示',\n description: '配置文件列表页的赞赏提示、联系入口和资源限制说明。',\n fields: [\n { key: 'filePagePraiseText', label: '赞赏前置文案', description: '展示在赞赏链接前的说明。', type: 'textarea', maxlength: 120 },\n { key: 'filePagePraiseLinkText', label: '赞赏链接文案', description: '赞赏入口的链接文字。', type: 'textarea', maxlength: 80 },\n { key: 'filePagePraiseLink', label: '赞赏链接', description: '点击赞赏入口后打开的地址。', type: 'url', maxlength: 300 },\n { key: 'filePageContactText', label: '联系前置文案', description: '展示在联系入口前的说明。', type: 'textarea', maxlength: 120 },\n { key: 'filePageContactLinkText', label: '联系链接文案', description: '联系入口的链接文字。', type: 'textarea', maxlength: 80 },\n { key: 'filePageContactLink', label: '联系链接', description: '点击联系入口后打开的地址。', type: 'url', maxlength: 300 },\n { key: 'filePageLimitText', label: '限制说明', description: '赞赏提示开启时展示的资源限制说明。', type: 'textarea', maxlength: 300 },\n { key: 'filePageSponsorText', label: '赞助说明前缀', description: '展示在赞助联系链接前的文案。', type: 'textarea', maxlength: 120 },\n { key: 'filePageSponsorLinkText', label: '赞助链接文案', description: '赞助联系入口的链接文字。', type: 'textarea', maxlength: 100 },\n { key: 'filePageSponsorLink', label: '赞助链接', description: '点击赞助联系入口后打开的地址。', type: 'url', maxlength: 300 },\n { key: 'filePageSponsorSuffix', label: '赞助说明后缀', description: '展示在赞助联系链接后的文案。', type: 'textarea', maxlength: 120 },\n { key: 'filePageSelfHostLinkText', label: '自建链接文案', description: '自建文档入口的链接文字。', type: 'textarea', maxlength: 100 },\n { key: 'filePageSelfHostLink', label: '自建链接', description: '点击自建文档入口后打开的地址。', type: 'url', maxlength: 300 },\n ],\n },\n]\n\nconst $router = useRouter()\nconst routes = computed(() =>\n $router.options.routes.filter(v => v.meta?.allowDisabled),\n)\nconst showRoutes = reactive<RouteItem[]>([])\nconst enabledRouteCount = computed(() => showRoutes.filter(route => !route.disabled).length)\n\nconst siteFormRef = ref<FormInstance>()\nconst saving = ref(false)\nconst activeConfigTab = ref(configSections[0].title)\nconst siteForm = reactive<SiteConfig>({ ...defaultSiteConfig })\nconst { value: jsonData, updateValue: updateJsonData } = useSiteAllConfig()\nconst configFieldMap = new Map(\n configSections\n .flatMap(section => section.fields)\n .map(field => [field.key, field]),\n)\n\nconst rules: FormRules = {\n appName: [{ required: true, message: '请输入应用名称', trigger: 'blur' }],\n maxInputLength: [{ required: true, message: '请输入输入长度上限', trigger: 'blur' }],\n formLength: [{ required: true, message: '请输入表单项数量', trigger: 'blur' }],\n downloadOneExpired: [{ required: true, message: '请输入单文件链接有效期', trigger: 'blur' }],\n downloadCompressExpired: [{ required: true, message: '请输入归档链接有效期', trigger: 'blur' }],\n compressSizeLimit: [{ required: true, message: '请输入压缩包大小限制', trigger: 'blur' }],\n moneyStartDay: [{ required: true, message: '请选择计费开始日期', trigger: 'change' }],\n}\n\nfunction syncForm(data: Partial<SiteConfig> = {}) {\n Object.assign(siteForm, {\n ...defaultSiteConfig,\n ...data,\n })\n}\n\nfunction normalizeSiteConfig(): SiteConfig {\n return {\n ...defaultSiteConfig,\n ...jsonData.value,\n appName: siteForm.appName.trim(),\n maxInputLength: Number(siteForm.maxInputLength),\n openPraise: Boolean(siteForm.openPraise),\n feedbackEntryEnabled: Boolean(siteForm.feedbackEntryEnabled),\n formLength: Number(siteForm.formLength),\n downloadOneExpired: Number(siteForm.downloadOneExpired),\n downloadCompressExpired: Number(siteForm.downloadCompressExpired),\n compressSizeLimit: Number(siteForm.compressSizeLimit),\n needBindPhone: Boolean(siteForm.needBindPhone),\n enableCodeLogin: Boolean(siteForm.enableCodeLogin),\n limitSpace: Boolean(siteForm.limitSpace),\n limitWallet: Boolean(siteForm.limitWallet),\n qiniuOSSPrice: Number(siteForm.qiniuOSSPrice),\n qiniuCDNPrice: Number(siteForm.qiniuCDNPrice),\n qiniuBackhaulTrafficPrice: Number(siteForm.qiniuBackhaulTrafficPrice),\n qiniuBackhaulTrafficPercentage: Number(siteForm.qiniuBackhaulTrafficPercentage),\n qiniuCompressPrice: Number(siteForm.qiniuCompressPrice),\n moneyStartDay: Number(siteForm.moneyStartDay),\n filePagePraiseText: siteForm.filePagePraiseText.trim(),\n filePagePraiseLinkText: siteForm.filePagePraiseLinkText.trim(),\n filePagePraiseLink: siteForm.filePagePraiseLink.trim(),\n filePageContactText: siteForm.filePageContactText.trim(),\n filePageContactLinkText: siteForm.filePageContactLinkText.trim(),\n filePageContactLink: siteForm.filePageContactLink.trim(),\n filePageFloatingContactEnabled: Boolean(siteForm.filePageFloatingContactEnabled),\n filePageLimitText: siteForm.filePageLimitText.trim(),\n filePageSponsorText: siteForm.filePageSponsorText.trim(),\n filePageSponsorLinkText: siteForm.filePageSponsorLinkText.trim(),\n filePageSponsorLink: siteForm.filePageSponsorLink.trim(),\n filePageSponsorSuffix: siteForm.filePageSponsorSuffix.trim(),\n filePageSelfHostLinkText: siteForm.filePageSelfHostLinkText.trim(),\n filePageSelfHostLink: siteForm.filePageSelfHostLink.trim(),\n }\n}\n\nfunction getFieldValue(key: keyof SiteConfig) {\n return siteForm[key]\n}\n\nfunction updateFieldValue(key: keyof SiteConfig, value: string | number | boolean) {\n siteForm[key] = value as never\n}\n\nfunction handleChangeRoute(route: RouteItem) {\n SuperOverviewApi.addDisabledRoute(route.path, !route.disabled).then(() => {\n route.disabled = !route.disabled\n ElMessage.success('切换成功')\n })\n}\n\nfunction handleResetConfig() {\n syncForm(jsonData.value)\n ElMessage.info('已恢复为当前线上配置')\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\nfunction formatConfirmValue(key: keyof SiteConfig, value: SiteConfig[keyof SiteConfig]) {\n const field = configFieldMap.get(key)\n if (field?.type === 'switch') {\n return value ? '开启' : '关闭'\n }\n if (field?.type === 'date') {\n return Number.isNaN(Number(value))\n ? '-'\n : new Date(Number(value)).toLocaleDateString()\n }\n const text = String(value ?? '')\n return text.length > 120 ? `${text.slice(0, 120)}...` : text\n}\n\nfunction getConfigChanges(nextConfig: SiteConfig) {\n const currentConfig: SiteConfig = {\n ...defaultSiteConfig,\n ...jsonData.value,\n }\n return Object.keys(defaultSiteConfig)\n .map((key) => {\n const typedKey = key as keyof SiteConfig\n const oldValue = currentConfig[typedKey]\n const newValue = nextConfig[typedKey]\n if (oldValue === newValue) {\n return null\n }\n return {\n key: typedKey,\n label: configFieldMap.get(typedKey)?.label || typedKey,\n oldValue: formatConfirmValue(typedKey, oldValue),\n newValue: formatConfirmValue(typedKey, newValue),\n }\n })\n .filter(Boolean)\n}\n\nfunction buildChangeConfirmContent(changes: NonNullable<ReturnType<typeof getConfigChanges>[number]>[]) {\n const list = changes\n .map((change) => {\n return `<li><strong>${escapeHtml(String(change.label))}</strong>:<span>${escapeHtml(change.oldValue)}</span> → <span>${escapeHtml(change.newValue)}</span></li>`\n })\n .join('')\n\n return `<div class=\"config-change-confirm\">\n <p>本次将修改以下 ${changes.length} 项配置,请确认后再提交:</p>\n <ul>${list}</ul>\n </div>`\n}\n\nasync function handleSaveConfig() {\n try {\n await siteFormRef.value?.validate()\n }\n catch {\n ElMessage.error('保存失败,请检查配置项后重试')\n return\n }\n\n const nextConfig = normalizeSiteConfig()\n const changes = getConfigChanges(nextConfig)\n if (changes.length === 0) {\n ElMessage.info('暂无配置变更')\n return\n }\n\n try {\n await ElMessageBox.confirm(\n buildChangeConfirmContent(changes),\n '确认保存配置',\n {\n confirmButtonText: '确认保存',\n cancelButtonText: '取消',\n type: 'warning',\n dangerouslyUseHTMLString: true,\n },\n )\n }\n catch {\n ElMessage.info('已取消保存')\n return\n }\n\n try {\n saving.value = true\n jsonData.value = nextConfig\n await updateJsonData()\n syncForm(jsonData.value)\n ElMessage.success('全局配置已保存')\n }\n catch {\n ElMessage.error('保存失败,请稍后重试')\n }\n finally {\n saving.value = false\n }\n}\n\nwatch(\n jsonData,\n value => syncForm(value),\n {\n immediate: true,\n deep: true,\n },\n)\n\nonMounted(() => {\n for (const r of routes.value) {\n SuperOverviewApi.checkDisabledRoute(r.path).then((v) => {\n showRoutes.push({\n path: r.path,\n name: String(r.name),\n title: String(r.meta?.title || r.name || r.path),\n disabled: !!v.data?.status,\n })\n })\n }\n})\n</script>\n\n<template>\n <div class=\"config-page\">\n <section class=\"hero-card\">\n <div>\n <p class=\"eyebrow\">\n 系统配置\n </p>\n <h1>配置中心</h1>\n <p class=\"hero-desc\">\n 统一管理可禁用路由与全局站点参数,表单化编辑后会直接写入服务端配置。\n </p>\n </div>\n <div class=\"hero-stat\">\n <strong>{{ enabledRouteCount }}</strong>\n <span>个路由启用中</span>\n </div>\n </section>\n\n <section class=\"panel\">\n <div class=\"section-head\">\n <div>\n <h2>禁用路由管理</h2>\n <p>关闭后对应页面将无法访问,注册页关闭时会同步禁用注册能力。</p>\n </div>\n </div>\n\n <div class=\"route-grid\">\n <article\n v-for=\"route in showRoutes\"\n :key=\"route.name\"\n class=\"route-item\"\n :class=\"{ disabled: route.disabled }\"\n >\n <div class=\"route-main\">\n <strong>{{ route.title }}</strong>\n <span>{{ route.path }}</span>\n <small v-if=\"route.path === '/register'\">关闭后将同时禁用注册功能</small>\n </div>\n <el-switch\n :model-value=\"!route.disabled\"\n inline-prompt\n active-text=\"开\"\n inactive-text=\"关\"\n style=\"--el-switch-on-color: #13ce66; --el-switch-off-color: #ff6b6b\"\n @change=\"handleChangeRoute(route)\"\n />\n </article>\n </div>\n </section>\n\n <section class=\"panel\">\n <div class=\"section-head form-head\">\n <div>\n <h2>全局配置管理</h2>\n <p>按场景维护站点参数,无需直接编辑 JSON。</p>\n </div>\n <div class=\"actions\">\n <el-button @click=\"handleResetConfig\">\n 重置\n </el-button>\n <el-button type=\"primary\" :loading=\"saving\" @click=\"handleSaveConfig\">\n 保存配置\n </el-button>\n </div>\n </div>\n\n <el-form\n ref=\"siteFormRef\"\n :model=\"siteForm\"\n :rules=\"rules\"\n label-position=\"top\"\n class=\"config-form\"\n >\n <el-tabs v-model=\"activeConfigTab\" class=\"config-tabs\">\n <el-tab-pane\n v-for=\"section in configSections\"\n :key=\"section.title\"\n :label=\"section.title\"\n :name=\"section.title\"\n >\n <div class=\"tab-desc\">\n {{ section.description }}\n </div>\n\n <div class=\"field-list\">\n <el-form-item\n v-for=\"field in section.fields\"\n :key=\"field.key\"\n :prop=\"field.key\"\n class=\"field-item\"\n >\n <template #label>\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-desc\">{{ field.description }}</span>\n </template>\n\n <div class=\"field-control\">\n <el-switch\n v-if=\"field.type === 'switch'\"\n :model-value=\"Boolean(getFieldValue(field.key))\"\n inline-prompt\n active-text=\"开\"\n inactive-text=\"关\"\n @update:model-value=\"updateFieldValue(field.key, $event)\"\n />\n <el-date-picker\n v-else-if=\"field.type === 'date'\"\n :model-value=\"Number(getFieldValue(field.key))\"\n type=\"date\"\n value-format=\"x\"\n placeholder=\"请选择日期\"\n class=\"full-control\"\n @update:model-value=\"updateFieldValue(field.key, Number($event))\"\n />\n <el-input-number\n v-else-if=\"field.type === 'number'\"\n :model-value=\"Number(getFieldValue(field.key))\"\n :min=\"field.min\"\n :max=\"field.max\"\n :step=\"field.step || 1\"\n :precision=\"field.precision\"\n controls-position=\"right\"\n class=\"number-control\"\n @update:model-value=\"updateFieldValue(field.key, Number($event))\"\n />\n <el-input\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"String(getFieldValue(field.key))\"\n type=\"textarea\"\n :rows=\"3\"\n :maxlength=\"field.maxlength || 300\"\n show-word-limit\n placeholder=\"请输入\"\n @update:model-value=\"updateFieldValue(field.key, $event)\"\n />\n <el-input\n v-else\n :model-value=\"String(getFieldValue(field.key))\"\n :type=\"field.type === 'url' ? 'url' : 'text'\"\n :maxlength=\"field.maxlength || 30\"\n show-word-limit\n placeholder=\"请输入\"\n @update:model-value=\"updateFieldValue(field.key, $event)\"\n />\n <span v-if=\"field.suffix\" class=\"suffix\">{{ field.suffix }}</span>\n </div>\n </el-form-item>\n </div>\n </el-tab-pane>\n </el-tabs>\n </el-form>\n </section>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.config-page {\n max-width: 1256px;\n margin: 10px auto;\n color: #1f2937;\n}\n\n.hero-card,\n.panel {\n box-sizing: border-box;\n border: 1px solid #edf0f5;\n border-radius: 18px;\n background: #fff;\n box-shadow: 0 10px 30px rgb(31 41 55 / 8%);\n}\n\n.hero-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n padding: 28px 32px;\n overflow: hidden;\n background:\n radial-gradient(circle at 88% 20%, rgb(64 158 255 / 18%), transparent 28%),\n linear-gradient(135deg, #fff 0%, #f6f9ff 100%);\n\n h1 {\n margin: 6px 0 10px;\n font-size: 30px;\n line-height: 1.2;\n }\n}\n\n.eyebrow {\n margin: 0;\n color: #409eff;\n font-size: 13px;\n font-weight: 700;\n letter-spacing: 0.12em;\n}\n\n.hero-desc {\n max-width: 560px;\n margin: 0;\n color: #6b7280;\n line-height: 1.7;\n}\n\n.hero-stat {\n display: grid;\n place-items: center;\n min-width: 132px;\n min-height: 132px;\n border-radius: 28px;\n background: rgb(255 255 255 / 72%);\n box-shadow: inset 0 0 0 1px rgb(64 158 255 / 12%);\n\n strong {\n color: #2563eb;\n font-size: 42px;\n line-height: 1;\n }\n\n span {\n color: #6b7280;\n font-size: 13px;\n }\n}\n\n.panel {\n margin-top: 18px;\n padding: 24px;\n}\n\n.section-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 20px;\n\n h2 {\n margin: 0 0 6px;\n font-size: 20px;\n }\n\n p {\n margin: 0;\n color: #6b7280;\n line-height: 1.6;\n }\n}\n\n.actions {\n display: flex;\n flex-shrink: 0;\n gap: 10px;\n}\n\n.route-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 14px;\n}\n\n.route-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 16px;\n border: 1px solid #e8edf5;\n border-radius: 14px;\n background: #fbfdff;\n transition:\n border-color 0.2s,\n box-shadow 0.2s,\n transform 0.2s;\n\n &:hover {\n border-color: rgb(64 158 255 / 45%);\n box-shadow: 0 8px 24px rgb(64 158 255 / 10%);\n transform: translateY(-1px);\n }\n\n &.disabled {\n background: #fff8f8;\n }\n}\n\n.route-main {\n display: grid;\n gap: 5px;\n\n strong {\n font-size: 16px;\n }\n\n span,\n small {\n color: #6b7280;\n font-size: 13px;\n }\n}\n\n.config-tabs {\n :deep(.el-tabs__header) {\n margin-bottom: 14px;\n }\n\n :deep(.el-tabs__nav-wrap::after) {\n height: 1px;\n background-color: #edf0f5;\n }\n\n :deep(.el-tabs__item) {\n height: 36px;\n padding: 0 18px;\n color: #6b7280;\n font-weight: 700;\n }\n}\n\n.tab-desc {\n margin-bottom: 12px;\n padding: 10px 12px;\n border-radius: 10px;\n background: #f7faff;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n}\n\n.field-list {\n display: grid;\n gap: 12px;\n}\n\n.config-form :deep(.el-form-item) {\n margin-bottom: 0;\n}\n\n.config-form :deep(.el-form-item__label) {\n display: block;\n margin-bottom: 4px;\n line-height: 1.4;\n}\n\n.field-item {\n min-width: 0;\n display: grid;\n grid-template-columns: minmax(180px, 1fr) minmax(220px, 320px);\n align-items: center;\n gap: 16px;\n padding: 12px 14px;\n border: 1px solid #edf0f5;\n border-radius: 12px;\n background: #fff;\n\n :deep(.el-form-item__label) {\n margin-bottom: 0;\n padding-right: 0;\n }\n\n :deep(.el-form-item__content) {\n min-width: 0;\n }\n}\n\n.field-label,\n.field-desc {\n display: block;\n}\n\n.field-label {\n color: #1f2937;\n font-size: 14px;\n font-weight: 700;\n}\n\n.field-desc {\n margin-top: 3px;\n color: #8a94a6;\n font-size: 13px;\n}\n\n.field-control {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.full-control,\n.number-control {\n flex: 1;\n width: 100%;\n min-width: 0;\n}\n\n.suffix {\n flex-shrink: 0;\n color: #6b7280;\n font-size: 13px;\n}\n\n@media screen and (max-width: 900px) {\n .config-page {\n margin-top: 40px;\n }\n\n .hero-card {\n align-items: flex-start;\n flex-direction: column;\n padding: 22px;\n }\n\n .hero-stat {\n display: flex;\n justify-content: center;\n width: 100%;\n min-height: auto;\n padding: 18px;\n gap: 10px;\n border-radius: 18px;\n }\n\n .field-item {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n}\n\n@media screen and (max-width: 700px) {\n .config-page {\n margin: 40px 10px 0;\n }\n\n .panel {\n padding: 18px;\n border-radius: 14px;\n }\n\n .form-head,\n .section-head {\n display: block;\n }\n\n .actions {\n margin-top: 14px;\n\n .el-button {\n flex: 1;\n }\n }\n\n .route-grid {\n grid-template-columns: 1fr;\n }\n\n .route-item {\n align-items: flex-start;\n }\n\n .config-tabs :deep(.el-tabs__nav-scroll) {\n overflow-x: auto;\n }\n\n .field-item {\n padding: 12px;\n }\n}\n</style>\n"],"names":["defaultSiteConfig","baseDefaultSiteConfig","configSections","title","description","fields","key","label","type","min","step","suffix","precision","max","maxlength","$router","useRouter","routes","computed","options","filter","v","meta","allowDisabled","showRoutes","reactive","enabledRouteCount","route","disabled","length","siteFormRef","ref","saving","activeConfigTab","siteForm","value","jsonData","updateValue","updateJsonData","useSiteAllConfig","configFieldMap","Map","flatMap","section","map","field","rules","appName","required","message","trigger","maxInputLength","formLength","downloadOneExpired","downloadCompressExpired","compressSizeLimit","moneyStartDay","syncForm","data","Object","assign","getFieldValue","updateFieldValue","handleResetConfig","ElMessage","info","escapeHtml","replace","formatConfirmValue","get","Number","isNaN","Date","toLocaleDateString","text","String","slice","async","handleSaveConfig","validate","error","nextConfig","trim","openPraise","Boolean","feedbackEntryEnabled","needBindPhone","enableCodeLogin","limitSpace","limitWallet","qiniuOSSPrice","qiniuCDNPrice","qiniuBackhaulTrafficPrice","qiniuBackhaulTrafficPercentage","qiniuCompressPrice","filePagePraiseText","filePagePraiseLinkText","filePagePraiseLink","filePageContactText","filePageContactLinkText","filePageContactLink","filePageFloatingContactEnabled","filePageLimitText","filePageSponsorText","filePageSponsorLinkText","filePageSponsorLink","filePageSponsorSuffix","filePageSelfHostLinkText","filePageSelfHostLink","changes","currentConfig","keys","typedKey","oldValue","newValue","getConfigChanges","ElMessageBox","confirm","list","change","join","buildChangeConfirmContent","confirmButtonText","cancelButtonText","dangerouslyUseHTMLString","success","watch","immediate","deep","onMounted","r","SuperOverviewApi","checkDisabledRoute","path","then","push","name","status","addDisabledRoute"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
System.register(["./index-legacy-BsWj1xV2.js","./el-loading-legacy-BpxkUp1m.js","./tip-legacy-D_0YSCxT.js","./index-legacy-DFUJlpQR.js","./el-pagination-legacy-BcfQQTNs.js","./el-tag-legacy-DxOZcEw1.js","./el-select-legacy-Cvxrwg7z.js","./el-scrollbar-legacy-CLEobATW.js","./el-table-column-legacy-D1aU2dQP.js","./el-switch-legacy-DCF_46l4.js","./el-dropdown-item-legacy-D5N_3F3d.js","./linkDialog-legacy-CCHpjX0B.js","./index-legacy-C8OALizf.js","./index-legacy-C-gHf8SN.js","./refresh-legacy-BwFA7z7t.js","./data-analysis-legacy-4qD1YhB2.js","./index-legacy-BUrH0Ubh.js","./index-legacy-Ca1NdJPm.js","./aria-legacy-B70JmEZA.js"],(function(e,a){"use strict";var l,t,n,i,o,s,r,d,u,c,p,g,f,m,v,x,h,y,w,b,k,_,C,z,V,S,T,$,L,P,j,D,I,E,U,M,F,N,A,H,O,q,B,K,R,W,J,Q,X,G,Y,Z,ee,ae,le,te,ne,ie,oe,se,re,de,ue,ce,pe,ge,fe,me,ve,xe,he;return{setters:[e=>{l=e.a4,t=e.f,n=e.d,i=e.a,o=e.c,s=e.b,r=e.X,d=e.M,u=e.a5,c=e.o,p=e.U,g=e.a6,f=e.g,m=e.a1,v=e.r,x=e.a7,h=e.Y,y=e.Z,w=e.e,b=e.t,k=e.j,_=e.Q,C=e.i,z=e.w,V=e.F,S=e.A,T=e.B,$=e.a8,L=e.a9,P=e.n,j=e.aa,D=e.ab,I=e.D,E=e.ac,U=e.E,M=e.ad,F=e.ae,N=e.s,A=e.q,H=e.G,O=e.af,q=e.a0,B=e.ag,K=e.ah,R=e.ai,W=e.aj,J=e._},e=>{Q=e.v},e=>{X=e.T,G=e.E},e=>{Y=e.I,Z=e.E},e=>{ee=e.s,ae=e.E},null,e=>{le=e.E,te=e.a},null,e=>{ne=e.E,ie=e.a},e=>{oe=e.E},e=>{se=e.a,re=e.E,de=e.b,ue=e.c},e=>{ce=e.L},e=>{pe=e.F},e=>{ge=e.A,fe=e.D,me=e.f},e=>{ve=e.r},e=>{xe=e.d},e=>{he=e.E},null,null],execute:function(){var a=document.createElement("style");a.textContent=".files[data-v-4101c199]{width:min(1440px,100vw - 48px);max-width:1440px;margin:0 auto;padding-bottom:2em}.top-notice[data-v-4101c199]{padding:14px 18px;border:1px solid rgba(64,158,255,.18);border-radius:14px;margin:10px auto;background:radial-gradient(circle at 96% 12%,rgba(64,158,255,.16),transparent 24%),linear-gradient(135deg,#fff,#f7faff);box-shadow:0 8px 22px rgba(31,41,55,.06);color:#334155;font-size:14px;line-height:1.7}.top-notice a[data-v-4101c199]{color:#409eff}.top-notice-detail[data-v-4101c199]{display:flex;flex-wrap:wrap;gap:4px 8px;margin-top:4px;color:#f56c6c;font-weight:700}@media screen and (max-width: 700px){.files[data-v-4101c199]{margin-top:70px}.text-btns[data-v-4101c199]{display:flex;flex-direction:column}.text-btns[data-v-4101c199] .el-button{margin-left:0;margin-bottom:0}.header[data-v-4101c199]{justify-content:center}.export-btns[data-v-4101c199]{display:flex;flex-wrap:wrap;justify-content:space-around}}.panel[data-v-4101c199]{padding:1em;background-color:#fff;margin:10px auto;box-sizing:border-box;box-shadow:0 2px 12px rgba(0,0,0,.1);border-radius:4px;z-index:1}.panel .label[data-v-4101c199]{font-size:12px;margin-right:10px}.header[data-v-4101c199]{display:flex;flex-wrap:wrap}.header .item[data-v-4101c199]{margin-right:10px;margin-bottom:10px}.el-button[data-v-4101c199]{margin-left:10px;margin-bottom:10px}.control-item[data-v-4101c199]{margin-left:10px;margin-bottom:10px;font-size:14px}.search-item[data-v-4101c199]{min-width:260px}.search-tip[data-v-4101c199]{margin-top:4px;color:#909399;font-size:12px;line-height:1.4}.stats-dashboard[data-v-4101c199]{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin-bottom:16px}.stat-card[data-v-4101c199]{display:flex;flex-direction:column;min-height:120px;padding:16px;border:1px solid #edf0f5;border-radius:14px;background:radial-gradient(circle at 90% 16%,rgba(64,158,255,.14),transparent 28%),linear-gradient(135deg,#fff,#f7faff);box-shadow:0 8px 22px rgba(31,41,55,.06);box-sizing:border-box}.stat-card.warning[data-v-4101c199]{border-color:rgba(245,108,108,.38);background:radial-gradient(circle at 90% 16%,rgba(245,108,108,.14),transparent 28%),linear-gradient(135deg,#fff,#fff8f8)}.stat-card strong[data-v-4101c199]{margin:8px 0 6px;color:#1f2937;font-size:22px;line-height:1.25}.stat-card small[data-v-4101c199]{color:#8a94a6;line-height:1.5}.stat-card[data-v-4101c199] .el-progress{margin:4px 0 2px}.stat-label[data-v-4101c199]{color:#409eff;font-size:13px;font-weight:700}.stat-link[data-v-4101c199]{align-self:flex-start;padding:0;border:0;margin-top:8px;background:transparent;color:#409eff;cursor:pointer;font-size:13px}.imageLoading[data-v-4101c199]{display:flex;align-items:center;justify-content:center;height:100%}.imageDes[data-v-4101c199]{position:absolute;bottom:80px;color:#fff;left:50%;transform:translate(-50%)}.progress-list[data-v-4101c199]{margin-top:10px}.progress-list .progress-item[data-v-4101c199]{margin-bottom:10px}.progress-list .progress-item .progress[data-v-4101c199]{display:flex;justify-content:center;align-items:center;margin-bottom:6px}.progress-list .progress-item .progress .el-progress--line[data-v-4101c199]{min-width:200px;width:260px}.progress-list .progress-item .progress .el-button[data-v-4101c199]{margin:0 6px}.progress-list .progress-item .des[data-v-4101c199]{font-size:12px}.progress-list .progress-item .des .filename[data-v-4101c199]{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:keep-all;margin-right:10px}.progress-list .progress-item .des .mimeType[data-v-4101c199]{width:60px;color:#409eff}.progress-list .progress-item[data-v-4101c199]{text-align:center}\n/*$vite$:1*/",document.head.appendChild(a);const ye={getDownloadActions:function(e,a,t=[]){return l.post("/action/download/list",{pageSize:e,pageIndex:a,extraIds:t})}},we=n({name:"Download"}),be={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},ke=[s("path",{fill:"currentColor",d:"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64zm384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64v450.304z"},null,-1)];var _e=t(we,[["render",function(e,a,l,t,n,s){return i(),o("svg",be,ke)}]]);const Ce=n({name:"Picture"}),ze={viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg"},Ve=[s("path",{fill:"currentColor",d:"M160 160v704h704V160H160zm-32-64h768a32 32 0 0 1 32 32v768a32 32 0 0 1-32 32H128a32 32 0 0 1-32-32V128a32 32 0 0 1 32-32z"},null,-1),s("path",{fill:"currentColor",d:"M384 288q64 0 64 64t-64 64q-64 0-64-64t64-64zM185.408 876.992l-50.816-38.912L350.72 556.032a96 96 0 0 1 134.592-17.856l1.856 1.472 122.88 99.136a32 32 0 0 0 44.992-4.864l216-269.888 49.92 39.936-215.808 269.824-.256.32a96 96 0 0 1-135.04 14.464l-122.88-99.072-.64-.512a32 32 0 0 0-44.8 5.952L185.408 876.992z"},null,-1)];var Se=t(Ce,[["render",function(e,a,l,t,n,s){return i(),o("svg",ze,Ve)}]]);const Te={class:"files"},$e={key:0,class:"top-notice"},Le={class:"top-notice-main"},Pe=["href"],je=["href"],De={key:0,class:"top-notice-detail"},Ie=["href"],Ee=["href"],Ue={class:"panel header"},Me={class:"item"},Fe={class:"item"},Ne={class:"item"},Ae={class:"item search-item"},He={class:"panel"},Oe={class:"export-btns flex fac"},qe={class:"control-item"},Be={class:"control-item"},Ke={class:"control-item"},Re={class:"control-item"},We={class:"panel"},Je={"element-loading-text":"...",style:{"--el-loading-spinner-size":"20px"}},Qe={class:"panel"},Xe={key:0},Ge={key:1},Ye={key:2},Ze={key:0},ea={key:1},aa={key:2},la={key:3},ta={class:"flex fc"},na={class:"panel"},ia={class:"stats-dashboard"},oa={class:"stat-card"},sa={class:"stat-card"},ra={class:"imageDes"},da={class:"imageLoading"},ua={class:"text-btns"},ca={class:"panel flex fc"};e("default",J(n({__name:"index",setup(e){const{value:a}=g(),l=d((()=>a.value.openPraise)),t=d((()=>a.value.limitSpace)),n=d((()=>a.value.limitWallet)),J=d((()=>l.value&&(t.value||n.value))),{usage:we,size:be,wallet:ke,cost:Ce,percentageValue:ze,walletPercentageValue:Ve,limitDownload:pa,limitSpace:ga,limitWallet:fa,priceText:ma}=function(){const e=r({size:0,usage:0,limitUpload:!1,wallet:"0:00",cost:"0.00",limitSpace:!1,limitWallet:!1,price:{storage:"0:00",download:"0:00"}}),a=d((()=>e.usage)),l=d((()=>e.size)),t=d((()=>e.wallet)),n=d((()=>e.cost)),i=d((()=>e.size?+(e.usage/e.size*100).toFixed(2):0)),o=d((()=>+e.wallet?+(+e.cost/+e.wallet*100).toFixed(2):0)),s=d((()=>`${i.value.toFixed(2)}%`)),g=d((()=>`${o.value.toFixed(2)}%`)),f=d((()=>e.limitUpload)),m=d((()=>e.limitSpace)),v=d((()=>e.limitWallet)),x=d((()=>`空间 ${s.value}: ${u(e.usage)} / ${u(e.size)}`)),h=d((()=>`钱包 ${g.value}: ${e.cost} / ${e.wallet}¥`)),y=d((()=>`存储 ${e.price.storage}¥ + 下载 ${e.price.download}¥`));return c((()=>{p.usage().then((a=>{Object.assign(e,a.data)}))})),{usage:a,size:l,wallet:t,cost:n,percentageValue:i,walletPercentageValue:o,percentage:s,walletPercentage:g,limitDownload:f,limitSpace:m,limitWallet:v,spaceUsageText:x,moneyUsageText:h,priceText:y}}(),va=f(),xa=m(),ha=v(!1),ya=v(""),wa=v("false"!==localStorage.getItem("ep-show-images")),ba=v(!0),ka=v(!1),_a=v(!1),Ca=r({actions:[],pageSize:3,pageCount:0,pageCurrent:1,pageTotal:0,compressTask:[]});function za(){const e=JSON.parse(localStorage.getItem("ep_compress_task")||"[]");Ca.compressTask=e,ye.getDownloadActions(Ca.pageSize,Ca.pageCurrent,e.map((e=>e.id))).then((a=>{const{actions:l,sum:t}=a.data,n=l.some((e=>e.status===fe.ARCHIVE));l.filter((e=>e.type===ge.Compress)).forEach((a=>{const l=e.findIndex((e=>e.id===a.id));a.status===fe.SUCCESS&&-1!==l&&(ya.value=a.url,ha.value=!0,j(a.url),e.splice(l,1)),a.status===fe.ARCHIVE&&-1===l&&e.push(a),a.status===fe.FAIL&&-1!==l&&e.splice(l,1)})),Ca.compressTask=e,localStorage.setItem("ep_compress_task",JSON.stringify(e)),n&&setTimeout(za,1e3),Ca.pageTotal=t,Ca.actions=l,Ca.pageCount=Math.ceil(t/Ca.pageSize)}))}function Va(e){Ca.pageCurrent=e,za()}const Sa=d((()=>va.state.category.categoryList)),Ta=v("all"),$a=d((()=>va.state.task.taskList)),La=v("all"),Pa=d((()=>"all"===Ta.value?$a.value:(La.value="all",$a.value.filter((e=>e.category===Ta.value))))),ja=d((()=>{const e=Pa.value.find((e=>e.key===La.value));return e?.name}));function Da(e,a){if(0===e.length)return void U.warning("表格中没有可导出的内容");const l=["提交时间","任务","文件名","大小"];ka.value&&l.push("原文件名"),ba.value&&l.push("姓名");const t=l.map((e=>({value:e,row:2}))),n=e.reduce(((e,a)=>{try{JSON.parse(a.info).forEach((a=>{e.includes(a.text)||e.push(a.text)}))}catch{U.error({message:`数据异常${a.name},可联系平台管理员处理`,duration:5e3}),console.warn(a)}return e}),[]);t.push({value:"提交信息",col:n.length});const i=e.map((e=>{const{date:a,task_name:l,name:t,size:i,people:o}=e;try{const s=JSON.parse(e.info).reduce(((e,a)=>(e[a.text]=`${a.value}`,e)),{}),r=n.map((e=>s[e]??"-")),d=[P(new Date(a)),l,t,u(i)];return ka.value&&d.push(e.origin_name||"-"),ba.value&&d.push(o||"-"),d.push(...r),d}catch{U.error({message:`数据异常${e.name},可联系平台管理员处理`,duration:5e3}),console.warn(e)}return[]})).filter((e=>!!e.length));i.unshift(n);const o=a||`数据导出_${P(new Date,"yyyy年MM月dd日hh时mm分ss秒")}.xlsx`,s=ja.value?`${R(ja.value)}_${o}`:o;W(t,i,s),U.success("导出成功")}x((()=>{$a.value.length&&$a.value.some((e=>e.key===xa.query.task))&&(La.value=`${xa.query.task}`)}));const Ia=v(!1),Ea=r([]),Ua=v(""),Ma=v(6),Fa=v(1),Na=v(0),Aa=v(0),Ha=v(0),Oa=v(0);let qa=0;function Ba(){const e=++qa;Ia.value=!0,Ea.splice(0,Ea.length),E.getFilePage({pageIndex:Fa.value,pageSize:Ma.value,categoryKey:Ta.value,taskKey:La.value,keyword:Ua.value}).then((a=>{if(e!==qa)return;const{data:l}=a;Ea.push(...l.files),Na.value=l.total,Aa.value=l.pageCount,Ha.value=l.totalSize,Oa.value=l.filterSize})).finally((()=>{e===qa&&(Ia.value=!1)}))}async function Ka(){Da(await async function(){const e=[];let a=1,l=1;do{const{data:t}=await E.getFilePage({pageIndex:a,pageSize:100,categoryKey:Ta.value,taskKey:La.value,keyword:Ua.value});e.push(...t.files),l=t.pageCount,a+=1}while(a<=l);return e}(),`筛选数据导出_${P(new Date,"yyyy年MM月dd日hh时mm分ss秒")}.xlsx`)}const Ra=v(),Wa=d((()=>Ea)),Ja=r([]);function Qa(e){Ja.splice(0,Ja.length),Ja.push(...e)}const Xa=v(!1);function Ga(e){const a=Ja.map((e=>e.id));switch(e){case"download":if(pa.value)return void U.error("下载功能已被限制,请联系管理员扩容,或自行删除历史无用文件");if(0===Ja.length)return void U.warning("没有选中需要下载的内容");if(Xa.value)return void U.warning("已经有批量下载任务正在进行,请稍后再试");E.batchDownload(a,`批量下载_${P(new Date,"yyyy年MM月dd日hh时mm分ss秒")}`).then((()=>{za()})).catch((()=>{U.error("所选文件均已从服务器上移除"),Xa.value=!1})),U.info("开始归档选中的文件,请赖心等待");break;case"delete":if(0===Ja.length)return void U.warning("没有选中需要删除的内容");he.confirm("删除后无法恢复,是否删除","数据无价,请谨慎操作").then((()=>{E.batchDel(a).then((()=>{U.success("删除成功"),Ea.length===a.length&&Fa.value>1?Fa.value-=1:Ba()}))})).catch((()=>{U.info("取消")}));break;case"excel":if(0===Ja.length)return void U.warning("没有选中需要导出的内容");Da(Ja,`批量导出_${P(new Date,"yyyy年MM月dd日hh时mm分ss秒")}.xlsx`),U.success("导出成功")}Ra.value.clearSelection()}const Ya=v(!1),Za=r([]),el=v(!1),al=r({oldName:"",newName:"",suffix:"",id:-1});function ll(){if(me.test(al.newName))return U.error(`文件名不能包含${me.source}等字符`),void(me.lastIndex=0);E.updateFilename(al.id,`${al.newName}${al.suffix}`).then((()=>{U.success("修改成功");const e=Ea.find((e=>e.id===al.id));e&&(e.name=`${al.newName}${al.suffix}`)})).catch((()=>{U.error("修改失败")})).finally((()=>{el.value=!1}))}function tl(e){Ma.value=e,Fa.value=1}const nl=d((()=>u(Oa.value))),il=d((()=>u(Ha.value))),ol=d((()=>Math.min(100,ze.value))),sl=d((()=>Math.min(100,Ve.value)));function rl(e){Fa.value=e}function dl(){U.success({message:"刷新成功"}),Ba()}function ul(){0!==Na.value?Xa.value?U.warning("已经有批量下载任务正在进行,请稍后再试"):(Xa.value=!0,E.batchDownloadByQuery({taskKey:La.value,zipName:ja.value}).then((()=>{za()})).catch((()=>{U.error("所选任务中的文件均已从服务器上移除")})).finally((()=>{setTimeout((()=>{Xa.value=!1}),1e3)})),U.info("开始归档选中的文件,请赖心等待")):U.warning("该任务中没有数据")}const cl=v(""),pl=d((()=>Wa.value.map((e=>e.preview||""))));function gl(e){cl.value=Wa.value[e].name}h([Ta,La,Ua],(function(){1!==Fa.value?Fa.value=1:Ba()})),h([Fa,Ma],Ba),h(wa,(()=>{window.localStorage.setItem("ep-show-images",`${wa.value}`)})),c((()=>{Ba(),za(),va.dispatch("category/getCategory"),va.dispatch("task/getTask")}));const fl=y();function ml(){he.confirm(ma.value)}return(e,r)=>{const d=le,c=te,p=N,g=A,f=H,m=re,v=de,x=ue,h=oe,y=ne,R=O,W=ie,me=ae,ye=Z,Ve=G,ma=q,va=B,xa=K,$a=Q;return i(),o("div",Te,[l.value?(i(),o("div",$e,[s("div",Le,[s("strong",null,[w(b(k(a).filePagePraiseText),1),s("a",{href:k(a).filePagePraiseLink,target:"_blank",rel:"noopener noreferrer"},b(k(a).filePagePraiseLinkText),9,Pe)]),s("strong",null,[w(b(k(a).filePageContactText),1),s("a",{href:k(a).filePageContactLink,target:"_blank",rel:"noopener noreferrer"},b(k(a).filePageContactLinkText),9,je)])]),J.value?(i(),o("div",De,[s("span",null,b(k(a).filePageLimitText),1),s("span",null,[w(b(k(a).filePageSponsorText),1),s("a",{href:k(a).filePageSponsorLink,target:"_blank",rel:"noopener noreferrer"},b(k(a).filePageSponsorLinkText),9,Ie),w(b(k(a).filePageSponsorSuffix),1)]),s("span",null,[s("a",{href:k(a).filePageSelfHostLink,target:"_blank",rel:"noopener noreferrer"},b(k(a).filePageSelfHostLinkText),9,Ee)])])):_("",!0)])):_("",!0),s("div",Ue,[s("div",Me,[r[13]||(r[13]=s("span",{class:"label"},"分类",-1)),C(c,{modelValue:Ta.value,"onUpdate:modelValue":r[0]||(r[0]=e=>Ta.value=e),size:"default",filterable:"",placeholder:"请选择"},{default:z((()=>[C(d,{label:"全部",value:"all"}),C(d,{label:"默认",value:"default"}),(i(!0),o(V,null,S(Sa.value,(e=>(i(),T(d,{key:e.k,label:e.name,value:e.k},null,8,["label","value"])))),128)),C(d,{label:"无关联任务",value:"no-task"}),C(d,{label:"♻️回收站♻️",value:"trash"})])),_:1},8,["modelValue"])]),s("div",Fe,[r[14]||(r[14]=s("span",{class:"label"},"任务",-1)),C(c,{modelValue:La.value,"onUpdate:modelValue":r[1]||(r[1]=e=>La.value=e),size:"default",filterable:"",placeholder:"请选择"},{default:z((()=>[C(d,{label:"全部",value:"all"}),(i(!0),o(V,null,S(Pa.value,(e=>(i(),T(d,{key:e.key,label:e.name,value:e.key},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])]),s("div",Ne,[C(p,{loading:Xa.value,disabled:"all"===La.value,type:"primary",size:"default",icon:k(_e),onClick:ul},{default:z((()=>r[15]||(r[15]=[w(" 下载任务中的文件 ")]))),_:1},8,["loading","disabled","icon"])]),s("div",Ae,[C(g,{modelValue:Ua.value,"onUpdate:modelValue":r[2]||(r[2]=e=>Ua.value=e),size:"default",clearable:"",placeholder:"请输入要检索的内容","prefix-icon":k(ee)},null,8,["modelValue","prefix-icon"]),r[16]||(r[16]=s("div",{class:"search-tip"}," 可搜索:文件名、任务名、提交人姓名、原文件名、提交信息 ",-1))])]),s("div",He,[s("div",Oe,[C(x,{trigger:"click",onCommand:Ga},{dropdown:z((()=>[C(v,null,{default:z((()=>[C(m,{disabled:0===Ja.length,command:"download"},{default:z((()=>r[18]||(r[18]=[w(" 下载 ")]))),_:1},8,["disabled"]),C(m,{disabled:0===Ja.length,command:"delete"},{default:z((()=>r[19]||(r[19]=[w(" 删除 ")]))),_:1},8,["disabled"]),C(m,{disabled:0===Ja.length,command:"excel"},{default:z((()=>r[20]||(r[20]=[w(" 导出记录 ")]))),_:1},8,["disabled"])])),_:1})])),default:z((()=>[C(p,{type:"primary",size:"default"},{default:z((()=>[r[17]||(r[17]=w(" 批量操作")),C(f,{class:"el-icon--right"},{default:z((()=>[C(k(se))])),_:1})])),_:1})])),_:1}),$(s("div",null,[C(x,{trigger:"click",onCommand:Ga},{dropdown:z((()=>[C(v,null,{default:z((()=>[C(m,{command:"download"},{default:z((()=>r[22]||(r[22]=[w(" 下载 ")]))),_:1}),C(m,{command:"delete"},{default:z((()=>r[23]||(r[23]=[w(" 删除 ")]))),_:1}),C(m,{command:"excel"},{default:z((()=>r[24]||(r[24]=[w(" 导出记录 ")]))),_:1})])),_:1})])),default:z((()=>[C(p,{type:"primary",disabled:0===Ja.length,size:"default"},{default:z((()=>[r[21]||(r[21]=w(" 批量操作 ")),C(f,null,{default:z((()=>[C(k(se))])),_:1})])),_:1},8,["disabled"])])),_:1})],512),[[L,!1]]),C(p,{size:"default",icon:k(ve),onClick:dl},{default:z((()=>r[25]||(r[25]=[w(" 刷新 ")]))),_:1},8,["icon"]),C(p,{title:"导出当前筛选条件下的所有数据",type:"success",size:"default",icon:k(xe),disabled:0===Na.value,onClick:Ka},{default:z((()=>r[26]||(r[26]=[w(" 导出记录 ")]))),_:1},8,["icon","disabled"]),s("div",qe,[r[27]||(r[27]=w(" 显示图片 ")),C(h,{modelValue:wa.value,"onUpdate:modelValue":r[3]||(r[3]=e=>wa.value=e),"inline-prompt":"","active-color":"#13ce66","inactive-color":"#ff4949","active-text":"是","inactive-text":"否"},null,8,["modelValue"])]),s("div",Be,[r[28]||(r[28]=w(" 展示原文件名 ")),C(h,{modelValue:ka.value,"onUpdate:modelValue":r[4]||(r[4]=e=>ka.value=e),"inline-prompt":"","active-color":"#13ce66","inactive-color":"#ff4949","active-text":"是","inactive-text":"否"},null,8,["modelValue"])]),s("div",Ke,[r[29]||(r[29]=w(" 显示提交人姓名 ")),C(h,{modelValue:ba.value,"onUpdate:modelValue":r[5]||(r[5]=e=>ba.value=e),"inline-prompt":"","active-color":"#13ce66","inactive-color":"#ff4949","active-text":"是","inactive-text":"否"},null,8,["modelValue"])]),s("div",Re,[r[30]||(r[30]=w(" ⏰ 查看下载历史 ")),C(h,{modelValue:_a.value,"onUpdate:modelValue":r[6]||(r[6]=e=>_a.value=e),style:{"--el-switch-on-color":"#13ce66","--el-switch-off-color":"#ff4949"}},null,8,["modelValue"])])])]),$(s("div",We,[C(X,{style:{"font-size":"16px"}},{default:z((()=>[w(" 正在进行归档的任务 "+b(Ca.compressTask.length)+"个 ",1)])),_:1}),C(X,null,{default:z((()=>r[31]||(r[31]=[w("详细归档记录点击右上角 “⏰查看下载历史”")]))),_:1}),(i(!0),o(V,null,S(Ca.compressTask,((e,a)=>(i(),o("p",{key:e.id,class:"tc",style:{"margin-top":"10px"}},[w(b(a+1)+". "+b(e.tip)+" ",1),$(s("span",Je,null,512),[[$a,!0]])])))),128))],512),[[L,Ca.compressTask.length&&!_a.value]]),$(s("div",Qe,[C(X,{style:{"font-size":"16px"}},{default:z((()=>r[32]||(r[32]=[w(" ”❤️下面展示历史的下载记录与归档任务完成情况❤️“ ")]))),_:1}),C(X,null,{default:z((()=>r[33]||(r[33]=[w("”再也不需要在页面停留等待归档完成“")]))),_:1}),s("div",null,[$((i(),T(W,{ref_key:"multipleTable",ref:Ra,"element-loading-text":"Loading...","tooltip-effect":"dark","multiple-table":"",stripe:"",border:"","default-sort":{prop:"date",order:"descending"},"max-height":666,data:Ca.actions,style:{width:"100%"},onSelectionChange:Qa},{default:z((()=>[C(y,{prop:"date",label:"触发时间",width:"200"},{default:z((e=>[w(b(k(P)(new Date(e.row.date))),1)])),_:1}),C(y,{prop:"tip",label:"文件名"}),C(y,{prop:"type",label:"类型"},{default:z((e=>[e.row.type===k(ge).Compress?(i(),T(R,{key:0,type:"primary"},{default:z((()=>r[34]||(r[34]=[w(" 归档下载 ")]))),_:1})):(i(),T(R,{key:1,type:"default"},{default:z((()=>r[35]||(r[35]=[w(" 普通下载 ")]))),_:1}))])),_:1}),C(y,{prop:"size",label:"大小",width:"100"},{default:z((e=>[e.row.status===k(fe).ARCHIVE?(i(),o("span",Xe,[C(R,{type:"danger"},{default:z((()=>r[36]||(r[36]=[w("归档中...")]))),_:1})])):e.row.status!==k(fe).FAIL?(i(),o("span",Ge,b(e.row.size?k(u)(e.row.size):"未知大小"),1)):_("",!0),e.row.status===k(fe).FAIL?(i(),o("span",Ye,[C(R,{type:"danger"},{default:z((()=>r[37]||(r[37]=[w("归档失败")]))),_:1})])):_("",!0)])),_:1}),C(y,{fixed:"right",label:"操作",width:"140"},{default:z((e=>[e.row.status===k(fe).ARCHIVE?$((i(),o("div",Ze,r[38]||(r[38]=[w(" 归档中... ")]))),[[$a,!0]]):_("",!0),e.row.status===k(fe).EXPIRED?(i(),o("div",ea," 链接已失效 ")):_("",!0),e.row.status===k(fe).FAIL?(i(),o("div",aa," 联系开发者,提供错误信息:"+b(e.row.error),1)):_("",!0),e.row.status===k(fe).SUCCESS?(i(),o("div",la,[C(R,{type:"primary",onClick:a=>k(j)(e.row.url)},{default:z((()=>r[39]||(r[39]=[w(" 下载 ")]))),_:2},1032,["onClick"]),C(R,{type:"success",style:{"margin-left":"10px"},onClick:a=>k(D)(e.row.url)},{default:z((()=>r[40]||(r[40]=[w(" 链接 ")]))),_:2},1032,["onClick"]),C(R,{type:"warning",style:{"margin-left":"10px"},onClick:()=>{ha.value=!0,ya.value=e.row.url}},{default:z((()=>r[41]||(r[41]=[w(" 二维码 ")]))),_:2},1032,["onClick"])])):_("",!0)])),_:1})])),_:1},8,["data"])),[[$a,Ia.value]]),s("div",ta,[C(me,{small:"","current-page":Ca.pageCurrent,"page-count":Ca.pageCount,total:Ca.pageTotal,layout:"total, prev, pager, next",onCurrentChange:Va},null,8,["current-page","page-count","total"])])])],512),[[L,_a.value]]),s("div",na,[s("div",ia,[s("div",oa,[r[42]||(r[42]=s("span",{class:"stat-label"},"全部文件",-1)),s("strong",null,b(il.value),1),r[43]||(r[43]=s("small",null,"当前账号提交文件总大小",-1))]),s("div",sa,[r[44]||(r[44]=s("span",{class:"stat-label"},"当前筛选",-1)),s("strong",null,b(nl.value),1),r[45]||(r[45]=s("small",null,"当前筛选条件下文件大小",-1))]),t.value?(i(),o("div",{key:0,class:I(["stat-card",{warning:k(ga)}])},[r[46]||(r[46]=s("span",{class:"stat-label"},"存储空间",-1)),s("strong",null,b(k(u)(k(we)))+" / "+b(k(u)(k(be))),1),C(ye,{percentage:ol.value,status:k(ga)?"exception":void 0},null,8,["percentage","status"]),s("small",null,b(k(ze).toFixed(2))+"% 已使用",1)],2)):_("",!0),n.value?(i(),o("div",{key:1,class:I(["stat-card",{warning:k(fa)}])},[r[47]||(r[47]=s("span",{class:"stat-label"},"钱包消耗",-1)),s("strong",null,b(k(Ce))+" / "+b(k(ke))+"¥",1),C(ye,{percentage:sl.value,status:k(fa)?"exception":void 0},null,8,["percentage","status"]),s("small",null,"统计时间:"+b(k(P)(k(a).moneyStartDay,"yyyy-MM-dd"))+" - 至今",1),s("button",{class:"stat-link",type:"button",onClick:ml}," 查看费用明细 ")],2)):_("",!0)]),k(pa)?(i(),T(X,{key:0},{default:z((()=>r[48]||(r[48]=[s("h2",{style:{color:"#f56c6c"}}," 空间超限将无法上传/下载文件,如需要使用,请联系管理员扩容,或自行删除无关文件 ",-1)]))),_:1})):_("",!0),$((i(),T(W,{ref_key:"multipleTable",ref:Ra,"element-loading-text":"Loading...","tooltip-effect":"dark","multiple-table":"",stripe:"",border:"","max-height":666,data:Wa.value,style:{width:"100%"},onSelectionChange:Qa},{default:z((()=>[C(y,{type:"selection",width:"55"}),C(y,{prop:"date",label:"提交时间",width:"160"},{default:z((e=>[w(b(k(P)(new Date(e.row.date))),1)])),_:1}),C(y,{prop:"task_name",label:"任务",width:"150"}),C(y,{prop:"name",label:"文件名",width:"200"}),ka.value?(i(),T(y,{key:0,prop:"origin_name",label:"原文件名",width:"200"},{default:z((e=>[w(b(e.row.origin_name||"-"),1)])),_:1})):_("",!0),C(y,{prop:"size",label:"大小"},{default:z((e=>[w(b(0===e.row.size?"未知大小":k(u)(e.row.size)),1)])),_:1}),C(y,{prop:"downloadCount",width:"90",label:"下载次数"}),wa.value?(i(),T(y,{key:1,label:"缩略图",width:"120"},{default:z((e=>[C(Ve,{"preview-teleported":"","preview-src-list":pl.value,"initial-index":e.$index,lazy:"",style:{width:"100px",height:"100px"},src:e.row.cover,fit:"cover",onSwitch:gl,onClick:a=>gl(e.$index)},{viewer:z((()=>[s("div",ra,b(cl.value),1)])),placeholder:z((()=>r[49]||(r[49]=[s("div",{class:"imageLoading"}," Loading... ",-1)]))),error:z((()=>[s("div",da,[r[50]||(r[50]=w(" 不支持 ")),C(f,null,{default:z((()=>[C(k(Se))])),_:1})])])),_:2},1032,["preview-src-list","initial-index","src","onClick"])])),_:1})):_("",!0),ba.value?(i(),T(y,{key:2,prop:"people",width:"100",label:"限制名单"},{default:z((e=>[w(b(e.row.people||"-"),1)])),_:1})):_("",!0),C(y,{fixed:"right",label:"操作",width:"140"},{default:z((e=>[s("div",ua,[C(p,{type:"primary",text:"",size:"small",onClick:a=>{return l=e.row,Za.splice(0,Za.length),Za.push(...M(l.info)),void(Ya.value=!0);var l}},{default:z((()=>r[51]||(r[51]=[w(" 查看提交信息 ")]))),_:2},1032,["onClick"]),C(p,{type:"primary",text:"",size:"small",onClick:a=>function(e){const{id:a,name:l}=e,t=F(l);al.oldName=l,al.suffix=t,al.id=a,el.value=!0}(e.row)},{default:z((()=>r[52]||(r[52]=[w(" 修改文件名 ")]))),_:2},1032,["onClick"]),C(p,{type:"primary",text:"",size:"small",onClick:a=>function(e){if(pa.value)return void U.error("下载功能已被限制,请联系管理员扩容,或自行删除历史无用文件");const{id:a,name:l}=e;E.getOneFileUrl(a).then((e=>{const{link:a}=e.data;ha.value=!0,ya.value=a,j(a,l),za(),setTimeout((()=>{Ba()}),1e3)})).catch((()=>{U.error("文件已从服务器上移除")}))}(e.row)},{default:z((()=>r[53]||(r[53]=[w(" 下载 ")]))),_:2},1032,["onClick"]),C(p,{type:"primary",text:"",size:"small",onClick:a=>function(e){const a=Ea.findIndex((a=>a===e));he.confirm("确认删除此文件吗?","数据无价,请谨慎操作").then((()=>{E.deleteOneFile(e.id).then((()=>{U.success("删除成功"),Ea.splice(a,1),Na.value-=1,0===Ea.length&&Fa.value>1?Fa.value-=1:Ba()}))})).catch((()=>{U.info("取消删除")}))}(e.row)},{default:z((()=>r[54]||(r[54]=[w(" 删除 ")]))),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data"])),[[$a,Ia.value]])]),s("div",ca,[C(me,{"current-page":Fa.value,background:"","page-count":Aa.value,"page-sizes":[6,10,50,100],"page-size":Ma.value,total:Na.value,layout:"total, sizes, prev, pager, next, jumper",onCurrentChange:rl,onSizeChange:tl},null,8,["current-page","page-count","page-size","total"])]),C(ma,{modelValue:Ya.value,"onUpdate:modelValue":r[7]||(r[7]=e=>Ya.value=e),fullscreen:k(fl),title:"提交填写的信息"},{default:z((()=>[C(Y,{infos:Za,disabled:!0},null,8,["infos"])])),_:1},8,["modelValue","fullscreen"]),C(ce,{value:ha.value,"onUpdate:value":r[8]||(r[8]=e=>ha.value=e),title:"下载链接",link:ya.value},null,8,["value","link"]),k(a).filePageFloatingContactEnabled&&k(a).filePageContactLink?(i(),T(pe,{key:1,href:k(a).filePageContactLink,text:k(a).filePageContactLinkText||"联系客服"},null,8,["href","text"])):_("",!0),C(ma,{modelValue:el.value,"onUpdate:modelValue":r[12]||(r[12]=e=>el.value=e),fullscreen:k(fl),title:"修改文件名"},{default:z((()=>[s("div",null,[C(xa,{"label-width":"100px",model:al},{default:z((()=>[C(va,{label:"原文件名",prop:"newName"},{default:z((()=>[C(g,{modelValue:al.oldName,"onUpdate:modelValue":r[9]||(r[9]=e=>al.oldName=e),disabled:""},null,8,["modelValue"])])),_:1}),C(va,{label:"新文件名",prop:"newName"},{default:z((()=>[C(g,{modelValue:al.newName,"onUpdate:modelValue":r[10]||(r[10]=e=>al.newName=e),placeholder:"请输入新文件名"},{append:z((()=>[w(b(al.suffix),1)])),_:1},8,["modelValue"])])),_:1}),C(va,null,{default:z((()=>[C(p,{type:"success",onClick:ll},{default:z((()=>r[55]||(r[55]=[w(" 保存 ")]))),_:1}),C(p,{onClick:r[11]||(r[11]=e=>el.value=!1)},{default:z((()=>r[56]||(r[56]=[w(" 取消 ")]))),_:1})])),_:1})])),_:1},8,["model"])])])),_:1},8,["modelValue","fullscreen"])])}}}),[["__scopeId","data-v-4101c199"]]))}}}));
|
|
2
|
+
//# sourceMappingURL=index-legacy-DziFQjpX.js.map
|