From 080da56451db1a2b5080210a40c8ab148c904bf7 Mon Sep 17 00:00:00 2001 From: edgexie Date: Thu, 11 Jul 2024 07:30:30 +0000 Subject: [PATCH] deploy: 02d80f1e7dc03afd3d0c6e60ccd86845f2e910be --- 404.html | 2 +- about-me.html | 6 +- ...md.9wHsYVTS.js => about-me.md.DcXGFENO.js} | 2 +- ...S.lean.js => about-me.md.DcXGFENO.lean.js} | 2 +- ...37\345\274\200\345\247\213.md.oYYn0Lka.js" | 2 +- ...5\274\200\345\247\213.md.oYYn0Lka.lean.js" | 2 +- ...47\346\250\241\345\236\213.md.BYT2v8hW.js" | 2 +- ...6\250\241\345\236\213.md.BYT2v8hW.lean.js" | 2 +- ...06\345\274\200\345\217\221.md.B9lA-DEH.js" | 2 +- ...5\274\200\345\217\221.md.B9lA-DEH.lean.js" | 2 +- ...37\345\274\200\345\247\213.md.Dl0CiA0w.js" | 2 +- ...5\274\200\345\247\213.md.Dl0CiA0w.lean.js" | 2 +- ...nd_java_SpringBoot_restful.md.XqxFNTkh.js} | 2 +- ...va_SpringBoot_restful.md.XqxFNTkh.lean.js} | 2 +- ...is\347\273\223\345\220\210.md.BghR1Sl_.js" | 101 +++++++++++++ ...7\273\223\345\220\210.md.BghR1Sl_.lean.js" | 1 + ...66\345\217\215\350\275\254.md.C3ctmyRO.js" | 2 +- ...5\217\215\350\275\254.md.C3ctmyRO.lean.js" | 2 +- ...46\346\210\252\345\231\250.md.Cq6iAK7T.js" | 116 ++++++++++++++ ...6\210\252\345\231\250.md.Cq6iAK7T.lean.js" | 1 + ...37\345\274\200\345\247\213.md.DP6PVNWw.js" | 2 +- ...5\274\200\345\247\213.md.DP6PVNWw.lean.js" | 2 +- ...50\350\276\276\345\274\217.md.BZp7IVw9.js" | 2 +- ...0\276\276\345\274\217.md.BZp7IVw9.lean.js" | 2 +- ...QL\346\225\260\346\215\256.md.DYxRo87T.js" | 97 ++++++++++++ ...6\225\260\346\215\256.md.DYxRo87T.lean.js" | 1 + ...\344\273\266\345\222\214IO.md.Dc5_z6y9.js" | 2 +- ...273\266\345\222\214IO.md.Dc5_z6y9.lean.js" | 2 +- ...45\274\200\345\217\221java.md.5kW7XnHu.js" | 2 +- ...4\200\345\217\221java.md.5kW7XnHu.lean.js" | 2 +- ...00\201if\345\222\214switch.md.D_b_O2An.js" | 2 +- ...1if\345\222\214switch.md.D_b_O2An.lean.js" | 2 +- ...a_\345\217\230\351\207\217.md.BB1KqJGM.js" | 2 +- ...5\217\230\351\207\217.md.BB1KqJGM.lean.js" | 2 +- ...56\347\261\273\345\236\213.md.C3ic3dTu.js" | 2 +- ...7\261\273\345\236\213.md.C3ic3dTu.lean.js" | 2 +- ...27\347\254\246\344\270\262.md.qaq7Ch_W.js" | 2 +- ...7\254\246\344\270\262.md.qaq7Ch_W.lean.js" | 2 +- ...41\345\222\214\347\261\273.md.MrFr4t4s.js" | 2 +- ...5\222\214\347\261\273.md.MrFr4t4s.lean.js" | 2 +- ...70\345\244\204\347\220\206.md.BeHGpOim.js" | 2 +- ...5\244\204\347\220\206.md.BeHGpOim.lean.js" | 2 +- ...37\345\274\200\345\247\213.md.Cn1RmWoY.js" | 2 +- ...5\274\200\345\247\213.md.Cn1RmWoY.lean.js" | 2 +- ...75\350\261\241\347\261\273.md.BvwTwcoT.js" | 2 +- ...0\261\241\347\261\273.md.BvwTwcoT.lean.js" | 2 +- ...56\347\273\223\346\236\204.md.D3jXQd6a.js" | 2 +- ...7\273\223\346\236\204.md.D3jXQd6a.lean.js" | 2 +- ...a_\346\225\260\347\273\204.md.Dm5xgZ9v.js" | 2 +- ...6\225\260\347\273\204.md.Dm5xgZ9v.lean.js" | 2 +- ...a_\346\226\271\346\263\225.md.B6Ps2WDO.js" | 2 +- ...6\226\271\346\263\225.md.B6Ps2WDO.lean.js" | 2 +- ...a_\346\236\232\344\270\276.md.BRQGn6WS.js" | 2 +- ...6\236\232\344\270\276.md.BRQGn6WS.lean.js" | 2 +- ...14\345\244\232\346\200\201.md.Cttg-pU1.js" | 2 +- ...5\244\232\346\200\201.md.Cttg-pU1.lean.js" | 2 +- ...20\347\256\227\347\254\246.md.BD2DbKtn.js" | 6 +- ...7\256\227\347\254\246.md.BD2DbKtn.lean.js" | 2 +- ...SE\346\216\245\345\217\243.md.cvK-C0EM.js" | 2 +- ...6\216\245\345\217\243.md.cvK-C0EM.lean.js" | 2 +- ...ice_intergrate-with-vercel.md.D1tcau4g.js} | 2 +- ...ntergrate-with-vercel.md.D1tcau4g.lean.js} | 2 +- ...d_nestjs_\344\270\216MySQL.md.DbtJfsbp.js" | 8 +- ...tjs_\344\270\216MySQL.md.DbtJfsbp.lean.js" | 8 +- ...55\351\227\264\344\273\266.md.I4uhgMQ0.js" | 2 +- ...1\227\264\344\273\266.md.I4uhgMQ0.lean.js" | 2 +- ...s_\345\256\210\345\215\253.md.i9ye8GqR.js" | 6 +- ...5\256\210\345\215\253.md.i9ye8GqR.lean.js" | 2 +- ...07\346\273\244\345\231\250.md.VkzUvKXb.js" | 4 +- ...6\273\244\345\231\250.md.VkzUvKXb.lean.js" | 2 +- ...37\345\274\200\345\247\213.md.DnhWty34.js" | 2 +- ...5\274\200\345\247\213.md.DnhWty34.lean.js" | 2 +- ...46\346\210\252\345\231\250.md.DTW8NnCg.js" | 2 +- ...6\210\252\345\231\250.md.DTW8NnCg.lean.js" | 2 +- ...47\345\210\266\345\231\250.md.CxDWQf7D.js" | 2 +- ...5\210\266\345\231\250.md.CxDWQf7D.lean.js" | 2 +- ...s_\347\256\241\351\201\223.md.DOHXArpm.js" | 6 +- ...7\256\241\351\201\223.md.DOHXArpm.lean.js" | 2 +- ...05\351\245\260\345\231\250.md.BYcopKev.js" | 2 +- ...1\245\260\345\231\250.md.BYcopKev.lean.js" | 2 +- ...n_\345\217\230\351\207\217.md.BHrR-lVv.js" | 2 +- ...5\217\230\351\207\217.md.BHrR-lVv.lean.js" | 2 +- ...37\345\274\200\345\247\213.md.oG_Uc0gX.js" | 2 +- ...5\274\200\345\247\213.md.oG_Uc0gX.lean.js" | 2 +- ...ded-system_esp8266_control.md.DSoEfOfS.js} | 2 +- ...ystem_esp8266_control.md.DSoEfOfS.lean.js} | 2 +- ...system_esp8266_mqtt-client.md.BJ3hm7BS.js} | 2 +- ...m_esp8266_mqtt-client.md.BJ3hm7BS.lean.js} | 2 +- ...346\216\247\345\210\266LED.md.CNiwHqQ2.js" | 2 +- ...16\247\345\210\266LED.md.CNiwHqQ2.lean.js" | 2 +- ...js => cn_engineering_index.md.BzreDnDI.js} | 2 +- ... cn_engineering_index.md.BzreDnDI.lean.js} | 2 +- ...t-end_base_group-build_rank.md.BVKXpQu4.js | 1 + ..._base_group-build_rank.md.BVKXpQu4.lean.js | 1 + ...31\350\247\204\350\214\203.md.Dal3w7Ti.js" | 4 +- ...0\247\204\350\214\203.md.Dal3w7Ti.lean.js" | 1 + ...ont-end_base_js-docs_index.md.Db2Qhtbc.js} | 2 +- ...nd_base_js-docs_index.md.Db2Qhtbc.lean.js} | 2 +- assets/cn_front-end_base_rank.md.CKvdtC8S.js | 1 - ...cn_front-end_base_rank.md.CKvdtC8S.lean.js | 1 - ...37\345\274\200\345\247\213.md.CAnAV_WL.js" | 8 + ...5\274\200\345\247\213.md.CAnAV_WL.lean.js" | 1 + ...56\347\261\273\345\236\213.md.FIjfzCfT.js" | 62 ++++++++ ...7\261\273\345\236\213.md.FIjfzCfT.lean.js" | 1 + ...0\247\204\350\214\203.md.DeKqDrN_.lean.js" | 1 - ...> cn_front-end_frame_index.md.LdZDHp9B.js} | 2 +- ...front-end_frame_index.md.LdZDHp9B.lean.js} | 2 +- ...43\346\250\241\346\213\237.md.CzLUeX4j.js" | 2 +- ...6\250\241\346\213\237.md.CzLUeX4j.lean.js" | 2 +- ...37\345\274\200\345\247\213.md.DzVm42MB.js" | 2 +- ...5\274\200\345\247\213.md.DzVm42MB.lean.js" | 2 +- ...n_\346\235\203\351\231\220.md.bFc8S5k8.js" | 2 +- ...6\235\203\351\231\220.md.bFc8S5k8.lean.js" | 2 +- ...front-end_frame_vue3_index.md.D2myUyPq.js} | 2 +- ...-end_frame_vue3_index.md.D2myUyPq.lean.js} | 2 +- ...37\345\274\200\345\247\213.md.Cjl6w7BD.js" | 2 +- ...5\274\200\345\247\213.md.Cjl6w7BD.lean.js" | 2 +- ...21\345\220\254\345\231\250.md.CpDXWmdX.js" | 2 +- ...5\220\254\345\231\250.md.CpDXWmdX.lean.js" | 2 +- ...3_\347\273\204\344\273\266.md.BTQbvKsT.js" | 2 +- ...7\273\204\344\273\266.md.BTQbvKsT.lean.js" | 2 +- ..._leaflet_with-antdv-button.md.23m68R0W.js} | 2 +- ...let_with-antdv-button.md.23m68R0W.lean.js} | 2 +- ...s_\346\214\211\351\222\256.md.XVhE0SPK.js" | 2 +- ...6\214\211\351\222\256.md.XVhE0SPK.lean.js" | 2 +- ... => cn_mx-components_index.md.BsvAtqZQ.js} | 2 +- ...n_mx-components_index.md.BsvAtqZQ.lean.js} | 2 +- ...md.BJT6H8Yr.js => en_index.md.C-6bPfAN.js} | 2 +- ...r.lean.js => en_index.md.C-6bPfAN.lean.js} | 2 +- ...ex.md.CxW3bBkY.js => index.md.CbV-hMzj.js} | 2 +- ...bBkY.lean.js => index.md.CbV-hMzj.lean.js} | 2 +- ...CI8KVTJS.js => posts_index.md.EWW9ss0x.js} | 2 +- ...ean.js => posts_index.md.EWW9ss0x.lean.js} | 2 +- ...E.js => posts_my-first-day.md.DCiAmvyV.js} | 2 +- ...=> posts_my-first-day.md.DCiAmvyV.lean.js} | 2 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- ...\345\244\247\346\250\241\345\236\213.html" | 6 +- ...\347\220\206\345\274\200\345\217\221.html" | 8 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- cn/back-end/java/SpringBoot/restful.html | 8 +- ...0\216mybatis\347\273\223\345\220\210.html" | 126 ++++++++++++++++ ...\345\210\266\345\217\215\350\275\254.html" | 8 +- ...\346\213\246\346\210\252\345\231\250.html" | 141 ++++++++++++++++++ ...\351\200\237\345\274\200\345\247\213.html" | 8 +- ...\350\241\250\350\276\276\345\274\217.html" | 8 +- ...227\256MySQL\346\225\260\346\215\256.html" | 122 +++++++++++++++ ...46\226\207\344\273\266\345\222\214IO.html" | 8 +- .../vscode\345\274\200\345\217\221java.html" | 8 +- ...1for\343\200\201if\345\222\214switch.html" | 8 +- .../java/\345\217\230\351\207\217.html" | 8 +- ...\346\215\256\347\261\273\345\236\213.html" | 8 +- ...\345\255\227\347\254\246\344\270\262.html" | 6 +- ...\350\261\241\345\222\214\347\261\273.html" | 8 +- ...\345\270\270\345\244\204\347\220\206.html" | 8 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- ...\346\212\275\350\261\241\347\261\273.html" | 8 +- ...\346\215\256\347\273\223\346\236\204.html" | 8 +- .../java/\346\225\260\347\273\204.html" | 8 +- .../java/\346\226\271\346\263\225.html" | 8 +- .../java/\346\236\232\344\270\276.html" | 8 +- ...\345\222\214\345\244\232\346\200\201.html" | 8 +- ...\350\277\220\347\256\227\347\254\246.html" | 12 +- .../SSE\346\216\245\345\217\243.html" | 8 +- .../practice/intergrate-with-vercel.html | 8 +- "cn/back-end/nestjs/\344\270\216MySQL.html" | 14 +- ...\344\270\255\351\227\264\344\273\266.html" | 8 +- .../nestjs/\345\256\210\345\215\253.html" | 10 +- ...\350\277\207\346\273\244\345\231\250.html" | 10 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- ...\346\213\246\346\210\252\345\231\250.html" | 8 +- ...\346\216\247\345\210\266\345\231\250.html" | 8 +- .../nestjs/\347\256\241\351\201\223.html" | 12 +- ...\350\243\205\351\245\260\345\231\250.html" | 8 +- .../python/\345\217\230\351\207\217.html" | 8 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- cn/embedded-system/esp8266/control.html | 6 +- cn/embedded-system/esp8266/mqtt-client.html | 6 +- ...7\273\234\346\216\247\345\210\266LED.html" | 8 +- cn/engineering/index.html | 6 +- cn/front-end/base/group-build/rank.html | 26 ++++ ...\345\206\231\350\247\204\350\214\203.html" | 41 +++++ cn/front-end/base/js-docs/index.html | 6 +- cn/front-end/base/rank.html | 26 ---- ...\351\200\237\345\274\200\345\247\213.html" | 33 ++++ ...\346\215\256\347\261\273\345\236\213.html" | 87 +++++++++++ ...\345\206\231\350\247\204\350\214\203.html" | 41 ----- cn/front-end/frame/index.html | 6 +- ...\345\217\243\346\250\241\346\213\237.html" | 6 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- .../pure-admin/\346\235\203\351\231\220.html" | 8 +- cn/front-end/frame/vue3/index.html | 6 +- ...\351\200\237\345\274\200\345\247\213.html" | 8 +- ...\347\233\221\345\220\254\345\231\250.html" | 8 +- .../frame/vue3/\347\273\204\344\273\266.html" | 8 +- .../visual/leaflet/with-antdv-button.html | 8 +- .../\346\214\211\351\222\256.html" | 8 +- cn/mx-components/index.html | 6 +- en/index.html | 6 +- hashmap.json | 2 +- index.html | 6 +- packages/foo.html | 4 +- posts/index.html | 6 +- posts/my-first-day.html | 6 +- 203 files changed, 1329 insertions(+), 431 deletions(-) rename assets/{about-me.md.9wHsYVTS.js => about-me.md.DcXGFENO.js} (92%) rename assets/{about-me.md.9wHsYVTS.lean.js => about-me.md.DcXGFENO.lean.js} (92%) rename "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.js" => "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.js" (98%) rename "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.lean.js" => "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.lean.js" (86%) rename "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.js" => "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.js" (92%) rename "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.lean.js" => "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.lean.js" (92%) rename "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.js" => "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.js" (99%) rename "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.lean.js" => "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.lean.js" (87%) rename "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.js" => "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.js" (99%) rename "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.lean.js" => "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.lean.js" (87%) rename assets/{cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.js => cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.js} (99%) rename assets/{cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.lean.js => cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.lean.js} (87%) create mode 100644 "assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.js" create mode 100644 "assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.lean.js" rename "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.js" => "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.js" (99%) rename "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.lean.js" => "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.lean.js" (88%) create mode 100644 "assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.js" create mode 100644 "assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.lean.js" rename "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.js" => "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.js" (99%) rename "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.lean.js" => "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.lean.js" (87%) rename "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.js" => "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.js" (98%) rename "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.lean.js" => "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.lean.js" (88%) create mode 100644 "assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.js" create mode 100644 "assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.lean.js" rename "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.js" => "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.js" (99%) rename "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.lean.js" => "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.lean.js" (86%) rename "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.js" => "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.js" (99%) rename "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.lean.js" => "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.lean.js" (86%) rename "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.js" => "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.js" (95%) rename "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.lean.js" => "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.lean.js" (75%) rename "assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.js" => "assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.js" (99%) rename "assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.lean.js" => "assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.lean.js" (85%) rename "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.js" => "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.js" (98%) rename "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.lean.js" => "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.lean.js" (87%) rename "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.js" => "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.js" (95%) rename "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.lean.js" => "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.lean.js" (85%) rename "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.js" => "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.js" (99%) rename "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.lean.js" => "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.lean.js" (86%) rename "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.js" => "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.js" (99%) rename "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.lean.js" => "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.lean.js" (86%) rename "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.js" => "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.js" (99%) rename "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.lean.js" => "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.lean.js" (86%) rename "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.js" => "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.js" (99%) rename "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.lean.js" => "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.lean.js" (85%) rename "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.js" => "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.js" (99%) rename "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.lean.js" => "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.lean.js" (86%) rename "assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.js" => "assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.js" (99%) rename "assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.lean.js" => "assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.lean.js" (85%) rename "assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.js" => "assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.js" (99%) rename "assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.lean.js" => "assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.lean.js" (85%) rename "assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.js" => "assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.js" (99%) rename "assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.lean.js" => "assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.lean.js" (85%) rename "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.js" => "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.js" (99%) rename "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.lean.js" => "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.lean.js" (87%) rename "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.js" => "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.js" (96%) rename "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.lean.js" => "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.lean.js" (85%) rename "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.js" => "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.js" (98%) rename "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.lean.js" => "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.lean.js" (87%) rename assets/{cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.js => cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.js} (99%) rename assets/{cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.lean.js => cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.lean.js} (88%) rename "assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.js" => "assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.js" (98%) rename "assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.lean.js" => "assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.lean.js" (98%) rename "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.js" => "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.js" (99%) rename "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.lean.js" => "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.lean.js" (85%) rename "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.js" => "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.js" (96%) rename "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.lean.js" => "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.lean.js" (71%) rename "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.js" => "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.js" (97%) rename "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.lean.js" => "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.lean.js" (86%) rename "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.js" => "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.js" (99%) rename "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.lean.js" => "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.lean.js" (86%) rename "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.js" => "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.js" (97%) rename "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.lean.js" => "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.lean.js" (85%) rename "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.js" => "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.js" (99%) rename "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.lean.js" => "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.lean.js" (85%) rename "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.js" => "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.js" (98%) rename "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.lean.js" => "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.lean.js" (86%) rename "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.js" => "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.js" (95%) rename "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.lean.js" => "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.lean.js" (86%) rename "assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.js" => "assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.js" (99%) rename "assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.lean.js" => "assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.lean.js" (85%) rename "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.js" => "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.js" (99%) rename "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.lean.js" => "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.lean.js" (86%) rename assets/{cn_embedded-system_esp8266_control.md.CA-jCI-v.js => cn_embedded-system_esp8266_control.md.DSoEfOfS.js} (93%) rename assets/{cn_embedded-system_esp8266_control.md.CA-jCI-v.lean.js => cn_embedded-system_esp8266_control.md.DSoEfOfS.lean.js} (93%) rename assets/{cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.js => cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.js} (93%) rename assets/{cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.lean.js => cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.lean.js} (93%) rename "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.js" => "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.js" (99%) rename "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.lean.js" => "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.lean.js" (88%) rename assets/{cn_engineering_index.md.Bc5ppXgh.js => cn_engineering_index.md.BzreDnDI.js} (85%) rename assets/{cn_engineering_index.md.Bc5ppXgh.lean.js => cn_engineering_index.md.BzreDnDI.lean.js} (85%) create mode 100644 assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.js create mode 100644 assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.lean.js rename "assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.js" => "assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.js" (75%) create mode 100644 "assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.lean.js" rename assets/{cn_front-end_base_js-docs_index.md.Z9wnA6R-.js => cn_front-end_base_js-docs_index.md.Db2Qhtbc.js} (85%) rename assets/{cn_front-end_base_js-docs_index.md.Z9wnA6R-.lean.js => cn_front-end_base_js-docs_index.md.Db2Qhtbc.lean.js} (85%) delete mode 100644 assets/cn_front-end_base_rank.md.CKvdtC8S.js delete mode 100644 assets/cn_front-end_base_rank.md.CKvdtC8S.lean.js create mode 100644 "assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.js" create mode 100644 "assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.lean.js" create mode 100644 "assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.js" create mode 100644 "assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.lean.js" delete mode 100644 "assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.lean.js" rename assets/{cn_front-end_frame_index.md.CIjbLLhr.js => cn_front-end_frame_index.md.LdZDHp9B.js} (88%) rename assets/{cn_front-end_frame_index.md.CIjbLLhr.lean.js => cn_front-end_frame_index.md.LdZDHp9B.lean.js} (88%) rename "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.js" => "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.js" (90%) rename "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.lean.js" => "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.lean.js" (90%) rename "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.js" => "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.js" (97%) rename "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.lean.js" => "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.lean.js" (87%) rename "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.js" => "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.js" (99%) rename "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.lean.js" => "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.lean.js" (86%) rename assets/{cn_front-end_frame_vue3_index.md.0NbG7FuH.js => cn_front-end_frame_vue3_index.md.D2myUyPq.js} (86%) rename assets/{cn_front-end_frame_vue3_index.md.0NbG7FuH.lean.js => cn_front-end_frame_vue3_index.md.D2myUyPq.lean.js} (86%) rename "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.js" => "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.js" (99%) rename "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.lean.js" => "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.lean.js" (86%) rename "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.js" => "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.js" (99%) rename "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.lean.js" => "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.lean.js" (86%) rename "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.js" => "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.js" (99%) rename "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.lean.js" => "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.lean.js" (86%) rename assets/{cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.js => cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.js} (99%) rename assets/{cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.lean.js => cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.lean.js} (97%) rename "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.js" => "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.js" (99%) rename "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.lean.js" => "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.lean.js" (99%) rename assets/{cn_mx-components_index.md.UyJdQsEh.js => cn_mx-components_index.md.BsvAtqZQ.js} (73%) rename assets/{cn_mx-components_index.md.UyJdQsEh.lean.js => cn_mx-components_index.md.BsvAtqZQ.lean.js} (73%) rename assets/{en_index.md.BJT6H8Yr.js => en_index.md.C-6bPfAN.js} (89%) rename assets/{en_index.md.BJT6H8Yr.lean.js => en_index.md.C-6bPfAN.lean.js} (89%) rename assets/{index.md.CxW3bBkY.js => index.md.CbV-hMzj.js} (93%) rename assets/{index.md.CxW3bBkY.lean.js => index.md.CbV-hMzj.lean.js} (93%) rename assets/{posts_index.md.CI8KVTJS.js => posts_index.md.EWW9ss0x.js} (68%) rename assets/{posts_index.md.CI8KVTJS.lean.js => posts_index.md.EWW9ss0x.lean.js} (68%) rename assets/{posts_my-first-day.md.BWX3-leE.js => posts_my-first-day.md.DCiAmvyV.js} (85%) rename assets/{posts_my-first-day.md.BWX3-leE.lean.js => posts_my-first-day.md.DCiAmvyV.lean.js} (85%) create mode 100644 "cn/back-end/java/SpringBoot/\344\270\216mybatis\347\273\223\345\220\210.html" create mode 100644 "cn/back-end/java/SpringBoot/\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.html" create mode 100644 "cn/back-end/java/SpringBoot/\350\256\277\351\227\256MySQL\346\225\260\346\215\256.html" create mode 100644 cn/front-end/base/group-build/rank.html create mode 100644 "cn/front-end/base/group-build/\344\271\246\345\206\231\350\247\204\350\214\203.html" delete mode 100644 cn/front-end/base/rank.html create mode 100644 "cn/front-end/base/ts/\345\277\253\351\200\237\345\274\200\345\247\213.html" create mode 100644 "cn/front-end/base/ts/\346\225\260\346\215\256\347\261\273\345\236\213.html" delete mode 100644 "cn/front-end/base/\344\271\246\345\206\231\350\247\204\350\214\203.html" diff --git a/404.html b/404.html index daf7b00..f7595aa 100644 --- a/404.html +++ b/404.html @@ -17,7 +17,7 @@
- + \ No newline at end of file diff --git a/about-me.html b/about-me.html index 965ac4a..19eaa7a 100644 --- a/about-me.html +++ b/about-me.html @@ -12,15 +12,15 @@ - + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/assets/about-me.md.9wHsYVTS.js b/assets/about-me.md.DcXGFENO.js similarity index 92% rename from assets/about-me.md.9wHsYVTS.js rename to assets/about-me.md.DcXGFENO.js index d37a7ac..3fd7c72 100644 --- a/assets/about-me.md.9wHsYVTS.js +++ b/assets/about-me.md.DcXGFENO.js @@ -1 +1 @@ -import{f as l,V as O,N as s,k as e,S as a,a5 as t,M as r,u as c,P as S}from"./chunks/framework.wLg4U0bT.js";import{t as u,g as U,m as f}from"./chunks/theme.NQjD_CgT.js";const D={key:0},L=["innerHTML"],j=JSON.parse('{"title":"","description":"","frontmatter":{"navbar":true,"footer":false,"editLink":false,"lastUpdated":false,"sidebar":false,"outline":false},"headers":[],"relativePath":"about-me.md","filePath":"about-me.md","lastUpdated":1719277083000}'),M={name:"about-me.md"},w=Object.assign(M,{setup(P){const i=l(!0),n=l({code:""}),d=l(""),p=()=>{fetch(U("/auth/validate-code?code=")+n.value.code).then(o=>o.json()).then(o=>{console.log(o.data),o.data.flag?(f.success("验证成功"),i.value=!1,d.value=o.data.content):f.error("验证失败")})},{isDark:v}=O();return(o,_)=>{const h=t("a-alert"),g=t("a-input"),m=t("a-form-item"),b=t("a-button"),k=t("a-form"),y=t("a-space"),x=t("a-config-provider"),C=t("ClientOnly");return r(),s("div",null,[e(C,null,{default:a(()=>[i.value?(r(),s("div",D,[e(x,{theme:{algorithm:c(v)?c(u).darkAlgorithm:c(u).defaultAlgorithm}},{default:a(()=>[e(y,{size:"middle",direction:"vertical"},{default:a(()=>[e(h,{message:"个人介绍涉及隐私,请联系博主取邀请码,多谢 😁",type:"info"}),e(k,{model:n.value},{default:a(()=>[e(m,{label:"邀请码"},{default:a(()=>[e(g,{value:n.value.code,"onUpdate:value":_[0]||(_[0]=N=>n.value.code=N)},null,8,["value"])]),_:1}),e(m,{"wrapper-col":{span:24},style:{"text-align":"right"}},{default:a(()=>[e(b,{type:"primary",size:"small",onClick:p},{default:a(()=>[S("验证")]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["theme"])])):(r(),s("div",{key:1,innerHTML:d.value},null,8,L))]),_:1})])}}});export{j as __pageData,w as default}; +import{f as l,V as O,N as s,k as e,S as a,a5 as t,M as r,u as c,P as S}from"./chunks/framework.wLg4U0bT.js";import{t as u,g as U,m as f}from"./chunks/theme.NQjD_CgT.js";const D={key:0},L=["innerHTML"],j=JSON.parse('{"title":"","description":"","frontmatter":{"navbar":true,"footer":false,"editLink":false,"lastUpdated":false,"sidebar":false,"outline":false},"headers":[],"relativePath":"about-me.md","filePath":"about-me.md","lastUpdated":1720682010000}'),M={name:"about-me.md"},w=Object.assign(M,{setup(P){const i=l(!0),n=l({code:""}),d=l(""),p=()=>{fetch(U("/auth/validate-code?code=")+n.value.code).then(o=>o.json()).then(o=>{console.log(o.data),o.data.flag?(f.success("验证成功"),i.value=!1,d.value=o.data.content):f.error("验证失败")})},{isDark:v}=O();return(o,_)=>{const h=t("a-alert"),g=t("a-input"),m=t("a-form-item"),b=t("a-button"),k=t("a-form"),y=t("a-space"),x=t("a-config-provider"),C=t("ClientOnly");return r(),s("div",null,[e(C,null,{default:a(()=>[i.value?(r(),s("div",D,[e(x,{theme:{algorithm:c(v)?c(u).darkAlgorithm:c(u).defaultAlgorithm}},{default:a(()=>[e(y,{size:"middle",direction:"vertical"},{default:a(()=>[e(h,{message:"个人介绍涉及隐私,请联系博主取邀请码,多谢 😁",type:"info"}),e(k,{model:n.value},{default:a(()=>[e(m,{label:"邀请码"},{default:a(()=>[e(g,{value:n.value.code,"onUpdate:value":_[0]||(_[0]=N=>n.value.code=N)},null,8,["value"])]),_:1}),e(m,{"wrapper-col":{span:24},style:{"text-align":"right"}},{default:a(()=>[e(b,{type:"primary",size:"small",onClick:p},{default:a(()=>[S("验证")]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["theme"])])):(r(),s("div",{key:1,innerHTML:d.value},null,8,L))]),_:1})])}}});export{j as __pageData,w as default}; diff --git a/assets/about-me.md.9wHsYVTS.lean.js b/assets/about-me.md.DcXGFENO.lean.js similarity index 92% rename from assets/about-me.md.9wHsYVTS.lean.js rename to assets/about-me.md.DcXGFENO.lean.js index d37a7ac..3fd7c72 100644 --- a/assets/about-me.md.9wHsYVTS.lean.js +++ b/assets/about-me.md.DcXGFENO.lean.js @@ -1 +1 @@ -import{f as l,V as O,N as s,k as e,S as a,a5 as t,M as r,u as c,P as S}from"./chunks/framework.wLg4U0bT.js";import{t as u,g as U,m as f}from"./chunks/theme.NQjD_CgT.js";const D={key:0},L=["innerHTML"],j=JSON.parse('{"title":"","description":"","frontmatter":{"navbar":true,"footer":false,"editLink":false,"lastUpdated":false,"sidebar":false,"outline":false},"headers":[],"relativePath":"about-me.md","filePath":"about-me.md","lastUpdated":1719277083000}'),M={name:"about-me.md"},w=Object.assign(M,{setup(P){const i=l(!0),n=l({code:""}),d=l(""),p=()=>{fetch(U("/auth/validate-code?code=")+n.value.code).then(o=>o.json()).then(o=>{console.log(o.data),o.data.flag?(f.success("验证成功"),i.value=!1,d.value=o.data.content):f.error("验证失败")})},{isDark:v}=O();return(o,_)=>{const h=t("a-alert"),g=t("a-input"),m=t("a-form-item"),b=t("a-button"),k=t("a-form"),y=t("a-space"),x=t("a-config-provider"),C=t("ClientOnly");return r(),s("div",null,[e(C,null,{default:a(()=>[i.value?(r(),s("div",D,[e(x,{theme:{algorithm:c(v)?c(u).darkAlgorithm:c(u).defaultAlgorithm}},{default:a(()=>[e(y,{size:"middle",direction:"vertical"},{default:a(()=>[e(h,{message:"个人介绍涉及隐私,请联系博主取邀请码,多谢 😁",type:"info"}),e(k,{model:n.value},{default:a(()=>[e(m,{label:"邀请码"},{default:a(()=>[e(g,{value:n.value.code,"onUpdate:value":_[0]||(_[0]=N=>n.value.code=N)},null,8,["value"])]),_:1}),e(m,{"wrapper-col":{span:24},style:{"text-align":"right"}},{default:a(()=>[e(b,{type:"primary",size:"small",onClick:p},{default:a(()=>[S("验证")]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["theme"])])):(r(),s("div",{key:1,innerHTML:d.value},null,8,L))]),_:1})])}}});export{j as __pageData,w as default}; +import{f as l,V as O,N as s,k as e,S as a,a5 as t,M as r,u as c,P as S}from"./chunks/framework.wLg4U0bT.js";import{t as u,g as U,m as f}from"./chunks/theme.NQjD_CgT.js";const D={key:0},L=["innerHTML"],j=JSON.parse('{"title":"","description":"","frontmatter":{"navbar":true,"footer":false,"editLink":false,"lastUpdated":false,"sidebar":false,"outline":false},"headers":[],"relativePath":"about-me.md","filePath":"about-me.md","lastUpdated":1720682010000}'),M={name:"about-me.md"},w=Object.assign(M,{setup(P){const i=l(!0),n=l({code:""}),d=l(""),p=()=>{fetch(U("/auth/validate-code?code=")+n.value.code).then(o=>o.json()).then(o=>{console.log(o.data),o.data.flag?(f.success("验证成功"),i.value=!1,d.value=o.data.content):f.error("验证失败")})},{isDark:v}=O();return(o,_)=>{const h=t("a-alert"),g=t("a-input"),m=t("a-form-item"),b=t("a-button"),k=t("a-form"),y=t("a-space"),x=t("a-config-provider"),C=t("ClientOnly");return r(),s("div",null,[e(C,null,{default:a(()=>[i.value?(r(),s("div",D,[e(x,{theme:{algorithm:c(v)?c(u).darkAlgorithm:c(u).defaultAlgorithm}},{default:a(()=>[e(y,{size:"middle",direction:"vertical"},{default:a(()=>[e(h,{message:"个人介绍涉及隐私,请联系博主取邀请码,多谢 😁",type:"info"}),e(k,{model:n.value},{default:a(()=>[e(m,{label:"邀请码"},{default:a(()=>[e(g,{value:n.value.code,"onUpdate:value":_[0]||(_[0]=N=>n.value.code=N)},null,8,["value"])]),_:1}),e(m,{"wrapper-col":{span:24},style:{"text-align":"right"}},{default:a(()=>[e(b,{type:"primary",size:"small",onClick:p},{default:a(()=>[S("验证")]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})]),_:1},8,["theme"])])):(r(),s("div",{key:1,innerHTML:d.value},null,8,L))]),_:1})])}}});export{j as __pageData,w as default}; diff --git "a/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.js" "b/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.js" similarity index 98% rename from "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.js" rename to "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.js" index cc6f846..7d344dc 100644 --- "a/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.js" +++ "b/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.js" @@ -1,4 +1,4 @@ -import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"ollama","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/快速开始.md","filePath":"cn/back-end/AI/ollama/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/AI/ollama/快速开始.md"},e=n(`

ollama

启动并运行大型语言模型,不需要编程。官网

  1. 下载并安装 ollama,参考官网

  2. 启动 ollama 服务,首次运行会在本地安装大语言模型。

sh
  ollama run llama3
  1. 在控制台与本地 AI 对话。

ollama-cmd

  1. 使用 nodejs 与 llama3 对话
sh
# 启动ollama
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"ollama","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/快速开始.md","filePath":"cn/back-end/AI/ollama/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/AI/ollama/快速开始.md"},e=n(`

ollama

启动并运行大型语言模型,不需要编程。官网

  1. 下载并安装 ollama,参考官网

  2. 启动 ollama 服务,首次运行会在本地安装大语言模型。

sh
  ollama run llama3
  1. 在控制台与本地 AI 对话。

ollama-cmd

  1. 使用 nodejs 与 llama3 对话
sh
# 启动ollama
 ollama serve
 
 # 安装依赖
diff --git "a/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.lean.js" "b/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.lean.js"
similarity index 86%
rename from "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.lean.js"
rename to "assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.lean.js"
index ee6d1b0..31335fa 100644
--- "a/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.jt46mI5s.lean.js"
+++ "b/assets/cn_back-end_AI_ollama_\345\277\253\351\200\237\345\274\200\345\247\213.md.oYYn0Lka.lean.js"
@@ -1 +1 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"ollama","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/快速开始.md","filePath":"cn/back-end/AI/ollama/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/AI/ollama/快速开始.md"},e=n("",11),p=[e];function t(h,r,k,d,o,c){return i(),a("div",null,p)}const E=s(l,[["render",t]]);export{g as __pageData,E as default};
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"ollama","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/快速开始.md","filePath":"cn/back-end/AI/ollama/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/AI/ollama/快速开始.md"},e=n("",11),p=[e];function t(h,r,k,d,o,c){return i(),a("div",null,p)}const E=s(l,[["render",t]]);export{g as __pageData,E as default};
diff --git "a/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.js" "b/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.js"
similarity index 92%
rename from "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.js"
rename to "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.js"
index 13d98bb..ba951f8 100644
--- "a/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.js"
+++ "b/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.js"
@@ -1 +1 @@
-import{_ as a,N as t,M as s,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"文生图大模型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/文生图大模型.md","filePath":"cn/back-end/AI/ollama/文生图大模型.md","lastUpdated":1719277083000}'),o={name:"cn/back-end/AI/ollama/文生图大模型.md"},c=e("h1",{id:"文生图大模型",tabindex:"-1"},[n("文生图大模型 "),e("a",{class:"header-anchor",href:"#文生图大模型","aria-label":'Permalink to "文生图大模型"'},"​")],-1),d=e("p",null,"stable-diffusion-3 简称 sd3,是 2022 年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像",-1),r=[c,d];function l(_,i,m,p,f,h){return s(),t("div",null,r)}const k=a(o,[["render",l]]);export{b as __pageData,k as default};
+import{_ as a,N as t,M as s,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"文生图大模型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/文生图大模型.md","filePath":"cn/back-end/AI/ollama/文生图大模型.md","lastUpdated":1720682010000}'),o={name:"cn/back-end/AI/ollama/文生图大模型.md"},c=e("h1",{id:"文生图大模型",tabindex:"-1"},[n("文生图大模型 "),e("a",{class:"header-anchor",href:"#文生图大模型","aria-label":'Permalink to "文生图大模型"'},"​")],-1),d=e("p",null,"stable-diffusion-3 简称 sd3,是 2022 年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像",-1),r=[c,d];function l(_,i,m,p,f,h){return s(),t("div",null,r)}const k=a(o,[["render",l]]);export{b as __pageData,k as default};
diff --git "a/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.lean.js" "b/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.lean.js"
similarity index 92%
rename from "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.lean.js"
rename to "assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.lean.js"
index 13d98bb..ba951f8 100644
--- "a/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.FH1Yb-4P.lean.js"
+++ "b/assets/cn_back-end_AI_ollama_\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.md.BYT2v8hW.lean.js"
@@ -1 +1 @@
-import{_ as a,N as t,M as s,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"文生图大模型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/文生图大模型.md","filePath":"cn/back-end/AI/ollama/文生图大模型.md","lastUpdated":1719277083000}'),o={name:"cn/back-end/AI/ollama/文生图大模型.md"},c=e("h1",{id:"文生图大模型",tabindex:"-1"},[n("文生图大模型 "),e("a",{class:"header-anchor",href:"#文生图大模型","aria-label":'Permalink to "文生图大模型"'},"​")],-1),d=e("p",null,"stable-diffusion-3 简称 sd3,是 2022 年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像",-1),r=[c,d];function l(_,i,m,p,f,h){return s(),t("div",null,r)}const k=a(o,[["render",l]]);export{b as __pageData,k as default};
+import{_ as a,N as t,M as s,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"文生图大模型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/AI/ollama/文生图大模型.md","filePath":"cn/back-end/AI/ollama/文生图大模型.md","lastUpdated":1720682010000}'),o={name:"cn/back-end/AI/ollama/文生图大模型.md"},c=e("h1",{id:"文生图大模型",tabindex:"-1"},[n("文生图大模型 "),e("a",{class:"header-anchor",href:"#文生图大模型","aria-label":'Permalink to "文生图大模型"'},"​")],-1),d=e("p",null,"stable-diffusion-3 简称 sd3,是 2022 年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像",-1),r=[c,d];function l(_,i,m,p,f,h){return s(),t("div",null,r)}const k=a(o,[["render",l]]);export{b as __pageData,k as default};
diff --git "a/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.js" "b/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.js"
similarity index 99%
rename from "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.js"
rename to "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.js"
index 9cff140..f92273d 100644
--- "a/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.js"
+++ "b/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"代理开发","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","filePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/java/MyBatis/Mapper代理开发.md"},l=n(`

代理开发

痛点:存在硬编码,没有 IDE 提示、自动补全、代码检查。

代理开发:通过代理类,实现接口,实现接口方法,通过接口方法调用 Mapper 方法。

创建代理接口

src/main/java/com/mx下创建 mappers文件夹,随后在其中创建WebsiteMapper.java

java
// src/main/java/com/mx.pojo 中的 Website.java
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"代理开发","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","filePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/MyBatis/Mapper代理开发.md"},l=n(`

代理开发

痛点:存在硬编码,没有 IDE 提示、自动补全、代码检查。

代理开发:通过代理类,实现接口,实现接口方法,通过接口方法调用 Mapper 方法。

创建代理接口

src/main/java/com/mx下创建 mappers文件夹,随后在其中创建WebsiteMapper.java

java
// src/main/java/com/mx.pojo 中的 Website.java
 package com.mx.pojo;
 
 public class Website {
diff --git "a/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.lean.js" "b/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.lean.js"
similarity index 87%
rename from "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.lean.js"
rename to "assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.lean.js"
index ffa773a..392444f 100644
--- "a/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.BnlHG9kI.lean.js"
+++ "b/assets/cn_back-end_java_MyBatis_Mapper\344\273\243\347\220\206\345\274\200\345\217\221.md.B9lA-DEH.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"代理开发","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","filePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/java/MyBatis/Mapper代理开发.md"},l=n("",16),h=[l];function e(t,k,r,E,d,g){return a(),i("div",null,h)}const b=s(p,[["render",e]]);export{c as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"代理开发","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","filePath":"cn/back-end/java/MyBatis/Mapper代理开发.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/MyBatis/Mapper代理开发.md"},l=n("",16),h=[l];function e(t,k,r,E,d,g){return a(),i("div",null,h)}const b=s(p,[["render",e]]);export{c as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.js" "b/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.js"
similarity index 99%
rename from "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.js"
rename to "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.js"
index 45d609b..125ad96 100644
--- "a/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.js"
+++ "b/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/快速开始.md","filePath":"cn/back-end/java/MyBatis/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/MyBatis/快速开始.md"},p=n(`

快速开始

表现层、业务层、持久层

MyBatis 是一款 ORM 框架,它支持定制化 SQL、存储过程以及高级映射。是一款优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

物料准备

在本地新建mx数据库和表websites,并填充测试数据。

sql

+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/快速开始.md","filePath":"cn/back-end/java/MyBatis/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/MyBatis/快速开始.md"},p=n(`

快速开始

表现层、业务层、持久层

MyBatis 是一款 ORM 框架,它支持定制化 SQL、存储过程以及高级映射。是一款优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

物料准备

在本地新建mx数据库和表websites,并填充测试数据。

sql

 -- 创建数据库
 
 CREATE DATABASE mx DEFAULT CHARACTER SET = 'utf8mb4';
diff --git "a/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.lean.js" "b/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.lean.js"
similarity index 87%
rename from "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.lean.js"
rename to "assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.lean.js"
index 3e18d3d..bf59bfd 100644
--- "a/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.BglxuHnL.lean.js"
+++ "b/assets/cn_back-end_java_MyBatis_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dl0CiA0w.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/快速开始.md","filePath":"cn/back-end/java/MyBatis/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/MyBatis/快速开始.md"},p=n("",29),h=[p];function k(t,e,E,r,d,g){return a(),i("div",null,h)}const F=s(l,[["render",k]]);export{c as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/MyBatis/快速开始.md","filePath":"cn/back-end/java/MyBatis/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/MyBatis/快速开始.md"},p=n("",29),h=[p];function k(t,e,E,r,d,g){return a(),i("div",null,h)}const F=s(l,[["render",k]]);export{c as __pageData,F as default};
diff --git a/assets/cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.js b/assets/cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.js
similarity index 99%
rename from assets/cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.js
rename to assets/cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.js
index 9726ef7..98b4522 100644
--- a/assets/cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.js
+++ b/assets/cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.js
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"restful 和静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/restful.md","filePath":"cn/back-end/java/SpringBoot/restful.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/SpringBoot/restful.md"},p=n(`

restful 和静态资源

相关注解

  • PathVariable 接收前端请求请求 path 中的参数
  • RequestParam 接收前端请求请求参数
  • RequestBody 接收前端请求请求体
  • RequestHeader 接收前端请求请求头
  • CookieValue 接收前端请求 cookie

restful

/src/main/java/com/mx/spring_boot_starter/controllers下新建RestfulController

java

+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"restful 和静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/restful.md","filePath":"cn/back-end/java/SpringBoot/restful.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/SpringBoot/restful.md"},p=n(`

restful 和静态资源

相关注解

  • PathVariable 接收前端请求请求 path 中的参数
  • RequestParam 接收前端请求请求参数
  • RequestBody 接收前端请求请求体
  • RequestHeader 接收前端请求请求头
  • CookieValue 接收前端请求 cookie

restful

/src/main/java/com/mx/spring_boot_starter/controllers下新建RestfulController

java

 package com.mx.spring_boot_starter.controllers;
 
 import java.io.File;
diff --git a/assets/cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.lean.js b/assets/cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.lean.js
similarity index 87%
rename from assets/cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.lean.js
rename to assets/cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.lean.js
index 2b2eb87..cf2b288 100644
--- a/assets/cn_back-end_java_SpringBoot_restful.md.Cm7SD-pm.lean.js
+++ b/assets/cn_back-end_java_SpringBoot_restful.md.XqxFNTkh.lean.js
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"restful 和静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/restful.md","filePath":"cn/back-end/java/SpringBoot/restful.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/SpringBoot/restful.md"},p=n("",18),t=[p];function h(k,e,r,E,d,g){return a(),i("div",null,t)}const c=s(l,[["render",h]]);export{o as __pageData,c as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"restful 和静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/restful.md","filePath":"cn/back-end/java/SpringBoot/restful.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/SpringBoot/restful.md"},p=n("",18),t=[p];function h(k,e,r,E,d,g){return a(),i("div",null,t)}const c=s(l,[["render",h]]);export{o as __pageData,c as default};
diff --git "a/assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.js" "b/assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.js"
new file mode 100644
index 0000000..9ba2793
--- /dev/null
+++ "b/assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.js"
@@ -0,0 +1,101 @@
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"与 mybatis 接口","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/与mybatis结合.md","filePath":"cn/back-end/java/SpringBoot/与mybatis结合.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/与mybatis结合.md"},l=n(`

与 mybatis 接口

步骤:

  1. 添加mybatis-spring-boot-starter依赖
  2. 配置数据库连接信息和mybatis
  3. src/main/java/com/mx/spring_boot_starter/pojo下新建实体类User.java
  4. src/main/java/com/mx/spring_boot_starter/mapper下新建映射类UserMapper.java
  5. src/main/resources/mapper/下新建映射文件UserMapper.xml
  6. src/main/java/com/mx/spring_boot_starter/service下新建业务类UserService.java
  7. src/main/java/com/mx/spring_boot_starter/controller下新建控制类UserController.java
  8. 在启动类SpringBootStarterApplication.java中,添加MapperScan注解
  9. 启动项目,访问http://localhost:8080/user

添加依赖

xml
<dependency>
+  <groupId>org.mybatis.spring.boot</groupId>
+  <artifactId>mybatis-spring-boot-starter</artifactId>
+  <version>3.0.3</version>
+</dependency>
+
+<dependency>
+  <groupId>org.projectlombok</groupId>
+  <artifactId>lombok</artifactId>
+  <version>1.18.32</version>
+</dependency>

配置数据库连接信息和mybatis

yml
spring:
+  application:
+    name: spring-boot-starter-web-demo # 应用名称
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource # 使用Hikari连接池
+    driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动
+    url: jdbc:mysql://localhost:3306/mx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai # 数据库连接地址
+    username: root
+    password: 123456
+
+mybatis:
+  type-aliases-package: com.mx.spring_boot_starter.pojo # 扫描实体类
+  mapper-locations: classpath:mapper/*.xml # 扫描映射文件

新建实体类User.java

java
package com.mx.spring_boot_starter.pojo;
+
+import lombok.Data;
+
+@Data
+public class User {
+  private int id;
+  private String username;
+  private String email;
+  private String password;
+  private int age;
+  private String gender;
+  private boolean is_active;
+  private int department_id;
+}

新建映射类UserMapper.java

java
package com.mx.spring_boot_starter.mapper;
+
+import com.mx.spring_boot_starter.pojo.User;
+import java.util.List;
+
+public interface UserMapper {
+
+  List<User> getAll();
+}

新建映射文件UserMapper.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mx.spring_boot_starter.mapper.UserMapper">
+  <select id="getAll" resultType="User"> select * from user </select>
+</mapper>

业务类UserService.java

java
package com.mx.spring_boot_starter.service;
+
+import com.mx.spring_boot_starter.mapper.UserMapper;
+import com.mx.spring_boot_starter.pojo.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.*;
+
+@Service
+public class UserService {
+
+  @Autowired
+  private UserMapper userMapper;
+
+  public List<User> getAll() {
+
+    return userMapper.getAll();
+  }
+}

新建控制类UserController.java

java
package com.mx.spring_boot_starter.controllers;
+
+import com.mx.spring_boot_starter.pojo.User;
+import com.mx.spring_boot_starter.services.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.util.*;
+
+@RestController
+public class UserController {
+
+  @Autowired
+  private UserService userService;
+
+  @GetMapping("/user")
+  public List<User> getAll() {
+    return userService.getAll();
+  }
+}

添加MapperScan注解

java
package com.mx.spring_boot_starter;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+// 表明当前项目为SpringBoot项目, 启动类, 启动SpringBoot项目
+@SpringBootApplication
+@MapperScan("com.mx.spring_boot_starter.mapper") // 扫描mapper
+public class SpringBootStarterApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(SpringBootStarterApplication.class, args);
+	}
+
+}

访问

`,20),e=[l];function t(r,h,k,E,d,c){return i(),a("div",null,e)}const b=s(p,[["render",t]]);export{o as __pageData,b as default}; diff --git "a/assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.lean.js" "b/assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.lean.js" new file mode 100644 index 0000000..9001dc5 --- /dev/null +++ "b/assets/cn_back-end_java_SpringBoot_\344\270\216mybatis\347\273\223\345\220\210.md.BghR1Sl_.lean.js" @@ -0,0 +1 @@ +import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"与 mybatis 接口","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/与mybatis结合.md","filePath":"cn/back-end/java/SpringBoot/与mybatis结合.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/与mybatis结合.md"},l=n("",20),e=[l];function t(r,h,k,E,d,c){return i(),a("div",null,e)}const b=s(p,[["render",t]]);export{o as __pageData,b as default}; diff --git "a/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.js" "b/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.js" similarity index 99% rename from "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.js" rename to "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.js" index a8e7047..98214e7 100644 --- "a/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.js" +++ "b/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.js" @@ -1,4 +1,4 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"依赖注入和控制反转","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","filePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/java/SpringBoot/依赖注入和控制反转.md"},l=n(`

依赖注入和控制反转

控制反转(Inversion of Control,简称 IoC)
依赖注入(Dependency Injection, DI)

IoC 是通过依赖注入(Dependency Injection, DI)来实现的。在传统编程中,应用程序负责创建和管理对象的生命周期,这会导致代码之间的紧密耦合。IoC 则将这种控制权交给了容器(如 Spring 容器),由容器负责创建、管理和注入对象。

控制反转意味着对象的创建和依赖关系由容器管理,而不是由应用程序代码直接管理。也就是说,应用程序将控制权“反转”给了 Spring 容器。

在配置类中创建注入类

定义注入类

java
// src/main/java/com/mx/spring_boot_starter/Stu.java
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"依赖注入和控制反转","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","filePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/依赖注入和控制反转.md"},l=n(`

依赖注入和控制反转

控制反转(Inversion of Control,简称 IoC)
依赖注入(Dependency Injection, DI)

IoC 是通过依赖注入(Dependency Injection, DI)来实现的。在传统编程中,应用程序负责创建和管理对象的生命周期,这会导致代码之间的紧密耦合。IoC 则将这种控制权交给了容器(如 Spring 容器),由容器负责创建、管理和注入对象。

控制反转意味着对象的创建和依赖关系由容器管理,而不是由应用程序代码直接管理。也就是说,应用程序将控制权“反转”给了 Spring 容器。

在配置类中创建注入类

定义注入类

java
// src/main/java/com/mx/spring_boot_starter/Stu.java
 package com.mx.spring_boot_starter;
 
 public class Stu {
diff --git "a/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.lean.js" "b/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.lean.js"
similarity index 88%
rename from "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.lean.js"
rename to "assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.lean.js"
index 563618c..40f110c 100644
--- "a/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C_95ueQm.lean.js"
+++ "b/assets/cn_back-end_java_SpringBoot_\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.md.C3ctmyRO.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"依赖注入和控制反转","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","filePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/java/SpringBoot/依赖注入和控制反转.md"},l=n("",24),e=[l];function h(t,k,r,E,d,g){return a(),i("div",null,e)}const o=s(p,[["render",h]]);export{b as __pageData,o as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"依赖注入和控制反转","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","filePath":"cn/back-end/java/SpringBoot/依赖注入和控制反转.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/依赖注入和控制反转.md"},l=n("",24),e=[l];function h(t,k,r,E,d,g){return a(),i("div",null,e)}const o=s(p,[["render",h]]);export{b as __pageData,o as default};
diff --git "a/assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.js" "b/assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.js"
new file mode 100644
index 0000000..54d68cf
--- /dev/null
+++ "b/assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.js"
@@ -0,0 +1,116 @@
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"异常处理和拦截器","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/异常处理和拦截器.md","filePath":"cn/back-end/java/SpringBoot/异常处理和拦截器.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/异常处理和拦截器.md"},l=n(`

异常处理和拦截器

异常处理

设置文件请求限制

application.properties 中设置

spring.servlet.multipart.max-file-size=50KB # 单文件最大大小
spring.servlet.multipart.max-request-size=50KB # 请求最大大小

统一异常拦截处理

  • ControllerAdvice 捕获所有异常

在工程中新建 GraceExceptionHandler 类,并使用 @ControllerAdvice 注解。

java
package com.mx.spring_boot_starter;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+
+import java.util.Map;
+import java.util.HashMap;
+
+@ControllerAdvice
+public class GraceExceptionHandler {
+  @ExceptionHandler(MaxUploadSizeExceededException.class)
+  @ResponseBody
+  public Map<String, Object> handleException(MaxUploadSizeExceededException e) {
+    Map<String, Object> map = new HashMap<String, Object>();
+    map.put("code", 400);
+    map.put("status", "文件太大了");
+    return map;
+  }
+}

测试

上传一张大于50KB的文件。

测试结果

拦截器

新建拦截器配置文件

在项目目录下新建 configs 目录,新建 InterceptorConfig.java 文件。

java
package com.mx.spring_boot_starter.configs;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import com.mx.spring_boot_starter.interceptors.UserInfoInterceptor;
+
+@Configuration  // 注解,spring boot 扫描到这个注解会把配置加到容器。
+public class InterceptorConfig implements WebMvcConfigurer {
+  @Bean
+  public UserInfoInterceptor userInfoInterceptor() {
+    return new UserInfoInterceptor();
+  }
+
+  @Override
+  public void addInterceptors(InterceptorRegistry registry) {
+    registry.addInterceptor(userInfoInterceptor()).addPathPatterns("/restful/upload");  // 给\`restful/upload\`添加拦截器
+\`
+  }
+}

新建拦截器类

在项目文件中新建 interceptors 目录,新建 UserInfoInterceptor.java 类。

java
package com.mx.spring_boot_starter.interceptors;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import io.micrometer.common.util.StringUtils;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class UserInfoInterceptor implements HandlerInterceptor {
+
+  @Override
+  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+    // TODO Auto-generated method stub
+    String token = request.getHeader("token");
+    if (StringUtils.isEmpty(token)) {
+      log.info("用户token为空");
+      return false;
+    }
+    if (!token.equalsIgnoreCase("asdf")) {
+      log.info("用户权限不正确");
+      return false;
+    }
+    return true;
+  }
+}

测试

当请求restful/upload 不带 token 头,或者token 值不正确时,会拦截。

实战

在拦截器中抛出运行时异常,并在统一异常捕获器中返回异常结果给前端。

java
// UserInfoInterceptor.java
+package com.mx.spring_boot_starter.interceptors;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import io.micrometer.common.util.StringUtils;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class UserInfoInterceptor implements HandlerInterceptor {
+
+  @Override
+  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+    // TODO Auto-generated method stub
+    String token = request.getHeader("token");
+    if (StringUtils.isEmpty(token)) {
+      log.info("用户token为空");
+      throw new RuntimeException("用户token为空");
+    }
+    if (!token.equalsIgnoreCase("asdf")) {
+      log.info("用户权限不正确");
+      throw new RuntimeException("用户权限不正确");
+    }
+    return HandlerInterceptor.super.preHandle(request, response, handler);
+  }
+}
java
// GraceExceptionHandler.java
+package com.mx.spring_boot_starter.exceptions;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+
+import java.util.Map;
+import java.util.HashMap;
+
+@ControllerAdvice
+public class GraceExceptionHandler {
+  @ExceptionHandler(RuntimeException.class)
+  @ResponseBody
+  public Map<String, Object> handleException(RuntimeException e) {
+    Map<String, Object> map = new HashMap<String, Object>();
+    map.put("status", 500);
+    map.put("msg", e.getMessage());
+    return map;
+  }
+}
`,25),e=[l];function t(h,k,r,E,d,g){return a(),i("div",null,e)}const y=s(p,[["render",t]]);export{o as __pageData,y as default}; diff --git "a/assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.lean.js" "b/assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.lean.js" new file mode 100644 index 0000000..b7cfb0f --- /dev/null +++ "b/assets/cn_back-end_java_SpringBoot_\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.md.Cq6iAK7T.lean.js" @@ -0,0 +1 @@ +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"异常处理和拦截器","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/异常处理和拦截器.md","filePath":"cn/back-end/java/SpringBoot/异常处理和拦截器.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/异常处理和拦截器.md"},l=n("",25),e=[l];function t(h,k,r,E,d,g){return a(),i("div",null,e)}const y=s(p,[["render",t]]);export{o as __pageData,y as default}; diff --git "a/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.js" "b/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.js" similarity index 99% rename from "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.js" rename to "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.js" index 71e13dc..e5fa8ae 100644 --- "a/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.js" +++ "b/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.js" @@ -1,4 +1,4 @@ -import{_ as a,N as s,M as i,aF as p}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"在 vscode 搭建 SpringBoot 开发环境","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/快速开始.md","filePath":"cn/back-end/java/SpringBoot/快速开始.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/java/SpringBoot/快速开始.md"},n=p(`

在 vscode 搭建 SpringBoot 开发环境

参考

事先准备

安装插件

在 vscode 插件市场中安装以下插件

  • Extension Pack for Java
  • Spring Boot Extension Pack

创建 spring boot 项目

ctrl+shift+p 打开命令面板,输入 spring boot,选择 java: 创建java项目,创建 java 项目

img

选择 spring boot

img

选择 maven project

img

选择 spring boot 版本

img

选语言

img

输入 group id,这里我用的默认 com.example

img

输入 artifact id,这里我用的默认 demo

img

指定打包类型

img

指定 JDK 版本

img

选需要的依赖

img

随后选择文件夹存放项目,创建成功后 vscode 会提示打开项目

img

测试

src/main/java/com/example/demo/下创建类

img

录入类名

img

写入类代码

java
package com.example.demo.controller;
+import{_ as a,N as s,M as i,aF as p}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"在 vscode 搭建 SpringBoot 开发环境","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/快速开始.md","filePath":"cn/back-end/java/SpringBoot/快速开始.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/java/SpringBoot/快速开始.md"},n=p(`

在 vscode 搭建 SpringBoot 开发环境

参考

事先准备

安装插件

在 vscode 插件市场中安装以下插件

  • Extension Pack for Java
  • Spring Boot Extension Pack

创建 spring boot 项目

ctrl+shift+p 打开命令面板,输入 spring boot,选择 java: 创建java项目,创建 java 项目

img

选择 spring boot

img

选择 maven project

img

选择 spring boot 版本

img

选语言

img

输入 group id,这里我用的默认 com.example

img

输入 artifact id,这里我用的默认 demo

img

指定打包类型

img

指定 JDK 版本

img

选需要的依赖

img

随后选择文件夹存放项目,创建成功后 vscode 会提示打开项目

img

测试

src/main/java/com/example/demo/下创建类

img

录入类名

img

写入类代码

java
package com.example.demo.controller;
 
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
diff --git "a/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.lean.js" "b/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.lean.js"
similarity index 87%
rename from "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.lean.js"
rename to "assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.lean.js"
index 8dd86d5..7f926f0 100644
--- "a/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.D7pVD-NV.lean.js"
+++ "b/assets/cn_back-end_java_SpringBoot_\345\277\253\351\200\237\345\274\200\345\247\213.md.DP6PVNWw.lean.js"
@@ -1 +1 @@
-import{_ as a,N as s,M as i,aF as p}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"在 vscode 搭建 SpringBoot 开发环境","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/快速开始.md","filePath":"cn/back-end/java/SpringBoot/快速开始.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/java/SpringBoot/快速开始.md"},n=p("",45),t=[n];function o(r,l,g,h,c,d){return i(),s("div",null,t)}const m=a(e,[["render",o]]);export{b as __pageData,m as default};
+import{_ as a,N as s,M as i,aF as p}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"在 vscode 搭建 SpringBoot 开发环境","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/快速开始.md","filePath":"cn/back-end/java/SpringBoot/快速开始.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/java/SpringBoot/快速开始.md"},n=p("",45),t=[n];function o(r,l,g,h,c,d){return i(),s("div",null,t)}const m=a(e,[["render",o]]);export{b as __pageData,m as default};
diff --git "a/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.js" "b/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.js"
similarity index 98%
rename from "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.js"
rename to "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.js"
index 6483a5d..5bda324 100644
--- "a/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.js"
+++ "b/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"自定义配置和表达式","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","filePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/java/SpringBoot/自定义配置和表达式.md"},t=n(`

自定义配置和表达式

在 applacation.properties 中配置新建自定义字段

properties
spring.application.name=spring-boot-starter
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"自定义配置和表达式","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","filePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/java/SpringBoot/自定义配置和表达式.md"},t=n(`

自定义配置和表达式

在 applacation.properties 中配置新建自定义字段

properties
spring.application.name=spring-boot-starter
 my.config.a = 123 # 自定义的属性

使用

java
  @Value("\${my.config.a}")
   private String a;
 
diff --git "a/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.lean.js" "b/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.lean.js"
similarity index 88%
rename from "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.lean.js"
rename to "assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.lean.js"
index 7f48e35..6de16ac 100644
--- "a/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.DnYxt3wX.lean.js"
+++ "b/assets/cn_back-end_java_SpringBoot_\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.md.BZp7IVw9.lean.js"
@@ -1 +1 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"自定义配置和表达式","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","filePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/java/SpringBoot/自定义配置和表达式.md"},t=n("",7),p=[t];function l(r,h,k,o,d,c){return i(),a("div",null,p)}const b=s(e,[["render",l]]);export{g as __pageData,b as default};
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"自定义配置和表达式","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","filePath":"cn/back-end/java/SpringBoot/自定义配置和表达式.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/java/SpringBoot/自定义配置和表达式.md"},t=n("",7),p=[t];function l(r,h,k,o,d,c){return i(),a("div",null,p)}const b=s(e,[["render",l]]);export{g as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.js" "b/assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.js"
new file mode 100644
index 0000000..544d7c2
--- /dev/null
+++ "b/assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.js"
@@ -0,0 +1,97 @@
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"访问 MySQL 数据库","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/访问MySQL数据.md","filePath":"cn/back-end/java/SpringBoot/访问MySQL数据.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/访问MySQL数据.md"},l=n(`

访问 MySQL 数据库

本文介绍如何使用spring-data-spa访问MySQL数据库。 参考

安装依赖

xml
<!-- 数据库连接器,spring boot3.x 以上用 mysql-connector-j -->
+<dependency>
+  <groupId>com.mysql</groupId>
+  <artifactId>mysql-connector-j</artifactId>
+  <scope>runtime</scope>
+</dependency>
+<dependency>
+  <groupId>org.springframework.boot</groupId>
+  <artifactId>spring-boot-starter-data-jpa</artifactId>
+</dependency>

配置数据库

在 application.properties 中配置数据库连接信息。

properties
spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:mysql://localhost:3306/mx
+spring.datasource.username=root
+spring.datasource.password=123456
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.jpa.show-sql: true

新建实体类

插入数据后,Hibernate 会自动将实体转换为表。

java
package com.example.accessingdatamysql;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
+@Entity // Hibernate会自动将实体转换为表。
+public class User {
+	@Id
+	@GeneratedValue(strategy=GenerationType.AUTO)
+	private Integer id;
+
+	private String name;
+
+	private String email;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+}

新建 Repository

Spring 在具有相同名称的 bean 中自动实现此存储库接口。

java
package com.example.accessingdatamysql;
+
+import org.springframework.data.repository.CrudRepository;
+
+import com.example.accessingdatamysql.User;
+
+// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
+// CRUD refers Create, Read, Update, Delete
+
+public interface UserRepository extends CrudRepository<User, Integer> {
+
+}

新建 Controller

java
package com.example.accessingdatamysql;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(path = "/demo")
+public class MainController {
+	@Autowired // This means to get the bean called userRepository
+	// Which is auto-generated by Spring, we will use it to handle the data
+	private UserRepository userRepository;
+
+	@PostMapping(path = "/add")
+	public String addNewUser(@RequestParam String name, @RequestParam String email) {
+
+		User n = new User();
+		n.setName(name);
+		n.setEmail(email);
+		userRepository.save(n);
+		return "Saved";
+	}
+
+	@GetMapping(path = "/all")
+	public Iterable<User> getAllUsers() {
+		// This returns a JSON or XML with the users
+		return userRepository.findAll();
+	}
+}
`,15),e=[l];function t(h,k,r,E,d,g){return a(),i("div",null,e)}const b=s(p,[["render",t]]);export{y as __pageData,b as default}; diff --git "a/assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.lean.js" "b/assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.lean.js" new file mode 100644 index 0000000..0481cda --- /dev/null +++ "b/assets/cn_back-end_java_SpringBoot_\350\256\277\351\227\256MySQL\346\225\260\346\215\256.md.DYxRo87T.lean.js" @@ -0,0 +1 @@ +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"访问 MySQL 数据库","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/SpringBoot/访问MySQL数据.md","filePath":"cn/back-end/java/SpringBoot/访问MySQL数据.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/SpringBoot/访问MySQL数据.md"},l=n("",15),e=[l];function t(h,k,r,E,d,g){return a(),i("div",null,e)}const b=s(p,[["render",t]]);export{y as __pageData,b as default}; diff --git "a/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.js" "b/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.js" similarity index 99% rename from "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.js" rename to "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.js" index a65e687..53a6bea 100644 --- "a/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.js" +++ "b/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.js" @@ -1,4 +1,4 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"stream","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/stream,文件和IO.md","filePath":"cn/back-end/java/stream,文件和IO.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/stream,文件和IO.md"},p=n(`

stream

控制台输入

  1. 使用 scanner
java
import java.util.Scanner;
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"stream","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/stream,文件和IO.md","filePath":"cn/back-end/java/stream,文件和IO.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/stream,文件和IO.md"},p=n(`

stream

控制台输入

  1. 使用 scanner
java
import java.util.Scanner;
 
 public class ScannerTest {
   public static void main(String[] args) {
diff --git "a/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.lean.js" "b/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.lean.js"
similarity index 86%
rename from "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.lean.js"
rename to "assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.lean.js"
index 04b33be..b308a63 100644
--- "a/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.C35Ih-S-.lean.js"
+++ "b/assets/cn_back-end_java_stream\357\274\214\346\226\207\344\273\266\345\222\214IO.md.Dc5_z6y9.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"stream","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/stream,文件和IO.md","filePath":"cn/back-end/java/stream,文件和IO.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/stream,文件和IO.md"},p=n("",16),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"stream","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/stream,文件和IO.md","filePath":"cn/back-end/java/stream,文件和IO.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/stream,文件和IO.md"},p=n("",16),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.js" "b/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.js"
similarity index 99%
rename from "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.js"
rename to "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.js"
index fb1d25e..4a186bf 100644
--- "a/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.js"
+++ "b/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"vscode 开发 java","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/vscode开发java.md","filePath":"cn/back-end/java/vscode开发java.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/vscode开发java.md"},p=n(`

vscode 开发 java

熟悉前端的朋友都比较熟悉 vscode,vscode 是一个轻量级的 IDE,可以支持 java 开发。 利用 vscode 的强大功能,Java 开发人员可以获得一个出色的工具,既可以快速编辑代码,又可以进行完整的调试和测试周期。

官方文档 overview

安装插件

打开 vscode 搜索extension pack for java,这个插件是 vscode 开发 java 扩展包的集合,其中包括:

  • Language Support for Java™ by Red Hat
  • Debugger for Java
  • Test Runner for Java
  • Maven for Java
  • Project Manager for Java
  • Visual Studio IntelliCode

在 vscode ctrl+shift+p,搜索:java: extensions guide 可以查看到已经安装的插件。

img

img

安装 jdk

如果系统中未安装 JDK 可以选择用 extension pack for java 插件去安装。在 vscode ctrl+shift+p,搜索:java: install new jdkimg

创建工程

在 vscode ctrl+shift+p,搜索:java: create java project,插件会询问我们选择什么打包工具,这里先选择不使用打包工具。 img

然后插件会让选择一个文件夹,然后会询问我们 java 工程的名字,我们输入my-java-app。随后 vscode 会自动打开这个工程。

img

运行

img

debug

点击 run 旁边的 debug 按钮

img

手动导入 jar 包

mysql-connector-j-8.4.0为例

下载mysql-connector-j-8.4.0.tar.gz

img

解压后将mysql-connector-j-8.4.0.jar 文件复制到工程中的lib目录下,可以看到 JAVA PROJECTS中的Referenced Libraries中多了一个mysql-connector-j-8.4.0.jar,表明导入成功。

img

使用 maven 工具构建项目

先决条件:系统中需有 maven 工具,如果没有,可以参考maven下载安装。下载压缩文件后解压,并添加到系统环境变量中。

查看系统中是否有 maven 工具:mvn -v

img

安装依赖 img

写代码测试:

java
package com.mx;
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"vscode 开发 java","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/vscode开发java.md","filePath":"cn/back-end/java/vscode开发java.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/vscode开发java.md"},p=n(`

vscode 开发 java

熟悉前端的朋友都比较熟悉 vscode,vscode 是一个轻量级的 IDE,可以支持 java 开发。 利用 vscode 的强大功能,Java 开发人员可以获得一个出色的工具,既可以快速编辑代码,又可以进行完整的调试和测试周期。

官方文档 overview

安装插件

打开 vscode 搜索extension pack for java,这个插件是 vscode 开发 java 扩展包的集合,其中包括:

  • Language Support for Java™ by Red Hat
  • Debugger for Java
  • Test Runner for Java
  • Maven for Java
  • Project Manager for Java
  • Visual Studio IntelliCode

在 vscode ctrl+shift+p,搜索:java: extensions guide 可以查看到已经安装的插件。

img

img

安装 jdk

如果系统中未安装 JDK 可以选择用 extension pack for java 插件去安装。在 vscode ctrl+shift+p,搜索:java: install new jdkimg

创建工程

在 vscode ctrl+shift+p,搜索:java: create java project,插件会询问我们选择什么打包工具,这里先选择不使用打包工具。 img

然后插件会让选择一个文件夹,然后会询问我们 java 工程的名字,我们输入my-java-app。随后 vscode 会自动打开这个工程。

img

运行

img

debug

点击 run 旁边的 debug 按钮

img

手动导入 jar 包

mysql-connector-j-8.4.0为例

下载mysql-connector-j-8.4.0.tar.gz

img

解压后将mysql-connector-j-8.4.0.jar 文件复制到工程中的lib目录下,可以看到 JAVA PROJECTS中的Referenced Libraries中多了一个mysql-connector-j-8.4.0.jar,表明导入成功。

img

使用 maven 工具构建项目

先决条件:系统中需有 maven 工具,如果没有,可以参考maven下载安装。下载压缩文件后解压,并添加到系统环境变量中。

查看系统中是否有 maven 工具:mvn -v

img

安装依赖 img

写代码测试:

java
package com.mx;
 
 import java.sql.*;
 
diff --git "a/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.lean.js" "b/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.lean.js"
similarity index 86%
rename from "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.lean.js"
rename to "assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.lean.js"
index 0b7d2ce..ab87fad 100644
--- "a/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.BaurqQkP.lean.js"
+++ "b/assets/cn_back-end_java_vscode\345\274\200\345\217\221java.md.5kW7XnHu.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"vscode 开发 java","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/vscode开发java.md","filePath":"cn/back-end/java/vscode开发java.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/vscode开发java.md"},p=n("",35),e=[p];function t(h,k,r,E,d,c){return a(),i("div",null,e)}const y=s(l,[["render",t]]);export{o as __pageData,y as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"vscode 开发 java","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/vscode开发java.md","filePath":"cn/back-end/java/vscode开发java.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/vscode开发java.md"},p=n("",35),e=[p];function t(h,k,r,E,d,c){return a(),i("div",null,e)}const y=s(l,[["render",t]]);export{o as __pageData,y as default};
diff --git "a/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.js" "b/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.js"
similarity index 95%
rename from "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.js"
rename to "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.js"
index 094194c..01cf673 100644
--- "a/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.js"
+++ "b/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"循环、条件和 switch","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/while、for、if和switch.md","filePath":"cn/back-end/java/while、for、if和switch.md","lastUpdated":1719277083000}'),t={name:"cn/back-end/java/while、for、if和switch.md"},e=n(`

循环、条件和 switch

逻辑与 js 语法大致相同。

循环

Java 提供了增强的 for 循环,用于迭代数组和集合:

java
int[] numbers = {1, 2, 3, 4, 5};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"循环、条件和 switch","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/while、for、if和switch.md","filePath":"cn/back-end/java/while、for、if和switch.md","lastUpdated":1720682010000}'),t={name:"cn/back-end/java/while、for、if和switch.md"},e=n(`

循环、条件和 switch

逻辑与 js 语法大致相同。

循环

Java 提供了增强的 for 循环,用于迭代数组和集合:

java
int[] numbers = {1, 2, 3, 4, 5};
 for (int number : numbers) {
     System.out.println(number);
 }
`,5),h=[e];function l(p,k,r,d,c,E){return a(),i("div",null,h)}const _=s(t,[["render",l]]);export{g as __pageData,_ as default}; diff --git "a/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.lean.js" "b/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.lean.js" similarity index 75% rename from "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.lean.js" rename to "assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.lean.js" index b035b24..57dc5b5 100644 --- "a/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.9iBJG72r.lean.js" +++ "b/assets/cn_back-end_java_while\343\200\201for\343\200\201if\345\222\214switch.md.D_b_O2An.lean.js" @@ -1 +1 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"循环、条件和 switch","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/while、for、if和switch.md","filePath":"cn/back-end/java/while、for、if和switch.md","lastUpdated":1719277083000}'),t={name:"cn/back-end/java/while、for、if和switch.md"},e=n("",5),h=[e];function l(p,k,r,d,c,E){return a(),i("div",null,h)}const _=s(t,[["render",l]]);export{g as __pageData,_ as default}; +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"循环、条件和 switch","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/while、for、if和switch.md","filePath":"cn/back-end/java/while、for、if和switch.md","lastUpdated":1720682010000}'),t={name:"cn/back-end/java/while、for、if和switch.md"},e=n("",5),h=[e];function l(p,k,r,d,c,E){return a(),i("div",null,h)}const _=s(t,[["render",l]]);export{g as __pageData,_ as default}; diff --git "a/assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.js" "b/assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.js" similarity index 99% rename from "assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.js" rename to "assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.js" index 768501a..51c7655 100644 --- "a/assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.js" +++ "b/assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.js" @@ -1,4 +1,4 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/变量.md","filePath":"cn/back-end/java/变量.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/变量.md"},e=n(`

变量

所有的变量在使用前必须先声明。

java
int a, b, c;  // 声明三个变量
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/变量.md","filePath":"cn/back-end/java/变量.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/变量.md"},e=n(`

变量

所有的变量在使用前必须先声明。

java
int a, b, c;  // 声明三个变量
 int d=3, e=4, f=5; // 声明三个变量并初始化

参数变量

如果参数变量是值传递,传递的是实际参数的副本,而不是变量的地址。当修改副本时,不会影响原来的变量。

如果参数变量是引用传递,传递的是变量的地址,而不是变量的值。当修改变量时,会影响原来的变量。

规则与 js 一致。

局部变量

局部变量的生命周期从声明时开始,到方法、构造方法或代码块执行结束时终止。之后将被垃圾回收。

必须先初始化,java 不会为局部变量分配默认值。

成员变量

对象被实例化后,每个成员变量的值就跟着确定了。

有默认值。

一般情况下把成员变量声明为 private,然后提供 getter 和 setter 方法。

在静态方法以及其他类中,使用完全限定名:ObjectReference.memberName,来访问。

类变量(静态变量)

Java 中的静态变量是指在类中定义的变量,它与类相关而不是与实例相关,即无论创建多少个类实例,静态变量在内存中只有一份拷贝,被所有实例共享。

静态变量在类加载时被创建,在整个程序运行期间都存在。

静态变量的线程安全性【TO DO】

修饰符

参考

访问修饰符

  • pakcage-private (默认) 类、方法或变量仅对同一个包中的其他类可见。包外的类无法访问。
  • public 类、方法或变量对同一个包中的其他类和包外的类都可见。
  • private 类、方法或变量仅对同一个类可见。
  • protected 类、方法或变量对同一个包中的其他类和包外的类都可见,对子类可见。
修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYYN
package-privateYYYNN
privateYNNNN

注意:

  • main 必须是 public
  • private 的成员变量,只能提供 getter 和 setter 方法来访问
  • 接口及接口的成员变量和成员方法不能申明为 protected

非访问修饰符

static

  • 静态变量是类变量,不是实例变量,无论创建多少个实例,静态变量在内存中只有一份拷贝,被所有实例共享。
  • 静态方法只能访问静态变量,不能访问实例变量。

final

  • final 修饰的变量不能被修改,必须显示初始化。
  • final 方法不能被重写。
  • final 类不能被继承。

abstract

  • 抽象类不能被实例化,唯一目的是将来对该类进行扩充。
  • 一个类不能同时被 abstractfinal 修饰。
  • 如果一个类包含抽象方法,则该类必须声明为抽象类。
  • 抽象方法必须被子类重写。
  • 抽象方法不能声明成 finalstatic

synchronized (同步的)

  • 同步方法只能被同一时刻一个线程访问,其他线程等待。

transient (临时的)

在 Java 中,transient 关键字用于修饰那些不希望被序列化的字段。序列化是将对象的状态转换成字节流的过程,以便将对象存储到文件中或者通过网络传输。当一个对象被序列化时,所有的非 transient 字段都会被序列化并存储,而 transient 字段则会被忽略,不会保存它们的值。

使用 transient 的场景

以下是一些常见的使用 transient 关键字的场景:

  1. 敏感数据:例如密码或其他敏感信息,不希望这些信息在序列化过程中被保存下来。
  2. 派生数据:一些字段可以通过其他字段计算得出,不需要保存这些字段的值,只需在反序列化后重新计算即可。
  3. 大数据字段:有些字段包含大量数据,不需要保存这些数据,只需在需要时重新生成这些数据。

示例

下面是一个简单的示例,展示如何使用 transient 关键字:

java
import java.io.*;
 
 class User implements Serializable {
diff --git "a/assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.lean.js" "b/assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.lean.js"
similarity index 85%
rename from "assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.lean.js"
rename to "assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.lean.js"
index a4f2279..4dda252 100644
--- "a/assets/cn_back-end_java_\345\217\230\351\207\217.md.yjV7c7xM.lean.js"
+++ "b/assets/cn_back-end_java_\345\217\230\351\207\217.md.BB1KqJGM.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/变量.md","filePath":"cn/back-end/java/变量.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/变量.md"},e=n("",52),t=[e];function p(h,r,k,d,o,c){return a(),i("div",null,t)}const u=s(l,[["render",p]]);export{g as __pageData,u as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/变量.md","filePath":"cn/back-end/java/变量.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/变量.md"},e=n("",52),t=[e];function p(h,r,k,d,o,c){return a(),i("div",null,t)}const u=s(l,[["render",p]]);export{g as __pageData,u as default};
diff --git "a/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.js" "b/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.js"
similarity index 98%
rename from "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.js"
rename to "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.js"
index ec9b1cd..ddf39b2 100644
--- "a/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.js"
+++ "b/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.js"
@@ -1,4 +1,4 @@
-import{_ as a,N as i,M as s,aF as e}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"基本数据类型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/基本数据类型.md","filePath":"cn/back-end/java/基本数据类型.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/基本数据类型.md"},n=e(`

基本数据类型

内置数据类型和引用数据类型。char 赋值用单引号,String 赋值用双引号。

内置数据类型

  1. byte 8 位,有符号。-128 ~ 127。
  2. short 16 位,有符号。-32768 ~ 32767。
  3. int 32 位,有符号。-2147483648 ~ 2147483647。
  4. long 64 位,有符号。-9223372036854775808 ~ 9223372036854775807。默认值:0L。
  5. float 32 位,有符号,单精度。1 符号位,8 位的指数,23 位的精度。默认值:0.0f。
  6. double 64 位,有符号,双精度。1 符号位,11 位的指数,52 位的精度。默认值:0.0d。
  7. char 16 位,无符号,字符。65535。默认值:'\\u0000'。
  8. boolean 1 位,布尔值。true 或 false。默认值:false。

引用数据类型

  1. String 字符串。
  2. 数组。
  3. 对象。

常量

常量用大写变量命名,使用 final 修饰。

java
final int MAX_NUM = 100;
+import{_ as a,N as i,M as s,aF as e}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"基本数据类型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/基本数据类型.md","filePath":"cn/back-end/java/基本数据类型.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/基本数据类型.md"},n=e(`

基本数据类型

内置数据类型和引用数据类型。char 赋值用单引号,String 赋值用双引号。

内置数据类型

  1. byte 8 位,有符号。-128 ~ 127。
  2. short 16 位,有符号。-32768 ~ 32767。
  3. int 32 位,有符号。-2147483648 ~ 2147483647。
  4. long 64 位,有符号。-9223372036854775808 ~ 9223372036854775807。默认值:0L。
  5. float 32 位,有符号,单精度。1 符号位,8 位的指数,23 位的精度。默认值:0.0f。
  6. double 64 位,有符号,双精度。1 符号位,11 位的指数,52 位的精度。默认值:0.0d。
  7. char 16 位,无符号,字符。65535。默认值:'\\u0000'。
  8. boolean 1 位,布尔值。true 或 false。默认值:false。

引用数据类型

  1. String 字符串。
  2. 数组。
  3. 对象。

常量

常量用大写变量命名,使用 final 修饰。

java
final int MAX_NUM = 100;
 final double PI = 3.14;
 
 int octal = 010;  // 八进制 前缀0
diff --git "a/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.lean.js" "b/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.lean.js"
similarity index 87%
rename from "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.lean.js"
rename to "assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.lean.js"
index 406f979..8781a5c 100644
--- "a/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.BCZbyXtM.lean.js"
+++ "b/assets/cn_back-end_java_\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md.C3ic3dTu.lean.js"
@@ -1 +1 @@
-import{_ as a,N as i,M as s,aF as e}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"基本数据类型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/基本数据类型.md","filePath":"cn/back-end/java/基本数据类型.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/基本数据类型.md"},n=e("",12),t=[n];function h(p,d,r,o,k,c){return s(),i("div",null,t)}const E=a(l,[["render",h]]);export{g as __pageData,E as default};
+import{_ as a,N as i,M as s,aF as e}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"基本数据类型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/基本数据类型.md","filePath":"cn/back-end/java/基本数据类型.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/基本数据类型.md"},n=e("",12),t=[n];function h(p,d,r,o,k,c){return s(),i("div",null,t)}const E=a(l,[["render",h]]);export{g as __pageData,E as default};
diff --git "a/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.js" "b/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.js"
similarity index 95%
rename from "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.js"
rename to "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.js"
index 4586a16..5bc79c9 100644
--- "a/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.js"
+++ "b/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.js"
@@ -1 +1 @@
-import{_ as e,N as a,M as t,aF as r}from"./chunks/framework.wLg4U0bT.js";const S=JSON.parse('{"title":"字符串","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/字符串.md","filePath":"cn/back-end/java/字符串.md","lastUpdated":1719277083000}'),o={name:"cn/back-end/java/字符串.md"},c=r('

字符串

参考

在 java 中有三种字符串类,分别是String、StringBuffer、StringBuilder

String 类是 java 中最基本的字符串类,它不可变,即一旦创建,就不能改变。

如:String.concat()方法用于连接两个字符串,他不改变原字符串,而是返回一个新的字符串。

StringBufferStringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer 类是线程安全的,它可变,即我们可以改变它。

StringBuilder 类是非线程安全的,它可变。相对StringbufferStringbuilder类速度更快,但是不能保证线程安全。

',8),d=[c];function n(i,_,p,s,f,l){return t(),a("div",null,d)}const g=e(o,[["render",n]]);export{S as __pageData,g as default}; +import{_ as e,N as a,M as t,aF as r}from"./chunks/framework.wLg4U0bT.js";const S=JSON.parse('{"title":"字符串","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/字符串.md","filePath":"cn/back-end/java/字符串.md","lastUpdated":1720682010000}'),o={name:"cn/back-end/java/字符串.md"},c=r('

字符串

参考

在 java 中有三种字符串类,分别是String、StringBuffer、StringBuilder

String 类是 java 中最基本的字符串类,它不可变,即一旦创建,就不能改变。

如:String.concat()方法用于连接两个字符串,他不改变原字符串,而是返回一个新的字符串。

StringBufferStringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer 类是线程安全的,它可变,即我们可以改变它。

StringBuilder 类是非线程安全的,它可变。相对StringbufferStringbuilder类速度更快,但是不能保证线程安全。

',8),d=[c];function n(i,_,p,s,f,l){return t(),a("div",null,d)}const g=e(o,[["render",n]]);export{S as __pageData,g as default}; diff --git "a/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.lean.js" "b/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.lean.js" similarity index 85% rename from "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.lean.js" rename to "assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.lean.js" index 12f0aa7..76fc9ce 100644 --- "a/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.DFJYux5v.lean.js" +++ "b/assets/cn_back-end_java_\345\255\227\347\254\246\344\270\262.md.qaq7Ch_W.lean.js" @@ -1 +1 @@ -import{_ as e,N as a,M as t,aF as r}from"./chunks/framework.wLg4U0bT.js";const S=JSON.parse('{"title":"字符串","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/字符串.md","filePath":"cn/back-end/java/字符串.md","lastUpdated":1719277083000}'),o={name:"cn/back-end/java/字符串.md"},c=r("",8),d=[c];function n(i,_,p,s,f,l){return t(),a("div",null,d)}const g=e(o,[["render",n]]);export{S as __pageData,g as default}; +import{_ as e,N as a,M as t,aF as r}from"./chunks/framework.wLg4U0bT.js";const S=JSON.parse('{"title":"字符串","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/字符串.md","filePath":"cn/back-end/java/字符串.md","lastUpdated":1720682010000}'),o={name:"cn/back-end/java/字符串.md"},c=r("",8),d=[c];function n(i,_,p,s,f,l){return t(),a("div",null,d)}const g=e(o,[["render",n]]);export{S as __pageData,g as default}; diff --git "a/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.js" "b/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.js" similarity index 99% rename from "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.js" rename to "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.js" index e2959f5..f35b51a 100644 --- "a/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.js" +++ "b/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.js" @@ -1,4 +1,4 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"对象和类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/对象和类.md","filePath":"cn/back-end/java/对象和类.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/java/对象和类.md"},l=n(`

对象和类

对象 objects 是类 classes 的实例。

java
public class Dog{
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"对象和类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/对象和类.md","filePath":"cn/back-end/java/对象和类.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/对象和类.md"},l=n(`

对象和类

对象 objects 是类 classes 的实例。

java
public class Dog{
   int age; // 成员变量
   private static String name;  // 私有静态成员变量,在实例上不可用
 
diff --git "a/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.lean.js" "b/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.lean.js"
similarity index 86%
rename from "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.lean.js"
rename to "assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.lean.js"
index 569a3cb..c686ddf 100644
--- "a/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.fswazgI2.lean.js"
+++ "b/assets/cn_back-end_java_\345\257\271\350\261\241\345\222\214\347\261\273.md.MrFr4t4s.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"对象和类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/对象和类.md","filePath":"cn/back-end/java/对象和类.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/java/对象和类.md"},l=n("",11),h=[l];function k(e,t,r,E,d,g){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{y as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"对象和类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/对象和类.md","filePath":"cn/back-end/java/对象和类.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/java/对象和类.md"},l=n("",11),h=[l];function k(e,t,r,E,d,g){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{y as __pageData,F as default};
diff --git "a/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.js" "b/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.js"
similarity index 99%
rename from "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.js"
rename to "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.js"
index fb8f397..6a7c966 100644
--- "a/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.js"
+++ "b/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"异常处理","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/异常处理.md","filePath":"cn/back-end/java/异常处理.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/异常处理.md"},p=n(`

异常处理

异常捕获

java
import java.io.*;
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"异常处理","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/异常处理.md","filePath":"cn/back-end/java/异常处理.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/异常处理.md"},p=n(`

异常处理

异常捕获

java
import java.io.*;
 public class ExcepTest{
 
    public static void main(String args[]){
diff --git "a/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.lean.js" "b/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.lean.js"
similarity index 86%
rename from "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.lean.js"
rename to "assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.lean.js"
index c5a352d..b86addb 100644
--- "a/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.CIQyHBhB.lean.js"
+++ "b/assets/cn_back-end_java_\345\274\202\345\270\270\345\244\204\347\220\206.md.BeHGpOim.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"异常处理","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/异常处理.md","filePath":"cn/back-end/java/异常处理.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/异常处理.md"},p=n("",17),h=[p];function t(e,k,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",t]]);export{y as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"异常处理","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/异常处理.md","filePath":"cn/back-end/java/异常处理.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/异常处理.md"},p=n("",17),h=[p];function t(e,k,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",t]]);export{y as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.js" "b/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.js"
similarity index 99%
rename from "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.js"
rename to "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.js"
index ed6be11..4fe3350 100644
--- "a/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.js"
+++ "b/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/快速开始.md","filePath":"cn/back-end/java/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/快速开始.md"},e=n(`

快速开始

features

  • java 不使用指针而是引用。并提供了自动分配和回收内存空间的机制。

环境配置(windows)

下载java 开发工具包JDK

系统环境变量配置, 在系统变量中添加以下变量:

  1. JAVA_HOME = C:\\Program Files\\Java\\jdk-17 (jdk 安装目录)
  2. CLASSPATH = .;%JAVA_HOME%\\lib\\dt.jar;%JAVA_HOME%\\lib\\tools.jar;
  3. PATH = %JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;

验证安装情况

sh
java -version
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/快速开始.md","filePath":"cn/back-end/java/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/快速开始.md"},e=n(`

快速开始

features

  • java 不使用指针而是引用。并提供了自动分配和回收内存空间的机制。

环境配置(windows)

下载java 开发工具包JDK

系统环境变量配置, 在系统变量中添加以下变量:

  1. JAVA_HOME = C:\\Program Files\\Java\\jdk-17 (jdk 安装目录)
  2. CLASSPATH = .;%JAVA_HOME%\\lib\\dt.jar;%JAVA_HOME%\\lib\\tools.jar;
  3. PATH = %JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin;

验证安装情况

sh
java -version
 
 java 17.0.11 2024-04-16 LTS

第一段 java 程序

单文件运行

java
public class HelloWorld {
    /* 这是第一个Java程序
diff --git "a/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.lean.js" "b/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.lean.js"
similarity index 86%
rename from "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.lean.js"
rename to "assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.lean.js"
index 977b3d5..45dee96 100644
--- "a/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.DZyRCUCK.lean.js"
+++ "b/assets/cn_back-end_java_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cn1RmWoY.lean.js"
@@ -1 +1 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/快速开始.md","filePath":"cn/back-end/java/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/快速开始.md"},e=n("",21),p=[e];function h(t,k,r,d,c,o){return i(),a("div",null,p)}const b=s(l,[["render",h]]);export{g as __pageData,b as default};
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/快速开始.md","filePath":"cn/back-end/java/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/快速开始.md"},e=n("",21),p=[e];function h(t,k,r,d,c,o){return i(),a("div",null,p)}const b=s(l,[["render",h]]);export{g as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.js" "b/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.js"
similarity index 99%
rename from "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.js"
rename to "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.js"
index 2bdc68e..e0b0cb7 100644
--- "a/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.js"
+++ "b/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"抽象类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/抽象类.md","filePath":"cn/back-end/java/抽象类.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/抽象类.md"},p=n(`

抽象类

子类共同的属性和行为方法放到抽象类(父类),一部分子类具有的行为放到接口中。

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于 Java 不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

网上流传最广泛的例子:门和警报的例子:门都有 open() 和 close() 两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

java
abstract class Door {
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"抽象类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/抽象类.md","filePath":"cn/back-end/java/抽象类.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/抽象类.md"},p=n(`

抽象类

子类共同的属性和行为方法放到抽象类(父类),一部分子类具有的行为放到接口中。

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于 Java 不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

网上流传最广泛的例子:门和警报的例子:门都有 open() 和 close() 两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

java
abstract class Door {
     public abstract void open();
     public abstract void close();
 }
diff --git "a/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.lean.js" "b/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.lean.js"
similarity index 85%
rename from "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.lean.js"
rename to "assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.lean.js"
index c863407..0413b5b 100644
--- "a/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.DkPAOQKq.lean.js"
+++ "b/assets/cn_back-end_java_\346\212\275\350\261\241\347\261\273.md.BvwTwcoT.lean.js"
@@ -1 +1 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"抽象类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/抽象类.md","filePath":"cn/back-end/java/抽象类.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/抽象类.md"},p=n("",10),e=[p];function h(t,k,r,c,d,E){return i(),a("div",null,e)}const g=s(l,[["render",h]]);export{b as __pageData,g as default};
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"抽象类","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/抽象类.md","filePath":"cn/back-end/java/抽象类.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/抽象类.md"},p=n("",10),e=[p];function h(t,k,r,c,d,E){return i(),a("div",null,e)}const g=s(l,[["render",h]]);export{b as __pageData,g as default};
diff --git "a/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.js" "b/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.js"
similarity index 99%
rename from "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.js"
rename to "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.js"
index 6c83fd5..589884e 100644
--- "a/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.js"
+++ "b/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数据结构","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数据结构.md","filePath":"cn/back-end/java/数据结构.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/数据结构.md"},t=n(`

数据结构

java.util包中提供了很多数据结构的实现。

数组

java
int[] arr = new int[10];

列表 ArrayList 和 LinkedList

ArrayList:

  • 特点: 动态数组,可变大小。
  • 优点: 高效的随机访问和快速尾部插入。
  • 缺点: 中间插入和删除相对较慢。

LinkedList:

  • 特点: 双向链表,元素之间通过指针连接。
  • 优点: 插入和删除元素高效,迭代器性能好。
  • 缺点: 随机访问相对较慢。
java
import java.util.ArrayList;
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数据结构","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数据结构.md","filePath":"cn/back-end/java/数据结构.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/数据结构.md"},t=n(`

数据结构

java.util包中提供了很多数据结构的实现。

数组

java
int[] arr = new int[10];

列表 ArrayList 和 LinkedList

ArrayList:

  • 特点: 动态数组,可变大小。
  • 优点: 高效的随机访问和快速尾部插入。
  • 缺点: 中间插入和删除相对较慢。

LinkedList:

  • 特点: 双向链表,元素之间通过指针连接。
  • 优点: 插入和删除元素高效,迭代器性能好。
  • 缺点: 随机访问相对较慢。
java
import java.util.ArrayList;
 
 List<String> arrayList = new ArrayList<>();
 
diff --git "a/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.lean.js" "b/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.lean.js"
similarity index 86%
rename from "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.lean.js"
rename to "assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.lean.js"
index 4f7e1ff..2522daa 100644
--- "a/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.DQQWuCDW.lean.js"
+++ "b/assets/cn_back-end_java_\346\225\260\346\215\256\347\273\223\346\236\204.md.D3jXQd6a.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数据结构","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数据结构.md","filePath":"cn/back-end/java/数据结构.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/数据结构.md"},t=n("",12),p=[t];function h(k,e,r,E,d,g){return a(),i("div",null,p)}const o=s(l,[["render",h]]);export{c as __pageData,o as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数据结构","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数据结构.md","filePath":"cn/back-end/java/数据结构.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/数据结构.md"},t=n("",12),p=[t];function h(k,e,r,E,d,g){return a(),i("div",null,p)}const o=s(l,[["render",h]]);export{c as __pageData,o as default};
diff --git "a/assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.js" "b/assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.js"
similarity index 99%
rename from "assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.js"
rename to "assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.js"
index 6d733cb..7ca5b2f 100644
--- "a/assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.js"
+++ "b/assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数组","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数组.md","filePath":"cn/back-end/java/数组.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/数组.md"},h=n(`

数组

java 中数组的每个元素类型都是相同的,js 中可以不是。

声明数组变量

java
double[] myList = new double[2];
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数组","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数组.md","filePath":"cn/back-end/java/数组.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/数组.md"},h=n(`

数组

java 中数组的每个元素类型都是相同的,js 中可以不是。

声明数组变量

java
double[] myList = new double[2];
 myList[0] = 1.9;
 myList[1] = 2.9;
 myList[2] = 3.4;  // 错误,超出了myList数组长度
diff --git "a/assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.lean.js" "b/assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.lean.js"
similarity index 85%
rename from "assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.lean.js"
rename to "assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.lean.js"
index bd68d17..5b9ee7d 100644
--- "a/assets/cn_back-end_java_\346\225\260\347\273\204.md.-0KdhHL7.lean.js"
+++ "b/assets/cn_back-end_java_\346\225\260\347\273\204.md.Dm5xgZ9v.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数组","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数组.md","filePath":"cn/back-end/java/数组.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/数组.md"},h=n("",11),p=[h];function k(t,e,r,E,d,g){return a(),i("div",null,p)}const F=s(l,[["render",k]]);export{c as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数组","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/数组.md","filePath":"cn/back-end/java/数组.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/数组.md"},h=n("",11),p=[h];function k(t,e,r,E,d,g){return a(),i("div",null,p)}const F=s(l,[["render",k]]);export{c as __pageData,F as default};
diff --git "a/assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.js" "b/assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.js"
similarity index 99%
rename from "assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.js"
rename to "assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.js"
index c66d1ca..7670fa4 100644
--- "a/assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.js"
+++ "b/assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"方法","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/方法.md","filePath":"cn/back-end/java/方法.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/方法.md"},p=n(`

方法

例子:

java
public static int max(int a, int b) {
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"方法","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/方法.md","filePath":"cn/back-end/java/方法.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/方法.md"},p=n(`

方法

例子:

java
public static int max(int a, int b) {
   return a > b ? a : b;
 }
 
diff --git "a/assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.lean.js" "b/assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.lean.js"
similarity index 85%
rename from "assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.lean.js"
rename to "assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.lean.js"
index f817e3c..ab0aed1 100644
--- "a/assets/cn_back-end_java_\346\226\271\346\263\225.md.IsjnL8J1.lean.js"
+++ "b/assets/cn_back-end_java_\346\226\271\346\263\225.md.B6Ps2WDO.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"方法","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/方法.md","filePath":"cn/back-end/java/方法.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/方法.md"},p=n("",3),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"方法","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/方法.md","filePath":"cn/back-end/java/方法.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/方法.md"},p=n("",3),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.js" "b/assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.js"
similarity index 99%
rename from "assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.js"
rename to "assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.js"
index 33b61ff..930aec8 100644
--- "a/assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.js"
+++ "b/assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"枚举","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/枚举.md","filePath":"cn/back-end/java/枚举.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/枚举.md"},p=n(`

枚举

java
enum Color {
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"枚举","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/枚举.md","filePath":"cn/back-end/java/枚举.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/枚举.md"},p=n(`

枚举

java
enum Color {
   RED {
     public String getColor() {// 枚举对象实现抽象方法
       return "红色";
diff --git "a/assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.lean.js" "b/assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.lean.js"
similarity index 85%
rename from "assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.lean.js"
rename to "assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.lean.js"
index 5c548cf..f01ae17 100644
--- "a/assets/cn_back-end_java_\346\236\232\344\270\276.md.RJZ_YCDL.lean.js"
+++ "b/assets/cn_back-end_java_\346\236\232\344\270\276.md.BRQGn6WS.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"枚举","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/枚举.md","filePath":"cn/back-end/java/枚举.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/枚举.md"},p=n("",2),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{y as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"枚举","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/枚举.md","filePath":"cn/back-end/java/枚举.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/枚举.md"},p=n("",2),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{y as __pageData,b as default};
diff --git "a/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.js" "b/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.js"
similarity index 99%
rename from "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.js"
rename to "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.js"
index d6be380..138d1d1 100644
--- "a/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.js"
+++ "b/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"继承","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/继承、重载和多态.md","filePath":"cn/back-end/java/继承、重载和多态.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/继承、重载和多态.md"},p=n(`

继承

继承类 extends 父类
继承接口 implements 父接口

类继承

java
class Animal{
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"继承","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/继承、重载和多态.md","filePath":"cn/back-end/java/继承、重载和多态.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/继承、重载和多态.md"},p=n(`

继承

继承类 extends 父类
继承接口 implements 父接口

类继承

java
class Animal{
     public String action = 'move'
     public Animal(String aciton){
       this.action = action;
diff --git "a/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.lean.js" "b/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.lean.js"
similarity index 87%
rename from "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.lean.js"
rename to "assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.lean.js"
index 19894fd..1adae22 100644
--- "a/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.CwoY92ZF.lean.js"
+++ "b/assets/cn_back-end_java_\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.md.Cttg-pU1.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"继承","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/继承、重载和多态.md","filePath":"cn/back-end/java/继承、重载和多态.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/继承、重载和多态.md"},p=n("",15),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const c=s(l,[["render",k]]);export{F as __pageData,c as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"继承","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/继承、重载和多态.md","filePath":"cn/back-end/java/继承、重载和多态.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/继承、重载和多态.md"},p=n("",15),h=[p];function k(t,e,r,E,d,g){return a(),i("div",null,h)}const c=s(l,[["render",k]]);export{F as __pageData,c as default};
diff --git "a/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.js" "b/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.js"
similarity index 96%
rename from "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.js"
rename to "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.js"
index fbe8509..5a0fab7 100644
--- "a/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.js"
+++ "b/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"运算符","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/运算符.md","filePath":"cn/back-end/java/运算符.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/运算符.md"},p=n(`

运算符

java 运算符普遍运算规则与 js 相同,以下介绍一些他们的区别

  1. 相等运算符

在 js 中是宽松相等。在 java 中,严格相等。

java
public class HelloWorld {
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"运算符","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/运算符.md","filePath":"cn/back-end/java/运算符.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/运算符.md"},p=n(`

运算符

java 运算符普遍运算规则与 js 相同,以下介绍一些他们的区别

  1. 相等运算符

在 js 中是宽松相等。在 java 中,严格相等。

java
public class HelloWorld {
   public static void main(String[] args) {
     boolean a = 1 == '1';
     System.out.println(a);  // false
@@ -7,7 +7,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c
 console.log(a); // true
 
 const b = 1 === '1';
-console.log(b); // false
  1. 类型转换

java 是强类型语言,类型转换必须显式进行。js 是弱类型语言,类型转换是隐式进行的。

java
public class HelloWorld {
+console.log(b); // false
  1. 类型转换

java 是强类型语言,类型转换必须显式进行。js 是弱类型语言,类型转换是隐式进行的。

java
public class HelloWorld {
   public static void main(String[] args) {
     int a = 1;
     String b = "1";
@@ -25,7 +25,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c
 console.log(a + Number(b)); // 2
 console.log(a + parseFloat(b)); // 2.0
 console.log(String(a)); // '1'
-console.log(a.toString()); // '1'
  1. 算数运算符
java
public class HelloWorld {
+console.log(a.toString()); // '1'
  1. 算数运算符
java
public class HelloWorld {
   public static void main(String[] args) {
     int a = 5/2;  // 2
     double b = 5/2; // 2.0
diff --git "a/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.lean.js" "b/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.lean.js"
similarity index 85%
rename from "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.lean.js"
rename to "assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.lean.js"
index 54f83c5..c510961 100644
--- "a/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BtjyO-WZ.lean.js"
+++ "b/assets/cn_back-end_java_\350\277\220\347\256\227\347\254\246.md.BD2DbKtn.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"运算符","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/运算符.md","filePath":"cn/back-end/java/运算符.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/java/运算符.md"},p=n("",10),h=[p];function k(t,e,r,d,E,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"运算符","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/java/运算符.md","filePath":"cn/back-end/java/运算符.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/java/运算符.md"},p=n("",10),h=[p];function k(t,e,r,d,E,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
diff --git "a/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.js" "b/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.js"
similarity index 98%
rename from "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.js"
rename to "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.js"
index d82fd32..0843d78 100644
--- "a/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.js"
+++ "b/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 实现 SSE 接口","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/SSE接口.md","filePath":"cn/back-end/nestjs/practice/SSE接口.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/practice/SSE接口.md"},p=n(`

nestjs 实现 SSE 接口

动机 24-06-07

SSE(Server-Sent Events) 是一种用于在浏览器中从服务器接收实时数据的技术。它允许服务器向客户端发送事件,客户端可以实时接收并处理这些事件。

在很多情况下,SSE 可以比 WebSocket 更适合实时数据传输,因为它不需要客户端主动发起连接,并且可以节省服务器资源。

在很多 AI 对话工具中,SSE 可以用于实时获取模型的预测结果。

nest 代码实现

ts
import { Controller, Get, Param, Res, Sse, Response } from '@nestjs/common';
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 实现 SSE 接口","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/SSE接口.md","filePath":"cn/back-end/nestjs/practice/SSE接口.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/practice/SSE接口.md"},p=n(`

nestjs 实现 SSE 接口

动机 24-06-07

SSE(Server-Sent Events) 是一种用于在浏览器中从服务器接收实时数据的技术。它允许服务器向客户端发送事件,客户端可以实时接收并处理这些事件。

在很多情况下,SSE 可以比 WebSocket 更适合实时数据传输,因为它不需要客户端主动发起连接,并且可以节省服务器资源。

在很多 AI 对话工具中,SSE 可以用于实时获取模型的预测结果。

nest 代码实现

ts
import { Controller, Get, Param, Res, Sse, Response } from '@nestjs/common';
 import { SseService } from './sse.service';
 import { Observable, interval, map, takeUntil } from 'rxjs';
 
diff --git "a/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.lean.js" "b/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.lean.js"
similarity index 87%
rename from "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.lean.js"
rename to "assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.lean.js"
index 5d615b2..b854cd8 100644
--- "a/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.CAkWXiRF.lean.js"
+++ "b/assets/cn_back-end_nestjs_practice_SSE\346\216\245\345\217\243.md.cvK-C0EM.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 实现 SSE 接口","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/SSE接口.md","filePath":"cn/back-end/nestjs/practice/SSE接口.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/practice/SSE接口.md"},p=n("",12),h=[p];function k(e,t,E,r,d,g){return a(),i("div",null,h)}const c=s(l,[["render",k]]);export{F as __pageData,c as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 实现 SSE 接口","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/SSE接口.md","filePath":"cn/back-end/nestjs/practice/SSE接口.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/practice/SSE接口.md"},p=n("",12),h=[p];function k(e,t,E,r,d,g){return a(),i("div",null,h)}const c=s(l,[["render",k]]);export{F as __pageData,c as default};
diff --git a/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.js b/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.js
similarity index 99%
rename from assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.js
rename to assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.js
index 30c799c..28ba569 100644
--- a/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.js
+++ b/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.js
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 与 vercel 集成","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","filePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/practice/intergrate-with-vercel.md"},t=n(`

nestjs 与 vercel 集成

注意,访问 vercel 官网需要科学上网

本文主要介绍以下几个内容:

  • 创建 nestjs 项目,本地跑通
  • 上传 nestjs 项目到 github 仓库
  • 创建 vercel 项目并导入那个仓库
  • 为部署好的 vercel 项目添加国内域名访问

创建 nestjs 项目

shell
$ npm i -g @nestjs/cli
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 与 vercel 集成","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","filePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/practice/intergrate-with-vercel.md"},t=n(`

nestjs 与 vercel 集成

注意,访问 vercel 官网需要科学上网

本文主要介绍以下几个内容:

  • 创建 nestjs 项目,本地跑通
  • 上传 nestjs 项目到 github 仓库
  • 创建 vercel 项目并导入那个仓库
  • 为部署好的 vercel 项目添加国内域名访问

创建 nestjs 项目

shell
$ npm i -g @nestjs/cli
 # 不想全局安装 nestjs 脚手架 也可以使用 npx nest new intergrate-with-vercel
 $ nest new intergrate-with-vercel # 根据控制台提示,选择包管理工具安装依赖
 $ cd intergrate-with-vercel
diff --git a/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.lean.js b/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.lean.js
similarity index 88%
rename from assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.lean.js
rename to assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.lean.js
index 233b9cd..53077f6 100644
--- a/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.BC5v_pp1.lean.js
+++ b/assets/cn_back-end_nestjs_practice_intergrate-with-vercel.md.D1tcau4g.lean.js
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 与 vercel 集成","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","filePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/practice/intergrate-with-vercel.md"},t=n("",40),l=[t];function p(h,r,k,g,d,c){return a(),i("div",null,l)}const u=s(e,[["render",p]]);export{F as __pageData,u as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const F=JSON.parse('{"title":"nestjs 与 vercel 集成","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","filePath":"cn/back-end/nestjs/practice/intergrate-with-vercel.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/practice/intergrate-with-vercel.md"},t=n("",40),l=[t];function p(h,r,k,g,d,c){return a(),i("div",null,l)}const u=s(e,[["render",p]]);export{F as __pageData,u as default};
diff --git "a/assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.js" "b/assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.js"
similarity index 98%
rename from "assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.js"
rename to "assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.js"
index 15f8946..d40f2aa 100644
--- "a/assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.js"
+++ "b/assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p="/assets/typeorm-subscripter.AsFgnR4F.png",c=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"cn/back-end/nestjs/与MySQL.md","filePath":"cn/back-end/nestjs/与MySQL.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/与MySQL.md"},h=n(`

Nest 与数据库无关,将 Nest 连接到数据库只是为数据库加载适当的 Node.js 驱动程序的问题。比如使用@nestjs/typeorm库,将 Nest 与 typeorm 链接,typeorm 与 mysql 数据库链接。

关系链条

nest应用 -- @nestjs/typeorm -- typeorm -- mysql

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (Object Relation Mapping),简称 ORM。

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

使用

ts
// app.module.ts
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p="/assets/typeorm-subscripter.AsFgnR4F.png",c=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"cn/back-end/nestjs/与MySQL.md","filePath":"cn/back-end/nestjs/与MySQL.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/与MySQL.md"},h=n(`

Nest 与数据库无关,将 Nest 连接到数据库只是为数据库加载适当的 Node.js 驱动程序的问题。比如使用@nestjs/typeorm库,将 Nest 与 typeorm 链接,typeorm 与 mysql 数据库链接。

关系链条

nest应用 -- @nestjs/typeorm -- typeorm -- mysql

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (Object Relation Mapping),简称 ORM。

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

使用

ts
// app.module.ts
 import { Module } from '@nestjs/common';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { UsersModule } from './users/users.module';
@@ -156,7 +156,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p
     const res = await this.usersService.updateOne({ id, name });
     return res;
   }
-}

::: detail /**/*.entity{.ts,.js} 是一种什么形式? /**/\\*.entity{.ts,.js} 是一种用于匹配文件路径的模式,通常用于在一些工具和配置中指定文件的匹配规则。这种模式通常被称为 "glob 模式",它允许你使用通配符和特殊字符来匹配文件路径。

具体来说,/**/*.entity{.ts,.js} 可以解释为:

  • /**/: 匹配零个或多个子目录。
  • *.entity: 匹配任何以 .entity 结尾的文件名。
  • {.ts,.js}: 使用花括号表示选择,匹配 .ts.js 扩展名的文件。

因此,这个模式用于匹配所有以 .entity.ts.entity.js 结尾的文件,而这些文件通常是包含实体定义的文件,例如在使用 TypeORM(一个 TypeScript 和 JavaScript 的 ORM 框架)时,用于定义数据库实体的文件。 :::

typeorm 的 synchronize 有什么用? [BY GPT]

typeorm 是一个用于 TypeScript 和 JavaScript 的对象关系映射(ORM)库,用于在应用程序和数据库之间进行数据映射。在 typeorm 中,synchronize 是一个用于自动创建数据库表结构的选项。

当你使用 synchronize 时,typeorm 会检查你的实体类(Entity)的定义,并确保数据库中存在相应的表。如果表不存在,它会尝试创建表。这在开发过程中很方便,因为你不必手动创建数据库表,而是可以依赖 typeorm 自动处理。

但要注意,在生产环境中,最好不要使用 synchronize。这是因为在生产环境中,你可能希望对数据库表的结构进行更严格的控制,并且手动管理数据库迁移(migration)。手动管理迁移可以更好地掌握数据库结构的演变,确保在更新应用程序时不会丢失数据或造成不必要的数据迁移问题。

在开发阶段,你可能会方便地使用 synchronize,但在生产环境中,最好使用数据库迁移工具(如 TypeORM 的迁移工具)来管理数据库的结构变化。这样可以更好地跟踪数据库模式的演进,并在需要时执行有序的数据库升级。

TIP

收到的 id 是 string 类型,为什么在 service 里还是能找到这条?[GPT]

在 TypeScript 中,当你在 Controller 接收 GET 请求参数时,即使你声明id的类型为number,它仍然可以接受传入的字符串,而 TypeORM 的findOneBy方法也可以正常工作。这是因为 TypeORM 的findOneBy方法会自动进行类型转换。

TypeORM 的findOneBy方法会检查传递给它的查询条件,并尝试将其中的属性与实体的列进行类型匹配。如果实体定义中指定了idnumber类型,而你传递了一个字符串,TypeORM 会尝试将字符串转换为数字,以便与数据库中的列进行比较。

这种行为是由 TypeORM 的查询构建器和数据映射机制支持的。在这种情况下,TypeORM 会尽量进行合适的类型转换,以确保查询条件与数据库列的类型匹配。这种自动类型转换可以提高代码的灵活性,但同时也需要注意在边界情况下进行明确的类型转换,以避免潜在的错误。

在这种情况下,即使你的 Controller 接收到的参数是字符串,TypeORM 会尝试将其转换为匹配实体列类型的值。因此,在使用findOneBy时,你通常不需要手动进行类型转换。

TIP

前端 id 传字符串 或者 数字,这个后端是自动转换好,还是要做异常提示?[GPT]

在一些框架和库中,比如 Express 和 NestJS(通过 TypeORM 等库),后端通常会尝试自动进行类型转换,而不会直接导致异常。这种自动类型转换的行为是为了提高开发的灵活性,使得开发者在接收前端请求时不必过于担心传递参数的精确类型。

例如,在 Express 中,路由处理函数可以通过 req.params 获取 URL 中的参数,而这些参数的类型通常是字符串。当你在路由处理函数中使用这些参数时,Express 会尝试自动将其转换为适当的类型。这可能包括将字符串转换为数字、布尔值等,以适应你在路由处理函数中的预期类型。

尽管这样的自动类型转换很方便,但在一些情况下,可能会导致意外的行为。例如,如果你的路由处理函数期望一个数字,但实际传递了一个无法转换为数字的字符串,可能会导致错误。因此,有时在接收参数之前,进行显式的类型验证或转换可能是一个好的实践,以确保参数符合预期。

在 NestJS 中,使用 TypeORM 进行数据库操作时,通常也能够处理这些类型转换。TypeORM 会根据实体定义的类型信息,尝试将接收到的参数转换为相应的类型,从而与数据库中的列进行匹配。但同样,注意确保传递的参数是符合预期的,以避免潜在的错误。

综上所述,虽然许多后端框架会尝试进行自动类型转换,但在关键的地方,特别是需要保证类型准确性的情况下,最好进行显式的类型验证或转换,并在需要时提供适当的异常处理和错误提示。

处理前端传递的参数并进行类型转换的最佳实践是使用 Pipes

通过使用 DTO 和 Pipes,你能够将参数的验证和类型转换与业务逻辑解耦,并确保接收到的参数符合预期的类型。这有助于提高代码的可维护性和可读性。

前端如何通过 GET 方法传对象或数组

推荐使用 query-string

ts
import queryString from 'query-string';
+}

::: detail /**/*.entity{.ts,.js} 是一种什么形式? /**/\\*.entity{.ts,.js} 是一种用于匹配文件路径的模式,通常用于在一些工具和配置中指定文件的匹配规则。这种模式通常被称为 "glob 模式",它允许你使用通配符和特殊字符来匹配文件路径。

具体来说,/**/*.entity{.ts,.js} 可以解释为:

  • /**/: 匹配零个或多个子目录。
  • *.entity: 匹配任何以 .entity 结尾的文件名。
  • {.ts,.js}: 使用花括号表示选择,匹配 .ts.js 扩展名的文件。

因此,这个模式用于匹配所有以 .entity.ts.entity.js 结尾的文件,而这些文件通常是包含实体定义的文件,例如在使用 TypeORM(一个 TypeScript 和 JavaScript 的 ORM 框架)时,用于定义数据库实体的文件。 :::

typeorm 的 synchronize 有什么用? [BY GPT]

typeorm 是一个用于 TypeScript 和 JavaScript 的对象关系映射(ORM)库,用于在应用程序和数据库之间进行数据映射。在 typeorm 中,synchronize 是一个用于自动创建数据库表结构的选项。

当你使用 synchronize 时,typeorm 会检查你的实体类(Entity)的定义,并确保数据库中存在相应的表。如果表不存在,它会尝试创建表。这在开发过程中很方便,因为你不必手动创建数据库表,而是可以依赖 typeorm 自动处理。

但要注意,在生产环境中,最好不要使用 synchronize。这是因为在生产环境中,你可能希望对数据库表的结构进行更严格的控制,并且手动管理数据库迁移(migration)。手动管理迁移可以更好地掌握数据库结构的演变,确保在更新应用程序时不会丢失数据或造成不必要的数据迁移问题。

在开发阶段,你可能会方便地使用 synchronize,但在生产环境中,最好使用数据库迁移工具(如 TypeORM 的迁移工具)来管理数据库的结构变化。这样可以更好地跟踪数据库模式的演进,并在需要时执行有序的数据库升级。

TIP

收到的 id 是 string 类型,为什么在 service 里还是能找到这条?[GPT]

在 TypeScript 中,当你在 Controller 接收 GET 请求参数时,即使你声明id的类型为number,它仍然可以接受传入的字符串,而 TypeORM 的findOneBy方法也可以正常工作。这是因为 TypeORM 的findOneBy方法会自动进行类型转换。

TypeORM 的findOneBy方法会检查传递给它的查询条件,并尝试将其中的属性与实体的列进行类型匹配。如果实体定义中指定了idnumber类型,而你传递了一个字符串,TypeORM 会尝试将字符串转换为数字,以便与数据库中的列进行比较。

这种行为是由 TypeORM 的查询构建器和数据映射机制支持的。在这种情况下,TypeORM 会尽量进行合适的类型转换,以确保查询条件与数据库列的类型匹配。这种自动类型转换可以提高代码的灵活性,但同时也需要注意在边界情况下进行明确的类型转换,以避免潜在的错误。

在这种情况下,即使你的 Controller 接收到的参数是字符串,TypeORM 会尝试将其转换为匹配实体列类型的值。因此,在使用findOneBy时,你通常不需要手动进行类型转换。

TIP

前端 id 传字符串 或者 数字,这个后端是自动转换好,还是要做异常提示?[GPT]

在一些框架和库中,比如 Express 和 NestJS(通过 TypeORM 等库),后端通常会尝试自动进行类型转换,而不会直接导致异常。这种自动类型转换的行为是为了提高开发的灵活性,使得开发者在接收前端请求时不必过于担心传递参数的精确类型。

例如,在 Express 中,路由处理函数可以通过 req.params 获取 URL 中的参数,而这些参数的类型通常是字符串。当你在路由处理函数中使用这些参数时,Express 会尝试自动将其转换为适当的类型。这可能包括将字符串转换为数字、布尔值等,以适应你在路由处理函数中的预期类型。

尽管这样的自动类型转换很方便,但在一些情况下,可能会导致意外的行为。例如,如果你的路由处理函数期望一个数字,但实际传递了一个无法转换为数字的字符串,可能会导致错误。因此,有时在接收参数之前,进行显式的类型验证或转换可能是一个好的实践,以确保参数符合预期。

在 NestJS 中,使用 TypeORM 进行数据库操作时,通常也能够处理这些类型转换。TypeORM 会根据实体定义的类型信息,尝试将接收到的参数转换为相应的类型,从而与数据库中的列进行匹配。但同样,注意确保传递的参数是符合预期的,以避免潜在的错误。

综上所述,虽然许多后端框架会尝试进行自动类型转换,但在关键的地方,特别是需要保证类型准确性的情况下,最好进行显式的类型验证或转换,并在需要时提供适当的异常处理和错误提示。

处理前端传递的参数并进行类型转换的最佳实践是使用 Pipes

通过使用 DTO 和 Pipes,你能够将参数的验证和类型转换与业务逻辑解耦,并确保接收到的参数符合预期的类型。这有助于提高代码的可维护性和可读性。

前端如何通过 GET 方法传对象或数组

推荐使用 query-string

ts
import queryString from 'query-string';
 
 const data = {
   key1: 'value1',
@@ -194,7 +194,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p
 fetch(url)
   .then((response) => response.json())
   .then((data) => console.log(data))
-  .catch((error) => console.error('Error:', error));

一对多和多对一

假设一个用户有多张图片,这样就是一对多(oneToMany)的场景。那么对于图片表里来说,就是多张图片对应一个用户(manyToOne)。

现在需要【通过用户 id 查询用户和用户对应的图片集】

  1. 新建 photo.entity
  2. 改造user.entity
  3. 如果未使用 glob模式 则需在app.module.tsentities中填入photo.entity
  4. 改造user.service中的方法
ts
// photo.entity.ts ,且把他放在user文件夹中
+  .catch((error) => console.error('Error:', error));

一对多和多对一

假设一个用户有多张图片,这样就是一对多(oneToMany)的场景。那么对于图片表里来说,就是多张图片对应一个用户(manyToOne)。

现在需要【通过用户 id 查询用户和用户对应的图片集】

  1. 新建 photo.entity
  2. 改造user.entity
  3. 如果未使用 glob模式 则需在app.module.tsentities中填入photo.entity
  4. 改造user.service中的方法
ts
// photo.entity.ts ,且把他放在user文件夹中
 import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
 import { User } from './user.entity';
 
@@ -261,7 +261,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p
     });
     return res;
   }
-}

然后请求http://localhost:3000/user/{用户id}

更多用法,参照链接

设置订阅者 subscriber

使用 TypeORM subscribers,你可以监听特定的实体事件。

步骤

  1. 新建user.subscriber.ts文件
  2. user.module中添加 UserSubscriber provider
  3. 测试
ts
// user.subscriber.ts
+}

然后请求http://localhost:3000/user/{用户id}

更多用法,参照链接

设置订阅者 subscriber

使用 TypeORM subscribers,你可以监听特定的实体事件。

步骤

  1. 新建user.subscriber.ts文件
  2. user.module中添加 UserSubscriber provider
  3. 测试
ts
// user.subscriber.ts
 import {
   DataSource,
   EntitySubscriberInterface,
diff --git "a/assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.lean.js" "b/assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.lean.js"
similarity index 98%
rename from "assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.lean.js"
rename to "assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.lean.js"
index 15f8946..d40f2aa 100644
--- "a/assets/cn_back-end_nestjs_\344\270\216MySQL.md.B_FkEIjg.lean.js"
+++ "b/assets/cn_back-end_nestjs_\344\270\216MySQL.md.DbtJfsbp.lean.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p="/assets/typeorm-subscripter.AsFgnR4F.png",c=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"cn/back-end/nestjs/与MySQL.md","filePath":"cn/back-end/nestjs/与MySQL.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/与MySQL.md"},h=n(`

Nest 与数据库无关,将 Nest 连接到数据库只是为数据库加载适当的 Node.js 驱动程序的问题。比如使用@nestjs/typeorm库,将 Nest 与 typeorm 链接,typeorm 与 mysql 数据库链接。

关系链条

nest应用 -- @nestjs/typeorm -- typeorm -- mysql

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (Object Relation Mapping),简称 ORM。

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

使用

ts
// app.module.ts
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p="/assets/typeorm-subscripter.AsFgnR4F.png",c=JSON.parse('{"title":"","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"cn/back-end/nestjs/与MySQL.md","filePath":"cn/back-end/nestjs/与MySQL.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/与MySQL.md"},h=n(`

Nest 与数据库无关,将 Nest 连接到数据库只是为数据库加载适当的 Node.js 驱动程序的问题。比如使用@nestjs/typeorm库,将 Nest 与 typeorm 链接,typeorm 与 mysql 数据库链接。

关系链条

nest应用 -- @nestjs/typeorm -- typeorm -- mysql

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (Object Relation Mapping),简称 ORM。

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

使用

ts
// app.module.ts
 import { Module } from '@nestjs/common';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { UsersModule } from './users/users.module';
@@ -156,7 +156,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p
     const res = await this.usersService.updateOne({ id, name });
     return res;
   }
-}

::: detail /**/*.entity{.ts,.js} 是一种什么形式? /**/\\*.entity{.ts,.js} 是一种用于匹配文件路径的模式,通常用于在一些工具和配置中指定文件的匹配规则。这种模式通常被称为 "glob 模式",它允许你使用通配符和特殊字符来匹配文件路径。

具体来说,/**/*.entity{.ts,.js} 可以解释为:

  • /**/: 匹配零个或多个子目录。
  • *.entity: 匹配任何以 .entity 结尾的文件名。
  • {.ts,.js}: 使用花括号表示选择,匹配 .ts.js 扩展名的文件。

因此,这个模式用于匹配所有以 .entity.ts.entity.js 结尾的文件,而这些文件通常是包含实体定义的文件,例如在使用 TypeORM(一个 TypeScript 和 JavaScript 的 ORM 框架)时,用于定义数据库实体的文件。 :::

typeorm 的 synchronize 有什么用? [BY GPT]

typeorm 是一个用于 TypeScript 和 JavaScript 的对象关系映射(ORM)库,用于在应用程序和数据库之间进行数据映射。在 typeorm 中,synchronize 是一个用于自动创建数据库表结构的选项。

当你使用 synchronize 时,typeorm 会检查你的实体类(Entity)的定义,并确保数据库中存在相应的表。如果表不存在,它会尝试创建表。这在开发过程中很方便,因为你不必手动创建数据库表,而是可以依赖 typeorm 自动处理。

但要注意,在生产环境中,最好不要使用 synchronize。这是因为在生产环境中,你可能希望对数据库表的结构进行更严格的控制,并且手动管理数据库迁移(migration)。手动管理迁移可以更好地掌握数据库结构的演变,确保在更新应用程序时不会丢失数据或造成不必要的数据迁移问题。

在开发阶段,你可能会方便地使用 synchronize,但在生产环境中,最好使用数据库迁移工具(如 TypeORM 的迁移工具)来管理数据库的结构变化。这样可以更好地跟踪数据库模式的演进,并在需要时执行有序的数据库升级。

TIP

收到的 id 是 string 类型,为什么在 service 里还是能找到这条?[GPT]

在 TypeScript 中,当你在 Controller 接收 GET 请求参数时,即使你声明id的类型为number,它仍然可以接受传入的字符串,而 TypeORM 的findOneBy方法也可以正常工作。这是因为 TypeORM 的findOneBy方法会自动进行类型转换。

TypeORM 的findOneBy方法会检查传递给它的查询条件,并尝试将其中的属性与实体的列进行类型匹配。如果实体定义中指定了idnumber类型,而你传递了一个字符串,TypeORM 会尝试将字符串转换为数字,以便与数据库中的列进行比较。

这种行为是由 TypeORM 的查询构建器和数据映射机制支持的。在这种情况下,TypeORM 会尽量进行合适的类型转换,以确保查询条件与数据库列的类型匹配。这种自动类型转换可以提高代码的灵活性,但同时也需要注意在边界情况下进行明确的类型转换,以避免潜在的错误。

在这种情况下,即使你的 Controller 接收到的参数是字符串,TypeORM 会尝试将其转换为匹配实体列类型的值。因此,在使用findOneBy时,你通常不需要手动进行类型转换。

TIP

前端 id 传字符串 或者 数字,这个后端是自动转换好,还是要做异常提示?[GPT]

在一些框架和库中,比如 Express 和 NestJS(通过 TypeORM 等库),后端通常会尝试自动进行类型转换,而不会直接导致异常。这种自动类型转换的行为是为了提高开发的灵活性,使得开发者在接收前端请求时不必过于担心传递参数的精确类型。

例如,在 Express 中,路由处理函数可以通过 req.params 获取 URL 中的参数,而这些参数的类型通常是字符串。当你在路由处理函数中使用这些参数时,Express 会尝试自动将其转换为适当的类型。这可能包括将字符串转换为数字、布尔值等,以适应你在路由处理函数中的预期类型。

尽管这样的自动类型转换很方便,但在一些情况下,可能会导致意外的行为。例如,如果你的路由处理函数期望一个数字,但实际传递了一个无法转换为数字的字符串,可能会导致错误。因此,有时在接收参数之前,进行显式的类型验证或转换可能是一个好的实践,以确保参数符合预期。

在 NestJS 中,使用 TypeORM 进行数据库操作时,通常也能够处理这些类型转换。TypeORM 会根据实体定义的类型信息,尝试将接收到的参数转换为相应的类型,从而与数据库中的列进行匹配。但同样,注意确保传递的参数是符合预期的,以避免潜在的错误。

综上所述,虽然许多后端框架会尝试进行自动类型转换,但在关键的地方,特别是需要保证类型准确性的情况下,最好进行显式的类型验证或转换,并在需要时提供适当的异常处理和错误提示。

处理前端传递的参数并进行类型转换的最佳实践是使用 Pipes

通过使用 DTO 和 Pipes,你能够将参数的验证和类型转换与业务逻辑解耦,并确保接收到的参数符合预期的类型。这有助于提高代码的可维护性和可读性。

前端如何通过 GET 方法传对象或数组

推荐使用 query-string

ts
import queryString from 'query-string';
+}

::: detail /**/*.entity{.ts,.js} 是一种什么形式? /**/\\*.entity{.ts,.js} 是一种用于匹配文件路径的模式,通常用于在一些工具和配置中指定文件的匹配规则。这种模式通常被称为 "glob 模式",它允许你使用通配符和特殊字符来匹配文件路径。

具体来说,/**/*.entity{.ts,.js} 可以解释为:

  • /**/: 匹配零个或多个子目录。
  • *.entity: 匹配任何以 .entity 结尾的文件名。
  • {.ts,.js}: 使用花括号表示选择,匹配 .ts.js 扩展名的文件。

因此,这个模式用于匹配所有以 .entity.ts.entity.js 结尾的文件,而这些文件通常是包含实体定义的文件,例如在使用 TypeORM(一个 TypeScript 和 JavaScript 的 ORM 框架)时,用于定义数据库实体的文件。 :::

typeorm 的 synchronize 有什么用? [BY GPT]

typeorm 是一个用于 TypeScript 和 JavaScript 的对象关系映射(ORM)库,用于在应用程序和数据库之间进行数据映射。在 typeorm 中,synchronize 是一个用于自动创建数据库表结构的选项。

当你使用 synchronize 时,typeorm 会检查你的实体类(Entity)的定义,并确保数据库中存在相应的表。如果表不存在,它会尝试创建表。这在开发过程中很方便,因为你不必手动创建数据库表,而是可以依赖 typeorm 自动处理。

但要注意,在生产环境中,最好不要使用 synchronize。这是因为在生产环境中,你可能希望对数据库表的结构进行更严格的控制,并且手动管理数据库迁移(migration)。手动管理迁移可以更好地掌握数据库结构的演变,确保在更新应用程序时不会丢失数据或造成不必要的数据迁移问题。

在开发阶段,你可能会方便地使用 synchronize,但在生产环境中,最好使用数据库迁移工具(如 TypeORM 的迁移工具)来管理数据库的结构变化。这样可以更好地跟踪数据库模式的演进,并在需要时执行有序的数据库升级。

TIP

收到的 id 是 string 类型,为什么在 service 里还是能找到这条?[GPT]

在 TypeScript 中,当你在 Controller 接收 GET 请求参数时,即使你声明id的类型为number,它仍然可以接受传入的字符串,而 TypeORM 的findOneBy方法也可以正常工作。这是因为 TypeORM 的findOneBy方法会自动进行类型转换。

TypeORM 的findOneBy方法会检查传递给它的查询条件,并尝试将其中的属性与实体的列进行类型匹配。如果实体定义中指定了idnumber类型,而你传递了一个字符串,TypeORM 会尝试将字符串转换为数字,以便与数据库中的列进行比较。

这种行为是由 TypeORM 的查询构建器和数据映射机制支持的。在这种情况下,TypeORM 会尽量进行合适的类型转换,以确保查询条件与数据库列的类型匹配。这种自动类型转换可以提高代码的灵活性,但同时也需要注意在边界情况下进行明确的类型转换,以避免潜在的错误。

在这种情况下,即使你的 Controller 接收到的参数是字符串,TypeORM 会尝试将其转换为匹配实体列类型的值。因此,在使用findOneBy时,你通常不需要手动进行类型转换。

TIP

前端 id 传字符串 或者 数字,这个后端是自动转换好,还是要做异常提示?[GPT]

在一些框架和库中,比如 Express 和 NestJS(通过 TypeORM 等库),后端通常会尝试自动进行类型转换,而不会直接导致异常。这种自动类型转换的行为是为了提高开发的灵活性,使得开发者在接收前端请求时不必过于担心传递参数的精确类型。

例如,在 Express 中,路由处理函数可以通过 req.params 获取 URL 中的参数,而这些参数的类型通常是字符串。当你在路由处理函数中使用这些参数时,Express 会尝试自动将其转换为适当的类型。这可能包括将字符串转换为数字、布尔值等,以适应你在路由处理函数中的预期类型。

尽管这样的自动类型转换很方便,但在一些情况下,可能会导致意外的行为。例如,如果你的路由处理函数期望一个数字,但实际传递了一个无法转换为数字的字符串,可能会导致错误。因此,有时在接收参数之前,进行显式的类型验证或转换可能是一个好的实践,以确保参数符合预期。

在 NestJS 中,使用 TypeORM 进行数据库操作时,通常也能够处理这些类型转换。TypeORM 会根据实体定义的类型信息,尝试将接收到的参数转换为相应的类型,从而与数据库中的列进行匹配。但同样,注意确保传递的参数是符合预期的,以避免潜在的错误。

综上所述,虽然许多后端框架会尝试进行自动类型转换,但在关键的地方,特别是需要保证类型准确性的情况下,最好进行显式的类型验证或转换,并在需要时提供适当的异常处理和错误提示。

处理前端传递的参数并进行类型转换的最佳实践是使用 Pipes

通过使用 DTO 和 Pipes,你能够将参数的验证和类型转换与业务逻辑解耦,并确保接收到的参数符合预期的类型。这有助于提高代码的可维护性和可读性。

前端如何通过 GET 方法传对象或数组

推荐使用 query-string

ts
import queryString from 'query-string';
 
 const data = {
   key1: 'value1',
@@ -194,7 +194,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p
 fetch(url)
   .then((response) => response.json())
   .then((data) => console.log(data))
-  .catch((error) => console.error('Error:', error));

一对多和多对一

假设一个用户有多张图片,这样就是一对多(oneToMany)的场景。那么对于图片表里来说,就是多张图片对应一个用户(manyToOne)。

现在需要【通过用户 id 查询用户和用户对应的图片集】

  1. 新建 photo.entity
  2. 改造user.entity
  3. 如果未使用 glob模式 则需在app.module.tsentities中填入photo.entity
  4. 改造user.service中的方法
ts
// photo.entity.ts ,且把他放在user文件夹中
+  .catch((error) => console.error('Error:', error));

一对多和多对一

假设一个用户有多张图片,这样就是一对多(oneToMany)的场景。那么对于图片表里来说,就是多张图片对应一个用户(manyToOne)。

现在需要【通过用户 id 查询用户和用户对应的图片集】

  1. 新建 photo.entity
  2. 改造user.entity
  3. 如果未使用 glob模式 则需在app.module.tsentities中填入photo.entity
  4. 改造user.service中的方法
ts
// photo.entity.ts ,且把他放在user文件夹中
 import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
 import { User } from './user.entity';
 
@@ -261,7 +261,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const p
     });
     return res;
   }
-}

然后请求http://localhost:3000/user/{用户id}

更多用法,参照链接

设置订阅者 subscriber

使用 TypeORM subscribers,你可以监听特定的实体事件。

步骤

  1. 新建user.subscriber.ts文件
  2. user.module中添加 UserSubscriber provider
  3. 测试
ts
// user.subscriber.ts
+}

然后请求http://localhost:3000/user/{用户id}

更多用法,参照链接

设置订阅者 subscriber

使用 TypeORM subscribers,你可以监听特定的实体事件。

步骤

  1. 新建user.subscriber.ts文件
  2. user.module中添加 UserSubscriber provider
  3. 测试
ts
// user.subscriber.ts
 import {
   DataSource,
   EntitySubscriberInterface,
diff --git "a/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.js" "b/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.js"
similarity index 99%
rename from "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.js"
rename to "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.js"
index 14760ce..fcebf5e 100644
--- "a/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.js"
+++ "b/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/中间件.md","filePath":"cn/back-end/nestjs/中间件.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/中间件.md"},l=n(`

创建中间件

ts
import { Injectable, NestMiddleware } from '@nestjs/common';
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/中间件.md","filePath":"cn/back-end/nestjs/中间件.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/中间件.md"},l=n(`

创建中间件

ts
import { Injectable, NestMiddleware } from '@nestjs/common';
 import { Request, Response, NextFunction } from 'express';
 
 @Injectable()
diff --git "a/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.lean.js" "b/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.lean.js"
similarity index 85%
rename from "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.lean.js"
rename to "assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.lean.js"
index d3ecff4..88b687d 100644
--- "a/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.DDcoszTZ.lean.js"
+++ "b/assets/cn_back-end_nestjs_\344\270\255\351\227\264\344\273\266.md.I4uhgMQ0.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/中间件.md","filePath":"cn/back-end/nestjs/中间件.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/中间件.md"},l=n("",10),p=[l];function t(h,k,r,d,E,o){return a(),i("div",null,p)}const y=s(e,[["render",t]]);export{g as __pageData,y as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/中间件.md","filePath":"cn/back-end/nestjs/中间件.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/中间件.md"},l=n("",10),p=[l];function t(h,k,r,d,E,o){return a(),i("div",null,p)}const y=s(e,[["render",t]]);export{g as __pageData,y as default};
diff --git "a/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.js" "b/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.js"
similarity index 96%
rename from "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.js"
rename to "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.js"
index bd9dba6..4506852 100644
--- "a/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.js"
+++ "b/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/守卫.md","filePath":"cn/back-end/nestjs/守卫.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/守卫.md"},p=n(`

守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。

守卫有一个 单一职责。 它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否将由路由处理程序处理。 这通常称为 authorization。

授权守卫

ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/守卫.md","filePath":"cn/back-end/nestjs/守卫.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/守卫.md"},p=n(`

守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。

守卫有一个 单一职责。 它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否将由路由处理程序处理。 这通常称为 authorization。

授权守卫

ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
 import { Observable } from 'rxjs';
 
 @Injectable()
@@ -39,7 +39,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y
     },
   ],
 })
-export class AppModule {}

注意

依赖注入方面,从任何模块外部注册的全局守卫(如上例中的 useGlobalGuards())不能注入依赖,因为这是在任何模块的上下文之外完成的。

为每个处理程序设置角色

ts
// roles.decorator.ts;
+export class AppModule {}

注意

依赖注入方面,从任何模块外部注册的全局守卫(如上例中的 useGlobalGuards())不能注入依赖,因为这是在任何模块的上下文之外完成的。

为每个处理程序设置角色

ts
// roles.decorator.ts;
 import { SetMetadata } from '@nestjs/common';
 
 export const Roles = (...roles: string[]) => SetMetadata('roles', roles);
ts
// cats.controller.ts
@@ -70,4 +70,4 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y
     const user = request.user;
     return matchRoles(roles, user.roles);
   }
-}
`,7),e=[p];function t(h,k,r,d,E,c){return a(),i("div",null,e)}const o=s(l,[["render",t]]);export{y as __pageData,o as default}; +}
`,7),e=[p];function t(h,k,r,d,E,g){return a(),i("div",null,e)}const o=s(l,[["render",t]]);export{y as __pageData,o as default}; diff --git "a/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.lean.js" "b/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.lean.js" similarity index 71% rename from "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.lean.js" rename to "assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.lean.js" index 089e7be..dcc5161 100644 --- "a/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.EZXxCR6r.lean.js" +++ "b/assets/cn_back-end_nestjs_\345\256\210\345\215\253.md.i9ye8GqR.lean.js" @@ -1 +1 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/守卫.md","filePath":"cn/back-end/nestjs/守卫.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/守卫.md"},p=n("",7),e=[p];function t(h,k,r,d,E,c){return a(),i("div",null,e)}const o=s(l,[["render",t]]);export{y as __pageData,o as default}; +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/守卫.md","filePath":"cn/back-end/nestjs/守卫.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/守卫.md"},p=n("",7),e=[p];function t(h,k,r,d,E,g){return a(),i("div",null,e)}const o=s(l,[["render",t]]);export{y as __pageData,o as default}; diff --git "a/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.js" "b/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.js" similarity index 97% rename from "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.js" rename to "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.js" index 0a975ba..028cb77 100644 --- "a/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.js" +++ "b/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.js" @@ -1,10 +1,10 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/异常过滤器.md","filePath":"cn/back-end/nestjs/异常过滤器.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/nestjs/异常过滤器.md"},l=n(`

抛出标准异常

ts
@Get()
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/异常过滤器.md","filePath":"cn/back-end/nestjs/异常过滤器.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/nestjs/异常过滤器.md"},l=n(`

抛出标准异常

ts
@Get()
 async findAll() {
   throw new HttpException('Forbidden', HttpStatus.FORBIDDEN); 
 }

返回

json
{
   "statusCode": 403,
   "message": "Forbidden"
-}

HttpException 接收两个必需参数:

  • response JSON 响应主体
  • status HTTP 状态码,要使用 HttpStatus 枚举

要仅覆盖 JSON 响应正文的消息部分,请在 response 参数中提供一个字符串。 要覆盖整个 JSON 响应主体,请在 response 参数中传递一个对象。

异常过滤器的创建和绑定

有时你可能希望根据某些动态因素添加日志记录或使用不同的 JSON 模式,可以使用异常过滤器

新建 http-exception.filter.ts

ts
// http-exception.filter.ts
+}

HttpException 接收两个必需参数:

  • response JSON 响应主体
  • status HTTP 状态码,要使用 HttpStatus 枚举

要仅覆盖 JSON 响应正文的消息部分,请在 response 参数中提供一个字符串。 要覆盖整个 JSON 响应主体,请在 response 参数中传递一个对象。

异常过滤器的创建和绑定

有时你可能希望根据某些动态因素添加日志记录或使用不同的 JSON 模式,可以使用异常过滤器

新建 http-exception.filter.ts

ts
// http-exception.filter.ts
 import {
   ExceptionFilter,
   Catch,
diff --git "a/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.lean.js" "b/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.lean.js"
similarity index 86%
rename from "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.lean.js"
rename to "assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.lean.js"
index ddcfcfa..01a23f9 100644
--- "a/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.DX9dkiWs.lean.js"
+++ "b/assets/cn_back-end_nestjs_\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.md.VkzUvKXb.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/异常过滤器.md","filePath":"cn/back-end/nestjs/异常过滤器.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/nestjs/异常过滤器.md"},l=n("",14),e=[l];function t(h,k,r,E,d,c){return a(),i("div",null,e)}const b=s(p,[["render",t]]);export{o as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/异常过滤器.md","filePath":"cn/back-end/nestjs/异常过滤器.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/nestjs/异常过滤器.md"},l=n("",14),e=[l];function t(h,k,r,E,d,c){return a(),i("div",null,e)}const b=s(p,[["render",t]]);export{o as __pageData,b as default};
diff --git "a/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.js" "b/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.js"
similarity index 99%
rename from "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.js"
rename to "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.js"
index 7905203..82f7f01 100644
--- "a/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.js"
+++ "b/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/快速开始.md","filePath":"cn/back-end/nestjs/快速开始.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/快速开始.md"},t=n(`

快速开始

介绍

参考

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。 它使用渐进式 JavaScript,构建并完全支持 TypeScript(但仍然允许开发者使用纯 JavaScript 进行编码)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。

在幕后,Nest 使用强大的 HTTP 服务器框架,如 Express(默认),也可以选择配置为使用 Fastify!

Nest 在这些常见的 Node.js 框架(Express/Fastify)之上提供了一个抽象级别,但也直接向开发者公开了它们的 API。 这使开发者可以自由使用可用于底层平台的无数第三方模块。

创建项目

  1. npx nest new nest-starter
  2. 全局安装 cli,目前 cli 版本 10.1.11 2023 年 8 月 12 日
sh
npm install -g @nestjs/cli
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/快速开始.md","filePath":"cn/back-end/nestjs/快速开始.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/快速开始.md"},t=n(`

快速开始

介绍

参考

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。 它使用渐进式 JavaScript,构建并完全支持 TypeScript(但仍然允许开发者使用纯 JavaScript 进行编码)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。

在幕后,Nest 使用强大的 HTTP 服务器框架,如 Express(默认),也可以选择配置为使用 Fastify!

Nest 在这些常见的 Node.js 框架(Express/Fastify)之上提供了一个抽象级别,但也直接向开发者公开了它们的 API。 这使开发者可以自由使用可用于底层平台的无数第三方模块。

创建项目

  1. npx nest new nest-starter
  2. 全局安装 cli,目前 cli 版本 10.1.11 2023 年 8 月 12 日
sh
npm install -g @nestjs/cli
 nest new nest-starter

生成样板文件,创建 src 目录,并在其中添加了几个核心文件。

sh
app.controller.ts	# 具有单一路由的基本控制器。
 app.controller.spec.ts	# 控制器的单元测试。
 app.module.ts	# 应用的根模块。
diff --git "a/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.lean.js" "b/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.lean.js"
similarity index 86%
rename from "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.lean.js"
rename to "assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.lean.js"
index 35e3c1c..e0d81a4 100644
--- "a/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.BAXasixq.lean.js"
+++ "b/assets/cn_back-end_nestjs_\345\277\253\351\200\237\345\274\200\345\247\213.md.DnhWty34.lean.js"
@@ -1 +1 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/快速开始.md","filePath":"cn/back-end/nestjs/快速开始.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/快速开始.md"},t=n("",14),l=[t];function p(h,r,k,d,c,o){return i(),a("div",null,l)}const b=s(e,[["render",p]]);export{g as __pageData,b as default};
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/快速开始.md","filePath":"cn/back-end/nestjs/快速开始.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/快速开始.md"},t=n("",14),l=[t];function p(h,r,k,d,c,o){return i(),a("div",null,l)}const b=s(e,[["render",p]]);export{g as __pageData,b as default};
diff --git "a/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.js" "b/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.js"
similarity index 97%
rename from "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.js"
rename to "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.js"
index 1e7e193..c6e101c 100644
--- "a/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.js"
+++ "b/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/拦截器.md","filePath":"cn/back-end/nestjs/拦截器.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/拦截器.md"},p=n(`

拦截器是用 @Injectable() 装饰器注释并实现 NestInterceptor 接口的类。

使用场景

  • 在方法执行之前/之后绑定额外的逻辑
  • 转换函数返回的结果
  • 转换函数抛出的异常
  • 扩展基本功能行为
  • 根据特定条件完全覆盖函数(例如,出于缓存目的)

切面拦截

ts
// logging.interceptor.ts
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/拦截器.md","filePath":"cn/back-end/nestjs/拦截器.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/拦截器.md"},p=n(`

拦截器是用 @Injectable() 装饰器注释并实现 NestInterceptor 接口的类。

使用场景

  • 在方法执行之前/之后绑定额外的逻辑
  • 转换函数返回的结果
  • 转换函数抛出的异常
  • 扩展基本功能行为
  • 根据特定条件完全覆盖函数(例如,出于缓存目的)

切面拦截

ts
// logging.interceptor.ts
 
 import { tap } from 'rxjs/operators';
 import {
diff --git "a/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.lean.js" "b/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.lean.js"
similarity index 85%
rename from "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.lean.js"
rename to "assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.lean.js"
index 49afb80..b2b4f0f 100644
--- "a/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.V89VkhOL.lean.js"
+++ "b/assets/cn_back-end_nestjs_\346\213\246\346\210\252\345\231\250.md.DTW8NnCg.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/拦截器.md","filePath":"cn/back-end/nestjs/拦截器.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/拦截器.md"},p=n("",8),h=[p];function t(e,k,r,E,d,g){return a(),i("div",null,h)}const F=s(l,[["render",t]]);export{c as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/拦截器.md","filePath":"cn/back-end/nestjs/拦截器.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/拦截器.md"},p=n("",8),h=[p];function t(e,k,r,E,d,g){return a(),i("div",null,h)}const F=s(l,[["render",t]]);export{c as __pageData,F as default};
diff --git "a/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.js" "b/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.js"
similarity index 99%
rename from "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.js"
rename to "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.js"
index abef7a1..3fb34ec 100644
--- "a/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.js"
+++ "b/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/控制器.md","filePath":"cn/back-end/nestjs/控制器.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/控制器.md"},p=n(`

控制器文件

cats.controller.ts,使用 nestjs 提供的装饰器来处理请求和响应

WARNING

代码中有 使用 nestjs 提供的装饰器来处理请求和响应使用Express 请求和响应对象的比较

ts
import {
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/控制器.md","filePath":"cn/back-end/nestjs/控制器.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/控制器.md"},p=n(`

控制器文件

cats.controller.ts,使用 nestjs 提供的装饰器来处理请求和响应

WARNING

代码中有 使用 nestjs 提供的装饰器来处理请求和响应使用Express 请求和响应对象的比较

ts
import {
   Controller,
   Get,
   Post,
diff --git "a/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.lean.js" "b/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.lean.js"
similarity index 85%
rename from "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.lean.js"
rename to "assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.lean.js"
index cac8a2a..d5bc1d6 100644
--- "a/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.Dfc9f8Pz.lean.js"
+++ "b/assets/cn_back-end_nestjs_\346\216\247\345\210\266\345\231\250.md.CxDWQf7D.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/控制器.md","filePath":"cn/back-end/nestjs/控制器.md","lastUpdated":1719277083000}'),l={name:"cn/back-end/nestjs/控制器.md"},p=n("",8),h=[p];function k(e,t,r,E,d,g){return a(),i("div",null,h)}const F=s(l,[["render",k]]);export{c as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/控制器.md","filePath":"cn/back-end/nestjs/控制器.md","lastUpdated":1720682010000}'),l={name:"cn/back-end/nestjs/控制器.md"},p=n("",8),h=[p];function k(e,t,r,E,d,g){return a(),i("div",null,h)}const F=s(l,[["render",k]]);export{c as __pageData,F as default};
diff --git "a/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.js" "b/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.js"
similarity index 98%
rename from "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.js"
rename to "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.js"
index 8d266b3..b8ae812 100644
--- "a/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.js"
+++ "b/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const l="/assets/zod-validation-pipe.Bu6unImr.png",o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/管道.md","filePath":"cn/back-end/nestjs/管道.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/nestjs/管道.md"},e=n(`

管道是用 @Injectable() 装饰器注释的类,它实现了 PipeTransform 接口。

使用场景

  • transformation: 将输入数据转换为所需的形式(例如,从字符串到整数)
  • validation: 评估输入数据,如果有效,只需将其原样传递; 否则抛出异常

绑定管道

内置管道 ParseIntPipe 例子

ts
import { ParseIntPipe } from "@nest/common"
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const l="/assets/zod-validation-pipe.Bu6unImr.png",o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/管道.md","filePath":"cn/back-end/nestjs/管道.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/nestjs/管道.md"},e=n(`

管道是用 @Injectable() 装饰器注释的类,它实现了 PipeTransform 接口。

使用场景

  • transformation: 将输入数据转换为所需的形式(例如,从字符串到整数)
  • validation: 评估输入数据,如果有效,只需将其原样传递; 否则抛出异常

绑定管道

内置管道 ParseIntPipe 例子

ts
import { ParseIntPipe } from "@nest/common"
 
 @Get(':id')
 async findOne(@Param('id', ParseIntPipe) id: number) {  
@@ -7,7 +7,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const l
   "statusCode": 400,
   "message": "Validation failed (numeric string is expected)",
   "error": "Bad Request"
-}

对象模式验证

构建一个使用基于 Zod 的模式的验证管道。

安装 zod npm install --save zod

ts
// zod-validation.pip.ts
+}

对象模式验证

构建一个使用基于 Zod 的模式的验证管道。

安装 zod npm install --save zod

ts
// zod-validation.pip.ts
 import {
   PipeTransform,
   ArgumentMetadata,
@@ -43,7 +43,7 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const l
 @UsePipes(new ZodValidationPipe(createCatSchema))
 create(@Body() createCatDto: CreateCatDto) {
   return this.catsService.create(createCatDto);
-}

使用 postman 测试

image

类验证器

验证技术的替代实现

安装 pnpm add class-validator class-transformer

ts
// class-validation.dto.ts
+}

使用 postman 测试

image

类验证器

验证技术的替代实现

安装 pnpm add class-validator class-transformer

ts
// class-validation.dto.ts
 import {
   PipeTransform,
   Injectable,
diff --git "a/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.lean.js" "b/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.lean.js"
similarity index 86%
rename from "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.lean.js"
rename to "assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.lean.js"
index 0c79f80..4f978c5 100644
--- "a/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.cElApXSp.lean.js"
+++ "b/assets/cn_back-end_nestjs_\347\256\241\351\201\223.md.DOHXArpm.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const l="/assets/zod-validation-pipe.Bu6unImr.png",o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/管道.md","filePath":"cn/back-end/nestjs/管道.md","lastUpdated":1719277083000}'),p={name:"cn/back-end/nestjs/管道.md"},e=n("",32),t=[e];function h(k,r,E,d,g,c){return a(),i("div",null,t)}const b=s(p,[["render",h]]);export{o as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const l="/assets/zod-validation-pipe.Bu6unImr.png",o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/管道.md","filePath":"cn/back-end/nestjs/管道.md","lastUpdated":1720682010000}'),p={name:"cn/back-end/nestjs/管道.md"},e=n("",32),t=[e];function h(k,r,E,d,g,c){return a(),i("div",null,t)}const b=s(p,[["render",h]]);export{o as __pageData,b as default};
diff --git "a/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.js" "b/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.js"
similarity index 95%
rename from "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.js"
rename to "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.js"
index ef0f4d7..f17aa53 100644
--- "a/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.js"
+++ "b/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/自定义装饰器.md","filePath":"cn/back-end/nestjs/自定义装饰器.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/自定义装饰器.md"},t=n(`

在 node.js 世界中,将属性附加到 request 对象是常见的做法。 然后在每个路由处理程序中手动提取它们,使用如下代码:

ts
const user = req.user;

为了使你的代码更具可读性和透明性,你可以创建一个 @User() 装饰器并在所有控制器中重复使用它。

ts
// user.decorator.ts
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/自定义装饰器.md","filePath":"cn/back-end/nestjs/自定义装饰器.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/自定义装饰器.md"},t=n(`

在 node.js 世界中,将属性附加到 request 对象是常见的做法。 然后在每个路由处理程序中手动提取它们,使用如下代码:

ts
const user = req.user;

为了使你的代码更具可读性和透明性,你可以创建一个 @User() 装饰器并在所有控制器中重复使用它。

ts
// user.decorator.ts
 import { createParamDecorator, ExecutionContext } from '@nestjs/common';
 
 export const User = createParamDecorator(
diff --git "a/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.lean.js" "b/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.lean.js"
similarity index 86%
rename from "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.lean.js"
rename to "assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.lean.js"
index a78a734..65cc510 100644
--- "a/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BiTGODGM.lean.js"
+++ "b/assets/cn_back-end_nestjs_\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.md.BYcopKev.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/自定义装饰器.md","filePath":"cn/back-end/nestjs/自定义装饰器.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/nestjs/自定义装饰器.md"},t=n("",4),p=[t];function l(h,k,r,d,c,E){return a(),i("div",null,p)}const y=s(e,[["render",l]]);export{o as __pageData,y as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/nestjs/自定义装饰器.md","filePath":"cn/back-end/nestjs/自定义装饰器.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/nestjs/自定义装饰器.md"},t=n("",4),p=[t];function l(h,k,r,d,c,E){return a(),i("div",null,p)}const y=s(e,[["render",l]]);export{o as __pageData,y as default};
diff --git "a/assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.js" "b/assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.js"
similarity index 99%
rename from "assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.js"
rename to "assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.js"
index eee8187..fc13dee 100644
--- "a/assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.js"
+++ "b/assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/变量.md","filePath":"cn/back-end/python/变量.md","lastUpdated":1719277083000}'),h={name:"cn/back-end/python/变量.md"},l=n(`

变量

Python 中的变量赋值不需要类型声明。

标准数据类型

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

多变量赋值

py
a = b = c = 1
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/变量.md","filePath":"cn/back-end/python/变量.md","lastUpdated":1720682010000}'),h={name:"cn/back-end/python/变量.md"},l=n(`

变量

Python 中的变量赋值不需要类型声明。

标准数据类型

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

多变量赋值

py
a = b = c = 1
 a, b, c = 1, 2, "john"

删除一些对象的引用

py
var1 = 1
 var2 = 2
 
diff --git "a/assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.lean.js" "b/assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.lean.js"
similarity index 85%
rename from "assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.lean.js"
rename to "assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.lean.js"
index 2b61277..4332161 100644
--- "a/assets/cn_back-end_python_\345\217\230\351\207\217.md.B--yoY4V.lean.js"
+++ "b/assets/cn_back-end_python_\345\217\230\351\207\217.md.BHrR-lVv.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/变量.md","filePath":"cn/back-end/python/变量.md","lastUpdated":1719277083000}'),h={name:"cn/back-end/python/变量.md"},l=n("",23),p=[l];function k(t,e,r,E,d,y){return a(),i("div",null,p)}const F=s(h,[["render",k]]);export{c as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"变量","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/变量.md","filePath":"cn/back-end/python/变量.md","lastUpdated":1720682010000}'),h={name:"cn/back-end/python/变量.md"},l=n("",23),p=[l];function k(t,e,r,E,d,y){return a(),i("div",null,p)}const F=s(h,[["render",k]]);export{c as __pageData,F as default};
diff --git "a/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.js" "b/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.js"
similarity index 99%
rename from "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.js"
rename to "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.js"
index d9d1079..8ae740b 100644
--- "a/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.js"
+++ "b/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/快速开始.md","filePath":"cn/back-end/python/快速开始.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/python/快速开始.md"},p=n(`

快速开始

安装

官网下载安装

windows 安装 v3.12.2 成功后测试

py-1

开发相关

  • 开发工具 vscode
  • 格式化插件 yapf 参考

NOTE THAT

python 遵循严格的缩进格式,每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用

多行语句

py
total = item_one + \\
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/快速开始.md","filePath":"cn/back-end/python/快速开始.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/python/快速开始.md"},p=n(`

快速开始

安装

官网下载安装

windows 安装 v3.12.2 成功后测试

py-1

开发相关

  • 开发工具 vscode
  • 格式化插件 yapf 参考

NOTE THAT

python 遵循严格的缩进格式,每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用

多行语句

py
total = item_one + \\
         item_two + \\
         item_three
 
diff --git "a/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.lean.js" "b/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.lean.js"
similarity index 86%
rename from "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.lean.js"
rename to "assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.lean.js"
index ab273d9..2e2bac3 100644
--- "a/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.Bep3XAyt.lean.js"
+++ "b/assets/cn_back-end_python_\345\277\253\351\200\237\345\274\200\345\247\213.md.oG_Uc0gX.lean.js"
@@ -1 +1 @@
-import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/快速开始.md","filePath":"cn/back-end/python/快速开始.md","lastUpdated":1719277083000}'),e={name:"cn/back-end/python/快速开始.md"},p=n("",15),l=[p];function t(h,r,k,d,c,o){return i(),a("div",null,l)}const u=s(e,[["render",t]]);export{b as __pageData,u as default};
+import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/back-end/python/快速开始.md","filePath":"cn/back-end/python/快速开始.md","lastUpdated":1720682010000}'),e={name:"cn/back-end/python/快速开始.md"},p=n("",15),l=[p];function t(h,r,k,d,c,o){return i(),a("div",null,l)}const u=s(e,[["render",t]]);export{b as __pageData,u as default};
diff --git a/assets/cn_embedded-system_esp8266_control.md.CA-jCI-v.js b/assets/cn_embedded-system_esp8266_control.md.DSoEfOfS.js
similarity index 93%
rename from assets/cn_embedded-system_esp8266_control.md.CA-jCI-v.js
rename to assets/cn_embedded-system_esp8266_control.md.DSoEfOfS.js
index 6730b86..96da1dc 100644
--- a/assets/cn_embedded-system_esp8266_control.md.CA-jCI-v.js
+++ b/assets/cn_embedded-system_esp8266_control.md.DSoEfOfS.js
@@ -1,2 +1,2 @@
 const __vite__fileDeps=["assets/chunks/control.D6cU2oQk.js","assets/chunks/mqtt.esm.DWiH5-9w.js","assets/chunks/theme.NQjD_CgT.js","assets/chunks/framework.wLg4U0bT.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
-import{N as a,k as s,u as o,Z as e,P as r,M as n,aG as d,aH as c}from"./chunks/framework.wLg4U0bT.js";const l=e("h2",{id:"esp8266-内置灯控制",tabindex:"-1"},[r("ESP8266 内置灯控制 "),e("a",{class:"header-anchor",href:"#esp8266-内置灯控制","aria-label":'Permalink to "ESP8266 内置灯控制"'},"​")],-1),f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/control.md","filePath":"cn/embedded-system/esp8266/control.md","lastUpdated":1719277083000}'),_={name:"cn/embedded-system/esp8266/control.md"},h=Object.assign(_,{setup(i){const t=d(()=>c(()=>import("./chunks/control.D6cU2oQk.js"),__vite__mapDeps([0,1,2,3])));return(m,p)=>(n(),a("div",null,[l,s(o(t))]))}});export{f as __pageData,h as default};
+import{N as a,k as s,u as o,Z as e,P as r,M as n,aG as d,aH as c}from"./chunks/framework.wLg4U0bT.js";const l=e("h2",{id:"esp8266-内置灯控制",tabindex:"-1"},[r("ESP8266 内置灯控制 "),e("a",{class:"header-anchor",href:"#esp8266-内置灯控制","aria-label":'Permalink to "ESP8266 内置灯控制"'},"​")],-1),f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/control.md","filePath":"cn/embedded-system/esp8266/control.md","lastUpdated":1720682010000}'),_={name:"cn/embedded-system/esp8266/control.md"},h=Object.assign(_,{setup(i){const t=d(()=>c(()=>import("./chunks/control.D6cU2oQk.js"),__vite__mapDeps([0,1,2,3])));return(m,p)=>(n(),a("div",null,[l,s(o(t))]))}});export{f as __pageData,h as default};
diff --git a/assets/cn_embedded-system_esp8266_control.md.CA-jCI-v.lean.js b/assets/cn_embedded-system_esp8266_control.md.DSoEfOfS.lean.js
similarity index 93%
rename from assets/cn_embedded-system_esp8266_control.md.CA-jCI-v.lean.js
rename to assets/cn_embedded-system_esp8266_control.md.DSoEfOfS.lean.js
index 6730b86..96da1dc 100644
--- a/assets/cn_embedded-system_esp8266_control.md.CA-jCI-v.lean.js
+++ b/assets/cn_embedded-system_esp8266_control.md.DSoEfOfS.lean.js
@@ -1,2 +1,2 @@
 const __vite__fileDeps=["assets/chunks/control.D6cU2oQk.js","assets/chunks/mqtt.esm.DWiH5-9w.js","assets/chunks/theme.NQjD_CgT.js","assets/chunks/framework.wLg4U0bT.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
-import{N as a,k as s,u as o,Z as e,P as r,M as n,aG as d,aH as c}from"./chunks/framework.wLg4U0bT.js";const l=e("h2",{id:"esp8266-内置灯控制",tabindex:"-1"},[r("ESP8266 内置灯控制 "),e("a",{class:"header-anchor",href:"#esp8266-内置灯控制","aria-label":'Permalink to "ESP8266 内置灯控制"'},"​")],-1),f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/control.md","filePath":"cn/embedded-system/esp8266/control.md","lastUpdated":1719277083000}'),_={name:"cn/embedded-system/esp8266/control.md"},h=Object.assign(_,{setup(i){const t=d(()=>c(()=>import("./chunks/control.D6cU2oQk.js"),__vite__mapDeps([0,1,2,3])));return(m,p)=>(n(),a("div",null,[l,s(o(t))]))}});export{f as __pageData,h as default};
+import{N as a,k as s,u as o,Z as e,P as r,M as n,aG as d,aH as c}from"./chunks/framework.wLg4U0bT.js";const l=e("h2",{id:"esp8266-内置灯控制",tabindex:"-1"},[r("ESP8266 内置灯控制 "),e("a",{class:"header-anchor",href:"#esp8266-内置灯控制","aria-label":'Permalink to "ESP8266 内置灯控制"'},"​")],-1),f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/control.md","filePath":"cn/embedded-system/esp8266/control.md","lastUpdated":1720682010000}'),_={name:"cn/embedded-system/esp8266/control.md"},h=Object.assign(_,{setup(i){const t=d(()=>c(()=>import("./chunks/control.D6cU2oQk.js"),__vite__mapDeps([0,1,2,3])));return(m,p)=>(n(),a("div",null,[l,s(o(t))]))}});export{f as __pageData,h as default};
diff --git a/assets/cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.js b/assets/cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.js
similarity index 93%
rename from assets/cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.js
rename to assets/cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.js
index 6632525..687c718 100644
--- a/assets/cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.js
+++ b/assets/cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.js
@@ -1,2 +1,2 @@
 const __vite__fileDeps=["assets/chunks/MqttClient.DaFDks4j.js","assets/chunks/mqtt.esm.DWiH5-9w.js","assets/chunks/framework.wLg4U0bT.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
-import{N as a,k as s,u as n,Z as e,P as d,M as r,aG as c,aH as o}from"./chunks/framework.wLg4U0bT.js";const i=e("h1",{id:"mqtt-简易客户端",tabindex:"-1"},[d("MQTT 简易客户端 "),e("a",{class:"header-anchor",href:"#mqtt-简易客户端","aria-label":'Permalink to "MQTT 简易客户端"'},"​")],-1),f=JSON.parse('{"title":"MQTT 简易客户端","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/mqtt-client.md","filePath":"cn/embedded-system/esp8266/mqtt-client.md","lastUpdated":1719277083000}'),m={name:"cn/embedded-system/esp8266/mqtt-client.md"},h=Object.assign(m,{setup(l){const t=c(()=>o(()=>import("./chunks/MqttClient.DaFDks4j.js"),__vite__mapDeps([0,1,2])));return(_,p)=>(r(),a("div",null,[i,s(n(t))]))}});export{f as __pageData,h as default};
+import{N as a,k as s,u as n,Z as e,P as d,M as r,aG as c,aH as o}from"./chunks/framework.wLg4U0bT.js";const i=e("h1",{id:"mqtt-简易客户端",tabindex:"-1"},[d("MQTT 简易客户端 "),e("a",{class:"header-anchor",href:"#mqtt-简易客户端","aria-label":'Permalink to "MQTT 简易客户端"'},"​")],-1),f=JSON.parse('{"title":"MQTT 简易客户端","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/mqtt-client.md","filePath":"cn/embedded-system/esp8266/mqtt-client.md","lastUpdated":1720682010000}'),m={name:"cn/embedded-system/esp8266/mqtt-client.md"},h=Object.assign(m,{setup(l){const t=c(()=>o(()=>import("./chunks/MqttClient.DaFDks4j.js"),__vite__mapDeps([0,1,2])));return(_,p)=>(r(),a("div",null,[i,s(n(t))]))}});export{f as __pageData,h as default};
diff --git a/assets/cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.lean.js b/assets/cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.lean.js
similarity index 93%
rename from assets/cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.lean.js
rename to assets/cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.lean.js
index 6632525..687c718 100644
--- a/assets/cn_embedded-system_esp8266_mqtt-client.md.BqYx6jQ0.lean.js
+++ b/assets/cn_embedded-system_esp8266_mqtt-client.md.BJ3hm7BS.lean.js
@@ -1,2 +1,2 @@
 const __vite__fileDeps=["assets/chunks/MqttClient.DaFDks4j.js","assets/chunks/mqtt.esm.DWiH5-9w.js","assets/chunks/framework.wLg4U0bT.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
-import{N as a,k as s,u as n,Z as e,P as d,M as r,aG as c,aH as o}from"./chunks/framework.wLg4U0bT.js";const i=e("h1",{id:"mqtt-简易客户端",tabindex:"-1"},[d("MQTT 简易客户端 "),e("a",{class:"header-anchor",href:"#mqtt-简易客户端","aria-label":'Permalink to "MQTT 简易客户端"'},"​")],-1),f=JSON.parse('{"title":"MQTT 简易客户端","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/mqtt-client.md","filePath":"cn/embedded-system/esp8266/mqtt-client.md","lastUpdated":1719277083000}'),m={name:"cn/embedded-system/esp8266/mqtt-client.md"},h=Object.assign(m,{setup(l){const t=c(()=>o(()=>import("./chunks/MqttClient.DaFDks4j.js"),__vite__mapDeps([0,1,2])));return(_,p)=>(r(),a("div",null,[i,s(n(t))]))}});export{f as __pageData,h as default};
+import{N as a,k as s,u as n,Z as e,P as d,M as r,aG as c,aH as o}from"./chunks/framework.wLg4U0bT.js";const i=e("h1",{id:"mqtt-简易客户端",tabindex:"-1"},[d("MQTT 简易客户端 "),e("a",{class:"header-anchor",href:"#mqtt-简易客户端","aria-label":'Permalink to "MQTT 简易客户端"'},"​")],-1),f=JSON.parse('{"title":"MQTT 简易客户端","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/mqtt-client.md","filePath":"cn/embedded-system/esp8266/mqtt-client.md","lastUpdated":1720682010000}'),m={name:"cn/embedded-system/esp8266/mqtt-client.md"},h=Object.assign(m,{setup(l){const t=c(()=>o(()=>import("./chunks/MqttClient.DaFDks4j.js"),__vite__mapDeps([0,1,2])));return(_,p)=>(r(),a("div",null,[i,s(n(t))]))}});export{f as __pageData,h as default};
diff --git "a/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.js" "b/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.js"
similarity index 99%
rename from "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.js"
rename to "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.js"
index ac851cc..d944f02 100644
--- "a/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.js"
+++ "b/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","filePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","lastUpdated":1719277083000}'),l={name:"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md"},p=n(`

通过 HTTP POST 请求控制 MCU 上的内置 LED 灯

这篇文章同时发表在我的博客

usb 转 串口 ch340h官方驱动下载地址

本文将介绍

  • platform io 的简单使用
  • esp8266 使能一个 GPIO 为输出状态
  • esp8266 的串口输出
  • esp8266 的无线网连接
  • eps8266 的 web service
  • 一款好用的 rest client 插件

新建项目

image.png
现在平台是 NodeMCU 1.0,选择一个自己的目录存储项目。
image.png
需要等一段时间,在这个期间,
image.png
用 VSCODE 打开这个目录。
image.png
看到工程目录如下
image.png
其中 main.cpp是程序的入口文件,lib文件夹存放库文件。platformio.iniplatformio的配置文件。

编写代码

控制 LED 灯的程序:

cpp
#include <Arduino.h>
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","filePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","lastUpdated":1720682010000}'),l={name:"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md"},p=n(`

通过 HTTP POST 请求控制 MCU 上的内置 LED 灯

这篇文章同时发表在我的博客

usb 转 串口 ch340h官方驱动下载地址

本文将介绍

  • platform io 的简单使用
  • esp8266 使能一个 GPIO 为输出状态
  • esp8266 的串口输出
  • esp8266 的无线网连接
  • eps8266 的 web service
  • 一款好用的 rest client 插件

新建项目

image.png
现在平台是 NodeMCU 1.0,选择一个自己的目录存储项目。
image.png
需要等一段时间,在这个期间,
image.png
用 VSCODE 打开这个目录。
image.png
看到工程目录如下
image.png
其中 main.cpp是程序的入口文件,lib文件夹存放库文件。platformio.iniplatformio的配置文件。

编写代码

控制 LED 灯的程序:

cpp
#include <Arduino.h>
 #include <ESP8266WebServer.h> //  ESP8266WebServer库
 #include <ESP8266WiFi.h>
 
diff --git "a/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.lean.js" "b/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.lean.js"
similarity index 88%
rename from "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.lean.js"
rename to "assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.lean.js"
index 15e114b..fa0f941 100644
--- "a/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.BEr8_qY6.lean.js"
+++ "b/assets/cn_embedded-system_esp8266_\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.md.CNiwHqQ2.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","filePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","lastUpdated":1719277083000}'),l={name:"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md"},p=n("",16),e=[p];function h(k,t,r,E,d,g){return a(),i("div",null,e)}const b=s(l,[["render",h]]);export{y as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","filePath":"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md","lastUpdated":1720682010000}'),l={name:"cn/embedded-system/esp8266/使用PlatformIO通过网络控制LED.md"},p=n("",16),e=[p];function h(k,t,r,E,d,g){return a(),i("div",null,e)}const b=s(l,[["render",h]]);export{y as __pageData,b as default};
diff --git a/assets/cn_engineering_index.md.Bc5ppXgh.js b/assets/cn_engineering_index.md.BzreDnDI.js
similarity index 85%
rename from assets/cn_engineering_index.md.Bc5ppXgh.js
rename to assets/cn_engineering_index.md.BzreDnDI.js
index f4dbc0a..0ea64c5 100644
--- a/assets/cn_engineering_index.md.Bc5ppXgh.js
+++ b/assets/cn_engineering_index.md.BzreDnDI.js
@@ -1 +1 @@
-import{_ as e,N as n,M as t,Z as a}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/engineering/index.md","filePath":"cn/engineering/index.md","lastUpdated":1719277083000}'),o={name:"cn/engineering/index.md"},s=a("p",null,"comming soon",-1),i=[s];function r(c,d,_,p,l,m){return t(),n("div",null,i)}const x=e(o,[["render",r]]);export{g as __pageData,x as default};
+import{_ as e,N as n,M as t,Z as a}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/engineering/index.md","filePath":"cn/engineering/index.md","lastUpdated":1720682010000}'),o={name:"cn/engineering/index.md"},s=a("p",null,"comming soon",-1),i=[s];function r(c,d,_,p,l,m){return t(),n("div",null,i)}const x=e(o,[["render",r]]);export{g as __pageData,x as default};
diff --git a/assets/cn_engineering_index.md.Bc5ppXgh.lean.js b/assets/cn_engineering_index.md.BzreDnDI.lean.js
similarity index 85%
rename from assets/cn_engineering_index.md.Bc5ppXgh.lean.js
rename to assets/cn_engineering_index.md.BzreDnDI.lean.js
index f4dbc0a..0ea64c5 100644
--- a/assets/cn_engineering_index.md.Bc5ppXgh.lean.js
+++ b/assets/cn_engineering_index.md.BzreDnDI.lean.js
@@ -1 +1 @@
-import{_ as e,N as n,M as t,Z as a}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/engineering/index.md","filePath":"cn/engineering/index.md","lastUpdated":1719277083000}'),o={name:"cn/engineering/index.md"},s=a("p",null,"comming soon",-1),i=[s];function r(c,d,_,p,l,m){return t(),n("div",null,i)}const x=e(o,[["render",r]]);export{g as __pageData,x as default};
+import{_ as e,N as n,M as t,Z as a}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/engineering/index.md","filePath":"cn/engineering/index.md","lastUpdated":1720682010000}'),o={name:"cn/engineering/index.md"},s=a("p",null,"comming soon",-1),i=[s];function r(c,d,_,p,l,m){return t(),n("div",null,i)}const x=e(o,[["render",r]]);export{g as __pageData,x as default};
diff --git a/assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.js b/assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.js
new file mode 100644
index 0000000..bbbe984
--- /dev/null
+++ b/assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.js
@@ -0,0 +1 @@
+import{_ as t,N as a,M as l,aF as e}from"./chunks/framework.wLg4U0bT.js";const _=JSON.parse('{"title":"前端职级与招聘","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/group-build/rank.md","filePath":"cn/front-end/base/group-build/rank.md","lastUpdated":1720682010000}'),i={name:"cn/front-end/base/group-build/rank.md"},r=e('

前端职级与招聘

Base 太原

V1 Pre-Junior 入门V2 Junior 初级V3 Intermidiate 中级V4 Advanced 高级V5 Tech Lead 技术负责V6 Tech Expert 技术专家
薪资范围[ 3 , 4 ] k( 4 , 6 ] k( 6 , 9 ] k( 9 , 12 ] k( 12 , 15 ] k( 15 , 18 ] k

如何提升

古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。 ―― 陆游《冬夜读书示子聿》

image.png

然后「多复盘多总结」

招聘

简历初筛

加分项:

  • 【前端基础】对底层技术原理有一定(可不深入)理解的
  • 【技术选型】使用三方库,但能有自己的见解,能区分三方库的使用场景和引入项目的利弊
  • 【逻辑思维】能描述清楚自己所做过的业务流程,包括但不限于,模型的抽象,状态的流转等?
  • 【自省好学】善于总结项目经验,并能记录下自己所学所思之人(有技术博客,Github 有大量研究性项目)

减分项:

  • 满篇流水账,如
    • 做了 xxx 项目
    • 实现了 xxx 功能
    • 使用了 xxx(框架/类库等技术名词)
  • 培训班(自学都做不到,迟早会掉队)
  • 前端架构师(前端是整个系统的触手,不存在单独「架构」)

初步沟通

当简历无法清楚判断的使用,可辅助以下问题:

  1. 概述最近一个前端项目整体架构的设计,如模块的划分,技术的选型等,并说明原因(比如三方库引入的目的和结果)。
  2. 选取其中一个业务模块,简述数据结构的设计和状态的流转,及组件的拆分与实现。
  3. 团队的技术栈 ,简单说说自己的理解(可选)

问题 1,2 是为了解应聘者

  • 是否能清楚表述自己做过的事
  • 是否能「带着脑子写代码

问题 3 是为了解应聘者

  • 是否对新技术排斥,能否拥抱变化
  • 能否举一反三

面试

通过上面的流程,其实基本能确定应聘者是否能融入这个团队。 面试时,只需要围绕上面提到的关注点,简单抽查即可:

  • 关于项目的
    • 选一个模块,看看表达是否清晰
  • 技术相关
    • 开源库使用者,问问对应库的基本理念/原理
    • 有一定基础的,问问底层细节,如 DOM,HTTP 等
',23),o=[r];function d(n,h,u,s,c,p){return l(),a("div",null,o)}const k=t(i,[["render",d]]);export{_ as __pageData,k as default}; diff --git a/assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.lean.js b/assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.lean.js new file mode 100644 index 0000000..bedd488 --- /dev/null +++ b/assets/cn_front-end_base_group-build_rank.md.BVKXpQu4.lean.js @@ -0,0 +1 @@ +import{_ as t,N as a,M as l,aF as e}from"./chunks/framework.wLg4U0bT.js";const _=JSON.parse('{"title":"前端职级与招聘","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/group-build/rank.md","filePath":"cn/front-end/base/group-build/rank.md","lastUpdated":1720682010000}'),i={name:"cn/front-end/base/group-build/rank.md"},r=e("",23),o=[r];function d(n,h,u,s,c,p){return l(),a("div",null,o)}const k=t(i,[["render",d]]);export{_ as __pageData,k as default}; diff --git "a/assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.js" "b/assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.js" similarity index 75% rename from "assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.js" rename to "assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.js" index eb4e33a..e894a04 100644 --- "a/assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.js" +++ "b/assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.js" @@ -1,4 +1,4 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"JavaScript 代码书写规范(from ChatGPT)","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/书写规范.md","filePath":"cn/front-end/base/书写规范.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/base/书写规范.md"},e=n(`

JavaScript 代码书写规范(from ChatGPT)

JavaScript 代码规范指的是一套关于如何编写、组织和格式化 JavaScript 代码的一致性规则和指南。这些规范旨在提高代码的可读性、可维护性,并降低团队协作时的摩擦。以下是一些遵循 JavaScript 代码规范的重要意义:

  1. 可读性和可维护性:规范化的代码更容易阅读和理解,使开发者能够快速找到他们需要的信息。这也使得在以后维护和修改代码变得更为容易。

  2. 减少错误和漏洞:一致的代码风格可以降低由于书写错误或者混乱的代码结构导致的错误的可能性。同时,规范也可以提供一些避免常见编码错误的建议。

  3. 团队合作:在团队中使用统一的代码规范可以减少开发者之间的歧义和摩擦。每个人都知道在哪里可以找到特定功能或模块的代码,也知道如何与之交互。

  4. 版本控制:规范的代码更容易与版本控制系统(如 Git)结合使用。在代码合并和比较时,格式一致的代码可以减少合并冲突的可能性。

  5. 提高代码质量:规范可以强制执行最佳实践,使得代码更为健壮、高效和可靠。

  6. 可扩展性:符合规范的代码更容易进行扩展,因为开发者可以更容易地理解和修改代码。

  7. 代码审查:在进行代码审查时,规范化的代码可以让审查过程更为高效。审查人员可以更专注于逻辑和功能,而不必担心代码的格式和风格。

总的来说,JavaScript 代码规范的主要目的是提升代码的质量、可维护性和可读性,从而为团队合作和软件项目的长期维护奠定坚实的基础。

变量名

变量名推荐使用驼峰法来命名(camelCase):

js
const firstName = 'John'
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"JavaScript 代码书写规范(from ChatGPT)","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/group-build/书写规范.md","filePath":"cn/front-end/base/group-build/书写规范.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/base/group-build/书写规范.md"},e=n(`

JavaScript 代码书写规范(from ChatGPT)

JavaScript 代码规范指的是一套关于如何编写、组织和格式化 JavaScript 代码的一致性规则和指南。这些规范旨在提高代码的可读性、可维护性,并降低团队协作时的摩擦。以下是一些遵循 JavaScript 代码规范的重要意义:

  1. 可读性和可维护性:规范化的代码更容易阅读和理解,使开发者能够快速找到他们需要的信息。这也使得在以后维护和修改代码变得更为容易。

  2. 减少错误和漏洞:一致的代码风格可以降低由于书写错误或者混乱的代码结构导致的错误的可能性。同时,规范也可以提供一些避免常见编码错误的建议。

  3. 团队合作:在团队中使用统一的代码规范可以减少开发者之间的歧义和摩擦。每个人都知道在哪里可以找到特定功能或模块的代码,也知道如何与之交互。

  4. 版本控制:规范的代码更容易与版本控制系统(如 Git)结合使用。在代码合并和比较时,格式一致的代码可以减少合并冲突的可能性。

  5. 提高代码质量:规范可以强制执行最佳实践,使得代码更为健壮、高效和可靠。

  6. 可扩展性:符合规范的代码更容易进行扩展,因为开发者可以更容易地理解和修改代码。

  7. 代码审查:在进行代码审查时,规范化的代码可以让审查过程更为高效。审查人员可以更专注于逻辑和功能,而不必担心代码的格式和风格。

总的来说,JavaScript 代码规范的主要目的是提升代码的质量、可维护性和可读性,从而为团队合作和软件项目的长期维护奠定坚实的基础。

变量名

变量名推荐使用驼峰法来命名(camelCase):

js
const firstName = 'John'
 const lastName = 'Doe'
 const price = 19.9
 let tax = 0.2
@@ -13,4 +13,4 @@ import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g
   lastName: 'Doe',
   age: 50,
   eyeColor: 'blue',
-}

命名规则

  • 变量和函数为小驼峰法标识, 即除第一个单词之外,其他单词首字母大写( lowerCamelCase)
  • 全局变量为大写 (UPPERCASE )
  • 常量 (如 PI) 为大写 (UPPERCASE )

文件命名

  • 一般文件以烤串命名(kebab case)
  • Vue 组件以大写驼峰命名
`,22),p=[e];function t(h,k,r,d,E,c){return a(),i("div",null,p)}const b=s(l,[["render",t]]);export{g as __pageData,b as default}; +}

命名规则

  • 变量和函数为小驼峰法标识, 即除第一个单词之外,其他单词首字母大写( lowerCamelCase)
  • 全局变量为大写 (UPPERCASE )
  • 常量 (如 PI) 为大写 (UPPERCASE )

文件命名

  • 一般文件以烤串命名(kebab case)
  • Vue 组件以大写驼峰命名
`,22),p=[e];function t(h,k,r,d,E,o){return a(),i("div",null,p)}const b=s(l,[["render",t]]);export{g as __pageData,b as default}; diff --git "a/assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.lean.js" "b/assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.lean.js" new file mode 100644 index 0000000..e951b6b --- /dev/null +++ "b/assets/cn_front-end_base_group-build_\344\271\246\345\206\231\350\247\204\350\214\203.md.Dal3w7Ti.lean.js" @@ -0,0 +1 @@ +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"JavaScript 代码书写规范(from ChatGPT)","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/group-build/书写规范.md","filePath":"cn/front-end/base/group-build/书写规范.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/base/group-build/书写规范.md"},e=n("",22),p=[e];function t(h,k,r,d,E,o){return a(),i("div",null,p)}const b=s(l,[["render",t]]);export{g as __pageData,b as default}; diff --git a/assets/cn_front-end_base_js-docs_index.md.Z9wnA6R-.js b/assets/cn_front-end_base_js-docs_index.md.Db2Qhtbc.js similarity index 85% rename from assets/cn_front-end_base_js-docs_index.md.Z9wnA6R-.js rename to assets/cn_front-end_base_js-docs_index.md.Db2Qhtbc.js index a24ebd2..462e251 100644 --- a/assets/cn_front-end_base_js-docs_index.md.Z9wnA6R-.js +++ b/assets/cn_front-end_base_js-docs_index.md.Db2Qhtbc.js @@ -1 +1 @@ -import{_ as e,N as t,M as n}from"./chunks/framework.wLg4U0bT.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/js-docs/index.md","filePath":"cn/front-end/base/js-docs/index.md","lastUpdated":1719277083000}'),s={name:"cn/front-end/base/js-docs/index.md"};function a(d,o,r,c,i,p){return n(),t("div")}const m=e(s,[["render",a]]);export{_ as __pageData,m as default}; +import{_ as e,N as t,M as n}from"./chunks/framework.wLg4U0bT.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/js-docs/index.md","filePath":"cn/front-end/base/js-docs/index.md","lastUpdated":1720682010000}'),s={name:"cn/front-end/base/js-docs/index.md"};function a(d,o,r,c,i,p){return n(),t("div")}const m=e(s,[["render",a]]);export{_ as __pageData,m as default}; diff --git a/assets/cn_front-end_base_js-docs_index.md.Z9wnA6R-.lean.js b/assets/cn_front-end_base_js-docs_index.md.Db2Qhtbc.lean.js similarity index 85% rename from assets/cn_front-end_base_js-docs_index.md.Z9wnA6R-.lean.js rename to assets/cn_front-end_base_js-docs_index.md.Db2Qhtbc.lean.js index a24ebd2..462e251 100644 --- a/assets/cn_front-end_base_js-docs_index.md.Z9wnA6R-.lean.js +++ b/assets/cn_front-end_base_js-docs_index.md.Db2Qhtbc.lean.js @@ -1 +1 @@ -import{_ as e,N as t,M as n}from"./chunks/framework.wLg4U0bT.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/js-docs/index.md","filePath":"cn/front-end/base/js-docs/index.md","lastUpdated":1719277083000}'),s={name:"cn/front-end/base/js-docs/index.md"};function a(d,o,r,c,i,p){return n(),t("div")}const m=e(s,[["render",a]]);export{_ as __pageData,m as default}; +import{_ as e,N as t,M as n}from"./chunks/framework.wLg4U0bT.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/js-docs/index.md","filePath":"cn/front-end/base/js-docs/index.md","lastUpdated":1720682010000}'),s={name:"cn/front-end/base/js-docs/index.md"};function a(d,o,r,c,i,p){return n(),t("div")}const m=e(s,[["render",a]]);export{_ as __pageData,m as default}; diff --git a/assets/cn_front-end_base_rank.md.CKvdtC8S.js b/assets/cn_front-end_base_rank.md.CKvdtC8S.js deleted file mode 100644 index 113e204..0000000 --- a/assets/cn_front-end_base_rank.md.CKvdtC8S.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,N as a,M as l,aF as e}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"前端职级与招聘","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/rank.md","filePath":"cn/front-end/base/rank.md","lastUpdated":1719277083000}'),i={name:"cn/front-end/base/rank.md"},r=e('

前端职级与招聘

Base 太原

V1 Pre-Junior 入门V2 Junior 初级V3 Intermidiate 中级V4 Advanced 高级V5 Tech Lead 技术负责V6 Tech Expert 技术专家
薪资范围[ 3 , 4 ] k( 4 , 6 ] k( 6 , 9 ] k( 9 , 12 ] k( 12 , 15 ] k( 15 , 18 ] k

如何提升

古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。 ―― 陆游《冬夜读书示子聿》

image.png

然后「多复盘多总结」

招聘

简历初筛

加分项:

  • 【前端基础】对底层技术原理有一定(可不深入)理解的
  • 【技术选型】使用三方库,但能有自己的见解,能区分三方库的使用场景和引入项目的利弊
  • 【逻辑思维】能描述清楚自己所做过的业务流程,包括但不限于,模型的抽象,状态的流转等?
  • 【自省好学】善于总结项目经验,并能记录下自己所学所思之人(有技术博客,Github 有大量研究性项目)

减分项:

  • 满篇流水账,如
    • 做了 xxx 项目
    • 实现了 xxx 功能
    • 使用了 xxx(框架/类库等技术名词)
  • 培训班(自学都做不到,迟早会掉队)
  • 前端架构师(前端是整个系统的触手,不存在单独「架构」)

初步沟通

当简历无法清楚判断的使用,可辅助以下问题:

  1. 概述最近一个前端项目整体架构的设计,如模块的划分,技术的选型等,并说明原因(比如三方库引入的目的和结果)。
  2. 选取其中一个业务模块,简述数据结构的设计和状态的流转,及组件的拆分与实现。
  3. 团队的技术栈 ,简单说说自己的理解(可选)

问题 1,2 是为了解应聘者

  • 是否能清楚表述自己做过的事
  • 是否能「带着脑子写代码

问题 3 是为了解应聘者

  • 是否对新技术排斥,能否拥抱变化
  • 能否举一反三

面试

通过上面的流程,其实基本能确定应聘者是否能融入这个团队。 面试时,只需要围绕上面提到的关注点,简单抽查即可:

  • 关于项目的
    • 选一个模块,看看表达是否清晰
  • 技术相关
    • 开源库使用者,问问对应库的基本理念/原理
    • 有一定基础的,问问底层细节,如 DOM,HTTP 等
',23),o=[r];function d(n,h,s,c,u,p){return l(),a("div",null,o)}const k=t(i,[["render",d]]);export{b as __pageData,k as default}; diff --git a/assets/cn_front-end_base_rank.md.CKvdtC8S.lean.js b/assets/cn_front-end_base_rank.md.CKvdtC8S.lean.js deleted file mode 100644 index 2f5c91b..0000000 --- a/assets/cn_front-end_base_rank.md.CKvdtC8S.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,N as a,M as l,aF as e}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"前端职级与招聘","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/rank.md","filePath":"cn/front-end/base/rank.md","lastUpdated":1719277083000}'),i={name:"cn/front-end/base/rank.md"},r=e("",23),o=[r];function d(n,h,s,c,u,p){return l(),a("div",null,o)}const k=t(i,[["render",d]]);export{b as __pageData,k as default}; diff --git "a/assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.js" "b/assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.js" new file mode 100644 index 0000000..7effab6 --- /dev/null +++ "b/assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.js" @@ -0,0 +1,8 @@ +import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/ts/快速开始.md","filePath":"cn/front-end/base/ts/快速开始.md","lastUpdated":1720682010000}'),t={name:"cn/front-end/base/ts/快速开始.md"},e=n(`

快速开始

tslint 已经废弃

在使用现代的 TypeScript 项目中,通常不再需要 tslint 了。TSLint 已经被弃用,官方推荐迁移到 ESLint。ESLint 是一个更加通用和强大的工具,并且有很好的 TypeScript 支持。

npm 安装的 eslint 和 vscode 的 eslint 有什么区别

npm 安装的 eslint 在编译阶段检测,而 vscode 的 eslint 是在编辑阶段检测。

初始化项目

shell
mkdir ts-starter # 创建项目文件夹
+cd ts-starter # 进入项目文件夹
+npm init -y # 初始化项目
+
+npm install -g typescript eslint # 安装依赖
+
+tsc --init # 初始化 tsconfig.json
+eslint --init # 初始化 eslint

区分是 tslint 报错还是 ts 报错

不应该在书写代码遇到 TSLint 报错就修改规则,而是应该根据规则去修改代码。

类型声明文件

一些 JS 库的作者已经使用 TypeScript 进行了重写,有些则是提供了声明文件,一些作者没有提供声明文件的,大部分库都有社区的人为他们补充了声明文件,如果使用了自身没有提供声明文件的库时,可以使用npm install @types/{模块名}来安装

`,11),l=[e];function p(h,r,d,k,c,o){return i(),a("div",null,l)}const m=s(t,[["render",p]]);export{b as __pageData,m as default}; diff --git "a/assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.lean.js" "b/assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.lean.js" new file mode 100644 index 0000000..6e83005 --- /dev/null +++ "b/assets/cn_front-end_base_ts_\345\277\253\351\200\237\345\274\200\345\247\213.md.CAnAV_WL.lean.js" @@ -0,0 +1 @@ +import{_ as s,N as a,M as i,aF as n}from"./chunks/framework.wLg4U0bT.js";const b=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/ts/快速开始.md","filePath":"cn/front-end/base/ts/快速开始.md","lastUpdated":1720682010000}'),t={name:"cn/front-end/base/ts/快速开始.md"},e=n("",11),l=[e];function p(h,r,d,k,c,o){return i(),a("div",null,l)}const m=s(t,[["render",p]]);export{b as __pageData,m as default}; diff --git "a/assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.js" "b/assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.js" new file mode 100644 index 0000000..192aad2 --- /dev/null +++ "b/assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.js" @@ -0,0 +1,62 @@ +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数据类型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/ts/数据类型.md","filePath":"cn/front-end/base/ts/数据类型.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/base/ts/数据类型.md"},p=n(`

数据类型

常见数据类型

ts
// boolean
+const bool: boolean = false;
+
+// number
+let num: number;
+num = 1;
+num = 0b0001;
+num = 0o0001;
+num = 0xab;
+
+// string
+let str: string = 'string';
+
+// Array
+let list1: number[] = [1, 2, 3]; // 推荐
+let list3: string | number[] = [1, 2, 3]; //  联合类型
+let list2: Array<number> = [1, 2, 3];
+
+// null 和 undefined
+let u1: undefined = undefined;
+let n1: null = null;
+
+// object
+let obj: object = { name: 'axed' };

Symbol

表示独一无二的值,通过 Symbol 函数生成

js
const s = Symbol();
+typeof s; // 'symbol'
+console.log(Boolean(s)); // true

调用toString方法可以转换为字符串

js
const s1 = Symbol('lison');
+console.log(s1.toString()); // 'Symbol(lison)'

symbol 可以作为属性名

js
let name = Symbol();
+let obj = {
+  [name]: 'lison',
+};
+console.log(obj); // { Symbol(): 'lison' }
+console.log(obj[name]); // lison
+console.log(obj.name); // undefined

以 symbol 值为属性名,这个属性不会被for in 遍历到,也不会被 Object.keys、Object.getOwnPropertyNames、JSON.stringify 方法遍历到。

ts
const name = Symbol('name');
+const obj = {
+  [name]: 'lison',
+  age: 18,
+};
+for (const key in obj) {
+  console.log(key);
+}
+// => 'age'
+console.log(Object.keys(obj));
+// ['age']
+console.log(Object.getOwnPropertyNames(obj));
+// ['age']
+console.log(JSON.stringify(obj));
+// '{ "age": 18 }'

ts 补充的数据类型

元祖 tuple

元祖是固定长度的数组,且数组中的元素类型也是固定的。

ts
let tuple: [string, number, boolean] = ['axed', 1, true];

枚举 enum

枚举是给一组数字或者字符串命名,枚举的每个值都有一个数字索引。

ts
enum Color {
+  Red,
+  Green,
+  Blue,
+}
+
+console.log(Color.Red); // 0
+console.log(Color[0]); // Red

Color.Red 的值为 0,Color.Green 的值为 1,Color.Blue 的值为 2。默认从 0 开始。

ts
enum Color {
+  Red = 1,
+  Green = 5,
+  Blue,
+}

Color.Red 的值为 1,Color.Green 的值为 5,Color.Blue 的值为 6。注意因为指定了 Green 的值为 5,所以 Blue 的值为 6。

any

不要滥用 any,如果任何值都指定为 any 类型,那么 TypeScript 将失去它的意义。

void

void 是表示没有任意类型,就是什么类型都不是,这在我们定义函数,函数没有返回值。

void 类型的变量只能赋值为 undefined 和 null,其他类型不能赋值给 void 类型的变量。

ts
const consoleText = (text: string): void => {
+  console.log(text);
+};

never

never 类型指那些永不存在的值的类型,它是那些总会抛出异常或根本不会有返回值的函数表达式的返回值类型。

ts
const infiniteFunc = (): never => {
+  while (true) {}
+};

unknown

交叉类型 &

交叉类型就是取多个类型的并集

联合类型 |

联合类型是要求只要符合联合类型中任意一种类型即可

`,36),h=[p];function e(k,t,r,d,E,g){return a(),i("div",null,h)}const o=s(l,[["render",e]]);export{c as __pageData,o as default}; diff --git "a/assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.lean.js" "b/assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.lean.js" new file mode 100644 index 0000000..d55d5d5 --- /dev/null +++ "b/assets/cn_front-end_base_ts_\346\225\260\346\215\256\347\261\273\345\236\213.md.FIjfzCfT.lean.js" @@ -0,0 +1 @@ +import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"数据类型","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/ts/数据类型.md","filePath":"cn/front-end/base/ts/数据类型.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/base/ts/数据类型.md"},p=n("",36),h=[p];function e(k,t,r,d,E,g){return a(),i("div",null,h)}const o=s(l,[["render",e]]);export{c as __pageData,o as default}; diff --git "a/assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.lean.js" "b/assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.lean.js" deleted file mode 100644 index e0d965f..0000000 --- "a/assets/cn_front-end_base_\344\271\246\345\206\231\350\247\204\350\214\203.md.DeKqDrN_.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const g=JSON.parse('{"title":"JavaScript 代码书写规范(from ChatGPT)","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/base/书写规范.md","filePath":"cn/front-end/base/书写规范.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/base/书写规范.md"},e=n("",22),p=[e];function t(h,k,r,d,E,c){return a(),i("div",null,p)}const b=s(l,[["render",t]]);export{g as __pageData,b as default}; diff --git a/assets/cn_front-end_frame_index.md.CIjbLLhr.js b/assets/cn_front-end_frame_index.md.LdZDHp9B.js similarity index 88% rename from assets/cn_front-end_frame_index.md.CIjbLLhr.js rename to assets/cn_front-end_frame_index.md.LdZDHp9B.js index 8d95343..7e75878 100644 --- a/assets/cn_front-end_frame_index.md.CIjbLLhr.js +++ b/assets/cn_front-end_frame_index.md.LdZDHp9B.js @@ -1 +1 @@ -import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/index.md","filePath":"cn/front-end/frame/index.md","lastUpdated":1719277083000}'),o={name:"cn/front-end/frame/index.md"},d=e("h2",{id:"frame",tabindex:"-1"},[n("frame "),e("a",{class:"header-anchor",href:"#frame","aria-label":'Permalink to "frame"'},"​")],-1),s=[d];function c(i,f,m,_,l,p){return r(),t("div",null,s)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; +import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/index.md","filePath":"cn/front-end/frame/index.md","lastUpdated":1720682010000}'),o={name:"cn/front-end/frame/index.md"},d=e("h2",{id:"frame",tabindex:"-1"},[n("frame "),e("a",{class:"header-anchor",href:"#frame","aria-label":'Permalink to "frame"'},"​")],-1),s=[d];function c(i,f,m,_,l,p){return r(),t("div",null,s)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; diff --git a/assets/cn_front-end_frame_index.md.CIjbLLhr.lean.js b/assets/cn_front-end_frame_index.md.LdZDHp9B.lean.js similarity index 88% rename from assets/cn_front-end_frame_index.md.CIjbLLhr.lean.js rename to assets/cn_front-end_frame_index.md.LdZDHp9B.lean.js index 8d95343..7e75878 100644 --- a/assets/cn_front-end_frame_index.md.CIjbLLhr.lean.js +++ b/assets/cn_front-end_frame_index.md.LdZDHp9B.lean.js @@ -1 +1 @@ -import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/index.md","filePath":"cn/front-end/frame/index.md","lastUpdated":1719277083000}'),o={name:"cn/front-end/frame/index.md"},d=e("h2",{id:"frame",tabindex:"-1"},[n("frame "),e("a",{class:"header-anchor",href:"#frame","aria-label":'Permalink to "frame"'},"​")],-1),s=[d];function c(i,f,m,_,l,p){return r(),t("div",null,s)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; +import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/index.md","filePath":"cn/front-end/frame/index.md","lastUpdated":1720682010000}'),o={name:"cn/front-end/frame/index.md"},d=e("h2",{id:"frame",tabindex:"-1"},[n("frame "),e("a",{class:"header-anchor",href:"#frame","aria-label":'Permalink to "frame"'},"​")],-1),s=[d];function c(i,f,m,_,l,p){return r(),t("div",null,s)}const u=a(o,[["render",c]]);export{x as __pageData,u as default}; diff --git "a/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.js" "b/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.js" similarity index 90% rename from "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.js" rename to "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.js" index ef6b8fa..845bc90 100644 --- "a/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.js" +++ "b/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.js" @@ -1 +1 @@ -import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"Mock","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","filePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","lastUpdated":1719277083000}'),o={name:"cn/front-end/frame/pure-admin/前端数据接口模拟.md"},c=e("h1",{id:"mock",tabindex:"-1"},[n("Mock "),e("a",{class:"header-anchor",href:"#mock","aria-label":'Permalink to "Mock"'},"​")],-1),s=[c];function d(_,i,m,f,p,l){return r(),t("div",null,s)}const u=a(o,[["render",d]]);export{k as __pageData,u as default}; +import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"Mock","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","filePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","lastUpdated":1720682010000}'),o={name:"cn/front-end/frame/pure-admin/前端数据接口模拟.md"},c=e("h1",{id:"mock",tabindex:"-1"},[n("Mock "),e("a",{class:"header-anchor",href:"#mock","aria-label":'Permalink to "Mock"'},"​")],-1),s=[c];function d(_,i,m,f,p,l){return r(),t("div",null,s)}const u=a(o,[["render",d]]);export{k as __pageData,u as default}; diff --git "a/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.lean.js" "b/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.lean.js" similarity index 90% rename from "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.lean.js" rename to "assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.lean.js" index ef6b8fa..845bc90 100644 --- "a/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.C60XH7I5.lean.js" +++ "b/assets/cn_front-end_frame_pure-admin_\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.md.CzLUeX4j.lean.js" @@ -1 +1 @@ -import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"Mock","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","filePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","lastUpdated":1719277083000}'),o={name:"cn/front-end/frame/pure-admin/前端数据接口模拟.md"},c=e("h1",{id:"mock",tabindex:"-1"},[n("Mock "),e("a",{class:"header-anchor",href:"#mock","aria-label":'Permalink to "Mock"'},"​")],-1),s=[c];function d(_,i,m,f,p,l){return r(),t("div",null,s)}const u=a(o,[["render",d]]);export{k as __pageData,u as default}; +import{_ as a,N as t,M as r,Z as e,P as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"Mock","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","filePath":"cn/front-end/frame/pure-admin/前端数据接口模拟.md","lastUpdated":1720682010000}'),o={name:"cn/front-end/frame/pure-admin/前端数据接口模拟.md"},c=e("h1",{id:"mock",tabindex:"-1"},[n("Mock "),e("a",{class:"header-anchor",href:"#mock","aria-label":'Permalink to "Mock"'},"​")],-1),s=[c];function d(_,i,m,f,p,l){return r(),t("div",null,s)}const u=a(o,[["render",d]]);export{k as __pageData,u as default}; diff --git "a/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.js" "b/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.js" similarity index 97% rename from "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.js" rename to "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.js" index ed879b2..4ad9a41 100644 --- "a/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.js" +++ "b/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.js" @@ -1,4 +1,4 @@ -import{_ as a,N as e,M as s,aF as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/快速开始.md","filePath":"cn/front-end/frame/pure-admin/快速开始.md","lastUpdated":1719277083000}'),i={name:"cn/front-end/frame/pure-admin/快速开始.md"},r=n(`

精简版预览地址 精简版仓库地址 文档地址

完整版预览地址 完整版仓库地址

快速开始

启动项目

shell
# clone 项目
+import{_ as a,N as e,M as s,aF as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/快速开始.md","filePath":"cn/front-end/frame/pure-admin/快速开始.md","lastUpdated":1720682010000}'),i={name:"cn/front-end/frame/pure-admin/快速开始.md"},r=n(`

精简版预览地址 精简版仓库地址 文档地址

完整版预览地址 完整版仓库地址

快速开始

启动项目

shell
# clone 项目
 git clone git@github.com:pure-admin/pure-admin-thin.git
 
 cd pure-admin-thin
diff --git "a/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.lean.js" "b/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.lean.js"
similarity index 87%
rename from "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.lean.js"
rename to "assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.lean.js"
index 94a7f4a..db09c6d 100644
--- "a/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.Dy2F_8Gk.lean.js"
+++ "b/assets/cn_front-end_frame_pure-admin_\345\277\253\351\200\237\345\274\200\345\247\213.md.DzVm42MB.lean.js"
@@ -1 +1 @@
-import{_ as a,N as e,M as s,aF as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/快速开始.md","filePath":"cn/front-end/frame/pure-admin/快速开始.md","lastUpdated":1719277083000}'),i={name:"cn/front-end/frame/pure-admin/快速开始.md"},r=n("",6),t=[r];function p(l,h,d,c,o,m){return s(),e("div",null,t)}const _=a(i,[["render",p]]);export{k as __pageData,_ as default};
+import{_ as a,N as e,M as s,aF as n}from"./chunks/framework.wLg4U0bT.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/快速开始.md","filePath":"cn/front-end/frame/pure-admin/快速开始.md","lastUpdated":1720682010000}'),i={name:"cn/front-end/frame/pure-admin/快速开始.md"},r=n("",6),t=[r];function p(l,h,d,c,o,m){return s(),e("div",null,t)}const _=a(i,[["render",p]]);export{k as __pageData,_ as default};
diff --git "a/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.js" "b/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.js"
similarity index 99%
rename from "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.js"
rename to "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.js"
index ce30c6d..dcaffe6 100644
--- "a/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.js"
+++ "b/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/权限.md","filePath":"cn/front-end/frame/pure-admin/权限.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/pure-admin/权限.md"},p=n(`

权限

与路由强相关

静态权限

前端硬编码实现

ts
// src/router/modules/visit.ts
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/权限.md","filePath":"cn/front-end/frame/pure-admin/权限.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/pure-admin/权限.md"},p=n(`

权限

与路由强相关

静态权限

前端硬编码实现

ts
// src/router/modules/visit.ts
 const VisitRecords = () => import('@/views/VisitRecords.vue');
 
 export default {
diff --git "a/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.lean.js" "b/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.lean.js"
similarity index 86%
rename from "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.lean.js"
rename to "assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.lean.js"
index c9e55b2..5879dee 100644
--- "a/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.Cbjawa2y.lean.js"
+++ "b/assets/cn_front-end_frame_pure-admin_\346\235\203\351\231\220.md.bFc8S5k8.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/权限.md","filePath":"cn/front-end/frame/pure-admin/权限.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/pure-admin/权限.md"},p=n("",14),h=[p];function k(e,t,E,r,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"权限","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/pure-admin/权限.md","filePath":"cn/front-end/frame/pure-admin/权限.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/pure-admin/权限.md"},p=n("",14),h=[p];function k(e,t,E,r,d,g){return a(),i("div",null,h)}const b=s(l,[["render",k]]);export{c as __pageData,b as default};
diff --git a/assets/cn_front-end_frame_vue3_index.md.0NbG7FuH.js b/assets/cn_front-end_frame_vue3_index.md.D2myUyPq.js
similarity index 86%
rename from assets/cn_front-end_frame_vue3_index.md.0NbG7FuH.js
rename to assets/cn_front-end_frame_vue3_index.md.D2myUyPq.js
index d2cfcf5..ad9ed3d 100644
--- a/assets/cn_front-end_frame_vue3_index.md.0NbG7FuH.js
+++ b/assets/cn_front-end_frame_vue3_index.md.D2myUyPq.js
@@ -1 +1 @@
-import{_ as e,N as t,M as n,Z as a}from"./chunks/framework.wLg4U0bT.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/index.md","filePath":"cn/front-end/frame/vue3/index.md","lastUpdated":1719277083000}'),r={name:"cn/front-end/frame/vue3/index.md"},o=a("p",null,"vue",-1),s=[o];function d(c,i,_,f,p,l){return n(),t("div",null,s)}const x=e(r,[["render",d]]);export{u as __pageData,x as default};
+import{_ as e,N as t,M as n,Z as a}from"./chunks/framework.wLg4U0bT.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/index.md","filePath":"cn/front-end/frame/vue3/index.md","lastUpdated":1720682010000}'),r={name:"cn/front-end/frame/vue3/index.md"},o=a("p",null,"vue",-1),s=[o];function d(c,i,_,f,p,l){return n(),t("div",null,s)}const x=e(r,[["render",d]]);export{u as __pageData,x as default};
diff --git a/assets/cn_front-end_frame_vue3_index.md.0NbG7FuH.lean.js b/assets/cn_front-end_frame_vue3_index.md.D2myUyPq.lean.js
similarity index 86%
rename from assets/cn_front-end_frame_vue3_index.md.0NbG7FuH.lean.js
rename to assets/cn_front-end_frame_vue3_index.md.D2myUyPq.lean.js
index d2cfcf5..ad9ed3d 100644
--- a/assets/cn_front-end_frame_vue3_index.md.0NbG7FuH.lean.js
+++ b/assets/cn_front-end_frame_vue3_index.md.D2myUyPq.lean.js
@@ -1 +1 @@
-import{_ as e,N as t,M as n,Z as a}from"./chunks/framework.wLg4U0bT.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/index.md","filePath":"cn/front-end/frame/vue3/index.md","lastUpdated":1719277083000}'),r={name:"cn/front-end/frame/vue3/index.md"},o=a("p",null,"vue",-1),s=[o];function d(c,i,_,f,p,l){return n(),t("div",null,s)}const x=e(r,[["render",d]]);export{u as __pageData,x as default};
+import{_ as e,N as t,M as n,Z as a}from"./chunks/framework.wLg4U0bT.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/index.md","filePath":"cn/front-end/frame/vue3/index.md","lastUpdated":1720682010000}'),r={name:"cn/front-end/frame/vue3/index.md"},o=a("p",null,"vue",-1),s=[o];function d(c,i,_,f,p,l){return n(),t("div",null,s)}const x=e(r,[["render",d]]);export{u as __pageData,x as default};
diff --git "a/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.js" "b/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.js"
similarity index 99%
rename from "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.js"
rename to "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.js"
index 18e4f40..0db31d3 100644
--- "a/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.js"
+++ "b/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/快速开始.md","filePath":"cn/front-end/frame/vue3/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/vue3/快速开始.md"},e=n(`

快速开始

对比

选项式 options api

  • 基于类的心智模型
  • 把响应式相关细节抽象出来,强制按照选项来组织代码,对初学者更为友好

组合式 composition api

  • 更加自由,灵活性使得组织和重用逻辑的模式变得更加强大

支持的场景

参考

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

快速上手

shell
pnpm create vue@latest
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/快速开始.md","filePath":"cn/front-end/frame/vue3/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/vue3/快速开始.md"},e=n(`

快速开始

对比

选项式 options api

  • 基于类的心智模型
  • 把响应式相关细节抽象出来,强制按照选项来组织代码,对初学者更为友好

组合式 composition api

  • 更加自由,灵活性使得组织和重用逻辑的模式变得更加强大

支持的场景

参考

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

快速上手

shell
pnpm create vue@latest
 
 npm create vue@latest
 
diff --git "a/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.lean.js" "b/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.lean.js"
similarity index 86%
rename from "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.lean.js"
rename to "assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.lean.js"
index fb0d5b8..fca093e 100644
--- "a/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.DynXKIWZ.lean.js"
+++ "b/assets/cn_front-end_frame_vue3_\345\277\253\351\200\237\345\274\200\345\247\213.md.Cjl6w7BD.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/快速开始.md","filePath":"cn/front-end/frame/vue3/快速开始.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/vue3/快速开始.md"},e=n("",28),t=[e];function p(h,k,r,d,E,c){return a(),i("div",null,t)}const b=s(l,[["render",p]]);export{o as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const o=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/快速开始.md","filePath":"cn/front-end/frame/vue3/快速开始.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/vue3/快速开始.md"},e=n("",28),t=[e];function p(h,k,r,d,E,c){return a(),i("div",null,t)}const b=s(l,[["render",p]]);export{o as __pageData,b as default};
diff --git "a/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.js" "b/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.js"
similarity index 99%
rename from "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.js"
rename to "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.js"
index 16e9574..93a942b 100644
--- "a/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.js"
+++ "b/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"监听器","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/监听器.md","filePath":"cn/front-end/frame/vue3/监听器.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/vue3/监听器.md"},p=n(`

监听器

watch

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

javascript
import { ref, watch } from 'vue';
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"监听器","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/监听器.md","filePath":"cn/front-end/frame/vue3/监听器.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/vue3/监听器.md"},p=n(`

监听器

watch

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

javascript
import { ref, watch } from 'vue';
 const x = ref(0);
 const y = ref(0);
 
diff --git "a/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.lean.js" "b/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.lean.js"
similarity index 86%
rename from "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.lean.js"
rename to "assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.lean.js"
index 4242b6a..0bb85b2 100644
--- "a/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.D5p4k0n1.lean.js"
+++ "b/assets/cn_front-end_frame_vue3_\347\233\221\345\220\254\345\231\250.md.CpDXWmdX.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"监听器","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/监听器.md","filePath":"cn/front-end/frame/vue3/监听器.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/vue3/监听器.md"},p=n("",12),h=[p];function e(t,k,r,E,c,d){return a(),i("div",null,h)}const b=s(l,[["render",e]]);export{y as __pageData,b as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const y=JSON.parse('{"title":"监听器","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/监听器.md","filePath":"cn/front-end/frame/vue3/监听器.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/vue3/监听器.md"},p=n("",12),h=[p];function e(t,k,r,E,c,d){return a(),i("div",null,h)}const b=s(l,[["render",e]]);export{y as __pageData,b as default};
diff --git "a/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.js" "b/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.js"
similarity index 99%
rename from "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.js"
rename to "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.js"
index ef5112d..37ea282 100644
--- "a/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.js"
+++ "b/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.js"
@@ -1,4 +1,4 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"组件","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/组件.md","filePath":"cn/front-end/frame/vue3/组件.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/vue3/组件.md"},p=n(`

组件

在单文件组件中,子组件推荐PascalCase的标签名。

在 DOM 中直接书写,推荐kebab-case的标签名

父子组件通信

子组件定义 props defineProps

vue
<!-- 运行时声明 -->
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"组件","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/组件.md","filePath":"cn/front-end/frame/vue3/组件.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/vue3/组件.md"},p=n(`

组件

在单文件组件中,子组件推荐PascalCase的标签名。

在 DOM 中直接书写,推荐kebab-case的标签名

父子组件通信

子组件定义 props defineProps

vue
<!-- 运行时声明 -->
 <script setup lang="ts">
 defineProps({
   title: {
diff --git "a/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.lean.js" "b/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.lean.js"
similarity index 86%
rename from "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.lean.js"
rename to "assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.lean.js"
index 54dae38..24159f0 100644
--- "a/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTnviDwV.lean.js"
+++ "b/assets/cn_front-end_frame_vue3_\347\273\204\344\273\266.md.BTQbvKsT.lean.js"
@@ -1 +1 @@
-import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"组件","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/组件.md","filePath":"cn/front-end/frame/vue3/组件.md","lastUpdated":1719277083000}'),l={name:"cn/front-end/frame/vue3/组件.md"},p=n("",20),t=[p];function h(k,e,E,r,d,g){return a(),i("div",null,t)}const F=s(l,[["render",h]]);export{c as __pageData,F as default};
+import{_ as s,N as i,M as a,aF as n}from"./chunks/framework.wLg4U0bT.js";const c=JSON.parse('{"title":"组件","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/frame/vue3/组件.md","filePath":"cn/front-end/frame/vue3/组件.md","lastUpdated":1720682010000}'),l={name:"cn/front-end/frame/vue3/组件.md"},p=n("",20),t=[p];function h(k,e,E,r,d,g){return a(),i("div",null,t)}const F=s(l,[["render",h]]);export{c as __pageData,F as default};
diff --git a/assets/cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.js b/assets/cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.js
similarity index 99%
rename from assets/cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.js
rename to assets/cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.js
index d83603f..6ac7a07 100644
--- a/assets/cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.js
+++ b/assets/cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.js
@@ -68,4 +68,4 @@ import{d as E,M as t,R as g,S as y,P as p,Q as c,u as e,f as F,o,aH as m,L as b,
   btnName: string;
 }>();
 const { btnName } = props;
-</script>
`,5),L=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/visual/leaflet/with-antdv-button.md","filePath":"cn/front-end/visual/leaflet/with-antdv-button.md","lastUpdated":1719277083000}'),z={name:"cn/front-end/visual/leaflet/with-antdv-button.md"},w=Object.assign(z,{setup(l){return(a,n)=>(t(),r("div",null,[f,x,P,C(v),q]))}});export{L as __pageData,w as default}; +</script>
`,5),L=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/visual/leaflet/with-antdv-button.md","filePath":"cn/front-end/visual/leaflet/with-antdv-button.md","lastUpdated":1720682010000}'),z={name:"cn/front-end/visual/leaflet/with-antdv-button.md"},w=Object.assign(z,{setup(l){return(a,n)=>(t(),r("div",null,[f,x,P,C(v),q]))}});export{L as __pageData,w as default}; diff --git a/assets/cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.lean.js b/assets/cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.lean.js similarity index 97% rename from assets/cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.lean.js rename to assets/cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.lean.js index 205f7d7..3cd38c6 100644 --- a/assets/cn_front-end_visual_leaflet_with-antdv-button.md.DFP6VaVo.lean.js +++ b/assets/cn_front-end_visual_leaflet_with-antdv-button.md.23m68R0W.lean.js @@ -1,2 +1,2 @@ const __vite__fileDeps=["assets/chunks/leaflet-src.DiR1WgIm.js","assets/chunks/theme.NQjD_CgT.js","assets/chunks/framework.wLg4U0bT.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); -import{d as E,M as t,R as g,S as y,P as p,Q as c,u as e,f as F,o,aH as m,L as b,N as r,Z as i,F as u,k as C,aF as B}from"./chunks/framework.wLg4U0bT.js";import{B as A}from"./chunks/theme.NQjD_CgT.js";const _=E({__name:"PopupContent",props:{btnName:{}},setup(l){const a=l,{btnName:n}=a;return(s,h)=>(t(),g(e(A),{type:"primary",size:"small"},{default:y(()=>[p(c(e(n)),1)]),_:1}))}}),D=i("div",{id:"myDomContainer"},null,-1),v=E({__name:"WithAntdvButton",setup(l){const a=F(),n=[37.6978,112.70788];return o(()=>{m(()=>import("./chunks/leaflet-src.DiR1WgIm.js").then(s=>s.l),__vite__mapDeps([0,1,2])).then(s=>{const h=b(_,{onClick(){alert("我被点了")},btnName:"按钮"}).mount("#myDomContainer"),k=s.map(a.value,{center:n,zoom:10});s.tileLayer("https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=4&style=8&x={x}&y={y}&z={z}",{subdomains:"1234",maxZoom:21,minZoom:3,coordType:"gcj02"}).addTo(k);const d=s.popup().setContent(h.$el);s.marker(n,{icon:s.icon({iconUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png",iconSize:[26,42],popupAnchor:[0,-18]})}).bindPopup(d).addTo(k).openPopup()})}),(s,h)=>(t(),r(u,null,[i("div",{class:"my-map",ref_key:"myMap",ref:a},null,512),D],64))}}),f=i("p",null,[p("示例是在"),i("code",null,"leaflet->marker-popup"),p("中使用 antdv 的 button 组件。核心是使用"),i("code",null,"createApp"),p("挂载一个组件。")],-1),x=i("p",null,"在所有的第三方库中,但给某个字段传入 html 参数的时候,都可以参考这个方案。",-1),P=i("h2",{id:"效果",tabindex:"-1"},[p("效果 "),i("a",{class:"header-anchor",href:"#效果","aria-label":'Permalink to "效果"'},"​")],-1),q=B("",5),L=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/visual/leaflet/with-antdv-button.md","filePath":"cn/front-end/visual/leaflet/with-antdv-button.md","lastUpdated":1719277083000}'),z={name:"cn/front-end/visual/leaflet/with-antdv-button.md"},w=Object.assign(z,{setup(l){return(a,n)=>(t(),r("div",null,[f,x,P,C(v),q]))}});export{L as __pageData,w as default}; +import{d as E,M as t,R as g,S as y,P as p,Q as c,u as e,f as F,o,aH as m,L as b,N as r,Z as i,F as u,k as C,aF as B}from"./chunks/framework.wLg4U0bT.js";import{B as A}from"./chunks/theme.NQjD_CgT.js";const _=E({__name:"PopupContent",props:{btnName:{}},setup(l){const a=l,{btnName:n}=a;return(s,h)=>(t(),g(e(A),{type:"primary",size:"small"},{default:y(()=>[p(c(e(n)),1)]),_:1}))}}),D=i("div",{id:"myDomContainer"},null,-1),v=E({__name:"WithAntdvButton",setup(l){const a=F(),n=[37.6978,112.70788];return o(()=>{m(()=>import("./chunks/leaflet-src.DiR1WgIm.js").then(s=>s.l),__vite__mapDeps([0,1,2])).then(s=>{const h=b(_,{onClick(){alert("我被点了")},btnName:"按钮"}).mount("#myDomContainer"),k=s.map(a.value,{center:n,zoom:10});s.tileLayer("https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=4&style=8&x={x}&y={y}&z={z}",{subdomains:"1234",maxZoom:21,minZoom:3,coordType:"gcj02"}).addTo(k);const d=s.popup().setContent(h.$el);s.marker(n,{icon:s.icon({iconUrl:"https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png",iconSize:[26,42],popupAnchor:[0,-18]})}).bindPopup(d).addTo(k).openPopup()})}),(s,h)=>(t(),r(u,null,[i("div",{class:"my-map",ref_key:"myMap",ref:a},null,512),D],64))}}),f=i("p",null,[p("示例是在"),i("code",null,"leaflet->marker-popup"),p("中使用 antdv 的 button 组件。核心是使用"),i("code",null,"createApp"),p("挂载一个组件。")],-1),x=i("p",null,"在所有的第三方库中,但给某个字段传入 html 参数的时候,都可以参考这个方案。",-1),P=i("h2",{id:"效果",tabindex:"-1"},[p("效果 "),i("a",{class:"header-anchor",href:"#效果","aria-label":'Permalink to "效果"'},"​")],-1),q=B("",5),L=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/front-end/visual/leaflet/with-antdv-button.md","filePath":"cn/front-end/visual/leaflet/with-antdv-button.md","lastUpdated":1720682010000}'),z={name:"cn/front-end/visual/leaflet/with-antdv-button.md"},w=Object.assign(z,{setup(l){return(a,n)=>(t(),r("div",null,[f,x,P,C(v),q]))}});export{L as __pageData,w as default}; diff --git "a/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.js" "b/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.js" similarity index 99% rename from "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.js" rename to "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.js" index 0567c0e..7bea641 100644 --- "a/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.js" +++ "b/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.js" @@ -7119,4 +7119,4 @@ ${t} position: absolute; height: max(284vh, 284vw); width: max(284vh, 284vw); - `)])]);function l6(e){if(!e)return 1;const t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t}const Wu=Object.assign(Object.assign({},ce.props),{debug:Boolean,cross:Boolean,fullscreen:Boolean,width:{type:Number,default:32},height:{type:Number,default:32},zIndex:{type:Number,default:10},xGap:{type:Number,default:0},yGap:{type:Number,default:0},yOffset:{type:Number,default:0},xOffset:{type:Number,default:0},rotate:{type:Number,default:0},image:String,imageOpacity:{type:Number,default:1},imageHeight:Number,imageWidth:Number,content:String,selectable:{type:Boolean,default:!0},fontSize:{type:Number,default:14},fontFamily:String,fontStyle:{type:String,default:"normal"},fontVariant:{type:String,default:""},fontWeight:{type:Number,default:400},fontColor:{type:String,default:"rgba(128, 128, 128, .3)"},fontStretch:{type:String,default:""},lineHeight:{type:Number,default:14},globalRotate:{type:Number,default:0}}),Hy=W({name:"Watermark",props:Wu,setup(e,{slots:t}){const{mergedClsPrefixRef:o}=He(e),r=ce("Watermark","-watermark",a6,s0,e,o),n=M(""),a=bo?document.createElement("canvas"):null,d=a?a.getContext("2d"):null,l=M(!1);return Ia(()=>l.value=!0),Dt(()=>{if(!a)return;l.value;const s=l6(d),{xGap:c,yGap:u,width:f,height:m,yOffset:h,xOffset:v,rotate:y,image:g,content:b,fontColor:w,fontStyle:P,fontVariant:z,fontStretch:C,fontWeight:$,fontFamily:D,fontSize:O,lineHeight:I,debug:T}=e,B=(c+f)*s,F=(u+m)*s,L=v*s,H=h*s;if(a.width=B,a.height=F,d){d.translate(0,0);const N=f*s,E=m*s;if(T&&(d.strokeStyle="grey",d.strokeRect(0,0,N,E)),d.rotate(y*(Math.PI/180)),g){const G=new Image;G.crossOrigin="anonymous",G.referrerPolicy="no-referrer",G.src=g,G.onload=()=>{d.globalAlpha=e.imageOpacity;const{imageWidth:re,imageHeight:Q}=e;d.drawImage(G,L,H,(e.imageWidth||(Q?G.width*Q/G.height:G.width))*s,(e.imageHeight||(re?G.height*re/G.width:G.height))*s),n.value=a.toDataURL()}}else b&&(T&&(d.strokeStyle="green",d.strokeRect(0,0,N,E)),d.font=`${P} ${z} ${$} ${C} ${O*s}px/${I*s}px ${D||r.value.self.fontFamily}`,d.fillStyle=w,d.fillText(b,L,H+I*s),n.value=a.toDataURL())}else mC("watermark","Canvas is not supported in the browser.")}),()=>{var s;const{globalRotate:c,fullscreen:u,zIndex:f}=e,m=o.value,h=c!==0&&u,v="max(142vh, 142vw)",y=i("div",{class:[`${m}-watermark`,c!==0&&`${m}-watermark--global-rotate`,u&&`${m}-watermark--fullscreen`],style:{transform:c?`translateX(-50%) translateY(-50%) rotate(${c}deg)`:void 0,zIndex:h?void 0:f,backgroundSize:`${e.xGap+e.width}px`,backgroundPosition:c===0?e.cross?`${e.width/2}px ${e.height/2}px, 0 0`:"":e.cross?`calc(${v} + ${e.width/2}px) calc(${v} + ${e.height/2}px), ${v} ${v}`:v,backgroundImage:e.cross?`url(${n.value}), url(${n.value})`:`url(${n.value})`}});return e.fullscreen&&!c?y:i("div",{class:[`${m}-watermark-container`,c!==0&&`${m}-watermark-container--global-rotate`,u&&`${m}-watermark-container--fullscreen`,e.selectable&&`${m}-watermark-container--selectable`],style:{zIndex:h?f:void 0}},(s=t.default)===null||s===void 0?void 0:s.call(t),y)}}}),s6=W({name:"InjectionExtractor",props:{onSetup:Function},setup(e,{slots:t}){var o;return(o=e.onSetup)===null||o===void 0||o.call(e),()=>{var r;return(r=t.default)===null||r===void 0?void 0:r.call(t)}}}),d6={message:ru,notification:lu,loadingBar:Kc,dialog:lc};function c6({providersAndProps:e,configProviderProps:t}){let r=sC(()=>i(Ea,oi(t),{default:()=>e.map(({type:l,Provider:s,props:c})=>i(s,oi(c),{default:()=>i(s6,{onSetup:()=>n[l]=d6[l]()})}))}));const n={app:r};let a;return bo&&(a=document.createElement("div"),document.body.appendChild(a),r.mount(a)),Object.assign({unmount:()=>{var l;if(r===null||a===null){mo("discrete","unmount call no need because discrete app has been unmounted");return}r.unmount(),(l=a.parentNode)===null||l===void 0||l.removeChild(a),a=null,r=null}},n)}function Vy(e,{configProviderProps:t,messageProviderProps:o,dialogProviderProps:r,notificationProviderProps:n,loadingBarProviderProps:a}={}){const d=[];return e.forEach(s=>{switch(s){case"message":d.push({type:s,Provider:ou,props:o});break;case"notification":d.push({type:s,Provider:au,props:n});break;case"dialog":d.push({type:s,Provider:ac,props:r});break;case"loadingBar":d.push({type:s,Provider:Uc,props:a});break}}),c6({providersAndProps:d,configProviderProps:t})}const Uu={value:String,katex:Object,katexOptions:Object},jy=W({name:"Equation",props:Uu,setup(e){const t=Ae(go),o=x(()=>{var r;const n=((r=e.katex||(t==null?void 0:t.mergedKatexRef.value))===null||r===void 0?void 0:r.renderToString(e.value||"",Object.assign({throwOnError:!1},e.katexOptions)))||"no katex provided",a=n.match(/^<([a-z]+)[^>]+class="([^"]+)"[^>]*>/),d=(a==null?void 0:a[1])||"span",l=a==null?void 0:a[2],s=n.replace(/^<[a-z]+[^>]*>/,"").replace(/<\/[a-z]+>$/,"");return{wrapperTag:d,innerHtml:s,wrapperClass:l}});return()=>{const{innerHtml:r,wrapperClass:n,wrapperTag:a}=o.value;return i(a,{class:n,innerHTML:r})}}}),$h=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertProps:Ps,anchorLinkProps:zs,anchorProps:$s,autoCompleteProps:Bs,avatarGroupProps:_s,avatarProps:Ls,backTopProps:Es,badgeProps:Ns,blockquoteProps:Lu,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonGroupProps:Us,buttonProps:js,calendarProps:Ks,cardProps:Js,carouselProps:rd,cascaderProps:ld,checkboxGroupProps:nd,checkboxProps:ad,codeProps:cd,colProps:zi,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,configProviderProps:gd,countdownProps:bd,createDiscreteApi:Vy,dataTableProps:Ad,datePickerProps:Xd,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogProps:Nn,dialogProviderProps:ic,dividerProps:sc,drawerContentProps:uc,drawerProps:cc,dropdownProps:jd,dynamicInputProps:hc,dynamicTagsProps:gc,elementProps:bc,ellipsisProps:Wa,emptyProps:xs,equationProps:Uu,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,giProps:nn,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconProps:Hd,iconWrapperProps:Tc,imageGroupProps:Bc,imageProps:Ac,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberProps:_c,inputProps:Is,layoutContentProps:ci,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,listProps:jc,loadingBarProviderProps:Wc,logProps:qc,mentionProps:eu,menuProps:Jc,messageProviderProps:tu,modalProps:rc,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationProps:Id,popconfirmProps:du,popoverProps:Cs,popselectProps:wd,progressProps:cu,radioButtonProps:hp,radioGroupProps:Ed,radioProps:_d,rateProps:fu,resultProps:hu,rowProps:Pi,scrollbarProps:vu,selectProps:Pd,skeletonProps:mu,sliderProps:pu,spaceProps:pc,spinProps:gu,statisticProps:bu,stepProps:xu,stepsProps:yu,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableProps:wu,tabsProps:Ru,tagProps:ks,textProps:Nu,thingProps:Pu,timePickerProps:Kd,timeProps:zu,timelineItemProps:$u,timelineProps:Tu,tooltipProps:Bd,transferProps:Iu,treeProps:Mu,treeSelectProps:Bu,ulProps:_u,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,watermarkProps:Wu},Symbol.toStringTag,{value:"Module"})),Wy="2.35.0";function Uy({componentPrefix:e="N",components:t=[]}={}){const o=[];function r(a,d,l){a.component(e+d)||a.component(e+d,l)}function n(a){o.includes(a)||(o.push(a),t.forEach(d=>{const{name:l,alias:s}=d;r(a,l,d),s&&s.forEach(c=>{r(a,c,d)})}))}return{version:Wy,componentPrefix:e,install:n}}const Ky=Uy({components:Object.keys($h).map(e=>$h[e])}),u6=Ky,f6=Ky.install;function h6(){const e=Ae(go,null);return x(()=>{if(e===null)return Ge;const{mergedThemeRef:{value:t},mergedThemeOverridesRef:{value:o}}=e,r=(t==null?void 0:t.common)||Ge;return o!=null&&o.common?Object.assign({},r,o.common):r})}const qy=()=>({}),v6={name:"Equation",common:Ge,self:qy},m6=v6,p6={name:"Equation",common:Qe,self:qy},g6=p6,b6={name:"dark",common:Qe,Alert:Hv,Anchor:Kv,AutoComplete:om,Avatar:As,AvatarGroup:h2,BackTop:fm,Badge:mm,Breadcrumb:xm,Button:wo,ButtonGroup:Zg,Calendar:U2,Card:Xs,Carousel:$R,Cascader:Vm,Checkbox:fn,Code:sd,Collapse:qm,CollapseTransition:bP,ColorPicker:Y2,DataTable:dp,DatePicker:Fp,Descriptions:Hp,Dialog:tc,Divider:og,Drawer:ig,Dropdown:ja,DynamicInput:dg,DynamicTags:pg,Element:yg,Empty:Lr,Ellipsis:np,Equation:g6,Form:wg,GradientText:Dg,Icon:wp,IconWrapper:W5,Image:X3,Input:Oo,InputNumber:Xg,LegacyTransfer:h4,Layout:Jg,List:ob,LoadingBar:rb,Log:ib,Menu:ub,Mention:lb,Message:Yg,Modal:Qp,Notification:Kg,PageHeader:O$,Pagination:$d,Popconfirm:pb,Popover:Er,Popselect:xd,Progress:Dc,Radio:Fd,Rate:bb,Result:wb,Row:q3,Scrollbar:xo,Select:Rd,Skeleton:fI,Slider:kb,Space:vc,Spin:Tb,Statistic:Db,Steps:Bb,Switch:Ab,Table:Nb,Tabs:jb,Tag:ws,Thing:Kb,TimePicker:Ud,Timeline:Gb,Tooltip:Ci,Transfer:Xb,Tree:Fc,TreeSelect:e0,Typography:r0,Upload:a0,Watermark:l0},Rn={name:"light",common:Ge,Alert:Vv,Anchor:Uv,AutoComplete:tm,Avatar:Os,AvatarGroup:dm,BackTop:hm,Badge:pm,Breadcrumb:ym,Button:Co,ButtonGroup:u$,Calendar:Tm,Card:Zs,Carousel:Om,Cascader:Hm,Checkbox:un,Code:dd,Collapse:Km,CollapseTransition:Zm,ColorPicker:Dm,DataTable:sp,DatePicker:Mp,Descriptions:Np,Dialog:ec,Divider:tg,Drawer:ng,Dropdown:Va,DynamicInput:cg,DynamicTags:gg,Element:xg,Empty:nr,Equation:m6,Ellipsis:Md,Form:yc,GradientText:Mg,Icon:Cp,IconWrapper:Ag,Image:jg,Input:$o,InputNumber:Qg,Layout:Ti,LegacyTransfer:C0,List:tb,LoadingBar:nb,Log:ab,Menu:cb,Mention:sb,Message:Gg,Modal:Xp,Notification:Ug,PageHeader:hb,Pagination:Td,Popconfirm:mb,Popover:_r,Popselect:Na,Progress:Ic,Radio:Ha,Rate:yb,Row:U3,Result:Cb,Scrollbar:yo,Skeleton:G0,Select:kd,Slider:Rb,Space:mc,Spin:zb,Statistic:Ib,Steps:Fb,Switch:Lb,Table:Eb,Tabs:Vb,Tag:Ss,Thing:Ub,TimePicker:Wd,Timeline:Yb,Tooltip:wi,Transfer:Qb,Tree:Mc,TreeSelect:t0,Typography:br,Upload:i0,Watermark:s0};function y6(e,t){const o=typeof e=="string",r={name:o?e:"customized-theme"};if(o){if(t)for(const n of t)r[n.name]=n}else for(const n of e)r[n.name]=n;return r}const x6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},i("g",{fill:"none"},i("path",{d:"M8.5 2a.5.5 0 0 0 0 1h3.793L3 12.293V8.5a.5.5 0 0 0-1 0v4.9a.6.6 0 0 0 .6.6h4.9a.5.5 0 0 0 0-1H3.707L13 3.707V7.5a.5.5 0 0 0 1 0V2.6a.6.6 0 0 0-.6-.6H8.5z",fill:"currentColor"})))}}),C6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},i("path",{d:"M4 18v2h6.586L2 28.582L3.414 30L12 21.414V28h2V18H4z",fill:"currentColor"}),i("path",{d:"M30 3.416L28.592 2L20 10.586V4h-2v10h10v-2h-6.586L30 3.416z",fill:"currentColor"}))}}),w6=i("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{width:"1em",height:"1em",color:"currentColor"}},i("path",{d:"M13.5 1C13.7761 1 14 1.22386 14 1.5V2H14.5C14.7761 2 15 2.22386 15 2.5C15 2.77614 14.7761 3 14.5 3H14V3.5C14 3.77614 13.7761 4 13.5 4C13.2239 4 13 3.77614 13 3.5V3H12.5C12.2239 3 12 2.77614 12 2.5C12 2.22386 12.2239 2 12.5 2H13V1.5C13 1.22386 13.2239 1 13.5 1Z",fill:"currentColor"}),i("path",{d:"M3.5 3C3.77615 3 4 3.22386 4 3.5V4H4.5C4.77615 4 5 4.22386 5 4.5C5 4.77614 4.77615 5 4.5 5H4V5.5C4 5.77614 3.77615 6 3.5 6C3.22386 6 3 5.77614 3 5.5V5H2.5C2.22386 5 2 4.77614 2 4.5C2 4.22386 2.22386 4 2.5 4H3V3.5C3 3.22386 3.22386 3 3.5 3Z",fill:"currentColor"}),i("path",{d:"M12.5 12C12.7761 12 13 11.7761 13 11.5C13 11.2239 12.7761 11 12.5 11H12V10.5C12 10.2239 11.7761 10 11.5 10C11.2239 10 11 10.2239 11 10.5V11H10.5C10.2239 11 10 11.2239 10 11.5C10 11.7761 10.2239 12 10.5 12H11V12.5C11 12.7761 11.2239 13 11.5 13C11.7761 13 12 12.7761 12 12.5V12H12.5Z",fill:"currentColor"}),i("path",{d:"M8.72956 4.56346C9.4771 3.81592 10.6891 3.81592 11.4367 4.56347C12.1842 5.31102 12.1842 6.52303 11.4367 7.27058L4.26679 14.4404C3.51924 15.1879 2.30723 15.1879 1.55968 14.4404C0.812134 13.6928 0.812138 12.4808 1.55969 11.7333L8.72956 4.56346ZM8.25002 6.4572L2.26679 12.4404C1.90977 12.7974 1.90977 13.3763 2.26679 13.7333C2.62381 14.0903 3.20266 14.0903 3.55968 13.7333L9.54292 7.75009L8.25002 6.4572ZM10.25 7.04299L10.7295 6.56347C11.0866 6.20645 11.0866 5.6276 10.7296 5.27057C10.3725 4.91355 9.79368 4.91355 9.43666 5.27057L8.95713 5.7501L10.25 7.04299Z",fill:"currentColor"})),S6=e=>e.includes("pacity")?!1:!!(e.includes("color")||e.includes("Color")),k6=W({name:"ThemeEditor",inheritAttrs:!1,setup(){const e=M(!1),t=M(null),o=Ae(go,null),r=x(()=>{var P,z,C,$;const D=(o==null?void 0:o.mergedThemeRef.value)||Rn,O=o==null?void 0:o.mergedThemeOverridesRef.value,I=dr({},D.common||Rn.common,O==null?void 0:O.common,d.value.common||{}),T={common:I};for(const B of Object.keys(Rn))B!=="common"&&(T[B]=((z=(P=D[B])===null||P===void 0?void 0:P.self)===null||z===void 0?void 0:z.call(P,I))||(($=(C=Rn[B]).self)===null||$===void 0?void 0:$.call(C,I)),O&&T[B]&&dr(T[B],O[B]));return T}),n=x(()=>{var P;return((P=o==null?void 0:o.mergedThemeRef.value)===null||P===void 0?void 0:P.common)||Rn.common}),a=M(!1),d=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),l=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),s=M(""),c=M(""),u=M(""),f=M("");function m(){d.value=oC(oa(l.value))}function h(P,z,C){const{value:$}=l;P in $||($[P]={});const D=$[P];C?D[z]=C:delete D[z]}function v(){l.value={},d.value={}}function y(){const{value:P}=t;P&&P.click()}function g(){e.value=!e.value}function b(){const{value:P}=t;if(!P)return;const z=P.files,C=z==null?void 0:z[0];C&&C.text().then($=>{d.value=JSON.parse($),l.value=JSON.parse($)}).catch($=>{alert("Imported File is Invalid"),console.error($)}).finally(()=>{P.value=""})}function w(){const P=URL.createObjectURL(new Blob([JSON.stringify(d.value,void 0,2)])),z=document.createElement("a");z.href=P,z.download="naive-ui-theme-overrides.json",document.body.appendChild(z),z.click(),document.body.removeChild(z),URL.revokeObjectURL(P)}return st(d,P=>{localStorage["naive-ui-theme-overrides"]=JSON.stringify(P)}),{locale:Qt("ThemeEditor").localeRef,themeCommonDefault:n,theme:r,showPanel:a,tempOverrides:l,overrides:d,compNamePattern:c,tempCompNamePattern:f,varNamePattern:s,tempVarNamePattern:u,fileInputRef:t,applyTempOverrides:m,setTempOverrides:h,handleClearAllClick:v,handleExportClick:w,handleImportClick:y,handleInputFileChange:b,toggleMaximized:g,isMaximized:e}},render(){return i(Ea,{themeOverrides:this.overrides},{default:()=>{var e,t;return[i(gr,{scrollable:!0,arrowPointToCenter:!0,trigger:"manual",show:this.showPanel,displayDirective:"show",placement:"top-end",style:{width:this.isMaximized?"calc(100vw - 80px)":"288px",height:"calc(100vh - 200px)",padding:0}},{trigger:()=>i(li,{style:[{position:"fixed",zIndex:10,bottom:"40px",right:`calc(40px + ${pa.value})`,width:"44px",height:"44px",fontSize:"26px",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",backgroundColor:"var(--popover-color)",color:"var(--text-color-2)",transition:"color .3s var(--cubic-bezier-ease-in-out), background-color .3s var(--cubic-bezier-ease-in-out), box-shadow .3s var(--cubic-bezier-ease-in-out)",boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",cursor:"pointer"},this.$attrs.style],onClick:()=>{this.showPanel=!this.showPanel}},{default:()=>w6}),default:()=>i(Nt,null,i("input",{type:"file",ref:"fileInputRef",style:{display:"block",width:0,height:0,visibility:"hidden"},onChange:this.handleInputFileChange}),i($n,{vertical:!0},{default:()=>[i($n,{align:"center",justify:"space-between",style:{marginBottom:"8px",fontSize:"18px",fontWeight:500}},{default:()=>i(Nt,null,i("span",null,this.locale.title),i(Ct,{onClick:this.toggleMaximized,secondary:!0,circle:!0,size:"tiny"},{icon:()=>i(Ka,{component:this.isMaximized?C6:x6})}))}),this.locale.filterCompName,i(Xt,{onChange:()=>{this.compNamePattern=this.tempCompNamePattern},onInput:o=>{this.tempCompNamePattern=o},value:this.tempCompNamePattern,placeholder:this.locale.filterCompName}),this.locale.filterVarName,i(Xt,{onChange:o=>{this.varNamePattern=o},onInput:o=>{this.tempVarNamePattern=o},value:this.tempVarNamePattern,placeholder:this.locale.filterVarName}),i(Ct,{size:"small",onClick:()=>{this.compNamePattern="",this.varNamePattern="",this.tempCompNamePattern="",this.tempVarNamePattern=""},block:!0},{default:()=>this.locale.clearSearch}),i(Ct,{size:"small",onClick:this.handleClearAllClick,block:!0},{default:()=>this.locale.clearAllVars}),i($n,{itemStyle:{flex:1}},{default:()=>i(Nt,null,i(Ct,{block:!0,size:"small",onClick:this.handleImportClick},{default:()=>this.locale.import}),i(Ct,{block:!0,size:"small",onClick:this.handleExportClick},{default:()=>this.locale.export}))})]}),i(dc,null),i(hd,null,{default:()=>{const{theme:o,compNamePattern:r,varNamePattern:n}=this,a=Object.keys(o),d=r.toLowerCase(),l=n.toLowerCase();let s=0;const c=a.filter(u=>u.toLowerCase().includes(d)).map(u=>{const f=u==="common"?this.themeCommonDefault:o[u];if(f===void 0)return null;const m=Object.keys(f).filter(h=>h!=="name"&&h.toLowerCase().includes(l));return m.length?(s+=1,i(md,{title:u,name:u},{default:()=>i(zc,{xGap:32,yGap:16,responsive:"screen",cols:this.isMaximized?"1 xs:1 s:2 m:3 l:4":1},{default:()=>m.map(h=>i(Bn,null,{default:()=>{var v,y,g,b;return i(Nt,null,i("div",{key:`${h}Label`,style:{wordBreak:"break-word"}},h),S6(h)?i(Ys,{key:h,modes:["rgb","hex"],value:((y=(v=this.tempOverrides)===null||v===void 0?void 0:v[u])===null||y===void 0?void 0:y[h])||f[h],onComplete:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)}},{action:()=>{var w,P;return i(Ct,{size:"small",disabled:f[h]===((P=(w=this.tempOverrides)===null||w===void 0?void 0:w[u])===null||P===void 0?void 0:P[h]),onClick:()=>{this.setTempOverrides(u,h,f[h]),this.applyTempOverrides()}},{default:()=>this.locale.restore})}}):i(Xt,{key:h,onChange:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)},value:((b=(g=this.tempOverrides)===null||g===void 0?void 0:g[u])===null||b===void 0?void 0:b[h])||"",placeholder:f[h]}))}}))})})):null});return s?c:i(ir,null)}}))}),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)]}})}}),R6=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThemeEditor:k6,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertDark:Hv,alertProps:Ps,anchorDark:Kv,anchorLinkProps:zs,anchorProps:$s,arDZ:J1,autoCompleteDark:om,autoCompleteProps:Bs,avatarDark:As,avatarGroupProps:_s,avatarProps:Ls,backTopDark:fm,backTopProps:Es,badgeDark:mm,badgeProps:Ns,blockquoteProps:Lu,breadcrumbDark:xm,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonDark:wo,buttonGroupDark:Zg,buttonGroupProps:Us,buttonProps:js,c:S,cB:p,cE:R,cM:k,cNotM:vt,calendarProps:Ks,cardDark:Xs,cardProps:Js,carouselProps:rd,cascaderDark:Vm,cascaderProps:ld,checkboxDark:fn,checkboxGroupProps:nd,checkboxProps:ad,codeDark:sd,codeProps:cd,colProps:zi,collapseDark:qm,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,commonDark:Qe,commonLight:Ge,configProviderProps:gd,countdownProps:bd,create:Uy,createDiscreteApi:Vy,createLocale:iS,createTheme:y6,darkTheme:b6,dataTableDark:dp,dataTableProps:Ad,dateArDZ:Gw,dateDeDE:Pw,dateEnGB:Nw,dateEnUS:mv,dateEo:Qw,dateEsAR:Bw,dateFaIR:oS,dateFrFR:Mw,dateIdID:kw,dateItIT:Aw,dateJaJP:xw,dateKoKR:ww,dateNbNO:Tw,dateNlNL:Iw,datePickerDark:Fp,datePickerProps:Xd,datePlPL:Vw,datePtBR:Ww,dateRuRU:pw,dateSkSK:_w,dateSvSE:nS,dateThTH:Kw,dateTrTR:Zw,dateUkUA:bw,dateViVN:eS,dateZhCN:uw,dateZhTW:hw,deDE:D1,default:u6,descriptionsDark:Hp,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogDark:tc,dialogProps:Nn,dialogProviderProps:ic,dividerDark:og,dividerProps:sc,drawerContentProps:uc,drawerDark:ig,drawerProps:cc,dropdownDark:ja,dropdownProps:jd,dynamicInputDark:dg,dynamicInputProps:hc,dynamicTagsDark:pg,dynamicTagsProps:gc,elementDark:yg,elementProps:bc,ellipsisProps:Wa,emptyDark:Lr,emptyProps:xs,enGB:U1,enUS:vv,eo:rw,equationProps:Uu,esAR:E1,faIR:lw,formDark:wg,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,frFR:L1,giProps:nn,gradientTextDark:Dg,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconDark:wp,iconProps:Hd,iconWrapperProps:Tc,idID:$1,imageGroupProps:Bc,imageProps:Ac,inputDark:Oo,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberDark:Xg,inputNumberProps:_c,inputProps:Is,install:f6,internalSelectMenuDark:En,internalSelectionDark:Ba,itIT:H1,jaJP:R1,koKR:z1,layoutContentProps:ci,layoutDark:Jg,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,lightTheme:Rn,listDark:ob,listProps:jc,loadingBarDark:rb,loadingBarProviderProps:Wc,logDark:ib,logProps:qc,mentionDark:lb,mentionProps:eu,menuDark:ub,menuProps:Jc,messageDark:Yg,messageProviderProps:tu,modalDark:Qp,modalProps:rc,nbNO:F1,nlNL:O1,notificationDark:Kg,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationDark:$d,paginationProps:Id,plPL:q1,popconfirmDark:pb,popconfirmProps:du,popoverDark:Er,popoverProps:Cs,popselectDark:xd,popselectProps:wd,progressDark:Dc,progressProps:cu,ptBR:Y1,radioButtonProps:hp,radioDark:Fd,radioGroupProps:Ed,radioProps:_d,rateDark:bb,rateProps:fu,resultDark:wb,resultProps:hu,rowProps:Pi,ruRU:C1,scrollbarDark:xo,scrollbarProps:vu,selectDark:Rd,selectProps:Pd,skSK:j1,skeletonProps:mu,sliderDark:kb,sliderProps:pu,spaceDark:vc,spaceProps:pc,spinDark:Tb,spinProps:gu,statisticDark:Db,statisticProps:bu,stepProps:xu,stepsDark:Bb,stepsProps:yu,svSE:dw,switchDark:Ab,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableDark:Nb,tableProps:wu,tabsDark:jb,tabsProps:Ru,tagDark:ws,tagProps:ks,textProps:Nu,thTH:X1,thingDark:Kb,thingProps:Pu,timePickerDark:Ud,timePickerProps:Kd,timeProps:zu,timelineDark:Gb,timelineItemProps:$u,timelineProps:Tu,tooltipDark:Ci,tooltipProps:Bd,trTR:tw,transferDark:Xb,transferProps:Iu,treeDark:Fc,treeProps:Mu,treeSelectDark:e0,treeSelectProps:Bu,typographyDark:r0,ukUA:S1,ulProps:_u,unstableAlertRtl:Mk,unstableAvatarGroupRtl:m2,unstableBadgeRtl:R2,unstableButtonGroupRtl:ug,unstableButtonRtl:La,unstableCardRtl:kR,unstableCheckboxRtl:Em,unstableCollapseRtl:fP,unstableCollapseTransitionRtl:xP,unstableDrawerRtl:ET,unstableDynamicInputRtl:a5,unstableInputNumberRtl:fg,unstableInputRtl:Aa,unstableListRtl:C$,unstableMessageRtl:s$,unstableNotificationRtl:r$,unstablePageHeaderRtl:L$,unstablePaginationRtl:OP,unstableRadioRtl:qP,unstableRowRtl:Z3,unstableScrollbarRtl:YS,unstableSpaceRtl:mg,unstableStatisticRtl:r3,unstableStepsRtl:s3,unstableTableRtl:p3,unstableTagRtl:bk,unstableThingRtl:S3,unstableTreeRtl:F3,uploadDark:a0,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,useOsTheme:FC,useThemeVars:h6,version:Wy,viVN:iw,watermarkDark:l0,watermarkProps:Wu,zhCN:p1,zhTW:b1,zindexable:Ln},Symbol.toStringTag,{value:"Module"})),P6=W({__name:"MxButton",setup(e){const{NButton:t}=R6;return(o,r)=>(Vh(),dC(oi(t),null,{default:jh(()=>[Pa(o.$slots,"default")]),_:3}))}}),D6=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/common-components/按钮.md","filePath":"cn/mx-components/common-components/按钮.md","lastUpdated":1719277083000}'),z6={name:"cn/mx-components/common-components/按钮.md"},M6=Object.assign(z6,{setup(e){return(t,o)=>(Vh(),cC("div",null,[uC("pre",null,fC(oi(vC)),1),hC(oi(P6),{type:"primary"},{default:jh(()=>[In("submit")]),_:1})]))}});export{D6 as __pageData,M6 as default}; + `)])]);function l6(e){if(!e)return 1;const t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t}const Wu=Object.assign(Object.assign({},ce.props),{debug:Boolean,cross:Boolean,fullscreen:Boolean,width:{type:Number,default:32},height:{type:Number,default:32},zIndex:{type:Number,default:10},xGap:{type:Number,default:0},yGap:{type:Number,default:0},yOffset:{type:Number,default:0},xOffset:{type:Number,default:0},rotate:{type:Number,default:0},image:String,imageOpacity:{type:Number,default:1},imageHeight:Number,imageWidth:Number,content:String,selectable:{type:Boolean,default:!0},fontSize:{type:Number,default:14},fontFamily:String,fontStyle:{type:String,default:"normal"},fontVariant:{type:String,default:""},fontWeight:{type:Number,default:400},fontColor:{type:String,default:"rgba(128, 128, 128, .3)"},fontStretch:{type:String,default:""},lineHeight:{type:Number,default:14},globalRotate:{type:Number,default:0}}),Hy=W({name:"Watermark",props:Wu,setup(e,{slots:t}){const{mergedClsPrefixRef:o}=He(e),r=ce("Watermark","-watermark",a6,s0,e,o),n=M(""),a=bo?document.createElement("canvas"):null,d=a?a.getContext("2d"):null,l=M(!1);return Ia(()=>l.value=!0),Dt(()=>{if(!a)return;l.value;const s=l6(d),{xGap:c,yGap:u,width:f,height:m,yOffset:h,xOffset:v,rotate:y,image:g,content:b,fontColor:w,fontStyle:P,fontVariant:z,fontStretch:C,fontWeight:$,fontFamily:D,fontSize:O,lineHeight:I,debug:T}=e,B=(c+f)*s,F=(u+m)*s,L=v*s,H=h*s;if(a.width=B,a.height=F,d){d.translate(0,0);const N=f*s,E=m*s;if(T&&(d.strokeStyle="grey",d.strokeRect(0,0,N,E)),d.rotate(y*(Math.PI/180)),g){const G=new Image;G.crossOrigin="anonymous",G.referrerPolicy="no-referrer",G.src=g,G.onload=()=>{d.globalAlpha=e.imageOpacity;const{imageWidth:re,imageHeight:Q}=e;d.drawImage(G,L,H,(e.imageWidth||(Q?G.width*Q/G.height:G.width))*s,(e.imageHeight||(re?G.height*re/G.width:G.height))*s),n.value=a.toDataURL()}}else b&&(T&&(d.strokeStyle="green",d.strokeRect(0,0,N,E)),d.font=`${P} ${z} ${$} ${C} ${O*s}px/${I*s}px ${D||r.value.self.fontFamily}`,d.fillStyle=w,d.fillText(b,L,H+I*s),n.value=a.toDataURL())}else mC("watermark","Canvas is not supported in the browser.")}),()=>{var s;const{globalRotate:c,fullscreen:u,zIndex:f}=e,m=o.value,h=c!==0&&u,v="max(142vh, 142vw)",y=i("div",{class:[`${m}-watermark`,c!==0&&`${m}-watermark--global-rotate`,u&&`${m}-watermark--fullscreen`],style:{transform:c?`translateX(-50%) translateY(-50%) rotate(${c}deg)`:void 0,zIndex:h?void 0:f,backgroundSize:`${e.xGap+e.width}px`,backgroundPosition:c===0?e.cross?`${e.width/2}px ${e.height/2}px, 0 0`:"":e.cross?`calc(${v} + ${e.width/2}px) calc(${v} + ${e.height/2}px), ${v} ${v}`:v,backgroundImage:e.cross?`url(${n.value}), url(${n.value})`:`url(${n.value})`}});return e.fullscreen&&!c?y:i("div",{class:[`${m}-watermark-container`,c!==0&&`${m}-watermark-container--global-rotate`,u&&`${m}-watermark-container--fullscreen`,e.selectable&&`${m}-watermark-container--selectable`],style:{zIndex:h?f:void 0}},(s=t.default)===null||s===void 0?void 0:s.call(t),y)}}}),s6=W({name:"InjectionExtractor",props:{onSetup:Function},setup(e,{slots:t}){var o;return(o=e.onSetup)===null||o===void 0||o.call(e),()=>{var r;return(r=t.default)===null||r===void 0?void 0:r.call(t)}}}),d6={message:ru,notification:lu,loadingBar:Kc,dialog:lc};function c6({providersAndProps:e,configProviderProps:t}){let r=sC(()=>i(Ea,oi(t),{default:()=>e.map(({type:l,Provider:s,props:c})=>i(s,oi(c),{default:()=>i(s6,{onSetup:()=>n[l]=d6[l]()})}))}));const n={app:r};let a;return bo&&(a=document.createElement("div"),document.body.appendChild(a),r.mount(a)),Object.assign({unmount:()=>{var l;if(r===null||a===null){mo("discrete","unmount call no need because discrete app has been unmounted");return}r.unmount(),(l=a.parentNode)===null||l===void 0||l.removeChild(a),a=null,r=null}},n)}function Vy(e,{configProviderProps:t,messageProviderProps:o,dialogProviderProps:r,notificationProviderProps:n,loadingBarProviderProps:a}={}){const d=[];return e.forEach(s=>{switch(s){case"message":d.push({type:s,Provider:ou,props:o});break;case"notification":d.push({type:s,Provider:au,props:n});break;case"dialog":d.push({type:s,Provider:ac,props:r});break;case"loadingBar":d.push({type:s,Provider:Uc,props:a});break}}),c6({providersAndProps:d,configProviderProps:t})}const Uu={value:String,katex:Object,katexOptions:Object},jy=W({name:"Equation",props:Uu,setup(e){const t=Ae(go),o=x(()=>{var r;const n=((r=e.katex||(t==null?void 0:t.mergedKatexRef.value))===null||r===void 0?void 0:r.renderToString(e.value||"",Object.assign({throwOnError:!1},e.katexOptions)))||"no katex provided",a=n.match(/^<([a-z]+)[^>]+class="([^"]+)"[^>]*>/),d=(a==null?void 0:a[1])||"span",l=a==null?void 0:a[2],s=n.replace(/^<[a-z]+[^>]*>/,"").replace(/<\/[a-z]+>$/,"");return{wrapperTag:d,innerHtml:s,wrapperClass:l}});return()=>{const{innerHtml:r,wrapperClass:n,wrapperTag:a}=o.value;return i(a,{class:n,innerHTML:r})}}}),$h=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertProps:Ps,anchorLinkProps:zs,anchorProps:$s,autoCompleteProps:Bs,avatarGroupProps:_s,avatarProps:Ls,backTopProps:Es,badgeProps:Ns,blockquoteProps:Lu,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonGroupProps:Us,buttonProps:js,calendarProps:Ks,cardProps:Js,carouselProps:rd,cascaderProps:ld,checkboxGroupProps:nd,checkboxProps:ad,codeProps:cd,colProps:zi,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,configProviderProps:gd,countdownProps:bd,createDiscreteApi:Vy,dataTableProps:Ad,datePickerProps:Xd,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogProps:Nn,dialogProviderProps:ic,dividerProps:sc,drawerContentProps:uc,drawerProps:cc,dropdownProps:jd,dynamicInputProps:hc,dynamicTagsProps:gc,elementProps:bc,ellipsisProps:Wa,emptyProps:xs,equationProps:Uu,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,giProps:nn,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconProps:Hd,iconWrapperProps:Tc,imageGroupProps:Bc,imageProps:Ac,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberProps:_c,inputProps:Is,layoutContentProps:ci,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,listProps:jc,loadingBarProviderProps:Wc,logProps:qc,mentionProps:eu,menuProps:Jc,messageProviderProps:tu,modalProps:rc,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationProps:Id,popconfirmProps:du,popoverProps:Cs,popselectProps:wd,progressProps:cu,radioButtonProps:hp,radioGroupProps:Ed,radioProps:_d,rateProps:fu,resultProps:hu,rowProps:Pi,scrollbarProps:vu,selectProps:Pd,skeletonProps:mu,sliderProps:pu,spaceProps:pc,spinProps:gu,statisticProps:bu,stepProps:xu,stepsProps:yu,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableProps:wu,tabsProps:Ru,tagProps:ks,textProps:Nu,thingProps:Pu,timePickerProps:Kd,timeProps:zu,timelineItemProps:$u,timelineProps:Tu,tooltipProps:Bd,transferProps:Iu,treeProps:Mu,treeSelectProps:Bu,ulProps:_u,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,watermarkProps:Wu},Symbol.toStringTag,{value:"Module"})),Wy="2.35.0";function Uy({componentPrefix:e="N",components:t=[]}={}){const o=[];function r(a,d,l){a.component(e+d)||a.component(e+d,l)}function n(a){o.includes(a)||(o.push(a),t.forEach(d=>{const{name:l,alias:s}=d;r(a,l,d),s&&s.forEach(c=>{r(a,c,d)})}))}return{version:Wy,componentPrefix:e,install:n}}const Ky=Uy({components:Object.keys($h).map(e=>$h[e])}),u6=Ky,f6=Ky.install;function h6(){const e=Ae(go,null);return x(()=>{if(e===null)return Ge;const{mergedThemeRef:{value:t},mergedThemeOverridesRef:{value:o}}=e,r=(t==null?void 0:t.common)||Ge;return o!=null&&o.common?Object.assign({},r,o.common):r})}const qy=()=>({}),v6={name:"Equation",common:Ge,self:qy},m6=v6,p6={name:"Equation",common:Qe,self:qy},g6=p6,b6={name:"dark",common:Qe,Alert:Hv,Anchor:Kv,AutoComplete:om,Avatar:As,AvatarGroup:h2,BackTop:fm,Badge:mm,Breadcrumb:xm,Button:wo,ButtonGroup:Zg,Calendar:U2,Card:Xs,Carousel:$R,Cascader:Vm,Checkbox:fn,Code:sd,Collapse:qm,CollapseTransition:bP,ColorPicker:Y2,DataTable:dp,DatePicker:Fp,Descriptions:Hp,Dialog:tc,Divider:og,Drawer:ig,Dropdown:ja,DynamicInput:dg,DynamicTags:pg,Element:yg,Empty:Lr,Ellipsis:np,Equation:g6,Form:wg,GradientText:Dg,Icon:wp,IconWrapper:W5,Image:X3,Input:Oo,InputNumber:Xg,LegacyTransfer:h4,Layout:Jg,List:ob,LoadingBar:rb,Log:ib,Menu:ub,Mention:lb,Message:Yg,Modal:Qp,Notification:Kg,PageHeader:O$,Pagination:$d,Popconfirm:pb,Popover:Er,Popselect:xd,Progress:Dc,Radio:Fd,Rate:bb,Result:wb,Row:q3,Scrollbar:xo,Select:Rd,Skeleton:fI,Slider:kb,Space:vc,Spin:Tb,Statistic:Db,Steps:Bb,Switch:Ab,Table:Nb,Tabs:jb,Tag:ws,Thing:Kb,TimePicker:Ud,Timeline:Gb,Tooltip:Ci,Transfer:Xb,Tree:Fc,TreeSelect:e0,Typography:r0,Upload:a0,Watermark:l0},Rn={name:"light",common:Ge,Alert:Vv,Anchor:Uv,AutoComplete:tm,Avatar:Os,AvatarGroup:dm,BackTop:hm,Badge:pm,Breadcrumb:ym,Button:Co,ButtonGroup:u$,Calendar:Tm,Card:Zs,Carousel:Om,Cascader:Hm,Checkbox:un,Code:dd,Collapse:Km,CollapseTransition:Zm,ColorPicker:Dm,DataTable:sp,DatePicker:Mp,Descriptions:Np,Dialog:ec,Divider:tg,Drawer:ng,Dropdown:Va,DynamicInput:cg,DynamicTags:gg,Element:xg,Empty:nr,Equation:m6,Ellipsis:Md,Form:yc,GradientText:Mg,Icon:Cp,IconWrapper:Ag,Image:jg,Input:$o,InputNumber:Qg,Layout:Ti,LegacyTransfer:C0,List:tb,LoadingBar:nb,Log:ab,Menu:cb,Mention:sb,Message:Gg,Modal:Xp,Notification:Ug,PageHeader:hb,Pagination:Td,Popconfirm:mb,Popover:_r,Popselect:Na,Progress:Ic,Radio:Ha,Rate:yb,Row:U3,Result:Cb,Scrollbar:yo,Skeleton:G0,Select:kd,Slider:Rb,Space:mc,Spin:zb,Statistic:Ib,Steps:Fb,Switch:Lb,Table:Eb,Tabs:Vb,Tag:Ss,Thing:Ub,TimePicker:Wd,Timeline:Yb,Tooltip:wi,Transfer:Qb,Tree:Mc,TreeSelect:t0,Typography:br,Upload:i0,Watermark:s0};function y6(e,t){const o=typeof e=="string",r={name:o?e:"customized-theme"};if(o){if(t)for(const n of t)r[n.name]=n}else for(const n of e)r[n.name]=n;return r}const x6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},i("g",{fill:"none"},i("path",{d:"M8.5 2a.5.5 0 0 0 0 1h3.793L3 12.293V8.5a.5.5 0 0 0-1 0v4.9a.6.6 0 0 0 .6.6h4.9a.5.5 0 0 0 0-1H3.707L13 3.707V7.5a.5.5 0 0 0 1 0V2.6a.6.6 0 0 0-.6-.6H8.5z",fill:"currentColor"})))}}),C6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},i("path",{d:"M4 18v2h6.586L2 28.582L3.414 30L12 21.414V28h2V18H4z",fill:"currentColor"}),i("path",{d:"M30 3.416L28.592 2L20 10.586V4h-2v10h10v-2h-6.586L30 3.416z",fill:"currentColor"}))}}),w6=i("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{width:"1em",height:"1em",color:"currentColor"}},i("path",{d:"M13.5 1C13.7761 1 14 1.22386 14 1.5V2H14.5C14.7761 2 15 2.22386 15 2.5C15 2.77614 14.7761 3 14.5 3H14V3.5C14 3.77614 13.7761 4 13.5 4C13.2239 4 13 3.77614 13 3.5V3H12.5C12.2239 3 12 2.77614 12 2.5C12 2.22386 12.2239 2 12.5 2H13V1.5C13 1.22386 13.2239 1 13.5 1Z",fill:"currentColor"}),i("path",{d:"M3.5 3C3.77615 3 4 3.22386 4 3.5V4H4.5C4.77615 4 5 4.22386 5 4.5C5 4.77614 4.77615 5 4.5 5H4V5.5C4 5.77614 3.77615 6 3.5 6C3.22386 6 3 5.77614 3 5.5V5H2.5C2.22386 5 2 4.77614 2 4.5C2 4.22386 2.22386 4 2.5 4H3V3.5C3 3.22386 3.22386 3 3.5 3Z",fill:"currentColor"}),i("path",{d:"M12.5 12C12.7761 12 13 11.7761 13 11.5C13 11.2239 12.7761 11 12.5 11H12V10.5C12 10.2239 11.7761 10 11.5 10C11.2239 10 11 10.2239 11 10.5V11H10.5C10.2239 11 10 11.2239 10 11.5C10 11.7761 10.2239 12 10.5 12H11V12.5C11 12.7761 11.2239 13 11.5 13C11.7761 13 12 12.7761 12 12.5V12H12.5Z",fill:"currentColor"}),i("path",{d:"M8.72956 4.56346C9.4771 3.81592 10.6891 3.81592 11.4367 4.56347C12.1842 5.31102 12.1842 6.52303 11.4367 7.27058L4.26679 14.4404C3.51924 15.1879 2.30723 15.1879 1.55968 14.4404C0.812134 13.6928 0.812138 12.4808 1.55969 11.7333L8.72956 4.56346ZM8.25002 6.4572L2.26679 12.4404C1.90977 12.7974 1.90977 13.3763 2.26679 13.7333C2.62381 14.0903 3.20266 14.0903 3.55968 13.7333L9.54292 7.75009L8.25002 6.4572ZM10.25 7.04299L10.7295 6.56347C11.0866 6.20645 11.0866 5.6276 10.7296 5.27057C10.3725 4.91355 9.79368 4.91355 9.43666 5.27057L8.95713 5.7501L10.25 7.04299Z",fill:"currentColor"})),S6=e=>e.includes("pacity")?!1:!!(e.includes("color")||e.includes("Color")),k6=W({name:"ThemeEditor",inheritAttrs:!1,setup(){const e=M(!1),t=M(null),o=Ae(go,null),r=x(()=>{var P,z,C,$;const D=(o==null?void 0:o.mergedThemeRef.value)||Rn,O=o==null?void 0:o.mergedThemeOverridesRef.value,I=dr({},D.common||Rn.common,O==null?void 0:O.common,d.value.common||{}),T={common:I};for(const B of Object.keys(Rn))B!=="common"&&(T[B]=((z=(P=D[B])===null||P===void 0?void 0:P.self)===null||z===void 0?void 0:z.call(P,I))||(($=(C=Rn[B]).self)===null||$===void 0?void 0:$.call(C,I)),O&&T[B]&&dr(T[B],O[B]));return T}),n=x(()=>{var P;return((P=o==null?void 0:o.mergedThemeRef.value)===null||P===void 0?void 0:P.common)||Rn.common}),a=M(!1),d=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),l=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),s=M(""),c=M(""),u=M(""),f=M("");function m(){d.value=oC(oa(l.value))}function h(P,z,C){const{value:$}=l;P in $||($[P]={});const D=$[P];C?D[z]=C:delete D[z]}function v(){l.value={},d.value={}}function y(){const{value:P}=t;P&&P.click()}function g(){e.value=!e.value}function b(){const{value:P}=t;if(!P)return;const z=P.files,C=z==null?void 0:z[0];C&&C.text().then($=>{d.value=JSON.parse($),l.value=JSON.parse($)}).catch($=>{alert("Imported File is Invalid"),console.error($)}).finally(()=>{P.value=""})}function w(){const P=URL.createObjectURL(new Blob([JSON.stringify(d.value,void 0,2)])),z=document.createElement("a");z.href=P,z.download="naive-ui-theme-overrides.json",document.body.appendChild(z),z.click(),document.body.removeChild(z),URL.revokeObjectURL(P)}return st(d,P=>{localStorage["naive-ui-theme-overrides"]=JSON.stringify(P)}),{locale:Qt("ThemeEditor").localeRef,themeCommonDefault:n,theme:r,showPanel:a,tempOverrides:l,overrides:d,compNamePattern:c,tempCompNamePattern:f,varNamePattern:s,tempVarNamePattern:u,fileInputRef:t,applyTempOverrides:m,setTempOverrides:h,handleClearAllClick:v,handleExportClick:w,handleImportClick:y,handleInputFileChange:b,toggleMaximized:g,isMaximized:e}},render(){return i(Ea,{themeOverrides:this.overrides},{default:()=>{var e,t;return[i(gr,{scrollable:!0,arrowPointToCenter:!0,trigger:"manual",show:this.showPanel,displayDirective:"show",placement:"top-end",style:{width:this.isMaximized?"calc(100vw - 80px)":"288px",height:"calc(100vh - 200px)",padding:0}},{trigger:()=>i(li,{style:[{position:"fixed",zIndex:10,bottom:"40px",right:`calc(40px + ${pa.value})`,width:"44px",height:"44px",fontSize:"26px",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",backgroundColor:"var(--popover-color)",color:"var(--text-color-2)",transition:"color .3s var(--cubic-bezier-ease-in-out), background-color .3s var(--cubic-bezier-ease-in-out), box-shadow .3s var(--cubic-bezier-ease-in-out)",boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",cursor:"pointer"},this.$attrs.style],onClick:()=>{this.showPanel=!this.showPanel}},{default:()=>w6}),default:()=>i(Nt,null,i("input",{type:"file",ref:"fileInputRef",style:{display:"block",width:0,height:0,visibility:"hidden"},onChange:this.handleInputFileChange}),i($n,{vertical:!0},{default:()=>[i($n,{align:"center",justify:"space-between",style:{marginBottom:"8px",fontSize:"18px",fontWeight:500}},{default:()=>i(Nt,null,i("span",null,this.locale.title),i(Ct,{onClick:this.toggleMaximized,secondary:!0,circle:!0,size:"tiny"},{icon:()=>i(Ka,{component:this.isMaximized?C6:x6})}))}),this.locale.filterCompName,i(Xt,{onChange:()=>{this.compNamePattern=this.tempCompNamePattern},onInput:o=>{this.tempCompNamePattern=o},value:this.tempCompNamePattern,placeholder:this.locale.filterCompName}),this.locale.filterVarName,i(Xt,{onChange:o=>{this.varNamePattern=o},onInput:o=>{this.tempVarNamePattern=o},value:this.tempVarNamePattern,placeholder:this.locale.filterVarName}),i(Ct,{size:"small",onClick:()=>{this.compNamePattern="",this.varNamePattern="",this.tempCompNamePattern="",this.tempVarNamePattern=""},block:!0},{default:()=>this.locale.clearSearch}),i(Ct,{size:"small",onClick:this.handleClearAllClick,block:!0},{default:()=>this.locale.clearAllVars}),i($n,{itemStyle:{flex:1}},{default:()=>i(Nt,null,i(Ct,{block:!0,size:"small",onClick:this.handleImportClick},{default:()=>this.locale.import}),i(Ct,{block:!0,size:"small",onClick:this.handleExportClick},{default:()=>this.locale.export}))})]}),i(dc,null),i(hd,null,{default:()=>{const{theme:o,compNamePattern:r,varNamePattern:n}=this,a=Object.keys(o),d=r.toLowerCase(),l=n.toLowerCase();let s=0;const c=a.filter(u=>u.toLowerCase().includes(d)).map(u=>{const f=u==="common"?this.themeCommonDefault:o[u];if(f===void 0)return null;const m=Object.keys(f).filter(h=>h!=="name"&&h.toLowerCase().includes(l));return m.length?(s+=1,i(md,{title:u,name:u},{default:()=>i(zc,{xGap:32,yGap:16,responsive:"screen",cols:this.isMaximized?"1 xs:1 s:2 m:3 l:4":1},{default:()=>m.map(h=>i(Bn,null,{default:()=>{var v,y,g,b;return i(Nt,null,i("div",{key:`${h}Label`,style:{wordBreak:"break-word"}},h),S6(h)?i(Ys,{key:h,modes:["rgb","hex"],value:((y=(v=this.tempOverrides)===null||v===void 0?void 0:v[u])===null||y===void 0?void 0:y[h])||f[h],onComplete:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)}},{action:()=>{var w,P;return i(Ct,{size:"small",disabled:f[h]===((P=(w=this.tempOverrides)===null||w===void 0?void 0:w[u])===null||P===void 0?void 0:P[h]),onClick:()=>{this.setTempOverrides(u,h,f[h]),this.applyTempOverrides()}},{default:()=>this.locale.restore})}}):i(Xt,{key:h,onChange:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)},value:((b=(g=this.tempOverrides)===null||g===void 0?void 0:g[u])===null||b===void 0?void 0:b[h])||"",placeholder:f[h]}))}}))})})):null});return s?c:i(ir,null)}}))}),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)]}})}}),R6=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThemeEditor:k6,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertDark:Hv,alertProps:Ps,anchorDark:Kv,anchorLinkProps:zs,anchorProps:$s,arDZ:J1,autoCompleteDark:om,autoCompleteProps:Bs,avatarDark:As,avatarGroupProps:_s,avatarProps:Ls,backTopDark:fm,backTopProps:Es,badgeDark:mm,badgeProps:Ns,blockquoteProps:Lu,breadcrumbDark:xm,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonDark:wo,buttonGroupDark:Zg,buttonGroupProps:Us,buttonProps:js,c:S,cB:p,cE:R,cM:k,cNotM:vt,calendarProps:Ks,cardDark:Xs,cardProps:Js,carouselProps:rd,cascaderDark:Vm,cascaderProps:ld,checkboxDark:fn,checkboxGroupProps:nd,checkboxProps:ad,codeDark:sd,codeProps:cd,colProps:zi,collapseDark:qm,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,commonDark:Qe,commonLight:Ge,configProviderProps:gd,countdownProps:bd,create:Uy,createDiscreteApi:Vy,createLocale:iS,createTheme:y6,darkTheme:b6,dataTableDark:dp,dataTableProps:Ad,dateArDZ:Gw,dateDeDE:Pw,dateEnGB:Nw,dateEnUS:mv,dateEo:Qw,dateEsAR:Bw,dateFaIR:oS,dateFrFR:Mw,dateIdID:kw,dateItIT:Aw,dateJaJP:xw,dateKoKR:ww,dateNbNO:Tw,dateNlNL:Iw,datePickerDark:Fp,datePickerProps:Xd,datePlPL:Vw,datePtBR:Ww,dateRuRU:pw,dateSkSK:_w,dateSvSE:nS,dateThTH:Kw,dateTrTR:Zw,dateUkUA:bw,dateViVN:eS,dateZhCN:uw,dateZhTW:hw,deDE:D1,default:u6,descriptionsDark:Hp,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogDark:tc,dialogProps:Nn,dialogProviderProps:ic,dividerDark:og,dividerProps:sc,drawerContentProps:uc,drawerDark:ig,drawerProps:cc,dropdownDark:ja,dropdownProps:jd,dynamicInputDark:dg,dynamicInputProps:hc,dynamicTagsDark:pg,dynamicTagsProps:gc,elementDark:yg,elementProps:bc,ellipsisProps:Wa,emptyDark:Lr,emptyProps:xs,enGB:U1,enUS:vv,eo:rw,equationProps:Uu,esAR:E1,faIR:lw,formDark:wg,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,frFR:L1,giProps:nn,gradientTextDark:Dg,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconDark:wp,iconProps:Hd,iconWrapperProps:Tc,idID:$1,imageGroupProps:Bc,imageProps:Ac,inputDark:Oo,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberDark:Xg,inputNumberProps:_c,inputProps:Is,install:f6,internalSelectMenuDark:En,internalSelectionDark:Ba,itIT:H1,jaJP:R1,koKR:z1,layoutContentProps:ci,layoutDark:Jg,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,lightTheme:Rn,listDark:ob,listProps:jc,loadingBarDark:rb,loadingBarProviderProps:Wc,logDark:ib,logProps:qc,mentionDark:lb,mentionProps:eu,menuDark:ub,menuProps:Jc,messageDark:Yg,messageProviderProps:tu,modalDark:Qp,modalProps:rc,nbNO:F1,nlNL:O1,notificationDark:Kg,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationDark:$d,paginationProps:Id,plPL:q1,popconfirmDark:pb,popconfirmProps:du,popoverDark:Er,popoverProps:Cs,popselectDark:xd,popselectProps:wd,progressDark:Dc,progressProps:cu,ptBR:Y1,radioButtonProps:hp,radioDark:Fd,radioGroupProps:Ed,radioProps:_d,rateDark:bb,rateProps:fu,resultDark:wb,resultProps:hu,rowProps:Pi,ruRU:C1,scrollbarDark:xo,scrollbarProps:vu,selectDark:Rd,selectProps:Pd,skSK:j1,skeletonProps:mu,sliderDark:kb,sliderProps:pu,spaceDark:vc,spaceProps:pc,spinDark:Tb,spinProps:gu,statisticDark:Db,statisticProps:bu,stepProps:xu,stepsDark:Bb,stepsProps:yu,svSE:dw,switchDark:Ab,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableDark:Nb,tableProps:wu,tabsDark:jb,tabsProps:Ru,tagDark:ws,tagProps:ks,textProps:Nu,thTH:X1,thingDark:Kb,thingProps:Pu,timePickerDark:Ud,timePickerProps:Kd,timeProps:zu,timelineDark:Gb,timelineItemProps:$u,timelineProps:Tu,tooltipDark:Ci,tooltipProps:Bd,trTR:tw,transferDark:Xb,transferProps:Iu,treeDark:Fc,treeProps:Mu,treeSelectDark:e0,treeSelectProps:Bu,typographyDark:r0,ukUA:S1,ulProps:_u,unstableAlertRtl:Mk,unstableAvatarGroupRtl:m2,unstableBadgeRtl:R2,unstableButtonGroupRtl:ug,unstableButtonRtl:La,unstableCardRtl:kR,unstableCheckboxRtl:Em,unstableCollapseRtl:fP,unstableCollapseTransitionRtl:xP,unstableDrawerRtl:ET,unstableDynamicInputRtl:a5,unstableInputNumberRtl:fg,unstableInputRtl:Aa,unstableListRtl:C$,unstableMessageRtl:s$,unstableNotificationRtl:r$,unstablePageHeaderRtl:L$,unstablePaginationRtl:OP,unstableRadioRtl:qP,unstableRowRtl:Z3,unstableScrollbarRtl:YS,unstableSpaceRtl:mg,unstableStatisticRtl:r3,unstableStepsRtl:s3,unstableTableRtl:p3,unstableTagRtl:bk,unstableThingRtl:S3,unstableTreeRtl:F3,uploadDark:a0,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,useOsTheme:FC,useThemeVars:h6,version:Wy,viVN:iw,watermarkDark:l0,watermarkProps:Wu,zhCN:p1,zhTW:b1,zindexable:Ln},Symbol.toStringTag,{value:"Module"})),P6=W({__name:"MxButton",setup(e){const{NButton:t}=R6;return(o,r)=>(Vh(),dC(oi(t),null,{default:jh(()=>[Pa(o.$slots,"default")]),_:3}))}}),D6=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/common-components/按钮.md","filePath":"cn/mx-components/common-components/按钮.md","lastUpdated":1720682010000}'),z6={name:"cn/mx-components/common-components/按钮.md"},M6=Object.assign(z6,{setup(e){return(t,o)=>(Vh(),cC("div",null,[uC("pre",null,fC(oi(vC)),1),hC(oi(P6),{type:"primary"},{default:jh(()=>[In("submit")]),_:1})]))}});export{D6 as __pageData,M6 as default}; diff --git "a/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.lean.js" "b/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.lean.js" similarity index 99% rename from "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.lean.js" rename to "assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.lean.js" index 0567c0e..7bea641 100644 --- "a/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.CrPL-6PG.lean.js" +++ "b/assets/cn_mx-components_common-components_\346\214\211\351\222\256.md.XVhE0SPK.lean.js" @@ -7119,4 +7119,4 @@ ${t} position: absolute; height: max(284vh, 284vw); width: max(284vh, 284vw); - `)])]);function l6(e){if(!e)return 1;const t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t}const Wu=Object.assign(Object.assign({},ce.props),{debug:Boolean,cross:Boolean,fullscreen:Boolean,width:{type:Number,default:32},height:{type:Number,default:32},zIndex:{type:Number,default:10},xGap:{type:Number,default:0},yGap:{type:Number,default:0},yOffset:{type:Number,default:0},xOffset:{type:Number,default:0},rotate:{type:Number,default:0},image:String,imageOpacity:{type:Number,default:1},imageHeight:Number,imageWidth:Number,content:String,selectable:{type:Boolean,default:!0},fontSize:{type:Number,default:14},fontFamily:String,fontStyle:{type:String,default:"normal"},fontVariant:{type:String,default:""},fontWeight:{type:Number,default:400},fontColor:{type:String,default:"rgba(128, 128, 128, .3)"},fontStretch:{type:String,default:""},lineHeight:{type:Number,default:14},globalRotate:{type:Number,default:0}}),Hy=W({name:"Watermark",props:Wu,setup(e,{slots:t}){const{mergedClsPrefixRef:o}=He(e),r=ce("Watermark","-watermark",a6,s0,e,o),n=M(""),a=bo?document.createElement("canvas"):null,d=a?a.getContext("2d"):null,l=M(!1);return Ia(()=>l.value=!0),Dt(()=>{if(!a)return;l.value;const s=l6(d),{xGap:c,yGap:u,width:f,height:m,yOffset:h,xOffset:v,rotate:y,image:g,content:b,fontColor:w,fontStyle:P,fontVariant:z,fontStretch:C,fontWeight:$,fontFamily:D,fontSize:O,lineHeight:I,debug:T}=e,B=(c+f)*s,F=(u+m)*s,L=v*s,H=h*s;if(a.width=B,a.height=F,d){d.translate(0,0);const N=f*s,E=m*s;if(T&&(d.strokeStyle="grey",d.strokeRect(0,0,N,E)),d.rotate(y*(Math.PI/180)),g){const G=new Image;G.crossOrigin="anonymous",G.referrerPolicy="no-referrer",G.src=g,G.onload=()=>{d.globalAlpha=e.imageOpacity;const{imageWidth:re,imageHeight:Q}=e;d.drawImage(G,L,H,(e.imageWidth||(Q?G.width*Q/G.height:G.width))*s,(e.imageHeight||(re?G.height*re/G.width:G.height))*s),n.value=a.toDataURL()}}else b&&(T&&(d.strokeStyle="green",d.strokeRect(0,0,N,E)),d.font=`${P} ${z} ${$} ${C} ${O*s}px/${I*s}px ${D||r.value.self.fontFamily}`,d.fillStyle=w,d.fillText(b,L,H+I*s),n.value=a.toDataURL())}else mC("watermark","Canvas is not supported in the browser.")}),()=>{var s;const{globalRotate:c,fullscreen:u,zIndex:f}=e,m=o.value,h=c!==0&&u,v="max(142vh, 142vw)",y=i("div",{class:[`${m}-watermark`,c!==0&&`${m}-watermark--global-rotate`,u&&`${m}-watermark--fullscreen`],style:{transform:c?`translateX(-50%) translateY(-50%) rotate(${c}deg)`:void 0,zIndex:h?void 0:f,backgroundSize:`${e.xGap+e.width}px`,backgroundPosition:c===0?e.cross?`${e.width/2}px ${e.height/2}px, 0 0`:"":e.cross?`calc(${v} + ${e.width/2}px) calc(${v} + ${e.height/2}px), ${v} ${v}`:v,backgroundImage:e.cross?`url(${n.value}), url(${n.value})`:`url(${n.value})`}});return e.fullscreen&&!c?y:i("div",{class:[`${m}-watermark-container`,c!==0&&`${m}-watermark-container--global-rotate`,u&&`${m}-watermark-container--fullscreen`,e.selectable&&`${m}-watermark-container--selectable`],style:{zIndex:h?f:void 0}},(s=t.default)===null||s===void 0?void 0:s.call(t),y)}}}),s6=W({name:"InjectionExtractor",props:{onSetup:Function},setup(e,{slots:t}){var o;return(o=e.onSetup)===null||o===void 0||o.call(e),()=>{var r;return(r=t.default)===null||r===void 0?void 0:r.call(t)}}}),d6={message:ru,notification:lu,loadingBar:Kc,dialog:lc};function c6({providersAndProps:e,configProviderProps:t}){let r=sC(()=>i(Ea,oi(t),{default:()=>e.map(({type:l,Provider:s,props:c})=>i(s,oi(c),{default:()=>i(s6,{onSetup:()=>n[l]=d6[l]()})}))}));const n={app:r};let a;return bo&&(a=document.createElement("div"),document.body.appendChild(a),r.mount(a)),Object.assign({unmount:()=>{var l;if(r===null||a===null){mo("discrete","unmount call no need because discrete app has been unmounted");return}r.unmount(),(l=a.parentNode)===null||l===void 0||l.removeChild(a),a=null,r=null}},n)}function Vy(e,{configProviderProps:t,messageProviderProps:o,dialogProviderProps:r,notificationProviderProps:n,loadingBarProviderProps:a}={}){const d=[];return e.forEach(s=>{switch(s){case"message":d.push({type:s,Provider:ou,props:o});break;case"notification":d.push({type:s,Provider:au,props:n});break;case"dialog":d.push({type:s,Provider:ac,props:r});break;case"loadingBar":d.push({type:s,Provider:Uc,props:a});break}}),c6({providersAndProps:d,configProviderProps:t})}const Uu={value:String,katex:Object,katexOptions:Object},jy=W({name:"Equation",props:Uu,setup(e){const t=Ae(go),o=x(()=>{var r;const n=((r=e.katex||(t==null?void 0:t.mergedKatexRef.value))===null||r===void 0?void 0:r.renderToString(e.value||"",Object.assign({throwOnError:!1},e.katexOptions)))||"no katex provided",a=n.match(/^<([a-z]+)[^>]+class="([^"]+)"[^>]*>/),d=(a==null?void 0:a[1])||"span",l=a==null?void 0:a[2],s=n.replace(/^<[a-z]+[^>]*>/,"").replace(/<\/[a-z]+>$/,"");return{wrapperTag:d,innerHtml:s,wrapperClass:l}});return()=>{const{innerHtml:r,wrapperClass:n,wrapperTag:a}=o.value;return i(a,{class:n,innerHTML:r})}}}),$h=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertProps:Ps,anchorLinkProps:zs,anchorProps:$s,autoCompleteProps:Bs,avatarGroupProps:_s,avatarProps:Ls,backTopProps:Es,badgeProps:Ns,blockquoteProps:Lu,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonGroupProps:Us,buttonProps:js,calendarProps:Ks,cardProps:Js,carouselProps:rd,cascaderProps:ld,checkboxGroupProps:nd,checkboxProps:ad,codeProps:cd,colProps:zi,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,configProviderProps:gd,countdownProps:bd,createDiscreteApi:Vy,dataTableProps:Ad,datePickerProps:Xd,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogProps:Nn,dialogProviderProps:ic,dividerProps:sc,drawerContentProps:uc,drawerProps:cc,dropdownProps:jd,dynamicInputProps:hc,dynamicTagsProps:gc,elementProps:bc,ellipsisProps:Wa,emptyProps:xs,equationProps:Uu,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,giProps:nn,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconProps:Hd,iconWrapperProps:Tc,imageGroupProps:Bc,imageProps:Ac,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberProps:_c,inputProps:Is,layoutContentProps:ci,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,listProps:jc,loadingBarProviderProps:Wc,logProps:qc,mentionProps:eu,menuProps:Jc,messageProviderProps:tu,modalProps:rc,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationProps:Id,popconfirmProps:du,popoverProps:Cs,popselectProps:wd,progressProps:cu,radioButtonProps:hp,radioGroupProps:Ed,radioProps:_d,rateProps:fu,resultProps:hu,rowProps:Pi,scrollbarProps:vu,selectProps:Pd,skeletonProps:mu,sliderProps:pu,spaceProps:pc,spinProps:gu,statisticProps:bu,stepProps:xu,stepsProps:yu,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableProps:wu,tabsProps:Ru,tagProps:ks,textProps:Nu,thingProps:Pu,timePickerProps:Kd,timeProps:zu,timelineItemProps:$u,timelineProps:Tu,tooltipProps:Bd,transferProps:Iu,treeProps:Mu,treeSelectProps:Bu,ulProps:_u,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,watermarkProps:Wu},Symbol.toStringTag,{value:"Module"})),Wy="2.35.0";function Uy({componentPrefix:e="N",components:t=[]}={}){const o=[];function r(a,d,l){a.component(e+d)||a.component(e+d,l)}function n(a){o.includes(a)||(o.push(a),t.forEach(d=>{const{name:l,alias:s}=d;r(a,l,d),s&&s.forEach(c=>{r(a,c,d)})}))}return{version:Wy,componentPrefix:e,install:n}}const Ky=Uy({components:Object.keys($h).map(e=>$h[e])}),u6=Ky,f6=Ky.install;function h6(){const e=Ae(go,null);return x(()=>{if(e===null)return Ge;const{mergedThemeRef:{value:t},mergedThemeOverridesRef:{value:o}}=e,r=(t==null?void 0:t.common)||Ge;return o!=null&&o.common?Object.assign({},r,o.common):r})}const qy=()=>({}),v6={name:"Equation",common:Ge,self:qy},m6=v6,p6={name:"Equation",common:Qe,self:qy},g6=p6,b6={name:"dark",common:Qe,Alert:Hv,Anchor:Kv,AutoComplete:om,Avatar:As,AvatarGroup:h2,BackTop:fm,Badge:mm,Breadcrumb:xm,Button:wo,ButtonGroup:Zg,Calendar:U2,Card:Xs,Carousel:$R,Cascader:Vm,Checkbox:fn,Code:sd,Collapse:qm,CollapseTransition:bP,ColorPicker:Y2,DataTable:dp,DatePicker:Fp,Descriptions:Hp,Dialog:tc,Divider:og,Drawer:ig,Dropdown:ja,DynamicInput:dg,DynamicTags:pg,Element:yg,Empty:Lr,Ellipsis:np,Equation:g6,Form:wg,GradientText:Dg,Icon:wp,IconWrapper:W5,Image:X3,Input:Oo,InputNumber:Xg,LegacyTransfer:h4,Layout:Jg,List:ob,LoadingBar:rb,Log:ib,Menu:ub,Mention:lb,Message:Yg,Modal:Qp,Notification:Kg,PageHeader:O$,Pagination:$d,Popconfirm:pb,Popover:Er,Popselect:xd,Progress:Dc,Radio:Fd,Rate:bb,Result:wb,Row:q3,Scrollbar:xo,Select:Rd,Skeleton:fI,Slider:kb,Space:vc,Spin:Tb,Statistic:Db,Steps:Bb,Switch:Ab,Table:Nb,Tabs:jb,Tag:ws,Thing:Kb,TimePicker:Ud,Timeline:Gb,Tooltip:Ci,Transfer:Xb,Tree:Fc,TreeSelect:e0,Typography:r0,Upload:a0,Watermark:l0},Rn={name:"light",common:Ge,Alert:Vv,Anchor:Uv,AutoComplete:tm,Avatar:Os,AvatarGroup:dm,BackTop:hm,Badge:pm,Breadcrumb:ym,Button:Co,ButtonGroup:u$,Calendar:Tm,Card:Zs,Carousel:Om,Cascader:Hm,Checkbox:un,Code:dd,Collapse:Km,CollapseTransition:Zm,ColorPicker:Dm,DataTable:sp,DatePicker:Mp,Descriptions:Np,Dialog:ec,Divider:tg,Drawer:ng,Dropdown:Va,DynamicInput:cg,DynamicTags:gg,Element:xg,Empty:nr,Equation:m6,Ellipsis:Md,Form:yc,GradientText:Mg,Icon:Cp,IconWrapper:Ag,Image:jg,Input:$o,InputNumber:Qg,Layout:Ti,LegacyTransfer:C0,List:tb,LoadingBar:nb,Log:ab,Menu:cb,Mention:sb,Message:Gg,Modal:Xp,Notification:Ug,PageHeader:hb,Pagination:Td,Popconfirm:mb,Popover:_r,Popselect:Na,Progress:Ic,Radio:Ha,Rate:yb,Row:U3,Result:Cb,Scrollbar:yo,Skeleton:G0,Select:kd,Slider:Rb,Space:mc,Spin:zb,Statistic:Ib,Steps:Fb,Switch:Lb,Table:Eb,Tabs:Vb,Tag:Ss,Thing:Ub,TimePicker:Wd,Timeline:Yb,Tooltip:wi,Transfer:Qb,Tree:Mc,TreeSelect:t0,Typography:br,Upload:i0,Watermark:s0};function y6(e,t){const o=typeof e=="string",r={name:o?e:"customized-theme"};if(o){if(t)for(const n of t)r[n.name]=n}else for(const n of e)r[n.name]=n;return r}const x6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},i("g",{fill:"none"},i("path",{d:"M8.5 2a.5.5 0 0 0 0 1h3.793L3 12.293V8.5a.5.5 0 0 0-1 0v4.9a.6.6 0 0 0 .6.6h4.9a.5.5 0 0 0 0-1H3.707L13 3.707V7.5a.5.5 0 0 0 1 0V2.6a.6.6 0 0 0-.6-.6H8.5z",fill:"currentColor"})))}}),C6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},i("path",{d:"M4 18v2h6.586L2 28.582L3.414 30L12 21.414V28h2V18H4z",fill:"currentColor"}),i("path",{d:"M30 3.416L28.592 2L20 10.586V4h-2v10h10v-2h-6.586L30 3.416z",fill:"currentColor"}))}}),w6=i("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{width:"1em",height:"1em",color:"currentColor"}},i("path",{d:"M13.5 1C13.7761 1 14 1.22386 14 1.5V2H14.5C14.7761 2 15 2.22386 15 2.5C15 2.77614 14.7761 3 14.5 3H14V3.5C14 3.77614 13.7761 4 13.5 4C13.2239 4 13 3.77614 13 3.5V3H12.5C12.2239 3 12 2.77614 12 2.5C12 2.22386 12.2239 2 12.5 2H13V1.5C13 1.22386 13.2239 1 13.5 1Z",fill:"currentColor"}),i("path",{d:"M3.5 3C3.77615 3 4 3.22386 4 3.5V4H4.5C4.77615 4 5 4.22386 5 4.5C5 4.77614 4.77615 5 4.5 5H4V5.5C4 5.77614 3.77615 6 3.5 6C3.22386 6 3 5.77614 3 5.5V5H2.5C2.22386 5 2 4.77614 2 4.5C2 4.22386 2.22386 4 2.5 4H3V3.5C3 3.22386 3.22386 3 3.5 3Z",fill:"currentColor"}),i("path",{d:"M12.5 12C12.7761 12 13 11.7761 13 11.5C13 11.2239 12.7761 11 12.5 11H12V10.5C12 10.2239 11.7761 10 11.5 10C11.2239 10 11 10.2239 11 10.5V11H10.5C10.2239 11 10 11.2239 10 11.5C10 11.7761 10.2239 12 10.5 12H11V12.5C11 12.7761 11.2239 13 11.5 13C11.7761 13 12 12.7761 12 12.5V12H12.5Z",fill:"currentColor"}),i("path",{d:"M8.72956 4.56346C9.4771 3.81592 10.6891 3.81592 11.4367 4.56347C12.1842 5.31102 12.1842 6.52303 11.4367 7.27058L4.26679 14.4404C3.51924 15.1879 2.30723 15.1879 1.55968 14.4404C0.812134 13.6928 0.812138 12.4808 1.55969 11.7333L8.72956 4.56346ZM8.25002 6.4572L2.26679 12.4404C1.90977 12.7974 1.90977 13.3763 2.26679 13.7333C2.62381 14.0903 3.20266 14.0903 3.55968 13.7333L9.54292 7.75009L8.25002 6.4572ZM10.25 7.04299L10.7295 6.56347C11.0866 6.20645 11.0866 5.6276 10.7296 5.27057C10.3725 4.91355 9.79368 4.91355 9.43666 5.27057L8.95713 5.7501L10.25 7.04299Z",fill:"currentColor"})),S6=e=>e.includes("pacity")?!1:!!(e.includes("color")||e.includes("Color")),k6=W({name:"ThemeEditor",inheritAttrs:!1,setup(){const e=M(!1),t=M(null),o=Ae(go,null),r=x(()=>{var P,z,C,$;const D=(o==null?void 0:o.mergedThemeRef.value)||Rn,O=o==null?void 0:o.mergedThemeOverridesRef.value,I=dr({},D.common||Rn.common,O==null?void 0:O.common,d.value.common||{}),T={common:I};for(const B of Object.keys(Rn))B!=="common"&&(T[B]=((z=(P=D[B])===null||P===void 0?void 0:P.self)===null||z===void 0?void 0:z.call(P,I))||(($=(C=Rn[B]).self)===null||$===void 0?void 0:$.call(C,I)),O&&T[B]&&dr(T[B],O[B]));return T}),n=x(()=>{var P;return((P=o==null?void 0:o.mergedThemeRef.value)===null||P===void 0?void 0:P.common)||Rn.common}),a=M(!1),d=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),l=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),s=M(""),c=M(""),u=M(""),f=M("");function m(){d.value=oC(oa(l.value))}function h(P,z,C){const{value:$}=l;P in $||($[P]={});const D=$[P];C?D[z]=C:delete D[z]}function v(){l.value={},d.value={}}function y(){const{value:P}=t;P&&P.click()}function g(){e.value=!e.value}function b(){const{value:P}=t;if(!P)return;const z=P.files,C=z==null?void 0:z[0];C&&C.text().then($=>{d.value=JSON.parse($),l.value=JSON.parse($)}).catch($=>{alert("Imported File is Invalid"),console.error($)}).finally(()=>{P.value=""})}function w(){const P=URL.createObjectURL(new Blob([JSON.stringify(d.value,void 0,2)])),z=document.createElement("a");z.href=P,z.download="naive-ui-theme-overrides.json",document.body.appendChild(z),z.click(),document.body.removeChild(z),URL.revokeObjectURL(P)}return st(d,P=>{localStorage["naive-ui-theme-overrides"]=JSON.stringify(P)}),{locale:Qt("ThemeEditor").localeRef,themeCommonDefault:n,theme:r,showPanel:a,tempOverrides:l,overrides:d,compNamePattern:c,tempCompNamePattern:f,varNamePattern:s,tempVarNamePattern:u,fileInputRef:t,applyTempOverrides:m,setTempOverrides:h,handleClearAllClick:v,handleExportClick:w,handleImportClick:y,handleInputFileChange:b,toggleMaximized:g,isMaximized:e}},render(){return i(Ea,{themeOverrides:this.overrides},{default:()=>{var e,t;return[i(gr,{scrollable:!0,arrowPointToCenter:!0,trigger:"manual",show:this.showPanel,displayDirective:"show",placement:"top-end",style:{width:this.isMaximized?"calc(100vw - 80px)":"288px",height:"calc(100vh - 200px)",padding:0}},{trigger:()=>i(li,{style:[{position:"fixed",zIndex:10,bottom:"40px",right:`calc(40px + ${pa.value})`,width:"44px",height:"44px",fontSize:"26px",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",backgroundColor:"var(--popover-color)",color:"var(--text-color-2)",transition:"color .3s var(--cubic-bezier-ease-in-out), background-color .3s var(--cubic-bezier-ease-in-out), box-shadow .3s var(--cubic-bezier-ease-in-out)",boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",cursor:"pointer"},this.$attrs.style],onClick:()=>{this.showPanel=!this.showPanel}},{default:()=>w6}),default:()=>i(Nt,null,i("input",{type:"file",ref:"fileInputRef",style:{display:"block",width:0,height:0,visibility:"hidden"},onChange:this.handleInputFileChange}),i($n,{vertical:!0},{default:()=>[i($n,{align:"center",justify:"space-between",style:{marginBottom:"8px",fontSize:"18px",fontWeight:500}},{default:()=>i(Nt,null,i("span",null,this.locale.title),i(Ct,{onClick:this.toggleMaximized,secondary:!0,circle:!0,size:"tiny"},{icon:()=>i(Ka,{component:this.isMaximized?C6:x6})}))}),this.locale.filterCompName,i(Xt,{onChange:()=>{this.compNamePattern=this.tempCompNamePattern},onInput:o=>{this.tempCompNamePattern=o},value:this.tempCompNamePattern,placeholder:this.locale.filterCompName}),this.locale.filterVarName,i(Xt,{onChange:o=>{this.varNamePattern=o},onInput:o=>{this.tempVarNamePattern=o},value:this.tempVarNamePattern,placeholder:this.locale.filterVarName}),i(Ct,{size:"small",onClick:()=>{this.compNamePattern="",this.varNamePattern="",this.tempCompNamePattern="",this.tempVarNamePattern=""},block:!0},{default:()=>this.locale.clearSearch}),i(Ct,{size:"small",onClick:this.handleClearAllClick,block:!0},{default:()=>this.locale.clearAllVars}),i($n,{itemStyle:{flex:1}},{default:()=>i(Nt,null,i(Ct,{block:!0,size:"small",onClick:this.handleImportClick},{default:()=>this.locale.import}),i(Ct,{block:!0,size:"small",onClick:this.handleExportClick},{default:()=>this.locale.export}))})]}),i(dc,null),i(hd,null,{default:()=>{const{theme:o,compNamePattern:r,varNamePattern:n}=this,a=Object.keys(o),d=r.toLowerCase(),l=n.toLowerCase();let s=0;const c=a.filter(u=>u.toLowerCase().includes(d)).map(u=>{const f=u==="common"?this.themeCommonDefault:o[u];if(f===void 0)return null;const m=Object.keys(f).filter(h=>h!=="name"&&h.toLowerCase().includes(l));return m.length?(s+=1,i(md,{title:u,name:u},{default:()=>i(zc,{xGap:32,yGap:16,responsive:"screen",cols:this.isMaximized?"1 xs:1 s:2 m:3 l:4":1},{default:()=>m.map(h=>i(Bn,null,{default:()=>{var v,y,g,b;return i(Nt,null,i("div",{key:`${h}Label`,style:{wordBreak:"break-word"}},h),S6(h)?i(Ys,{key:h,modes:["rgb","hex"],value:((y=(v=this.tempOverrides)===null||v===void 0?void 0:v[u])===null||y===void 0?void 0:y[h])||f[h],onComplete:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)}},{action:()=>{var w,P;return i(Ct,{size:"small",disabled:f[h]===((P=(w=this.tempOverrides)===null||w===void 0?void 0:w[u])===null||P===void 0?void 0:P[h]),onClick:()=>{this.setTempOverrides(u,h,f[h]),this.applyTempOverrides()}},{default:()=>this.locale.restore})}}):i(Xt,{key:h,onChange:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)},value:((b=(g=this.tempOverrides)===null||g===void 0?void 0:g[u])===null||b===void 0?void 0:b[h])||"",placeholder:f[h]}))}}))})})):null});return s?c:i(ir,null)}}))}),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)]}})}}),R6=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThemeEditor:k6,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertDark:Hv,alertProps:Ps,anchorDark:Kv,anchorLinkProps:zs,anchorProps:$s,arDZ:J1,autoCompleteDark:om,autoCompleteProps:Bs,avatarDark:As,avatarGroupProps:_s,avatarProps:Ls,backTopDark:fm,backTopProps:Es,badgeDark:mm,badgeProps:Ns,blockquoteProps:Lu,breadcrumbDark:xm,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonDark:wo,buttonGroupDark:Zg,buttonGroupProps:Us,buttonProps:js,c:S,cB:p,cE:R,cM:k,cNotM:vt,calendarProps:Ks,cardDark:Xs,cardProps:Js,carouselProps:rd,cascaderDark:Vm,cascaderProps:ld,checkboxDark:fn,checkboxGroupProps:nd,checkboxProps:ad,codeDark:sd,codeProps:cd,colProps:zi,collapseDark:qm,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,commonDark:Qe,commonLight:Ge,configProviderProps:gd,countdownProps:bd,create:Uy,createDiscreteApi:Vy,createLocale:iS,createTheme:y6,darkTheme:b6,dataTableDark:dp,dataTableProps:Ad,dateArDZ:Gw,dateDeDE:Pw,dateEnGB:Nw,dateEnUS:mv,dateEo:Qw,dateEsAR:Bw,dateFaIR:oS,dateFrFR:Mw,dateIdID:kw,dateItIT:Aw,dateJaJP:xw,dateKoKR:ww,dateNbNO:Tw,dateNlNL:Iw,datePickerDark:Fp,datePickerProps:Xd,datePlPL:Vw,datePtBR:Ww,dateRuRU:pw,dateSkSK:_w,dateSvSE:nS,dateThTH:Kw,dateTrTR:Zw,dateUkUA:bw,dateViVN:eS,dateZhCN:uw,dateZhTW:hw,deDE:D1,default:u6,descriptionsDark:Hp,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogDark:tc,dialogProps:Nn,dialogProviderProps:ic,dividerDark:og,dividerProps:sc,drawerContentProps:uc,drawerDark:ig,drawerProps:cc,dropdownDark:ja,dropdownProps:jd,dynamicInputDark:dg,dynamicInputProps:hc,dynamicTagsDark:pg,dynamicTagsProps:gc,elementDark:yg,elementProps:bc,ellipsisProps:Wa,emptyDark:Lr,emptyProps:xs,enGB:U1,enUS:vv,eo:rw,equationProps:Uu,esAR:E1,faIR:lw,formDark:wg,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,frFR:L1,giProps:nn,gradientTextDark:Dg,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconDark:wp,iconProps:Hd,iconWrapperProps:Tc,idID:$1,imageGroupProps:Bc,imageProps:Ac,inputDark:Oo,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberDark:Xg,inputNumberProps:_c,inputProps:Is,install:f6,internalSelectMenuDark:En,internalSelectionDark:Ba,itIT:H1,jaJP:R1,koKR:z1,layoutContentProps:ci,layoutDark:Jg,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,lightTheme:Rn,listDark:ob,listProps:jc,loadingBarDark:rb,loadingBarProviderProps:Wc,logDark:ib,logProps:qc,mentionDark:lb,mentionProps:eu,menuDark:ub,menuProps:Jc,messageDark:Yg,messageProviderProps:tu,modalDark:Qp,modalProps:rc,nbNO:F1,nlNL:O1,notificationDark:Kg,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationDark:$d,paginationProps:Id,plPL:q1,popconfirmDark:pb,popconfirmProps:du,popoverDark:Er,popoverProps:Cs,popselectDark:xd,popselectProps:wd,progressDark:Dc,progressProps:cu,ptBR:Y1,radioButtonProps:hp,radioDark:Fd,radioGroupProps:Ed,radioProps:_d,rateDark:bb,rateProps:fu,resultDark:wb,resultProps:hu,rowProps:Pi,ruRU:C1,scrollbarDark:xo,scrollbarProps:vu,selectDark:Rd,selectProps:Pd,skSK:j1,skeletonProps:mu,sliderDark:kb,sliderProps:pu,spaceDark:vc,spaceProps:pc,spinDark:Tb,spinProps:gu,statisticDark:Db,statisticProps:bu,stepProps:xu,stepsDark:Bb,stepsProps:yu,svSE:dw,switchDark:Ab,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableDark:Nb,tableProps:wu,tabsDark:jb,tabsProps:Ru,tagDark:ws,tagProps:ks,textProps:Nu,thTH:X1,thingDark:Kb,thingProps:Pu,timePickerDark:Ud,timePickerProps:Kd,timeProps:zu,timelineDark:Gb,timelineItemProps:$u,timelineProps:Tu,tooltipDark:Ci,tooltipProps:Bd,trTR:tw,transferDark:Xb,transferProps:Iu,treeDark:Fc,treeProps:Mu,treeSelectDark:e0,treeSelectProps:Bu,typographyDark:r0,ukUA:S1,ulProps:_u,unstableAlertRtl:Mk,unstableAvatarGroupRtl:m2,unstableBadgeRtl:R2,unstableButtonGroupRtl:ug,unstableButtonRtl:La,unstableCardRtl:kR,unstableCheckboxRtl:Em,unstableCollapseRtl:fP,unstableCollapseTransitionRtl:xP,unstableDrawerRtl:ET,unstableDynamicInputRtl:a5,unstableInputNumberRtl:fg,unstableInputRtl:Aa,unstableListRtl:C$,unstableMessageRtl:s$,unstableNotificationRtl:r$,unstablePageHeaderRtl:L$,unstablePaginationRtl:OP,unstableRadioRtl:qP,unstableRowRtl:Z3,unstableScrollbarRtl:YS,unstableSpaceRtl:mg,unstableStatisticRtl:r3,unstableStepsRtl:s3,unstableTableRtl:p3,unstableTagRtl:bk,unstableThingRtl:S3,unstableTreeRtl:F3,uploadDark:a0,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,useOsTheme:FC,useThemeVars:h6,version:Wy,viVN:iw,watermarkDark:l0,watermarkProps:Wu,zhCN:p1,zhTW:b1,zindexable:Ln},Symbol.toStringTag,{value:"Module"})),P6=W({__name:"MxButton",setup(e){const{NButton:t}=R6;return(o,r)=>(Vh(),dC(oi(t),null,{default:jh(()=>[Pa(o.$slots,"default")]),_:3}))}}),D6=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/common-components/按钮.md","filePath":"cn/mx-components/common-components/按钮.md","lastUpdated":1719277083000}'),z6={name:"cn/mx-components/common-components/按钮.md"},M6=Object.assign(z6,{setup(e){return(t,o)=>(Vh(),cC("div",null,[uC("pre",null,fC(oi(vC)),1),hC(oi(P6),{type:"primary"},{default:jh(()=>[In("submit")]),_:1})]))}});export{D6 as __pageData,M6 as default}; + `)])]);function l6(e){if(!e)return 1;const t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t}const Wu=Object.assign(Object.assign({},ce.props),{debug:Boolean,cross:Boolean,fullscreen:Boolean,width:{type:Number,default:32},height:{type:Number,default:32},zIndex:{type:Number,default:10},xGap:{type:Number,default:0},yGap:{type:Number,default:0},yOffset:{type:Number,default:0},xOffset:{type:Number,default:0},rotate:{type:Number,default:0},image:String,imageOpacity:{type:Number,default:1},imageHeight:Number,imageWidth:Number,content:String,selectable:{type:Boolean,default:!0},fontSize:{type:Number,default:14},fontFamily:String,fontStyle:{type:String,default:"normal"},fontVariant:{type:String,default:""},fontWeight:{type:Number,default:400},fontColor:{type:String,default:"rgba(128, 128, 128, .3)"},fontStretch:{type:String,default:""},lineHeight:{type:Number,default:14},globalRotate:{type:Number,default:0}}),Hy=W({name:"Watermark",props:Wu,setup(e,{slots:t}){const{mergedClsPrefixRef:o}=He(e),r=ce("Watermark","-watermark",a6,s0,e,o),n=M(""),a=bo?document.createElement("canvas"):null,d=a?a.getContext("2d"):null,l=M(!1);return Ia(()=>l.value=!0),Dt(()=>{if(!a)return;l.value;const s=l6(d),{xGap:c,yGap:u,width:f,height:m,yOffset:h,xOffset:v,rotate:y,image:g,content:b,fontColor:w,fontStyle:P,fontVariant:z,fontStretch:C,fontWeight:$,fontFamily:D,fontSize:O,lineHeight:I,debug:T}=e,B=(c+f)*s,F=(u+m)*s,L=v*s,H=h*s;if(a.width=B,a.height=F,d){d.translate(0,0);const N=f*s,E=m*s;if(T&&(d.strokeStyle="grey",d.strokeRect(0,0,N,E)),d.rotate(y*(Math.PI/180)),g){const G=new Image;G.crossOrigin="anonymous",G.referrerPolicy="no-referrer",G.src=g,G.onload=()=>{d.globalAlpha=e.imageOpacity;const{imageWidth:re,imageHeight:Q}=e;d.drawImage(G,L,H,(e.imageWidth||(Q?G.width*Q/G.height:G.width))*s,(e.imageHeight||(re?G.height*re/G.width:G.height))*s),n.value=a.toDataURL()}}else b&&(T&&(d.strokeStyle="green",d.strokeRect(0,0,N,E)),d.font=`${P} ${z} ${$} ${C} ${O*s}px/${I*s}px ${D||r.value.self.fontFamily}`,d.fillStyle=w,d.fillText(b,L,H+I*s),n.value=a.toDataURL())}else mC("watermark","Canvas is not supported in the browser.")}),()=>{var s;const{globalRotate:c,fullscreen:u,zIndex:f}=e,m=o.value,h=c!==0&&u,v="max(142vh, 142vw)",y=i("div",{class:[`${m}-watermark`,c!==0&&`${m}-watermark--global-rotate`,u&&`${m}-watermark--fullscreen`],style:{transform:c?`translateX(-50%) translateY(-50%) rotate(${c}deg)`:void 0,zIndex:h?void 0:f,backgroundSize:`${e.xGap+e.width}px`,backgroundPosition:c===0?e.cross?`${e.width/2}px ${e.height/2}px, 0 0`:"":e.cross?`calc(${v} + ${e.width/2}px) calc(${v} + ${e.height/2}px), ${v} ${v}`:v,backgroundImage:e.cross?`url(${n.value}), url(${n.value})`:`url(${n.value})`}});return e.fullscreen&&!c?y:i("div",{class:[`${m}-watermark-container`,c!==0&&`${m}-watermark-container--global-rotate`,u&&`${m}-watermark-container--fullscreen`,e.selectable&&`${m}-watermark-container--selectable`],style:{zIndex:h?f:void 0}},(s=t.default)===null||s===void 0?void 0:s.call(t),y)}}}),s6=W({name:"InjectionExtractor",props:{onSetup:Function},setup(e,{slots:t}){var o;return(o=e.onSetup)===null||o===void 0||o.call(e),()=>{var r;return(r=t.default)===null||r===void 0?void 0:r.call(t)}}}),d6={message:ru,notification:lu,loadingBar:Kc,dialog:lc};function c6({providersAndProps:e,configProviderProps:t}){let r=sC(()=>i(Ea,oi(t),{default:()=>e.map(({type:l,Provider:s,props:c})=>i(s,oi(c),{default:()=>i(s6,{onSetup:()=>n[l]=d6[l]()})}))}));const n={app:r};let a;return bo&&(a=document.createElement("div"),document.body.appendChild(a),r.mount(a)),Object.assign({unmount:()=>{var l;if(r===null||a===null){mo("discrete","unmount call no need because discrete app has been unmounted");return}r.unmount(),(l=a.parentNode)===null||l===void 0||l.removeChild(a),a=null,r=null}},n)}function Vy(e,{configProviderProps:t,messageProviderProps:o,dialogProviderProps:r,notificationProviderProps:n,loadingBarProviderProps:a}={}){const d=[];return e.forEach(s=>{switch(s){case"message":d.push({type:s,Provider:ou,props:o});break;case"notification":d.push({type:s,Provider:au,props:n});break;case"dialog":d.push({type:s,Provider:ac,props:r});break;case"loadingBar":d.push({type:s,Provider:Uc,props:a});break}}),c6({providersAndProps:d,configProviderProps:t})}const Uu={value:String,katex:Object,katexOptions:Object},jy=W({name:"Equation",props:Uu,setup(e){const t=Ae(go),o=x(()=>{var r;const n=((r=e.katex||(t==null?void 0:t.mergedKatexRef.value))===null||r===void 0?void 0:r.renderToString(e.value||"",Object.assign({throwOnError:!1},e.katexOptions)))||"no katex provided",a=n.match(/^<([a-z]+)[^>]+class="([^"]+)"[^>]*>/),d=(a==null?void 0:a[1])||"span",l=a==null?void 0:a[2],s=n.replace(/^<[a-z]+[^>]*>/,"").replace(/<\/[a-z]+>$/,"");return{wrapperTag:d,innerHtml:s,wrapperClass:l}});return()=>{const{innerHtml:r,wrapperClass:n,wrapperTag:a}=o.value;return i(a,{class:n,innerHTML:r})}}}),$h=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertProps:Ps,anchorLinkProps:zs,anchorProps:$s,autoCompleteProps:Bs,avatarGroupProps:_s,avatarProps:Ls,backTopProps:Es,badgeProps:Ns,blockquoteProps:Lu,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonGroupProps:Us,buttonProps:js,calendarProps:Ks,cardProps:Js,carouselProps:rd,cascaderProps:ld,checkboxGroupProps:nd,checkboxProps:ad,codeProps:cd,colProps:zi,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,configProviderProps:gd,countdownProps:bd,createDiscreteApi:Vy,dataTableProps:Ad,datePickerProps:Xd,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogProps:Nn,dialogProviderProps:ic,dividerProps:sc,drawerContentProps:uc,drawerProps:cc,dropdownProps:jd,dynamicInputProps:hc,dynamicTagsProps:gc,elementProps:bc,ellipsisProps:Wa,emptyProps:xs,equationProps:Uu,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,giProps:nn,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconProps:Hd,iconWrapperProps:Tc,imageGroupProps:Bc,imageProps:Ac,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberProps:_c,inputProps:Is,layoutContentProps:ci,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,listProps:jc,loadingBarProviderProps:Wc,logProps:qc,mentionProps:eu,menuProps:Jc,messageProviderProps:tu,modalProps:rc,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationProps:Id,popconfirmProps:du,popoverProps:Cs,popselectProps:wd,progressProps:cu,radioButtonProps:hp,radioGroupProps:Ed,radioProps:_d,rateProps:fu,resultProps:hu,rowProps:Pi,scrollbarProps:vu,selectProps:Pd,skeletonProps:mu,sliderProps:pu,spaceProps:pc,spinProps:gu,statisticProps:bu,stepProps:xu,stepsProps:yu,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableProps:wu,tabsProps:Ru,tagProps:ks,textProps:Nu,thingProps:Pu,timePickerProps:Kd,timeProps:zu,timelineItemProps:$u,timelineProps:Tu,tooltipProps:Bd,transferProps:Iu,treeProps:Mu,treeSelectProps:Bu,ulProps:_u,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,watermarkProps:Wu},Symbol.toStringTag,{value:"Module"})),Wy="2.35.0";function Uy({componentPrefix:e="N",components:t=[]}={}){const o=[];function r(a,d,l){a.component(e+d)||a.component(e+d,l)}function n(a){o.includes(a)||(o.push(a),t.forEach(d=>{const{name:l,alias:s}=d;r(a,l,d),s&&s.forEach(c=>{r(a,c,d)})}))}return{version:Wy,componentPrefix:e,install:n}}const Ky=Uy({components:Object.keys($h).map(e=>$h[e])}),u6=Ky,f6=Ky.install;function h6(){const e=Ae(go,null);return x(()=>{if(e===null)return Ge;const{mergedThemeRef:{value:t},mergedThemeOverridesRef:{value:o}}=e,r=(t==null?void 0:t.common)||Ge;return o!=null&&o.common?Object.assign({},r,o.common):r})}const qy=()=>({}),v6={name:"Equation",common:Ge,self:qy},m6=v6,p6={name:"Equation",common:Qe,self:qy},g6=p6,b6={name:"dark",common:Qe,Alert:Hv,Anchor:Kv,AutoComplete:om,Avatar:As,AvatarGroup:h2,BackTop:fm,Badge:mm,Breadcrumb:xm,Button:wo,ButtonGroup:Zg,Calendar:U2,Card:Xs,Carousel:$R,Cascader:Vm,Checkbox:fn,Code:sd,Collapse:qm,CollapseTransition:bP,ColorPicker:Y2,DataTable:dp,DatePicker:Fp,Descriptions:Hp,Dialog:tc,Divider:og,Drawer:ig,Dropdown:ja,DynamicInput:dg,DynamicTags:pg,Element:yg,Empty:Lr,Ellipsis:np,Equation:g6,Form:wg,GradientText:Dg,Icon:wp,IconWrapper:W5,Image:X3,Input:Oo,InputNumber:Xg,LegacyTransfer:h4,Layout:Jg,List:ob,LoadingBar:rb,Log:ib,Menu:ub,Mention:lb,Message:Yg,Modal:Qp,Notification:Kg,PageHeader:O$,Pagination:$d,Popconfirm:pb,Popover:Er,Popselect:xd,Progress:Dc,Radio:Fd,Rate:bb,Result:wb,Row:q3,Scrollbar:xo,Select:Rd,Skeleton:fI,Slider:kb,Space:vc,Spin:Tb,Statistic:Db,Steps:Bb,Switch:Ab,Table:Nb,Tabs:jb,Tag:ws,Thing:Kb,TimePicker:Ud,Timeline:Gb,Tooltip:Ci,Transfer:Xb,Tree:Fc,TreeSelect:e0,Typography:r0,Upload:a0,Watermark:l0},Rn={name:"light",common:Ge,Alert:Vv,Anchor:Uv,AutoComplete:tm,Avatar:Os,AvatarGroup:dm,BackTop:hm,Badge:pm,Breadcrumb:ym,Button:Co,ButtonGroup:u$,Calendar:Tm,Card:Zs,Carousel:Om,Cascader:Hm,Checkbox:un,Code:dd,Collapse:Km,CollapseTransition:Zm,ColorPicker:Dm,DataTable:sp,DatePicker:Mp,Descriptions:Np,Dialog:ec,Divider:tg,Drawer:ng,Dropdown:Va,DynamicInput:cg,DynamicTags:gg,Element:xg,Empty:nr,Equation:m6,Ellipsis:Md,Form:yc,GradientText:Mg,Icon:Cp,IconWrapper:Ag,Image:jg,Input:$o,InputNumber:Qg,Layout:Ti,LegacyTransfer:C0,List:tb,LoadingBar:nb,Log:ab,Menu:cb,Mention:sb,Message:Gg,Modal:Xp,Notification:Ug,PageHeader:hb,Pagination:Td,Popconfirm:mb,Popover:_r,Popselect:Na,Progress:Ic,Radio:Ha,Rate:yb,Row:U3,Result:Cb,Scrollbar:yo,Skeleton:G0,Select:kd,Slider:Rb,Space:mc,Spin:zb,Statistic:Ib,Steps:Fb,Switch:Lb,Table:Eb,Tabs:Vb,Tag:Ss,Thing:Ub,TimePicker:Wd,Timeline:Yb,Tooltip:wi,Transfer:Qb,Tree:Mc,TreeSelect:t0,Typography:br,Upload:i0,Watermark:s0};function y6(e,t){const o=typeof e=="string",r={name:o?e:"customized-theme"};if(o){if(t)for(const n of t)r[n.name]=n}else for(const n of e)r[n.name]=n;return r}const x6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 16"},i("g",{fill:"none"},i("path",{d:"M8.5 2a.5.5 0 0 0 0 1h3.793L3 12.293V8.5a.5.5 0 0 0-1 0v4.9a.6.6 0 0 0 .6.6h4.9a.5.5 0 0 0 0-1H3.707L13 3.707V7.5a.5.5 0 0 0 1 0V2.6a.6.6 0 0 0-.6-.6H8.5z",fill:"currentColor"})))}}),C6=W({render(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},i("path",{d:"M4 18v2h6.586L2 28.582L3.414 30L12 21.414V28h2V18H4z",fill:"currentColor"}),i("path",{d:"M30 3.416L28.592 2L20 10.586V4h-2v10h10v-2h-6.586L30 3.416z",fill:"currentColor"}))}}),w6=i("svg",{viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{width:"1em",height:"1em",color:"currentColor"}},i("path",{d:"M13.5 1C13.7761 1 14 1.22386 14 1.5V2H14.5C14.7761 2 15 2.22386 15 2.5C15 2.77614 14.7761 3 14.5 3H14V3.5C14 3.77614 13.7761 4 13.5 4C13.2239 4 13 3.77614 13 3.5V3H12.5C12.2239 3 12 2.77614 12 2.5C12 2.22386 12.2239 2 12.5 2H13V1.5C13 1.22386 13.2239 1 13.5 1Z",fill:"currentColor"}),i("path",{d:"M3.5 3C3.77615 3 4 3.22386 4 3.5V4H4.5C4.77615 4 5 4.22386 5 4.5C5 4.77614 4.77615 5 4.5 5H4V5.5C4 5.77614 3.77615 6 3.5 6C3.22386 6 3 5.77614 3 5.5V5H2.5C2.22386 5 2 4.77614 2 4.5C2 4.22386 2.22386 4 2.5 4H3V3.5C3 3.22386 3.22386 3 3.5 3Z",fill:"currentColor"}),i("path",{d:"M12.5 12C12.7761 12 13 11.7761 13 11.5C13 11.2239 12.7761 11 12.5 11H12V10.5C12 10.2239 11.7761 10 11.5 10C11.2239 10 11 10.2239 11 10.5V11H10.5C10.2239 11 10 11.2239 10 11.5C10 11.7761 10.2239 12 10.5 12H11V12.5C11 12.7761 11.2239 13 11.5 13C11.7761 13 12 12.7761 12 12.5V12H12.5Z",fill:"currentColor"}),i("path",{d:"M8.72956 4.56346C9.4771 3.81592 10.6891 3.81592 11.4367 4.56347C12.1842 5.31102 12.1842 6.52303 11.4367 7.27058L4.26679 14.4404C3.51924 15.1879 2.30723 15.1879 1.55968 14.4404C0.812134 13.6928 0.812138 12.4808 1.55969 11.7333L8.72956 4.56346ZM8.25002 6.4572L2.26679 12.4404C1.90977 12.7974 1.90977 13.3763 2.26679 13.7333C2.62381 14.0903 3.20266 14.0903 3.55968 13.7333L9.54292 7.75009L8.25002 6.4572ZM10.25 7.04299L10.7295 6.56347C11.0866 6.20645 11.0866 5.6276 10.7296 5.27057C10.3725 4.91355 9.79368 4.91355 9.43666 5.27057L8.95713 5.7501L10.25 7.04299Z",fill:"currentColor"})),S6=e=>e.includes("pacity")?!1:!!(e.includes("color")||e.includes("Color")),k6=W({name:"ThemeEditor",inheritAttrs:!1,setup(){const e=M(!1),t=M(null),o=Ae(go,null),r=x(()=>{var P,z,C,$;const D=(o==null?void 0:o.mergedThemeRef.value)||Rn,O=o==null?void 0:o.mergedThemeOverridesRef.value,I=dr({},D.common||Rn.common,O==null?void 0:O.common,d.value.common||{}),T={common:I};for(const B of Object.keys(Rn))B!=="common"&&(T[B]=((z=(P=D[B])===null||P===void 0?void 0:P.self)===null||z===void 0?void 0:z.call(P,I))||(($=(C=Rn[B]).self)===null||$===void 0?void 0:$.call(C,I)),O&&T[B]&&dr(T[B],O[B]));return T}),n=x(()=>{var P;return((P=o==null?void 0:o.mergedThemeRef.value)===null||P===void 0?void 0:P.common)||Rn.common}),a=M(!1),d=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),l=M(JSON.parse(localStorage["naive-ui-theme-overrides"]||"{}")),s=M(""),c=M(""),u=M(""),f=M("");function m(){d.value=oC(oa(l.value))}function h(P,z,C){const{value:$}=l;P in $||($[P]={});const D=$[P];C?D[z]=C:delete D[z]}function v(){l.value={},d.value={}}function y(){const{value:P}=t;P&&P.click()}function g(){e.value=!e.value}function b(){const{value:P}=t;if(!P)return;const z=P.files,C=z==null?void 0:z[0];C&&C.text().then($=>{d.value=JSON.parse($),l.value=JSON.parse($)}).catch($=>{alert("Imported File is Invalid"),console.error($)}).finally(()=>{P.value=""})}function w(){const P=URL.createObjectURL(new Blob([JSON.stringify(d.value,void 0,2)])),z=document.createElement("a");z.href=P,z.download="naive-ui-theme-overrides.json",document.body.appendChild(z),z.click(),document.body.removeChild(z),URL.revokeObjectURL(P)}return st(d,P=>{localStorage["naive-ui-theme-overrides"]=JSON.stringify(P)}),{locale:Qt("ThemeEditor").localeRef,themeCommonDefault:n,theme:r,showPanel:a,tempOverrides:l,overrides:d,compNamePattern:c,tempCompNamePattern:f,varNamePattern:s,tempVarNamePattern:u,fileInputRef:t,applyTempOverrides:m,setTempOverrides:h,handleClearAllClick:v,handleExportClick:w,handleImportClick:y,handleInputFileChange:b,toggleMaximized:g,isMaximized:e}},render(){return i(Ea,{themeOverrides:this.overrides},{default:()=>{var e,t;return[i(gr,{scrollable:!0,arrowPointToCenter:!0,trigger:"manual",show:this.showPanel,displayDirective:"show",placement:"top-end",style:{width:this.isMaximized?"calc(100vw - 80px)":"288px",height:"calc(100vh - 200px)",padding:0}},{trigger:()=>i(li,{style:[{position:"fixed",zIndex:10,bottom:"40px",right:`calc(40px + ${pa.value})`,width:"44px",height:"44px",fontSize:"26px",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"50%",backgroundColor:"var(--popover-color)",color:"var(--text-color-2)",transition:"color .3s var(--cubic-bezier-ease-in-out), background-color .3s var(--cubic-bezier-ease-in-out), box-shadow .3s var(--cubic-bezier-ease-in-out)",boxShadow:"0 2px 8px 0px rgba(0, 0, 0, .12)",cursor:"pointer"},this.$attrs.style],onClick:()=>{this.showPanel=!this.showPanel}},{default:()=>w6}),default:()=>i(Nt,null,i("input",{type:"file",ref:"fileInputRef",style:{display:"block",width:0,height:0,visibility:"hidden"},onChange:this.handleInputFileChange}),i($n,{vertical:!0},{default:()=>[i($n,{align:"center",justify:"space-between",style:{marginBottom:"8px",fontSize:"18px",fontWeight:500}},{default:()=>i(Nt,null,i("span",null,this.locale.title),i(Ct,{onClick:this.toggleMaximized,secondary:!0,circle:!0,size:"tiny"},{icon:()=>i(Ka,{component:this.isMaximized?C6:x6})}))}),this.locale.filterCompName,i(Xt,{onChange:()=>{this.compNamePattern=this.tempCompNamePattern},onInput:o=>{this.tempCompNamePattern=o},value:this.tempCompNamePattern,placeholder:this.locale.filterCompName}),this.locale.filterVarName,i(Xt,{onChange:o=>{this.varNamePattern=o},onInput:o=>{this.tempVarNamePattern=o},value:this.tempVarNamePattern,placeholder:this.locale.filterVarName}),i(Ct,{size:"small",onClick:()=>{this.compNamePattern="",this.varNamePattern="",this.tempCompNamePattern="",this.tempVarNamePattern=""},block:!0},{default:()=>this.locale.clearSearch}),i(Ct,{size:"small",onClick:this.handleClearAllClick,block:!0},{default:()=>this.locale.clearAllVars}),i($n,{itemStyle:{flex:1}},{default:()=>i(Nt,null,i(Ct,{block:!0,size:"small",onClick:this.handleImportClick},{default:()=>this.locale.import}),i(Ct,{block:!0,size:"small",onClick:this.handleExportClick},{default:()=>this.locale.export}))})]}),i(dc,null),i(hd,null,{default:()=>{const{theme:o,compNamePattern:r,varNamePattern:n}=this,a=Object.keys(o),d=r.toLowerCase(),l=n.toLowerCase();let s=0;const c=a.filter(u=>u.toLowerCase().includes(d)).map(u=>{const f=u==="common"?this.themeCommonDefault:o[u];if(f===void 0)return null;const m=Object.keys(f).filter(h=>h!=="name"&&h.toLowerCase().includes(l));return m.length?(s+=1,i(md,{title:u,name:u},{default:()=>i(zc,{xGap:32,yGap:16,responsive:"screen",cols:this.isMaximized?"1 xs:1 s:2 m:3 l:4":1},{default:()=>m.map(h=>i(Bn,null,{default:()=>{var v,y,g,b;return i(Nt,null,i("div",{key:`${h}Label`,style:{wordBreak:"break-word"}},h),S6(h)?i(Ys,{key:h,modes:["rgb","hex"],value:((y=(v=this.tempOverrides)===null||v===void 0?void 0:v[u])===null||y===void 0?void 0:y[h])||f[h],onComplete:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)}},{action:()=>{var w,P;return i(Ct,{size:"small",disabled:f[h]===((P=(w=this.tempOverrides)===null||w===void 0?void 0:w[u])===null||P===void 0?void 0:P[h]),onClick:()=>{this.setTempOverrides(u,h,f[h]),this.applyTempOverrides()}},{default:()=>this.locale.restore})}}):i(Xt,{key:h,onChange:this.applyTempOverrides,onUpdateValue:w=>{this.setTempOverrides(u,h,w)},value:((b=(g=this.tempOverrides)===null||g===void 0?void 0:g[u])===null||b===void 0?void 0:b[h])||"",placeholder:f[h]}))}}))})})):null});return s?c:i(ir,null)}}))}),(t=(e=this.$slots).default)===null||t===void 0?void 0:t.call(e)]}})}}),R6=Object.freeze(Object.defineProperty({__proto__:null,NA:$y,NAffix:gs,NAlert:jv,NAnchor:Gv,NAnchorLink:qv,NAutoComplete:nm,NAvatar:xa,NAvatarGroup:cm,NBackTop:vm,NBadge:gm,NBlockquote:Dy,NBreadcrumb:wm,NBreadcrumbItem:Sm,NButton:Ct,NButtonGroup:_a,NCalendar:$m,NCard:ed,NCarousel:Lm,NCarouselItem:od,NCascader:Wm,NCheckbox:ar,NCheckboxGroup:id,NCode:ud,NCol:wc,NCollapse:hd,NCollapseItem:md,NCollapseTransition:Xm,NColorPicker:Ys,NConfigProvider:Ea,NCountdown:Qm,NDataTable:$p,NDatePicker:_p,NDescriptions:jp,NDescriptionsItem:Wp,NDialog:Za,NDialogProvider:ac,NDivider:dc,NDrawer:ag,NDrawerContent:lg,NDropdown:Ga,NDynamicInput:hg,NDynamicTags:bg,NEl:li,NElement:li,NEllipsis:ki,NEmpty:ir,NEquation:jy,NForm:kg,NFormItem:Xa,NFormItemCol:kc,NFormItemGi:Sa,NFormItemGridItem:Sa,NFormItemRow:$g,NGi:Bn,NGlobalStyle:Ig,NGradientText:Fg,NGrid:zc,NGridItem:Bn,NH1:Sy,NH2:ky,NH3:Ry,NH4:Py,NH5:zy,NH6:Ty,NHr:My,NIcon:Ka,NIconWrapper:Lg,NImage:Lc,NImageGroup:Oc,NInput:Xt,NInputGroup:Ms,NInputGroupLabel:Jv,NInputNumber:u0,NLayout:m0,NLayoutContent:p0,NLayoutFooter:b0,NLayoutHeader:g0,NLayoutSider:y0,NLegacyTransfer:w0,NLi:Ay,NList:k0,NListItem:R0,NLoadingBarProvider:Uc,NLog:$0,NMention:A0,NMenu:O0,NMessageProvider:ou,NModal:nc,NNotificationProvider:au,NNumberAnimation:Jm,NOl:Oy,NP:Iy,NPageHeader:H0,NPagination:Dd,NPerformantEllipsis:Od,NPopconfirm:W0,NPopover:gr,NPopselect:Sd,NProgress:uu,NRadio:Ua,NRadioButton:vp,NRadioGroup:Nd,NRate:U0,NResult:K0,NRow:Cc,NScrollbar:q0,NSelect:zd,NSkeleton:Y0,NSlider:Z0,NSpace:$n,NSpin:X0,NStatistic:Q0,NStep:ty,NSteps:ey,NSwitch:oy,NTab:ui,NTabPane:dy,NTable:ry,NTabs:cy,NTag:Tn,NTbody:sy,NTd:ay,NText:Ly,NTh:ny,NThead:ly,NThemeEditor:k6,NThing:uy,NTime:fy,NTimePicker:ai,NTimeline:vy,NTimelineItem:my,NTooltip:Si,NTr:iy,NTransfer:py,NTree:Fu,NTreeSelect:wy,NUl:By,NUpload:Ny,NUploadDragger:Hu,NUploadFileList:Vu,NUploadTrigger:tl,NWatermark:Hy,NxButton:Eo,aProps:Ou,affixProps:bi,alertDark:Hv,alertProps:Ps,anchorDark:Kv,anchorLinkProps:zs,anchorProps:$s,arDZ:J1,autoCompleteDark:om,autoCompleteProps:Bs,avatarDark:As,avatarGroupProps:_s,avatarProps:Ls,backTopDark:fm,backTopProps:Es,badgeDark:mm,badgeProps:Ns,blockquoteProps:Lu,breadcrumbDark:xm,breadcrumbItemProps:Vs,breadcrumbProps:Hs,buttonDark:wo,buttonGroupDark:Zg,buttonGroupProps:Us,buttonProps:js,c:S,cB:p,cE:R,cM:k,cNotM:vt,calendarProps:Ks,cardDark:Xs,cardProps:Js,carouselProps:rd,cascaderDark:Vm,cascaderProps:ld,checkboxDark:fn,checkboxGroupProps:nd,checkboxProps:ad,codeDark:sd,codeProps:cd,colProps:zi,collapseDark:qm,collapseItemProps:vd,collapseProps:fd,collapseTransitionProps:pd,colorPickerProps:Gs,commonDark:Qe,commonLight:Ge,configProviderProps:gd,countdownProps:bd,create:Uy,createDiscreteApi:Vy,createLocale:iS,createTheme:y6,darkTheme:b6,dataTableDark:dp,dataTableProps:Ad,dateArDZ:Gw,dateDeDE:Pw,dateEnGB:Nw,dateEnUS:mv,dateEo:Qw,dateEsAR:Bw,dateFaIR:oS,dateFrFR:Mw,dateIdID:kw,dateItIT:Aw,dateJaJP:xw,dateKoKR:ww,dateNbNO:Tw,dateNlNL:Iw,datePickerDark:Fp,datePickerProps:Xd,datePlPL:Vw,datePtBR:Ww,dateRuRU:pw,dateSkSK:_w,dateSvSE:nS,dateThTH:Kw,dateTrTR:Zw,dateUkUA:bw,dateViVN:eS,dateZhCN:uw,dateZhTW:hw,deDE:D1,default:u6,descriptionsDark:Hp,descriptionsItemProps:Jd,descriptionsProps:Qd,dialogDark:tc,dialogProps:Nn,dialogProviderProps:ic,dividerDark:og,dividerProps:sc,drawerContentProps:uc,drawerDark:ig,drawerProps:cc,dropdownDark:ja,dropdownProps:jd,dynamicInputDark:dg,dynamicInputProps:hc,dynamicTagsDark:pg,dynamicTagsProps:gc,elementDark:yg,elementProps:bc,ellipsisProps:Wa,emptyDark:Lr,emptyProps:xs,enGB:U1,enUS:vv,eo:rw,equationProps:Uu,esAR:E1,faIR:lw,formDark:wg,formItemGiProps:si,formItemGridItemProps:si,formItemProps:Hn,formProps:xc,frFR:L1,giProps:nn,gradientTextDark:Dg,gradientTextProps:Rc,gridItemProps:nn,gridProps:Pc,h1Props:Io,h2Props:Io,h3Props:Io,h4Props:Io,h5Props:Io,h6Props:Io,iconDark:wp,iconProps:Hd,iconWrapperProps:Tc,idID:$1,imageGroupProps:Bc,imageProps:Ac,inputDark:Oo,inputGroupLabelProps:Fs,inputGroupProps:Ds,inputNumberDark:Xg,inputNumberProps:_c,inputProps:Is,install:f6,internalSelectMenuDark:En,internalSelectionDark:Ba,itIT:H1,jaJP:R1,koKR:z1,layoutContentProps:ci,layoutDark:Jg,layoutFooterProps:Nc,layoutHeaderProps:Ec,layoutProps:ci,layoutSiderProps:Hc,legacyTransferProps:Vc,lightTheme:Rn,listDark:ob,listProps:jc,loadingBarDark:rb,loadingBarProviderProps:Wc,logDark:ib,logProps:qc,mentionDark:lb,mentionProps:eu,menuDark:ub,menuProps:Jc,messageDark:Yg,messageProviderProps:tu,modalDark:Qp,modalProps:rc,nbNO:F1,nlNL:O1,notificationDark:Kg,notificationProviderProps:iu,numberAnimationProps:yd,olProps:Eu,pProps:Au,pageHeaderProps:su,paginationDark:$d,paginationProps:Id,plPL:q1,popconfirmDark:pb,popconfirmProps:du,popoverDark:Er,popoverProps:Cs,popselectDark:xd,popselectProps:wd,progressDark:Dc,progressProps:cu,ptBR:Y1,radioButtonProps:hp,radioDark:Fd,radioGroupProps:Ed,radioProps:_d,rateDark:bb,rateProps:fu,resultDark:wb,resultProps:hu,rowProps:Pi,ruRU:C1,scrollbarDark:xo,scrollbarProps:vu,selectDark:Rd,selectProps:Pd,skSK:j1,skeletonProps:mu,sliderDark:kb,sliderProps:pu,spaceDark:vc,spaceProps:pc,spinDark:Tb,spinProps:gu,statisticDark:Db,statisticProps:bu,stepProps:xu,stepsDark:Bb,stepsProps:yu,svSE:dw,switchDark:Ab,switchProps:Cu,tabPaneProps:el,tabProps:ku,tableDark:Nb,tableProps:wu,tabsDark:jb,tabsProps:Ru,tagDark:ws,tagProps:ks,textProps:Nu,thTH:X1,thingDark:Kb,thingProps:Pu,timePickerDark:Ud,timePickerProps:Kd,timeProps:zu,timelineDark:Gb,timelineItemProps:$u,timelineProps:Tu,tooltipDark:Ci,tooltipProps:Bd,trTR:tw,transferDark:Xb,transferProps:Iu,treeDark:Fc,treeProps:Mu,treeSelectDark:e0,treeSelectProps:Bu,typographyDark:r0,ukUA:S1,ulProps:_u,unstableAlertRtl:Mk,unstableAvatarGroupRtl:m2,unstableBadgeRtl:R2,unstableButtonGroupRtl:ug,unstableButtonRtl:La,unstableCardRtl:kR,unstableCheckboxRtl:Em,unstableCollapseRtl:fP,unstableCollapseTransitionRtl:xP,unstableDrawerRtl:ET,unstableDynamicInputRtl:a5,unstableInputNumberRtl:fg,unstableInputRtl:Aa,unstableListRtl:C$,unstableMessageRtl:s$,unstableNotificationRtl:r$,unstablePageHeaderRtl:L$,unstablePaginationRtl:OP,unstableRadioRtl:qP,unstableRowRtl:Z3,unstableScrollbarRtl:YS,unstableSpaceRtl:mg,unstableStatisticRtl:r3,unstableStepsRtl:s3,unstableTableRtl:p3,unstableTagRtl:bk,unstableThingRtl:S3,unstableTreeRtl:F3,uploadDark:a0,uploadProps:ju,useDialog:lc,useDialogReactiveList:Jp,useLoadingBar:Kc,useMessage:ru,useNotification:lu,useOsTheme:FC,useThemeVars:h6,version:Wy,viVN:iw,watermarkDark:l0,watermarkProps:Wu,zhCN:p1,zhTW:b1,zindexable:Ln},Symbol.toStringTag,{value:"Module"})),P6=W({__name:"MxButton",setup(e){const{NButton:t}=R6;return(o,r)=>(Vh(),dC(oi(t),null,{default:jh(()=>[Pa(o.$slots,"default")]),_:3}))}}),D6=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/common-components/按钮.md","filePath":"cn/mx-components/common-components/按钮.md","lastUpdated":1720682010000}'),z6={name:"cn/mx-components/common-components/按钮.md"},M6=Object.assign(z6,{setup(e){return(t,o)=>(Vh(),cC("div",null,[uC("pre",null,fC(oi(vC)),1),hC(oi(P6),{type:"primary"},{default:jh(()=>[In("submit")]),_:1})]))}});export{D6 as __pageData,M6 as default}; diff --git a/assets/cn_mx-components_index.md.UyJdQsEh.js b/assets/cn_mx-components_index.md.BsvAtqZQ.js similarity index 73% rename from assets/cn_mx-components_index.md.UyJdQsEh.js rename to assets/cn_mx-components_index.md.BsvAtqZQ.js index c135fee..890a54f 100644 --- a/assets/cn_mx-components_index.md.UyJdQsEh.js +++ b/assets/cn_mx-components_index.md.BsvAtqZQ.js @@ -1 +1 @@ -import{_ as e,N as t,M as n,Z as o}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/index.md","filePath":"cn/mx-components/index.md","lastUpdated":1719277083000}'),a={name:"cn/mx-components/index.md"},s=o("p",null,"基于 Naive-UI 封装的组件库",-1),c=[s];function d(r,i,p,m,_,l){return n(),t("div",null,c)}const h=e(a,[["render",d]]);export{f as __pageData,h as default}; +import{_ as e,N as t,M as n,Z as o}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/index.md","filePath":"cn/mx-components/index.md","lastUpdated":1720682010000}'),a={name:"cn/mx-components/index.md"},s=o("p",null,"基于 Naive-UI 封装的组件库",-1),c=[s];function d(r,i,p,m,_,l){return n(),t("div",null,c)}const h=e(a,[["render",d]]);export{f as __pageData,h as default}; diff --git a/assets/cn_mx-components_index.md.UyJdQsEh.lean.js b/assets/cn_mx-components_index.md.BsvAtqZQ.lean.js similarity index 73% rename from assets/cn_mx-components_index.md.UyJdQsEh.lean.js rename to assets/cn_mx-components_index.md.BsvAtqZQ.lean.js index c135fee..890a54f 100644 --- a/assets/cn_mx-components_index.md.UyJdQsEh.lean.js +++ b/assets/cn_mx-components_index.md.BsvAtqZQ.lean.js @@ -1 +1 @@ -import{_ as e,N as t,M as n,Z as o}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/index.md","filePath":"cn/mx-components/index.md","lastUpdated":1719277083000}'),a={name:"cn/mx-components/index.md"},s=o("p",null,"基于 Naive-UI 封装的组件库",-1),c=[s];function d(r,i,p,m,_,l){return n(),t("div",null,c)}const h=e(a,[["render",d]]);export{f as __pageData,h as default}; +import{_ as e,N as t,M as n,Z as o}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"cn/mx-components/index.md","filePath":"cn/mx-components/index.md","lastUpdated":1720682010000}'),a={name:"cn/mx-components/index.md"},s=o("p",null,"基于 Naive-UI 封装的组件库",-1),c=[s];function d(r,i,p,m,_,l){return n(),t("div",null,c)}const h=e(a,[["render",d]]);export{f as __pageData,h as default}; diff --git a/assets/en_index.md.BJT6H8Yr.js b/assets/en_index.md.C-6bPfAN.js similarity index 89% rename from assets/en_index.md.BJT6H8Yr.js rename to assets/en_index.md.C-6bPfAN.js index 0786978..a96394c 100644 --- a/assets/en_index.md.BJT6H8Yr.js +++ b/assets/en_index.md.C-6bPfAN.js @@ -1 +1 @@ -import{N as a,Z as e,F as l,a6 as s,u as o,M as n,Q as r}from"./chunks/framework.wLg4U0bT.js";const i=JSON.parse("[]"),u=e("h1",null,"All Blog Posts",-1),d=["href"],h=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1719277083000}'),c={name:"en/index.md"},g=Object.assign(c,{setup(_){return(m,p)=>(n(),a("div",null,[e("template",null,[u,e("ul",null,[(n(!0),a(l,null,s(o(i),t=>(n(),a("li",null,[e("a",{href:t.url},r(t.frontmatter.title),9,d),e("span",null,"by "+r(t.frontmatter.author),1)]))),256))])])]))}});export{h as __pageData,g as default}; +import{N as a,Z as e,F as l,a6 as s,u as o,M as n,Q as r}from"./chunks/framework.wLg4U0bT.js";const i=JSON.parse("[]"),u=e("h1",null,"All Blog Posts",-1),d=["href"],h=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1720682010000}'),c={name:"en/index.md"},g=Object.assign(c,{setup(_){return(m,p)=>(n(),a("div",null,[e("template",null,[u,e("ul",null,[(n(!0),a(l,null,s(o(i),t=>(n(),a("li",null,[e("a",{href:t.url},r(t.frontmatter.title),9,d),e("span",null,"by "+r(t.frontmatter.author),1)]))),256))])])]))}});export{h as __pageData,g as default}; diff --git a/assets/en_index.md.BJT6H8Yr.lean.js b/assets/en_index.md.C-6bPfAN.lean.js similarity index 89% rename from assets/en_index.md.BJT6H8Yr.lean.js rename to assets/en_index.md.C-6bPfAN.lean.js index 0786978..a96394c 100644 --- a/assets/en_index.md.BJT6H8Yr.lean.js +++ b/assets/en_index.md.C-6bPfAN.lean.js @@ -1 +1 @@ -import{N as a,Z as e,F as l,a6 as s,u as o,M as n,Q as r}from"./chunks/framework.wLg4U0bT.js";const i=JSON.parse("[]"),u=e("h1",null,"All Blog Posts",-1),d=["href"],h=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1719277083000}'),c={name:"en/index.md"},g=Object.assign(c,{setup(_){return(m,p)=>(n(),a("div",null,[e("template",null,[u,e("ul",null,[(n(!0),a(l,null,s(o(i),t=>(n(),a("li",null,[e("a",{href:t.url},r(t.frontmatter.title),9,d),e("span",null,"by "+r(t.frontmatter.author),1)]))),256))])])]))}});export{h as __pageData,g as default}; +import{N as a,Z as e,F as l,a6 as s,u as o,M as n,Q as r}from"./chunks/framework.wLg4U0bT.js";const i=JSON.parse("[]"),u=e("h1",null,"All Blog Posts",-1),d=["href"],h=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1720682010000}'),c={name:"en/index.md"},g=Object.assign(c,{setup(_){return(m,p)=>(n(),a("div",null,[e("template",null,[u,e("ul",null,[(n(!0),a(l,null,s(o(i),t=>(n(),a("li",null,[e("a",{href:t.url},r(t.frontmatter.title),9,d),e("span",null,"by "+r(t.frontmatter.author),1)]))),256))])])]))}});export{h as __pageData,g as default}; diff --git a/assets/index.md.CxW3bBkY.js b/assets/index.md.CbV-hMzj.js similarity index 93% rename from assets/index.md.CxW3bBkY.js rename to assets/index.md.CbV-hMzj.js index df5d466..1b6fa4e 100644 --- a/assets/index.md.CxW3bBkY.js +++ b/assets/index.md.CbV-hMzj.js @@ -1 +1 @@ -import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"MX-CodeCraft","text":"动机 | 摆弄 | 沉淀","tagline":"代码之间的魔法舞蹈","actions":[{"theme":"brand","text":"了解我","link":"/about-me"},{"theme":"alt","text":"团队概览","link":"/group"}]},"features":[{"icon":"🔬","title":"前端很杂","details":"都有涉猎建立体系,着重学习发挥特长。"},{"icon":"📃","title":"技术尝试 & 心得沉淀","details":"只有不断尝试和总结,才能把技术变成生产力。"},{"icon":"🏘️","title":"抽象","details":"将复杂的概念清晰地转化为可执行的代码。"},{"icon":"📊","title":"2/3D 动画 & 数据可视化","details":"唯一的限制是你的想象力。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1719277083000}'),i={name:"index.md"};function n(o,r,s,d,l,c){return a(),t("div")}const _=e(i,[["render",n]]);export{p as __pageData,_ as default}; +import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"MX-CodeCraft","text":"动机 | 摆弄 | 沉淀","tagline":"代码之间的魔法舞蹈","actions":[{"theme":"brand","text":"了解我","link":"/about-me"},{"theme":"alt","text":"团队概览","link":"/group"}]},"features":[{"icon":"🔬","title":"前端很杂","details":"都有涉猎建立体系,着重学习发挥特长。"},{"icon":"📃","title":"技术尝试 & 心得沉淀","details":"只有不断尝试和总结,才能把技术变成生产力。"},{"icon":"🏘️","title":"抽象","details":"将复杂的概念清晰地转化为可执行的代码。"},{"icon":"📊","title":"2/3D 动画 & 数据可视化","details":"唯一的限制是你的想象力。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1720682010000}'),i={name:"index.md"};function n(o,r,s,d,l,c){return a(),t("div")}const _=e(i,[["render",n]]);export{p as __pageData,_ as default}; diff --git a/assets/index.md.CxW3bBkY.lean.js b/assets/index.md.CbV-hMzj.lean.js similarity index 93% rename from assets/index.md.CxW3bBkY.lean.js rename to assets/index.md.CbV-hMzj.lean.js index df5d466..1b6fa4e 100644 --- a/assets/index.md.CxW3bBkY.lean.js +++ b/assets/index.md.CbV-hMzj.lean.js @@ -1 +1 @@ -import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"MX-CodeCraft","text":"动机 | 摆弄 | 沉淀","tagline":"代码之间的魔法舞蹈","actions":[{"theme":"brand","text":"了解我","link":"/about-me"},{"theme":"alt","text":"团队概览","link":"/group"}]},"features":[{"icon":"🔬","title":"前端很杂","details":"都有涉猎建立体系,着重学习发挥特长。"},{"icon":"📃","title":"技术尝试 & 心得沉淀","details":"只有不断尝试和总结,才能把技术变成生产力。"},{"icon":"🏘️","title":"抽象","details":"将复杂的概念清晰地转化为可执行的代码。"},{"icon":"📊","title":"2/3D 动画 & 数据可视化","details":"唯一的限制是你的想象力。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1719277083000}'),i={name:"index.md"};function n(o,r,s,d,l,c){return a(),t("div")}const _=e(i,[["render",n]]);export{p as __pageData,_ as default}; +import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"MX-CodeCraft","text":"动机 | 摆弄 | 沉淀","tagline":"代码之间的魔法舞蹈","actions":[{"theme":"brand","text":"了解我","link":"/about-me"},{"theme":"alt","text":"团队概览","link":"/group"}]},"features":[{"icon":"🔬","title":"前端很杂","details":"都有涉猎建立体系,着重学习发挥特长。"},{"icon":"📃","title":"技术尝试 & 心得沉淀","details":"只有不断尝试和总结,才能把技术变成生产力。"},{"icon":"🏘️","title":"抽象","details":"将复杂的概念清晰地转化为可执行的代码。"},{"icon":"📊","title":"2/3D 动画 & 数据可视化","details":"唯一的限制是你的想象力。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1720682010000}'),i={name:"index.md"};function n(o,r,s,d,l,c){return a(),t("div")}const _=e(i,[["render",n]]);export{p as __pageData,_ as default}; diff --git a/assets/posts_index.md.CI8KVTJS.js b/assets/posts_index.md.EWW9ss0x.js similarity index 68% rename from assets/posts_index.md.CI8KVTJS.js rename to assets/posts_index.md.EWW9ss0x.js index eb4cc97..6b3894a 100644 --- a/assets/posts_index.md.CI8KVTJS.js +++ b/assets/posts_index.md.EWW9ss0x.js @@ -1 +1 @@ -import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"index","description":"","frontmatter":{"title":"index","author":"xie"},"headers":[],"relativePath":"posts/index.md","filePath":"posts/index.md","lastUpdated":1719277083000}'),s={name:"posts/index.md"};function n(o,r,d,i,p,c){return a(),t("div")}const l=e(s,[["render",n]]);export{x as __pageData,l as default}; +import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"index","description":"","frontmatter":{"title":"index","author":"xie"},"headers":[],"relativePath":"posts/index.md","filePath":"posts/index.md","lastUpdated":1720682010000}'),s={name:"posts/index.md"};function n(o,r,d,i,p,c){return a(),t("div")}const l=e(s,[["render",n]]);export{x as __pageData,l as default}; diff --git a/assets/posts_index.md.CI8KVTJS.lean.js b/assets/posts_index.md.EWW9ss0x.lean.js similarity index 68% rename from assets/posts_index.md.CI8KVTJS.lean.js rename to assets/posts_index.md.EWW9ss0x.lean.js index eb4cc97..6b3894a 100644 --- a/assets/posts_index.md.CI8KVTJS.lean.js +++ b/assets/posts_index.md.EWW9ss0x.lean.js @@ -1 +1 @@ -import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"index","description":"","frontmatter":{"title":"index","author":"xie"},"headers":[],"relativePath":"posts/index.md","filePath":"posts/index.md","lastUpdated":1719277083000}'),s={name:"posts/index.md"};function n(o,r,d,i,p,c){return a(),t("div")}const l=e(s,[["render",n]]);export{x as __pageData,l as default}; +import{_ as e,N as t,M as a}from"./chunks/framework.wLg4U0bT.js";const x=JSON.parse('{"title":"index","description":"","frontmatter":{"title":"index","author":"xie"},"headers":[],"relativePath":"posts/index.md","filePath":"posts/index.md","lastUpdated":1720682010000}'),s={name:"posts/index.md"};function n(o,r,d,i,p,c){return a(),t("div")}const l=e(s,[["render",n]]);export{x as __pageData,l as default}; diff --git a/assets/posts_my-first-day.md.BWX3-leE.js b/assets/posts_my-first-day.md.DCiAmvyV.js similarity index 85% rename from assets/posts_my-first-day.md.BWX3-leE.js rename to assets/posts_my-first-day.md.DCiAmvyV.js index 44774da..50421cb 100644 --- a/assets/posts_my-first-day.md.BWX3-leE.js +++ b/assets/posts_my-first-day.md.DCiAmvyV.js @@ -1 +1 @@ -import{_ as t,N as a,M as s}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"my-first-day","description":"","frontmatter":{"title":"my-first-day","author":"du"},"headers":[],"relativePath":"posts/my-first-day.md","filePath":"posts/my-first-day.md","lastUpdated":1719277083000}'),e={name:"posts/my-first-day.md"};function r(o,d,i,m,n,p){return s(),a("div")}const y=t(e,[["render",r]]);export{f as __pageData,y as default}; +import{_ as t,N as a,M as s}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"my-first-day","description":"","frontmatter":{"title":"my-first-day","author":"du"},"headers":[],"relativePath":"posts/my-first-day.md","filePath":"posts/my-first-day.md","lastUpdated":1720682010000}'),e={name:"posts/my-first-day.md"};function r(o,d,i,m,n,p){return s(),a("div")}const y=t(e,[["render",r]]);export{f as __pageData,y as default}; diff --git a/assets/posts_my-first-day.md.BWX3-leE.lean.js b/assets/posts_my-first-day.md.DCiAmvyV.lean.js similarity index 85% rename from assets/posts_my-first-day.md.BWX3-leE.lean.js rename to assets/posts_my-first-day.md.DCiAmvyV.lean.js index 44774da..50421cb 100644 --- a/assets/posts_my-first-day.md.BWX3-leE.lean.js +++ b/assets/posts_my-first-day.md.DCiAmvyV.lean.js @@ -1 +1 @@ -import{_ as t,N as a,M as s}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"my-first-day","description":"","frontmatter":{"title":"my-first-day","author":"du"},"headers":[],"relativePath":"posts/my-first-day.md","filePath":"posts/my-first-day.md","lastUpdated":1719277083000}'),e={name:"posts/my-first-day.md"};function r(o,d,i,m,n,p){return s(),a("div")}const y=t(e,[["render",r]]);export{f as __pageData,y as default}; +import{_ as t,N as a,M as s}from"./chunks/framework.wLg4U0bT.js";const f=JSON.parse('{"title":"my-first-day","description":"","frontmatter":{"title":"my-first-day","author":"du"},"headers":[],"relativePath":"posts/my-first-day.md","filePath":"posts/my-first-day.md","lastUpdated":1720682010000}'),e={name:"posts/my-first-day.md"};function r(o,d,i,m,n,p){return s(),a("div")}const y=t(e,[["render",r]]);export{f as __pageData,y as default}; diff --git "a/cn/back-end/AI/ollama/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/back-end/AI/ollama/\345\277\253\351\200\237\345\274\200\345\247\213.html" index 2dabf8b..d5150e3 100644 --- "a/cn/back-end/AI/ollama/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/back-end/AI/ollama/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

ollama

启动并运行大型语言模型,不需要编程。官网

  1. 下载并安装 ollama,参考官网

  2. 启动 ollama 服务,首次运行会在本地安装大语言模型。

sh
  ollama run llama3
  1. 在控制台与本地 AI 对话。

ollama-cmd

  1. 使用 nodejs 与 llama3 对话
sh
# 启动ollama
+    
Skip to content

ollama

启动并运行大型语言模型,不需要编程。官网

  1. 下载并安装 ollama,参考官网

  2. 启动 ollama 服务,首次运行会在本地安装大语言模型。

sh
  ollama run llama3
  1. 在控制台与本地 AI 对话。

ollama-cmd

  1. 使用 nodejs 与 llama3 对话
sh
# 启动ollama
 ollama serve
 
 # 安装依赖
@@ -29,8 +29,8 @@
   model: 'llama3',
   messages: [{ role: 'user', content: '天空为什么是蓝色的,用中文回答' }],
 });
-console.log(response.message.content);

预览

ollama-cmd

- +console.log(response.message.content);

预览

ollama-cmd

+ \ No newline at end of file diff --git "a/cn/back-end/AI/ollama/\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.html" "b/cn/back-end/AI/ollama/\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.html" index 658688a..c096760 100644 --- "a/cn/back-end/AI/ollama/\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.html" +++ "b/cn/back-end/AI/ollama/\346\226\207\347\224\237\345\233\276\345\244\247\346\250\241\345\236\213.html" @@ -12,15 +12,15 @@ - + -
Skip to content

文生图大模型

stable-diffusion-3 简称 sd3,是 2022 年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像

- +
Skip to content

文生图大模型

stable-diffusion-3 简称 sd3,是 2022 年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像

+ \ No newline at end of file diff --git "a/cn/back-end/java/MyBatis/Mapper\344\273\243\347\220\206\345\274\200\345\217\221.html" "b/cn/back-end/java/MyBatis/Mapper\344\273\243\347\220\206\345\274\200\345\217\221.html" index 6decc7f..1dc6796 100644 --- "a/cn/back-end/java/MyBatis/Mapper\344\273\243\347\220\206\345\274\200\345\217\221.html" +++ "b/cn/back-end/java/MyBatis/Mapper\344\273\243\347\220\206\345\274\200\345\217\221.html" @@ -12,14 +12,14 @@ - + -
Skip to content

代理开发

痛点:存在硬编码,没有 IDE 提示、自动补全、代码检查。

代理开发:通过代理类,实现接口,实现接口方法,通过接口方法调用 Mapper 方法。

创建代理接口

src/main/java/com/mx下创建 mappers文件夹,随后在其中创建WebsiteMapper.java

java
// src/main/java/com/mx.pojo 中的 Website.java
+    
Skip to content

代理开发

痛点:存在硬编码,没有 IDE 提示、自动补全、代码检查。

代理开发:通过代理类,实现接口,实现接口方法,通过接口方法调用 Mapper 方法。

创建代理接口

src/main/java/com/mx下创建 mappers文件夹,随后在其中创建WebsiteMapper.java

java
// src/main/java/com/mx.pojo 中的 Website.java
 package com.mx.pojo;
 
 public class Website {
@@ -132,8 +132,8 @@
 
     sqlSession.close();
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/MyBatis/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/back-end/java/MyBatis/\345\277\253\351\200\237\345\274\200\345\247\213.html" index 5412e1e..c1959f9 100644 --- "a/cn/back-end/java/MyBatis/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/back-end/java/MyBatis/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

快速开始

表现层、业务层、持久层

MyBatis 是一款 ORM 框架,它支持定制化 SQL、存储过程以及高级映射。是一款优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

物料准备

在本地新建mx数据库和表websites,并填充测试数据。

sql

+    
Skip to content

快速开始

表现层、业务层、持久层

MyBatis 是一款 ORM 框架,它支持定制化 SQL、存储过程以及高级映射。是一款优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

物料准备

在本地新建mx数据库和表websites,并填充测试数据。

sql

 -- 创建数据库
 
 CREATE DATABASE mx DEFAULT CHARACTER SET = 'utf8mb4';
@@ -149,8 +149,8 @@
 
         sqlSession.close();
     }
-}

工程目录结构

img

运行结果

img

- +}

工程目录结构

img

运行结果

img

+ \ No newline at end of file diff --git a/cn/back-end/java/SpringBoot/restful.html b/cn/back-end/java/SpringBoot/restful.html index 396ee25..a0ab4dc 100644 --- a/cn/back-end/java/SpringBoot/restful.html +++ b/cn/back-end/java/SpringBoot/restful.html @@ -12,14 +12,14 @@ - + -
Skip to content

restful 和静态资源

相关注解

  • PathVariable 接收前端请求请求 path 中的参数
  • RequestParam 接收前端请求请求参数
  • RequestBody 接收前端请求请求体
  • RequestHeader 接收前端请求请求头
  • CookieValue 接收前端请求 cookie

restful

/src/main/java/com/mx/spring_boot_starter/controllers下新建RestfulController

java

+    
Skip to content

restful 和静态资源

相关注解

  • PathVariable 接收前端请求请求 path 中的参数
  • RequestParam 接收前端请求请求参数
  • RequestBody 接收前端请求请求体
  • RequestHeader 接收前端请求请求头
  • CookieValue 接收前端请求 cookie

restful

/src/main/java/com/mx/spring_boot_starter/controllers下新建RestfulController

java

 package com.mx.spring_boot_starter.controllers;
 
 import java.io.File;
@@ -88,8 +88,8 @@
   <body>
     <h1>hello spring boot</h1>
   </body>
-</html>
- +</html>
+ \ No newline at end of file diff --git "a/cn/back-end/java/SpringBoot/\344\270\216mybatis\347\273\223\345\220\210.html" "b/cn/back-end/java/SpringBoot/\344\270\216mybatis\347\273\223\345\220\210.html" new file mode 100644 index 0000000..dbd927b --- /dev/null +++ "b/cn/back-end/java/SpringBoot/\344\270\216mybatis\347\273\223\345\220\210.html" @@ -0,0 +1,126 @@ + + + + + + 与 mybatis 接口 | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

与 mybatis 接口

步骤:

  1. 添加mybatis-spring-boot-starter依赖
  2. 配置数据库连接信息和mybatis
  3. src/main/java/com/mx/spring_boot_starter/pojo下新建实体类User.java
  4. src/main/java/com/mx/spring_boot_starter/mapper下新建映射类UserMapper.java
  5. src/main/resources/mapper/下新建映射文件UserMapper.xml
  6. src/main/java/com/mx/spring_boot_starter/service下新建业务类UserService.java
  7. src/main/java/com/mx/spring_boot_starter/controller下新建控制类UserController.java
  8. 在启动类SpringBootStarterApplication.java中,添加MapperScan注解
  9. 启动项目,访问http://localhost:8080/user

添加依赖

xml
<dependency>
+  <groupId>org.mybatis.spring.boot</groupId>
+  <artifactId>mybatis-spring-boot-starter</artifactId>
+  <version>3.0.3</version>
+</dependency>
+
+<dependency>
+  <groupId>org.projectlombok</groupId>
+  <artifactId>lombok</artifactId>
+  <version>1.18.32</version>
+</dependency>

配置数据库连接信息和mybatis

yml
spring:
+  application:
+    name: spring-boot-starter-web-demo # 应用名称
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource # 使用Hikari连接池
+    driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动
+    url: jdbc:mysql://localhost:3306/mx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai # 数据库连接地址
+    username: root
+    password: 123456
+
+mybatis:
+  type-aliases-package: com.mx.spring_boot_starter.pojo # 扫描实体类
+  mapper-locations: classpath:mapper/*.xml # 扫描映射文件

新建实体类User.java

java
package com.mx.spring_boot_starter.pojo;
+
+import lombok.Data;
+
+@Data
+public class User {
+  private int id;
+  private String username;
+  private String email;
+  private String password;
+  private int age;
+  private String gender;
+  private boolean is_active;
+  private int department_id;
+}

新建映射类UserMapper.java

java
package com.mx.spring_boot_starter.mapper;
+
+import com.mx.spring_boot_starter.pojo.User;
+import java.util.List;
+
+public interface UserMapper {
+
+  List<User> getAll();
+}

新建映射文件UserMapper.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.mx.spring_boot_starter.mapper.UserMapper">
+  <select id="getAll" resultType="User"> select * from user </select>
+</mapper>

业务类UserService.java

java
package com.mx.spring_boot_starter.service;
+
+import com.mx.spring_boot_starter.mapper.UserMapper;
+import com.mx.spring_boot_starter.pojo.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.*;
+
+@Service
+public class UserService {
+
+  @Autowired
+  private UserMapper userMapper;
+
+  public List<User> getAll() {
+
+    return userMapper.getAll();
+  }
+}

新建控制类UserController.java

java
package com.mx.spring_boot_starter.controllers;
+
+import com.mx.spring_boot_starter.pojo.User;
+import com.mx.spring_boot_starter.services.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.util.*;
+
+@RestController
+public class UserController {
+
+  @Autowired
+  private UserService userService;
+
+  @GetMapping("/user")
+  public List<User> getAll() {
+    return userService.getAll();
+  }
+}

添加MapperScan注解

java
package com.mx.spring_boot_starter;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+// 表明当前项目为SpringBoot项目, 启动类, 启动SpringBoot项目
+@SpringBootApplication
+@MapperScan("com.mx.spring_boot_starter.mapper") // 扫描mapper
+public class SpringBootStarterApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(SpringBootStarterApplication.class, args);
+	}
+
+}

访问

+ + + + \ No newline at end of file diff --git "a/cn/back-end/java/SpringBoot/\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.html" "b/cn/back-end/java/SpringBoot/\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.html" index b32228c..cb63c72 100644 --- "a/cn/back-end/java/SpringBoot/\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.html" +++ "b/cn/back-end/java/SpringBoot/\344\276\235\350\265\226\346\263\250\345\205\245\345\222\214\346\216\247\345\210\266\345\217\215\350\275\254.html" @@ -12,14 +12,14 @@ - + -
Skip to content

依赖注入和控制反转

控制反转(Inversion of Control,简称 IoC)
依赖注入(Dependency Injection, DI)

IoC 是通过依赖注入(Dependency Injection, DI)来实现的。在传统编程中,应用程序负责创建和管理对象的生命周期,这会导致代码之间的紧密耦合。IoC 则将这种控制权交给了容器(如 Spring 容器),由容器负责创建、管理和注入对象。

控制反转意味着对象的创建和依赖关系由容器管理,而不是由应用程序代码直接管理。也就是说,应用程序将控制权“反转”给了 Spring 容器。

在配置类中创建注入类

定义注入类

java
// src/main/java/com/mx/spring_boot_starter/Stu.java
+    
Skip to content

依赖注入和控制反转

控制反转(Inversion of Control,简称 IoC)
依赖注入(Dependency Injection, DI)

IoC 是通过依赖注入(Dependency Injection, DI)来实现的。在传统编程中,应用程序负责创建和管理对象的生命周期,这会导致代码之间的紧密耦合。IoC 则将这种控制权交给了容器(如 Spring 容器),由容器负责创建、管理和注入对象。

控制反转意味着对象的创建和依赖关系由容器管理,而不是由应用程序代码直接管理。也就是说,应用程序将控制权“反转”给了 Spring 容器。

在配置类中创建注入类

定义注入类

java
// src/main/java/com/mx/spring_boot_starter/Stu.java
 package com.mx.spring_boot_starter;
 
 public class Stu {
@@ -100,8 +100,8 @@
   @GetMapping("getMyConfig")
   public MyConfig getMyConfig() {
     return myConfig;
-  }

测试结果

测试结果

- + }

测试结果

测试结果

+ \ No newline at end of file diff --git "a/cn/back-end/java/SpringBoot/\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.html" "b/cn/back-end/java/SpringBoot/\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.html" new file mode 100644 index 0000000..050ee51 --- /dev/null +++ "b/cn/back-end/java/SpringBoot/\345\274\202\345\270\270\345\244\204\347\220\206\345\222\214\346\213\246\346\210\252\345\231\250.html" @@ -0,0 +1,141 @@ + + + + + + 异常处理和拦截器 | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

异常处理和拦截器

异常处理

设置文件请求限制

application.properties 中设置

spring.servlet.multipart.max-file-size=50KB # 单文件最大大小
spring.servlet.multipart.max-request-size=50KB # 请求最大大小

统一异常拦截处理

  • ControllerAdvice 捕获所有异常

在工程中新建 GraceExceptionHandler 类,并使用 @ControllerAdvice 注解。

java
package com.mx.spring_boot_starter;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+
+import java.util.Map;
+import java.util.HashMap;
+
+@ControllerAdvice
+public class GraceExceptionHandler {
+  @ExceptionHandler(MaxUploadSizeExceededException.class)
+  @ResponseBody
+  public Map<String, Object> handleException(MaxUploadSizeExceededException e) {
+    Map<String, Object> map = new HashMap<String, Object>();
+    map.put("code", 400);
+    map.put("status", "文件太大了");
+    return map;
+  }
+}

测试

上传一张大于50KB的文件。

测试结果

拦截器

新建拦截器配置文件

在项目目录下新建 configs 目录,新建 InterceptorConfig.java 文件。

java
package com.mx.spring_boot_starter.configs;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import com.mx.spring_boot_starter.interceptors.UserInfoInterceptor;
+
+@Configuration  // 注解,spring boot 扫描到这个注解会把配置加到容器。
+public class InterceptorConfig implements WebMvcConfigurer {
+  @Bean
+  public UserInfoInterceptor userInfoInterceptor() {
+    return new UserInfoInterceptor();
+  }
+
+  @Override
+  public void addInterceptors(InterceptorRegistry registry) {
+    registry.addInterceptor(userInfoInterceptor()).addPathPatterns("/restful/upload");  // 给`restful/upload`添加拦截器
+`
+  }
+}

新建拦截器类

在项目文件中新建 interceptors 目录,新建 UserInfoInterceptor.java 类。

java
package com.mx.spring_boot_starter.interceptors;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import io.micrometer.common.util.StringUtils;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class UserInfoInterceptor implements HandlerInterceptor {
+
+  @Override
+  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+    // TODO Auto-generated method stub
+    String token = request.getHeader("token");
+    if (StringUtils.isEmpty(token)) {
+      log.info("用户token为空");
+      return false;
+    }
+    if (!token.equalsIgnoreCase("asdf")) {
+      log.info("用户权限不正确");
+      return false;
+    }
+    return true;
+  }
+}

测试

当请求restful/upload 不带 token 头,或者token 值不正确时,会拦截。

实战

在拦截器中抛出运行时异常,并在统一异常捕获器中返回异常结果给前端。

java
// UserInfoInterceptor.java
+package com.mx.spring_boot_starter.interceptors;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import io.micrometer.common.util.StringUtils;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class UserInfoInterceptor implements HandlerInterceptor {
+
+  @Override
+  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+    // TODO Auto-generated method stub
+    String token = request.getHeader("token");
+    if (StringUtils.isEmpty(token)) {
+      log.info("用户token为空");
+      throw new RuntimeException("用户token为空");
+    }
+    if (!token.equalsIgnoreCase("asdf")) {
+      log.info("用户权限不正确");
+      throw new RuntimeException("用户权限不正确");
+    }
+    return HandlerInterceptor.super.preHandle(request, response, handler);
+  }
+}
java
// GraceExceptionHandler.java
+package com.mx.spring_boot_starter.exceptions;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+
+import java.util.Map;
+import java.util.HashMap;
+
+@ControllerAdvice
+public class GraceExceptionHandler {
+  @ExceptionHandler(RuntimeException.class)
+  @ResponseBody
+  public Map<String, Object> handleException(RuntimeException e) {
+    Map<String, Object> map = new HashMap<String, Object>();
+    map.put("status", 500);
+    map.put("msg", e.getMessage());
+    return map;
+  }
+}
+ + + + \ No newline at end of file diff --git "a/cn/back-end/java/SpringBoot/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/back-end/java/SpringBoot/\345\277\253\351\200\237\345\274\200\345\247\213.html" index b4b20f8..1514c81 100644 --- "a/cn/back-end/java/SpringBoot/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/back-end/java/SpringBoot/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

在 vscode 搭建 SpringBoot 开发环境

参考

事先准备

安装插件

在 vscode 插件市场中安装以下插件

  • Extension Pack for Java
  • Spring Boot Extension Pack

创建 spring boot 项目

ctrl+shift+p 打开命令面板,输入 spring boot,选择 java: 创建java项目,创建 java 项目

img

选择 spring boot

img

选择 maven project

img

选择 spring boot 版本

img

选语言

img

输入 group id,这里我用的默认 com.example

img

输入 artifact id,这里我用的默认 demo

img

指定打包类型

img

指定 JDK 版本

img

选需要的依赖

img

随后选择文件夹存放项目,创建成功后 vscode 会提示打开项目

img

测试

src/main/java/com/example/demo/下创建类

img

录入类名

img

写入类代码

java
package com.example.demo.controller;
+    
Skip to content

在 vscode 搭建 SpringBoot 开发环境

参考

事先准备

安装插件

在 vscode 插件市场中安装以下插件

  • Extension Pack for Java
  • Spring Boot Extension Pack

创建 spring boot 项目

ctrl+shift+p 打开命令面板,输入 spring boot,选择 java: 创建java项目,创建 java 项目

img

选择 spring boot

img

选择 maven project

img

选择 spring boot 版本

img

选语言

img

输入 group id,这里我用的默认 com.example

img

输入 artifact id,这里我用的默认 demo

img

指定打包类型

img

指定 JDK 版本

img

选需要的依赖

img

随后选择文件夹存放项目,创建成功后 vscode 会提示打开项目

img

测试

src/main/java/com/example/demo/下创建类

img

录入类名

img

写入类代码

java
package com.example.demo.controller;
 
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -30,8 +30,8 @@
   public String Hello() {
     return "Hellooo";
   }
-}

运行项目

img

控制台提示服务运行在 8080 端口

img

查看运行效果

img

总结

我是个前端开发,平时使用 vscode 多,用 vscode 开发 java,我觉得用得很舒服,不用安装很重的且付费的 IDE。vscode 很轻量化。

- +}

运行项目

img

控制台提示服务运行在 8080 端口

img

查看运行效果

img

总结

我是个前端开发,平时使用 vscode 多,用 vscode 开发 java,我觉得用得很舒服,不用安装很重的且付费的 IDE。vscode 很轻量化。

+ \ No newline at end of file diff --git "a/cn/back-end/java/SpringBoot/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.html" "b/cn/back-end/java/SpringBoot/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.html" index 36d0097..24a10fa 100644 --- "a/cn/back-end/java/SpringBoot/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.html" +++ "b/cn/back-end/java/SpringBoot/\350\207\252\345\256\232\344\271\211\351\205\215\347\275\256\345\222\214\350\241\250\350\276\276\345\274\217.html" @@ -12,22 +12,22 @@ - + -
Skip to content

自定义配置和表达式

在 applacation.properties 中配置新建自定义字段

properties
spring.application.name=spring-boot-starter
+    
Skip to content

自定义配置和表达式

在 applacation.properties 中配置新建自定义字段

properties
spring.application.name=spring-boot-starter
 my.config.a = 123 # 自定义的属性

使用

java
  @Value("${my.config.a}")
   private String a;
 
   @GetMapping("getAppProperties")
   public String getMethodName() {
     return a;
-  }

测试结果

测试结果

- + }

测试结果

测试结果

+ \ No newline at end of file diff --git "a/cn/back-end/java/SpringBoot/\350\256\277\351\227\256MySQL\346\225\260\346\215\256.html" "b/cn/back-end/java/SpringBoot/\350\256\277\351\227\256MySQL\346\225\260\346\215\256.html" new file mode 100644 index 0000000..7b7aabd --- /dev/null +++ "b/cn/back-end/java/SpringBoot/\350\256\277\351\227\256MySQL\346\225\260\346\215\256.html" @@ -0,0 +1,122 @@ + + + + + + 访问 MySQL 数据库 | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

访问 MySQL 数据库

本文介绍如何使用spring-data-spa访问MySQL数据库。 参考

安装依赖

xml
<!-- 数据库连接器,spring boot3.x 以上用 mysql-connector-j -->
+<dependency>
+  <groupId>com.mysql</groupId>
+  <artifactId>mysql-connector-j</artifactId>
+  <scope>runtime</scope>
+</dependency>
+<dependency>
+  <groupId>org.springframework.boot</groupId>
+  <artifactId>spring-boot-starter-data-jpa</artifactId>
+</dependency>

配置数据库

在 application.properties 中配置数据库连接信息。

properties
spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:mysql://localhost:3306/mx
+spring.datasource.username=root
+spring.datasource.password=123456
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.jpa.show-sql: true

新建实体类

插入数据后,Hibernate 会自动将实体转换为表。

java
package com.example.accessingdatamysql;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
+@Entity // Hibernate会自动将实体转换为表。
+public class User {
+	@Id
+	@GeneratedValue(strategy=GenerationType.AUTO)
+	private Integer id;
+
+	private String name;
+
+	private String email;
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+}

新建 Repository

Spring 在具有相同名称的 bean 中自动实现此存储库接口。

java
package com.example.accessingdatamysql;
+
+import org.springframework.data.repository.CrudRepository;
+
+import com.example.accessingdatamysql.User;
+
+// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
+// CRUD refers Create, Read, Update, Delete
+
+public interface UserRepository extends CrudRepository<User, Integer> {
+
+}

新建 Controller

java
package com.example.accessingdatamysql;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(path = "/demo")
+public class MainController {
+	@Autowired // This means to get the bean called userRepository
+	// Which is auto-generated by Spring, we will use it to handle the data
+	private UserRepository userRepository;
+
+	@PostMapping(path = "/add")
+	public String addNewUser(@RequestParam String name, @RequestParam String email) {
+
+		User n = new User();
+		n.setName(name);
+		n.setEmail(email);
+		userRepository.save(n);
+		return "Saved";
+	}
+
+	@GetMapping(path = "/all")
+	public Iterable<User> getAllUsers() {
+		// This returns a JSON or XML with the users
+		return userRepository.findAll();
+	}
+}
+ + + + \ No newline at end of file diff --git "a/cn/back-end/java/stream\357\274\214\346\226\207\344\273\266\345\222\214IO.html" "b/cn/back-end/java/stream\357\274\214\346\226\207\344\273\266\345\222\214IO.html" index c58fe99..19dc581 100644 --- "a/cn/back-end/java/stream\357\274\214\346\226\207\344\273\266\345\222\214IO.html" +++ "b/cn/back-end/java/stream\357\274\214\346\226\207\344\273\266\345\222\214IO.html" @@ -12,14 +12,14 @@ - + -
Skip to content

stream

控制台输入

  1. 使用 scanner
java
import java.util.Scanner;
+    
Skip to content

stream

控制台输入

  1. 使用 scanner
java
import java.util.Scanner;
 
 public class ScannerTest {
   public static void main(String[] args) {
@@ -104,8 +104,8 @@
     }
 
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/vscode\345\274\200\345\217\221java.html" "b/cn/back-end/java/vscode\345\274\200\345\217\221java.html" index ccc37a3..6770a77 100644 --- "a/cn/back-end/java/vscode\345\274\200\345\217\221java.html" +++ "b/cn/back-end/java/vscode\345\274\200\345\217\221java.html" @@ -12,14 +12,14 @@ - + -
Skip to content

vscode 开发 java

熟悉前端的朋友都比较熟悉 vscode,vscode 是一个轻量级的 IDE,可以支持 java 开发。 利用 vscode 的强大功能,Java 开发人员可以获得一个出色的工具,既可以快速编辑代码,又可以进行完整的调试和测试周期。

官方文档 overview

安装插件

打开 vscode 搜索extension pack for java,这个插件是 vscode 开发 java 扩展包的集合,其中包括:

  • Language Support for Java™ by Red Hat
  • Debugger for Java
  • Test Runner for Java
  • Maven for Java
  • Project Manager for Java
  • Visual Studio IntelliCode

在 vscode ctrl+shift+p,搜索:java: extensions guide 可以查看到已经安装的插件。

img

img

安装 jdk

如果系统中未安装 JDK 可以选择用 extension pack for java 插件去安装。在 vscode ctrl+shift+p,搜索:java: install new jdkimg

创建工程

在 vscode ctrl+shift+p,搜索:java: create java project,插件会询问我们选择什么打包工具,这里先选择不使用打包工具。 img

然后插件会让选择一个文件夹,然后会询问我们 java 工程的名字,我们输入my-java-app。随后 vscode 会自动打开这个工程。

img

运行

img

debug

点击 run 旁边的 debug 按钮

img

手动导入 jar 包

mysql-connector-j-8.4.0为例

下载mysql-connector-j-8.4.0.tar.gz

img

解压后将mysql-connector-j-8.4.0.jar 文件复制到工程中的lib目录下,可以看到 JAVA PROJECTS中的Referenced Libraries中多了一个mysql-connector-j-8.4.0.jar,表明导入成功。

img

使用 maven 工具构建项目

先决条件:系统中需有 maven 工具,如果没有,可以参考maven下载安装。下载压缩文件后解压,并添加到系统环境变量中。

查看系统中是否有 maven 工具:mvn -v

img

安装依赖 img

写代码测试:

java
package com.mx;
+    
Skip to content

vscode 开发 java

熟悉前端的朋友都比较熟悉 vscode,vscode 是一个轻量级的 IDE,可以支持 java 开发。 利用 vscode 的强大功能,Java 开发人员可以获得一个出色的工具,既可以快速编辑代码,又可以进行完整的调试和测试周期。

官方文档 overview

安装插件

打开 vscode 搜索extension pack for java,这个插件是 vscode 开发 java 扩展包的集合,其中包括:

  • Language Support for Java™ by Red Hat
  • Debugger for Java
  • Test Runner for Java
  • Maven for Java
  • Project Manager for Java
  • Visual Studio IntelliCode

在 vscode ctrl+shift+p,搜索:java: extensions guide 可以查看到已经安装的插件。

img

img

安装 jdk

如果系统中未安装 JDK 可以选择用 extension pack for java 插件去安装。在 vscode ctrl+shift+p,搜索:java: install new jdkimg

创建工程

在 vscode ctrl+shift+p,搜索:java: create java project,插件会询问我们选择什么打包工具,这里先选择不使用打包工具。 img

然后插件会让选择一个文件夹,然后会询问我们 java 工程的名字,我们输入my-java-app。随后 vscode 会自动打开这个工程。

img

运行

img

debug

点击 run 旁边的 debug 按钮

img

手动导入 jar 包

mysql-connector-j-8.4.0为例

下载mysql-connector-j-8.4.0.tar.gz

img

解压后将mysql-connector-j-8.4.0.jar 文件复制到工程中的lib目录下,可以看到 JAVA PROJECTS中的Referenced Libraries中多了一个mysql-connector-j-8.4.0.jar,表明导入成功。

img

使用 maven 工具构建项目

先决条件:系统中需有 maven 工具,如果没有,可以参考maven下载安装。下载压缩文件后解压,并添加到系统环境变量中。

查看系统中是否有 maven 工具:mvn -v

img

安装依赖 img

写代码测试:

java
package com.mx;
 
 import java.sql.*;
 
@@ -89,8 +89,8 @@
     }
     System.out.println("Goodbye!");
   }
-}

运行:

img

- +}

运行:

img

+ \ No newline at end of file diff --git "a/cn/back-end/java/while\343\200\201for\343\200\201if\345\222\214switch.html" "b/cn/back-end/java/while\343\200\201for\343\200\201if\345\222\214switch.html" index 90b0ee2..76a8696 100644 --- "a/cn/back-end/java/while\343\200\201for\343\200\201if\345\222\214switch.html" +++ "b/cn/back-end/java/while\343\200\201for\343\200\201if\345\222\214switch.html" @@ -12,18 +12,18 @@ - + -
Skip to content

循环、条件和 switch

逻辑与 js 语法大致相同。

循环

Java 提供了增强的 for 循环,用于迭代数组和集合:

java
int[] numbers = {1, 2, 3, 4, 5};
+    
Skip to content

循环、条件和 switch

逻辑与 js 语法大致相同。

循环

Java 提供了增强的 for 循环,用于迭代数组和集合:

java
int[] numbers = {1, 2, 3, 4, 5};
 for (int number : numbers) {
     System.out.println(number);
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/\345\217\230\351\207\217.html" "b/cn/back-end/java/\345\217\230\351\207\217.html" index 401715b..10aafee 100644 --- "a/cn/back-end/java/\345\217\230\351\207\217.html" +++ "b/cn/back-end/java/\345\217\230\351\207\217.html" @@ -12,14 +12,14 @@ - + -
Skip to content

变量

所有的变量在使用前必须先声明。

java
int a, b, c;  // 声明三个变量
+    
Skip to content

变量

所有的变量在使用前必须先声明。

java
int a, b, c;  // 声明三个变量
 int d=3, e=4, f=5; // 声明三个变量并初始化

参数变量

如果参数变量是值传递,传递的是实际参数的副本,而不是变量的地址。当修改副本时,不会影响原来的变量。

如果参数变量是引用传递,传递的是变量的地址,而不是变量的值。当修改变量时,会影响原来的变量。

规则与 js 一致。

局部变量

局部变量的生命周期从声明时开始,到方法、构造方法或代码块执行结束时终止。之后将被垃圾回收。

必须先初始化,java 不会为局部变量分配默认值。

成员变量

对象被实例化后,每个成员变量的值就跟着确定了。

有默认值。

一般情况下把成员变量声明为 private,然后提供 getter 和 setter 方法。

在静态方法以及其他类中,使用完全限定名:ObjectReference.memberName,来访问。

类变量(静态变量)

Java 中的静态变量是指在类中定义的变量,它与类相关而不是与实例相关,即无论创建多少个类实例,静态变量在内存中只有一份拷贝,被所有实例共享。

静态变量在类加载时被创建,在整个程序运行期间都存在。

静态变量的线程安全性【TO DO】

修饰符

参考

访问修饰符

  • pakcage-private (默认) 类、方法或变量仅对同一个包中的其他类可见。包外的类无法访问。
  • public 类、方法或变量对同一个包中的其他类和包外的类都可见。
  • private 类、方法或变量仅对同一个类可见。
  • protected 类、方法或变量对同一个包中的其他类和包外的类都可见,对子类可见。
修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYYN
package-privateYYYNN
privateYNNNN

注意:

  • main 必须是 public
  • private 的成员变量,只能提供 getter 和 setter 方法来访问
  • 接口及接口的成员变量和成员方法不能申明为 protected

非访问修饰符

static

  • 静态变量是类变量,不是实例变量,无论创建多少个实例,静态变量在内存中只有一份拷贝,被所有实例共享。
  • 静态方法只能访问静态变量,不能访问实例变量。

final

  • final 修饰的变量不能被修改,必须显示初始化。
  • final 方法不能被重写。
  • final 类不能被继承。

abstract

  • 抽象类不能被实例化,唯一目的是将来对该类进行扩充。
  • 一个类不能同时被 abstractfinal 修饰。
  • 如果一个类包含抽象方法,则该类必须声明为抽象类。
  • 抽象方法必须被子类重写。
  • 抽象方法不能声明成 finalstatic

synchronized (同步的)

  • 同步方法只能被同一时刻一个线程访问,其他线程等待。

transient (临时的)

在 Java 中,transient 关键字用于修饰那些不希望被序列化的字段。序列化是将对象的状态转换成字节流的过程,以便将对象存储到文件中或者通过网络传输。当一个对象被序列化时,所有的非 transient 字段都会被序列化并存储,而 transient 字段则会被忽略,不会保存它们的值。

使用 transient 的场景

以下是一些常见的使用 transient 关键字的场景:

  1. 敏感数据:例如密码或其他敏感信息,不希望这些信息在序列化过程中被保存下来。
  2. 派生数据:一些字段可以通过其他字段计算得出,不需要保存这些字段的值,只需在反序列化后重新计算即可。
  3. 大数据字段:有些字段包含大量数据,不需要保存这些数据,只需在需要时重新生成这些数据。

示例

下面是一个简单的示例,展示如何使用 transient 关键字:

java
import java.io.*;
 
 class User implements Serializable {
@@ -60,8 +60,8 @@
 }

在这个示例中,User 类包含两个字段:usernamepasswordpassword 字段被标记为 transient,因此它不会被序列化。程序输出反序列化后的 User 对象时,password 字段将是 null

输出结果

sh
javac TransientExample.java
 java transientExample
 # 输出结果
-Deserialized User: Username: john_doe, Password: null

如上所示,password 字段在反序列化后变为了 null,因为它在序列化过程中被忽略了。

volatile

【GPT】 volatile 修饰的成员变量的能力用全局变量也可以实现,有什么区别?

在 Java 中,volatile关键字用于修饰成员变量,以确保线程之间的可见性和有序性。虽然全局变量可以在一定程度上实现线程之间的共享,但volatile和全局变量有着不同的作用和使用场景。以下是一些关键的区别和volatile关键字的作用:

  1. 可见性保证

    • volatile关键字:当一个变量被声明为volatile时,线程对该变量的写操作会立即被刷新到主内存中,且对该变量的读操作会从主内存中读取。这确保了所有线程对这个变量的可见性。
    • 全局变量:全局变量本身并不能确保线程对其修改的可见性。如果一个线程修改了一个全局变量,其他线程不一定能立即看到变化,除非显式地使用同步机制。
  2. 有序性保证

    • volatile关键字volatile还保证了变量的操作不会被指令重排序(instruction reordering)优化打乱。这对某些情况下的正确性至关重要。例如,在双重检查锁定(Double-checked locking)实现单例模式时,volatile可以防止指令重排序带来的线程安全问题。
    • 全局变量:全局变量不能保证操作的有序性。如果需要保证顺序性,仍然需要使用同步机制(如 synchronized关键字或Lock类)。
  3. 使用场景

    • volatile关键字:适用于需要简单标志变量(flag)的场景,如停止线程的标志、状态指示等。这种情况下,使用volatile可以避免复杂的同步机制,降低性能开销。
    • 全局变量:适用于共享数据或状态较多且复杂的场景,这些场景下往往需要更严格的同步控制。全局变量通常与其他同步机制(如锁)结合使用,以确保线程安全。
  4. 性能

    • volatile关键字:相比同步机制,volatile提供了一种轻量级的同步手段,不涉及锁定和上下文切换,性能开销较小。
    • 全局变量:如果需要保证线程安全,全局变量通常需要额外的同步机制,这些机制可能带来较大的性能开销。

总结来说,volatile关键字提供了一种简单、高效的方式来确保线程之间的可见性和有序性,而全局变量本身并不能保证这些特性。如果一个变量在多个线程之间共享,并且需要保证其最新状态对所有线程可见且操作顺序不被打乱,volatile是一个非常合适的选择。

- +Deserialized User: Username: john_doe, Password: null

如上所示,password 字段在反序列化后变为了 null,因为它在序列化过程中被忽略了。

volatile

【GPT】 volatile 修饰的成员变量的能力用全局变量也可以实现,有什么区别?

在 Java 中,volatile关键字用于修饰成员变量,以确保线程之间的可见性和有序性。虽然全局变量可以在一定程度上实现线程之间的共享,但volatile和全局变量有着不同的作用和使用场景。以下是一些关键的区别和volatile关键字的作用:

  1. 可见性保证

    • volatile关键字:当一个变量被声明为volatile时,线程对该变量的写操作会立即被刷新到主内存中,且对该变量的读操作会从主内存中读取。这确保了所有线程对这个变量的可见性。
    • 全局变量:全局变量本身并不能确保线程对其修改的可见性。如果一个线程修改了一个全局变量,其他线程不一定能立即看到变化,除非显式地使用同步机制。
  2. 有序性保证

    • volatile关键字volatile还保证了变量的操作不会被指令重排序(instruction reordering)优化打乱。这对某些情况下的正确性至关重要。例如,在双重检查锁定(Double-checked locking)实现单例模式时,volatile可以防止指令重排序带来的线程安全问题。
    • 全局变量:全局变量不能保证操作的有序性。如果需要保证顺序性,仍然需要使用同步机制(如 synchronized关键字或Lock类)。
  3. 使用场景

    • volatile关键字:适用于需要简单标志变量(flag)的场景,如停止线程的标志、状态指示等。这种情况下,使用volatile可以避免复杂的同步机制,降低性能开销。
    • 全局变量:适用于共享数据或状态较多且复杂的场景,这些场景下往往需要更严格的同步控制。全局变量通常与其他同步机制(如锁)结合使用,以确保线程安全。
  4. 性能

    • volatile关键字:相比同步机制,volatile提供了一种轻量级的同步手段,不涉及锁定和上下文切换,性能开销较小。
    • 全局变量:如果需要保证线程安全,全局变量通常需要额外的同步机制,这些机制可能带来较大的性能开销。

总结来说,volatile关键字提供了一种简单、高效的方式来确保线程之间的可见性和有序性,而全局变量本身并不能保证这些特性。如果一个变量在多个线程之间共享,并且需要保证其最新状态对所有线程可见且操作顺序不被打乱,volatile是一个非常合适的选择。

+ \ No newline at end of file diff --git "a/cn/back-end/java/\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.html" "b/cn/back-end/java/\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.html" index 9caa941..0e62ce4 100644 --- "a/cn/back-end/java/\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.html" +++ "b/cn/back-end/java/\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.html" @@ -12,19 +12,19 @@ - + -
Skip to content

基本数据类型

内置数据类型和引用数据类型。char 赋值用单引号,String 赋值用双引号。

内置数据类型

  1. byte 8 位,有符号。-128 ~ 127。
  2. short 16 位,有符号。-32768 ~ 32767。
  3. int 32 位,有符号。-2147483648 ~ 2147483647。
  4. long 64 位,有符号。-9223372036854775808 ~ 9223372036854775807。默认值:0L。
  5. float 32 位,有符号,单精度。1 符号位,8 位的指数,23 位的精度。默认值:0.0f。
  6. double 64 位,有符号,双精度。1 符号位,11 位的指数,52 位的精度。默认值:0.0d。
  7. char 16 位,无符号,字符。65535。默认值:'\u0000'。
  8. boolean 1 位,布尔值。true 或 false。默认值:false。

引用数据类型

  1. String 字符串。
  2. 数组。
  3. 对象。

常量

常量用大写变量命名,使用 final 修饰。

java
final int MAX_NUM = 100;
+    
Skip to content

基本数据类型

内置数据类型和引用数据类型。char 赋值用单引号,String 赋值用双引号。

内置数据类型

  1. byte 8 位,有符号。-128 ~ 127。
  2. short 16 位,有符号。-32768 ~ 32767。
  3. int 32 位,有符号。-2147483648 ~ 2147483647。
  4. long 64 位,有符号。-9223372036854775808 ~ 9223372036854775807。默认值:0L。
  5. float 32 位,有符号,单精度。1 符号位,8 位的指数,23 位的精度。默认值:0.0f。
  6. double 64 位,有符号,双精度。1 符号位,11 位的指数,52 位的精度。默认值:0.0d。
  7. char 16 位,无符号,字符。65535。默认值:'\u0000'。
  8. boolean 1 位,布尔值。true 或 false。默认值:false。

引用数据类型

  1. String 字符串。
  2. 数组。
  3. 对象。

常量

常量用大写变量命名,使用 final 修饰。

java
final int MAX_NUM = 100;
 final double PI = 3.14;
 
 int octal = 010;  // 八进制 前缀0
-int hexa = 0x10;  // 十六进制 前缀0x

自动类型转换

规则:

  1. 不能对 boolean 类型进行自动类型转换。
  2. 不能把对象转换成不相关的对象。
  3. 把容量大的类型转换成容量小的类型,会丢失精度,且必须使用强制类型转换。
- +int hexa = 0x10; // 十六进制 前缀0x

自动类型转换

规则:

  1. 不能对 boolean 类型进行自动类型转换。
  2. 不能把对象转换成不相关的对象。
  3. 把容量大的类型转换成容量小的类型,会丢失精度,且必须使用强制类型转换。
+ \ No newline at end of file diff --git "a/cn/back-end/java/\345\255\227\347\254\246\344\270\262.html" "b/cn/back-end/java/\345\255\227\347\254\246\344\270\262.html" index bd38d81..a27a4f6 100644 --- "a/cn/back-end/java/\345\255\227\347\254\246\344\270\262.html" +++ "b/cn/back-end/java/\345\255\227\347\254\246\344\270\262.html" @@ -12,15 +12,15 @@ - + -
Skip to content

字符串

参考

在 java 中有三种字符串类,分别是String、StringBuffer、StringBuilder

String 类是 java 中最基本的字符串类,它不可变,即一旦创建,就不能改变。

如:String.concat()方法用于连接两个字符串,他不改变原字符串,而是返回一个新的字符串。

StringBufferStringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer 类是线程安全的,它可变,即我们可以改变它。

StringBuilder 类是非线程安全的,它可变。相对StringbufferStringbuilder类速度更快,但是不能保证线程安全。

- +
Skip to content

字符串

参考

在 java 中有三种字符串类,分别是String、StringBuffer、StringBuilder

String 类是 java 中最基本的字符串类,它不可变,即一旦创建,就不能改变。

如:String.concat()方法用于连接两个字符串,他不改变原字符串,而是返回一个新的字符串。

StringBufferStringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer 类是线程安全的,它可变,即我们可以改变它。

StringBuilder 类是非线程安全的,它可变。相对StringbufferStringbuilder类速度更快,但是不能保证线程安全。

+ \ No newline at end of file diff --git "a/cn/back-end/java/\345\257\271\350\261\241\345\222\214\347\261\273.html" "b/cn/back-end/java/\345\257\271\350\261\241\345\222\214\347\261\273.html" index 17db8e3..2f8d1cf 100644 --- "a/cn/back-end/java/\345\257\271\350\261\241\345\222\214\347\261\273.html" +++ "b/cn/back-end/java/\345\257\271\350\261\241\345\222\214\347\261\273.html" @@ -12,14 +12,14 @@ - + -
Skip to content

对象和类

对象 objects 是类 classes 的实例。

java
public class Dog{
+    
Skip to content

对象和类

对象 objects 是类 classes 的实例。

java
public class Dog{
   int age; // 成员变量
   private static String name;  // 私有静态成员变量,在实例上不可用
 
@@ -53,8 +53,8 @@
     }
 }
sh
java Puppy Tom
 
-小狗的名字是 : Tom

注意:

  • 每个类中都可以有 main 方法,但是只能有一个,main 是程序的入口。
  • 指令运行时带的参数为 args 的值
- +小狗的名字是 : Tom

注意:

  • 每个类中都可以有 main 方法,但是只能有一个,main 是程序的入口。
  • 指令运行时带的参数为 args 的值
+ \ No newline at end of file diff --git "a/cn/back-end/java/\345\274\202\345\270\270\345\244\204\347\220\206.html" "b/cn/back-end/java/\345\274\202\345\270\270\345\244\204\347\220\206.html" index d7f896f..26883ca 100644 --- "a/cn/back-end/java/\345\274\202\345\270\270\345\244\204\347\220\206.html" +++ "b/cn/back-end/java/\345\274\202\345\270\270\345\244\204\347\220\206.html" @@ -12,14 +12,14 @@ - + -
Skip to content

异常处理

异常捕获

java
import java.io.*;
+    
Skip to content

异常处理

异常捕获

java
import java.io.*;
 public class ExcepTest{
 
    public static void main(String args[]){
@@ -81,8 +81,8 @@
   {
     return amount;
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/back-end/java/\345\277\253\351\200\237\345\274\200\345\247\213.html" index cf02a8a..9c92b5f 100644 --- "a/cn/back-end/java/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/back-end/java/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

快速开始

features

  • java 不使用指针而是引用。并提供了自动分配和回收内存空间的机制。

环境配置(windows)

下载java 开发工具包JDK

系统环境变量配置, 在系统变量中添加以下变量:

  1. JAVA_HOME = C:\Program Files\Java\jdk-17 (jdk 安装目录)
  2. CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  3. PATH = %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

验证安装情况

sh
java -version
+    
Skip to content

快速开始

features

  • java 不使用指针而是引用。并提供了自动分配和回收内存空间的机制。

环境配置(windows)

下载java 开发工具包JDK

系统环境变量配置, 在系统变量中添加以下变量:

  1. JAVA_HOME = C:\Program Files\Java\jdk-17 (jdk 安装目录)
  2. CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  3. PATH = %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

验证安装情况

sh
java -version
 
 java 17.0.11 2024-04-16 LTS

第一段 java 程序

单文件运行

java
public class HelloWorld {
    /* 这是第一个Java程序
@@ -47,8 +47,8 @@
   public void speak() {
     System.out.println("wang wang wang");
   }
-}

当 Dog.java 在 animals 目录下时,在 HelloWorld.java 中引入 Dog.java 需写import animals.Dog;,由此可见 import 后的点路径就是引用的类的文件夹的名称。

- +}

当 Dog.java 在 animals 目录下时,在 HelloWorld.java 中引入 Dog.java 需写import animals.Dog;,由此可见 import 后的点路径就是引用的类的文件夹的名称。

+ \ No newline at end of file diff --git "a/cn/back-end/java/\346\212\275\350\261\241\347\261\273.html" "b/cn/back-end/java/\346\212\275\350\261\241\347\261\273.html" index 8f56cc3..8c4e577 100644 --- "a/cn/back-end/java/\346\212\275\350\261\241\347\261\273.html" +++ "b/cn/back-end/java/\346\212\275\350\261\241\347\261\273.html" @@ -12,14 +12,14 @@ - + -
Skip to content

抽象类

子类共同的属性和行为方法放到抽象类(父类),一部分子类具有的行为放到接口中。

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于 Java 不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

网上流传最广泛的例子:门和警报的例子:门都有 open() 和 close() 两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

java
abstract class Door {
+    
Skip to content

抽象类

子类共同的属性和行为方法放到抽象类(父类),一部分子类具有的行为放到接口中。

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于 Java 不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

网上流传最广泛的例子:门和警报的例子:门都有 open() 和 close() 两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

java
abstract class Door {
     public abstract void open();
     public abstract void close();
 }
@@ -48,8 +48,8 @@
     void alarm() {
       //....
     }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/\346\225\260\346\215\256\347\273\223\346\236\204.html" "b/cn/back-end/java/\346\225\260\346\215\256\347\273\223\346\236\204.html" index b3b32f5..7e5ff31 100644 --- "a/cn/back-end/java/\346\225\260\346\215\256\347\273\223\346\236\204.html" +++ "b/cn/back-end/java/\346\225\260\346\215\256\347\273\223\346\236\204.html" @@ -12,14 +12,14 @@ - + -
Skip to content

数据结构

java.util包中提供了很多数据结构的实现。

数组

java
int[] arr = new int[10];

列表 ArrayList 和 LinkedList

ArrayList:

  • 特点: 动态数组,可变大小。
  • 优点: 高效的随机访问和快速尾部插入。
  • 缺点: 中间插入和删除相对较慢。

LinkedList:

  • 特点: 双向链表,元素之间通过指针连接。
  • 优点: 插入和删除元素高效,迭代器性能好。
  • 缺点: 随机访问相对较慢。
java
import java.util.ArrayList;
+    
Skip to content

数据结构

java.util包中提供了很多数据结构的实现。

数组

java
int[] arr = new int[10];

列表 ArrayList 和 LinkedList

ArrayList:

  • 特点: 动态数组,可变大小。
  • 优点: 高效的随机访问和快速尾部插入。
  • 缺点: 中间插入和删除相对较慢。

LinkedList:

  • 特点: 双向链表,元素之间通过指针连接。
  • 优点: 插入和删除元素高效,迭代器性能好。
  • 缺点: 随机访问相对较慢。
java
import java.util.ArrayList;
 
 List<String> arrayList = new ArrayList<>();
 
@@ -50,8 +50,8 @@
 Iterator<String> it = sites.iterator();
 
 // 输出集合中的第一个元素
-System.out.println(it.next());
- +System.out.println(it.next());
+ \ No newline at end of file diff --git "a/cn/back-end/java/\346\225\260\347\273\204.html" "b/cn/back-end/java/\346\225\260\347\273\204.html" index b20d3ba..2c508da 100644 --- "a/cn/back-end/java/\346\225\260\347\273\204.html" +++ "b/cn/back-end/java/\346\225\260\347\273\204.html" @@ -12,14 +12,14 @@ - + -
Skip to content

数组

java 中数组的每个元素类型都是相同的,js 中可以不是。

声明数组变量

java
double[] myList = new double[2];
+    
Skip to content

数组

java 中数组的每个元素类型都是相同的,js 中可以不是。

声明数组变量

java
double[] myList = new double[2];
 myList[0] = 1.9;
 myList[1] = 2.9;
 myList[2] = 3.4;  // 错误,超出了myList数组长度
@@ -69,8 +69,8 @@
     return arr2;
   }
 
-}

多维数组

多维数组,数组的元素也是数组。

java
int[][] arr = new int[2][3];
- +}

多维数组

多维数组,数组的元素也是数组。

java
int[][] arr = new int[2][3];
+ \ No newline at end of file diff --git "a/cn/back-end/java/\346\226\271\346\263\225.html" "b/cn/back-end/java/\346\226\271\346\263\225.html" index abd074a..4ff7b0b 100644 --- "a/cn/back-end/java/\346\226\271\346\263\225.html" +++ "b/cn/back-end/java/\346\226\271\346\263\225.html" @@ -12,14 +12,14 @@ - + -
Skip to content

方法

例子:

java
public static int max(int a, int b) {
+    
Skip to content

方法

例子:

java
public static int max(int a, int b) {
   return a > b ? a : b;
 }
 
@@ -44,8 +44,8 @@
         }
     }
     System.out.println("The max value is " + result);
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/\346\236\232\344\270\276.html" "b/cn/back-end/java/\346\236\232\344\270\276.html" index 3ff9c98..7c70b89 100644 --- "a/cn/back-end/java/\346\236\232\344\270\276.html" +++ "b/cn/back-end/java/\346\236\232\344\270\276.html" @@ -12,14 +12,14 @@ - + -
Skip to content

枚举

java
enum Color {
+    
Skip to content

枚举

java
enum Color {
   RED {
     public String getColor() {// 枚举对象实现抽象方法
       return "红色";
@@ -51,8 +51,8 @@
     // 返回指定字符串值的枚举常量
     System.out.println(Color.valueOf("RED"));
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.html" "b/cn/back-end/java/\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.html" index d747e02..5c61242 100644 --- "a/cn/back-end/java/\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.html" +++ "b/cn/back-end/java/\347\273\247\346\211\277\343\200\201\351\207\215\350\275\275\345\222\214\345\244\232\346\200\201.html" @@ -12,14 +12,14 @@ - + -
Skip to content

继承

继承类 extends 父类
继承接口 implements 父接口

类继承

java
class Animal{
+    
Skip to content

继承

继承类 extends 父类
继承接口 implements 父接口

类继承

java
class Animal{
     public String action = 'move'
     public Animal(String aciton){
       this.action = action;
@@ -112,8 +112,8 @@
         System.out.println("The type of "+d.age+" is "+(dValue instanceof Double ? "double" : (dValue instanceof Integer ? "int" : "")));     // d.age有两个age值,输出取引用名为Dog的double类型值
         System.out.println("The type of "+e.age+" is "+(eValue instanceof Double ? "double" : (eValue instanceof Integer ? "int" : "")));     // c.age只有一个age值,是super所继承的Animal中的age值,再被赋值为3
     }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/java/\350\277\220\347\256\227\347\254\246.html" "b/cn/back-end/java/\350\277\220\347\256\227\347\254\246.html" index 24b561e..d92e099 100644 --- "a/cn/back-end/java/\350\277\220\347\256\227\347\254\246.html" +++ "b/cn/back-end/java/\350\277\220\347\256\227\347\254\246.html" @@ -12,14 +12,14 @@ - + -
Skip to content

运算符

java 运算符普遍运算规则与 js 相同,以下介绍一些他们的区别

  1. 相等运算符

在 js 中是宽松相等。在 java 中,严格相等。

java
public class HelloWorld {
+    
Skip to content

运算符

java 运算符普遍运算规则与 js 相同,以下介绍一些他们的区别

  1. 相等运算符

在 js 中是宽松相等。在 java 中,严格相等。

java
public class HelloWorld {
   public static void main(String[] args) {
     boolean a = 1 == '1';
     System.out.println(a);  // false
@@ -28,7 +28,7 @@
 console.log(a); // true
 
 const b = 1 === '1';
-console.log(b); // false
  1. 类型转换

java 是强类型语言,类型转换必须显式进行。js 是弱类型语言,类型转换是隐式进行的。

java
public class HelloWorld {
+console.log(b); // false
  1. 类型转换

java 是强类型语言,类型转换必须显式进行。js 是弱类型语言,类型转换是隐式进行的。

java
public class HelloWorld {
   public static void main(String[] args) {
     int a = 1;
     String b = "1";
@@ -46,14 +46,14 @@
 console.log(a + Number(b)); // 2
 console.log(a + parseFloat(b)); // 2.0
 console.log(String(a)); // '1'
-console.log(a.toString()); // '1'
  1. 算数运算符
java
public class HelloWorld {
+console.log(a.toString()); // '1'
  1. 算数运算符
java
public class HelloWorld {
   public static void main(String[] args) {
     int a = 5/2;  // 2
     double b = 5/2; // 2.0
   }
 }
js
const a = 5 / 2;
-console.log(a); // 2.5
- +console.log(a); // 2.5
+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/practice/SSE\346\216\245\345\217\243.html" "b/cn/back-end/nestjs/practice/SSE\346\216\245\345\217\243.html" index 594ed66..6e71586 100644 --- "a/cn/back-end/nestjs/practice/SSE\346\216\245\345\217\243.html" +++ "b/cn/back-end/nestjs/practice/SSE\346\216\245\345\217\243.html" @@ -12,14 +12,14 @@ - + -
Skip to content

nestjs 实现 SSE 接口

动机 24-06-07

SSE(Server-Sent Events) 是一种用于在浏览器中从服务器接收实时数据的技术。它允许服务器向客户端发送事件,客户端可以实时接收并处理这些事件。

在很多情况下,SSE 可以比 WebSocket 更适合实时数据传输,因为它不需要客户端主动发起连接,并且可以节省服务器资源。

在很多 AI 对话工具中,SSE 可以用于实时获取模型的预测结果。

nest 代码实现

ts
import { Controller, Get, Param, Res, Sse, Response } from '@nestjs/common';
+    
Skip to content

nestjs 实现 SSE 接口

动机 24-06-07

SSE(Server-Sent Events) 是一种用于在浏览器中从服务器接收实时数据的技术。它允许服务器向客户端发送事件,客户端可以实时接收并处理这些事件。

在很多情况下,SSE 可以比 WebSocket 更适合实时数据传输,因为它不需要客户端主动发起连接,并且可以节省服务器资源。

在很多 AI 对话工具中,SSE 可以用于实时获取模型的预测结果。

nest 代码实现

ts
import { Controller, Get, Param, Res, Sse, Response } from '@nestjs/common';
 import { SseService } from './sse.service';
 import { Observable, interval, map, takeUntil } from 'rxjs';
 
@@ -87,8 +87,8 @@
 };
 sse.onerror = function (e) {
   console.log('error', e);
-};

img

- +};

img

+ \ No newline at end of file diff --git a/cn/back-end/nestjs/practice/intergrate-with-vercel.html b/cn/back-end/nestjs/practice/intergrate-with-vercel.html index 859c85e..3e4d572 100644 --- a/cn/back-end/nestjs/practice/intergrate-with-vercel.html +++ b/cn/back-end/nestjs/practice/intergrate-with-vercel.html @@ -12,14 +12,14 @@ - + -
Skip to content

nestjs 与 vercel 集成

注意,访问 vercel 官网需要科学上网

本文主要介绍以下几个内容:

  • 创建 nestjs 项目,本地跑通
  • 上传 nestjs 项目到 github 仓库
  • 创建 vercel 项目并导入那个仓库
  • 为部署好的 vercel 项目添加国内域名访问

创建 nestjs 项目

shell
$ npm i -g @nestjs/cli
+    
Skip to content

nestjs 与 vercel 集成

注意,访问 vercel 官网需要科学上网

本文主要介绍以下几个内容:

  • 创建 nestjs 项目,本地跑通
  • 上传 nestjs 项目到 github 仓库
  • 创建 vercel 项目并导入那个仓库
  • 为部署好的 vercel 项目添加国内域名访问

创建 nestjs 项目

shell
$ npm i -g @nestjs/cli
 # 不想全局安装 nestjs 脚手架 也可以使用 npx nest new intergrate-with-vercel
 $ nest new intergrate-with-vercel # 根据控制台提示,选择包管理工具安装依赖
 $ cd intergrate-with-vercel
@@ -43,8 +43,8 @@
   ]
 }
shell
$ git add .
 $ git commit -m "chore: add vercel.json"
-$ git push

为什么 github 要改主分支名为【GPT】

img

创建 vercel 项目并导入仓库

img

img

img

看到这个表示部署成功了。

img

访问以下试试 😀

img

img

让国内能访问

先决条件,你需要有自己的域名。我的域名是在阿里买的。

打开刚才那个项目的 vercel 设置,选 Domains

img

添加一个域名

img

添加后会提示配置错误,这是因为还没有在域名提供商那做解析。看图中提示,是要在提供商那里添加一条 CNAME 的记录。

img

img

提供商那里设置好以后,会看到在 vercel 项目设置里域名设置成功。

img

访问一下自己的域名,看到返回 hello world 表示成功。

img

资源

- +$ git push

为什么 github 要改主分支名为【GPT】

img

创建 vercel 项目并导入仓库

img

img

img

看到这个表示部署成功了。

img

访问以下试试 😀

img

img

让国内能访问

先决条件,你需要有自己的域名。我的域名是在阿里买的。

打开刚才那个项目的 vercel 设置,选 Domains

img

添加一个域名

img

添加后会提示配置错误,这是因为还没有在域名提供商那做解析。看图中提示,是要在提供商那里添加一条 CNAME 的记录。

img

img

提供商那里设置好以后,会看到在 vercel 项目设置里域名设置成功。

img

访问一下自己的域名,看到返回 hello world 表示成功。

img

资源

+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\344\270\216MySQL.html" "b/cn/back-end/nestjs/\344\270\216MySQL.html" index 0d87a3f..648c23c 100644 --- "a/cn/back-end/nestjs/\344\270\216MySQL.html" +++ "b/cn/back-end/nestjs/\344\270\216MySQL.html" @@ -12,14 +12,14 @@ - + -
Skip to content

Nest 与数据库无关,将 Nest 连接到数据库只是为数据库加载适当的 Node.js 驱动程序的问题。比如使用@nestjs/typeorm库,将 Nest 与 typeorm 链接,typeorm 与 mysql 数据库链接。

关系链条

nest应用 -- @nestjs/typeorm -- typeorm -- mysql

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (Object Relation Mapping),简称 ORM。

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

使用

ts
// app.module.ts
+    
Skip to content

Nest 与数据库无关,将 Nest 连接到数据库只是为数据库加载适当的 Node.js 驱动程序的问题。比如使用@nestjs/typeorm库,将 Nest 与 typeorm 链接,typeorm 与 mysql 数据库链接。

关系链条

nest应用 -- @nestjs/typeorm -- typeorm -- mysql

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。 TypeORM 是可用于 TypeScript 的最成熟的对象关系映射器 (Object Relation Mapping),简称 ORM。

安装依赖

shell
npm install --save @nestjs/typeorm typeorm mysql2

使用

ts
// app.module.ts
 import { Module } from '@nestjs/common';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { UsersModule } from './users/users.module';
@@ -177,7 +177,7 @@
     const res = await this.usersService.updateOne({ id, name });
     return res;
   }
-}

::: detail /**/*.entity{.ts,.js} 是一种什么形式? /**/\*.entity{.ts,.js} 是一种用于匹配文件路径的模式,通常用于在一些工具和配置中指定文件的匹配规则。这种模式通常被称为 "glob 模式",它允许你使用通配符和特殊字符来匹配文件路径。

具体来说,/**/*.entity{.ts,.js} 可以解释为:

  • /**/: 匹配零个或多个子目录。
  • *.entity: 匹配任何以 .entity 结尾的文件名。
  • {.ts,.js}: 使用花括号表示选择,匹配 .ts.js 扩展名的文件。

因此,这个模式用于匹配所有以 .entity.ts.entity.js 结尾的文件,而这些文件通常是包含实体定义的文件,例如在使用 TypeORM(一个 TypeScript 和 JavaScript 的 ORM 框架)时,用于定义数据库实体的文件。 :::

typeorm 的 synchronize 有什么用? [BY GPT]

typeorm 是一个用于 TypeScript 和 JavaScript 的对象关系映射(ORM)库,用于在应用程序和数据库之间进行数据映射。在 typeorm 中,synchronize 是一个用于自动创建数据库表结构的选项。

当你使用 synchronize 时,typeorm 会检查你的实体类(Entity)的定义,并确保数据库中存在相应的表。如果表不存在,它会尝试创建表。这在开发过程中很方便,因为你不必手动创建数据库表,而是可以依赖 typeorm 自动处理。

但要注意,在生产环境中,最好不要使用 synchronize。这是因为在生产环境中,你可能希望对数据库表的结构进行更严格的控制,并且手动管理数据库迁移(migration)。手动管理迁移可以更好地掌握数据库结构的演变,确保在更新应用程序时不会丢失数据或造成不必要的数据迁移问题。

在开发阶段,你可能会方便地使用 synchronize,但在生产环境中,最好使用数据库迁移工具(如 TypeORM 的迁移工具)来管理数据库的结构变化。这样可以更好地跟踪数据库模式的演进,并在需要时执行有序的数据库升级。

TIP

收到的 id 是 string 类型,为什么在 service 里还是能找到这条?[GPT]

在 TypeScript 中,当你在 Controller 接收 GET 请求参数时,即使你声明id的类型为number,它仍然可以接受传入的字符串,而 TypeORM 的findOneBy方法也可以正常工作。这是因为 TypeORM 的findOneBy方法会自动进行类型转换。

TypeORM 的findOneBy方法会检查传递给它的查询条件,并尝试将其中的属性与实体的列进行类型匹配。如果实体定义中指定了idnumber类型,而你传递了一个字符串,TypeORM 会尝试将字符串转换为数字,以便与数据库中的列进行比较。

这种行为是由 TypeORM 的查询构建器和数据映射机制支持的。在这种情况下,TypeORM 会尽量进行合适的类型转换,以确保查询条件与数据库列的类型匹配。这种自动类型转换可以提高代码的灵活性,但同时也需要注意在边界情况下进行明确的类型转换,以避免潜在的错误。

在这种情况下,即使你的 Controller 接收到的参数是字符串,TypeORM 会尝试将其转换为匹配实体列类型的值。因此,在使用findOneBy时,你通常不需要手动进行类型转换。

TIP

前端 id 传字符串 或者 数字,这个后端是自动转换好,还是要做异常提示?[GPT]

在一些框架和库中,比如 Express 和 NestJS(通过 TypeORM 等库),后端通常会尝试自动进行类型转换,而不会直接导致异常。这种自动类型转换的行为是为了提高开发的灵活性,使得开发者在接收前端请求时不必过于担心传递参数的精确类型。

例如,在 Express 中,路由处理函数可以通过 req.params 获取 URL 中的参数,而这些参数的类型通常是字符串。当你在路由处理函数中使用这些参数时,Express 会尝试自动将其转换为适当的类型。这可能包括将字符串转换为数字、布尔值等,以适应你在路由处理函数中的预期类型。

尽管这样的自动类型转换很方便,但在一些情况下,可能会导致意外的行为。例如,如果你的路由处理函数期望一个数字,但实际传递了一个无法转换为数字的字符串,可能会导致错误。因此,有时在接收参数之前,进行显式的类型验证或转换可能是一个好的实践,以确保参数符合预期。

在 NestJS 中,使用 TypeORM 进行数据库操作时,通常也能够处理这些类型转换。TypeORM 会根据实体定义的类型信息,尝试将接收到的参数转换为相应的类型,从而与数据库中的列进行匹配。但同样,注意确保传递的参数是符合预期的,以避免潜在的错误。

综上所述,虽然许多后端框架会尝试进行自动类型转换,但在关键的地方,特别是需要保证类型准确性的情况下,最好进行显式的类型验证或转换,并在需要时提供适当的异常处理和错误提示。

处理前端传递的参数并进行类型转换的最佳实践是使用 Pipes

通过使用 DTO 和 Pipes,你能够将参数的验证和类型转换与业务逻辑解耦,并确保接收到的参数符合预期的类型。这有助于提高代码的可维护性和可读性。

前端如何通过 GET 方法传对象或数组

推荐使用 query-string

ts
import queryString from 'query-string';
+}

::: detail /**/*.entity{.ts,.js} 是一种什么形式? /**/\*.entity{.ts,.js} 是一种用于匹配文件路径的模式,通常用于在一些工具和配置中指定文件的匹配规则。这种模式通常被称为 "glob 模式",它允许你使用通配符和特殊字符来匹配文件路径。

具体来说,/**/*.entity{.ts,.js} 可以解释为:

  • /**/: 匹配零个或多个子目录。
  • *.entity: 匹配任何以 .entity 结尾的文件名。
  • {.ts,.js}: 使用花括号表示选择,匹配 .ts.js 扩展名的文件。

因此,这个模式用于匹配所有以 .entity.ts.entity.js 结尾的文件,而这些文件通常是包含实体定义的文件,例如在使用 TypeORM(一个 TypeScript 和 JavaScript 的 ORM 框架)时,用于定义数据库实体的文件。 :::

typeorm 的 synchronize 有什么用? [BY GPT]

typeorm 是一个用于 TypeScript 和 JavaScript 的对象关系映射(ORM)库,用于在应用程序和数据库之间进行数据映射。在 typeorm 中,synchronize 是一个用于自动创建数据库表结构的选项。

当你使用 synchronize 时,typeorm 会检查你的实体类(Entity)的定义,并确保数据库中存在相应的表。如果表不存在,它会尝试创建表。这在开发过程中很方便,因为你不必手动创建数据库表,而是可以依赖 typeorm 自动处理。

但要注意,在生产环境中,最好不要使用 synchronize。这是因为在生产环境中,你可能希望对数据库表的结构进行更严格的控制,并且手动管理数据库迁移(migration)。手动管理迁移可以更好地掌握数据库结构的演变,确保在更新应用程序时不会丢失数据或造成不必要的数据迁移问题。

在开发阶段,你可能会方便地使用 synchronize,但在生产环境中,最好使用数据库迁移工具(如 TypeORM 的迁移工具)来管理数据库的结构变化。这样可以更好地跟踪数据库模式的演进,并在需要时执行有序的数据库升级。

TIP

收到的 id 是 string 类型,为什么在 service 里还是能找到这条?[GPT]

在 TypeScript 中,当你在 Controller 接收 GET 请求参数时,即使你声明id的类型为number,它仍然可以接受传入的字符串,而 TypeORM 的findOneBy方法也可以正常工作。这是因为 TypeORM 的findOneBy方法会自动进行类型转换。

TypeORM 的findOneBy方法会检查传递给它的查询条件,并尝试将其中的属性与实体的列进行类型匹配。如果实体定义中指定了idnumber类型,而你传递了一个字符串,TypeORM 会尝试将字符串转换为数字,以便与数据库中的列进行比较。

这种行为是由 TypeORM 的查询构建器和数据映射机制支持的。在这种情况下,TypeORM 会尽量进行合适的类型转换,以确保查询条件与数据库列的类型匹配。这种自动类型转换可以提高代码的灵活性,但同时也需要注意在边界情况下进行明确的类型转换,以避免潜在的错误。

在这种情况下,即使你的 Controller 接收到的参数是字符串,TypeORM 会尝试将其转换为匹配实体列类型的值。因此,在使用findOneBy时,你通常不需要手动进行类型转换。

TIP

前端 id 传字符串 或者 数字,这个后端是自动转换好,还是要做异常提示?[GPT]

在一些框架和库中,比如 Express 和 NestJS(通过 TypeORM 等库),后端通常会尝试自动进行类型转换,而不会直接导致异常。这种自动类型转换的行为是为了提高开发的灵活性,使得开发者在接收前端请求时不必过于担心传递参数的精确类型。

例如,在 Express 中,路由处理函数可以通过 req.params 获取 URL 中的参数,而这些参数的类型通常是字符串。当你在路由处理函数中使用这些参数时,Express 会尝试自动将其转换为适当的类型。这可能包括将字符串转换为数字、布尔值等,以适应你在路由处理函数中的预期类型。

尽管这样的自动类型转换很方便,但在一些情况下,可能会导致意外的行为。例如,如果你的路由处理函数期望一个数字,但实际传递了一个无法转换为数字的字符串,可能会导致错误。因此,有时在接收参数之前,进行显式的类型验证或转换可能是一个好的实践,以确保参数符合预期。

在 NestJS 中,使用 TypeORM 进行数据库操作时,通常也能够处理这些类型转换。TypeORM 会根据实体定义的类型信息,尝试将接收到的参数转换为相应的类型,从而与数据库中的列进行匹配。但同样,注意确保传递的参数是符合预期的,以避免潜在的错误。

综上所述,虽然许多后端框架会尝试进行自动类型转换,但在关键的地方,特别是需要保证类型准确性的情况下,最好进行显式的类型验证或转换,并在需要时提供适当的异常处理和错误提示。

处理前端传递的参数并进行类型转换的最佳实践是使用 Pipes

通过使用 DTO 和 Pipes,你能够将参数的验证和类型转换与业务逻辑解耦,并确保接收到的参数符合预期的类型。这有助于提高代码的可维护性和可读性。

前端如何通过 GET 方法传对象或数组

推荐使用 query-string

ts
import queryString from 'query-string';
 
 const data = {
   key1: 'value1',
@@ -215,7 +215,7 @@
 fetch(url)
   .then((response) => response.json())
   .then((data) => console.log(data))
-  .catch((error) => console.error('Error:', error));

一对多和多对一

假设一个用户有多张图片,这样就是一对多(oneToMany)的场景。那么对于图片表里来说,就是多张图片对应一个用户(manyToOne)。

现在需要【通过用户 id 查询用户和用户对应的图片集】

  1. 新建 photo.entity
  2. 改造user.entity
  3. 如果未使用 glob模式 则需在app.module.tsentities中填入photo.entity
  4. 改造user.service中的方法
ts
// photo.entity.ts ,且把他放在user文件夹中
+  .catch((error) => console.error('Error:', error));

一对多和多对一

假设一个用户有多张图片,这样就是一对多(oneToMany)的场景。那么对于图片表里来说,就是多张图片对应一个用户(manyToOne)。

现在需要【通过用户 id 查询用户和用户对应的图片集】

  1. 新建 photo.entity
  2. 改造user.entity
  3. 如果未使用 glob模式 则需在app.module.tsentities中填入photo.entity
  4. 改造user.service中的方法
ts
// photo.entity.ts ,且把他放在user文件夹中
 import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
 import { User } from './user.entity';
 
@@ -282,7 +282,7 @@
     });
     return res;
   }
-}

然后请求http://localhost:3000/user/{用户id}

更多用法,参照链接

设置订阅者 subscriber

使用 TypeORM subscribers,你可以监听特定的实体事件。

步骤

  1. 新建user.subscriber.ts文件
  2. user.module中添加 UserSubscriber provider
  3. 测试
ts
// user.subscriber.ts
+}

然后请求http://localhost:3000/user/{用户id}

更多用法,参照链接

设置订阅者 subscriber

使用 TypeORM subscribers,你可以监听特定的实体事件。

步骤

  1. 新建user.subscriber.ts文件
  2. user.module中添加 UserSubscriber provider
  3. 测试
ts
// user.subscriber.ts
 import {
   DataSource,
   EntitySubscriberInterface,
@@ -324,8 +324,8 @@
   controllers: [UserController],
   providers: [UserService, UserSubscriber], 
 })
-export class UserModule {}

使用 REST Client 插件,测试结果如图。

image

- +export class UserModule {}

使用 REST Client 插件,测试结果如图。

image

+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\344\270\255\351\227\264\344\273\266.html" "b/cn/back-end/nestjs/\344\270\255\351\227\264\344\273\266.html" index 9747a41..89cc1c6 100644 --- "a/cn/back-end/nestjs/\344\270\255\351\227\264\344\273\266.html" +++ "b/cn/back-end/nestjs/\344\270\255\351\227\264\344\273\266.html" @@ -12,14 +12,14 @@ - + -
Skip to content

创建中间件

ts
import { Injectable, NestMiddleware } from '@nestjs/common';
+    
Skip to content

创建中间件

ts
import { Injectable, NestMiddleware } from '@nestjs/common';
 import { Request, Response, NextFunction } from 'express';
 
 @Injectable()
@@ -38,8 +38,8 @@
   configure(consumer: MiddlewareConsumer) {
     consumer.apply(LoggerMiddleware).forRoutes('cats');
   }
-}

forRoutes函数参数支持:

  • 一个或多个路由字符串 forRoutes('cats')
  • 一个或多个路由字符串和请求方法,即 RouteInfo 对象 forRoutes({ path: 'cats', method: RequestMethod.GET });
  • 一个或多个路由字符串通配符和请求方法 forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });
  • 一个或多个控制器 forRoutes(CatsController,DogsController, FooController);

功能中间件

每当你的中间件不需要任何依赖时,请考虑使用更简单的 功能中间件 替代方案。

其他参考

排除路由
多个中间件
全局中间件 仅能使用功能中间件

- +}

forRoutes函数参数支持:

  • 一个或多个路由字符串 forRoutes('cats')
  • 一个或多个路由字符串和请求方法,即 RouteInfo 对象 forRoutes({ path: 'cats', method: RequestMethod.GET });
  • 一个或多个路由字符串通配符和请求方法 forRoutes({ path: 'ab*cd', method: RequestMethod.ALL });
  • 一个或多个控制器 forRoutes(CatsController,DogsController, FooController);

功能中间件

每当你的中间件不需要任何依赖时,请考虑使用更简单的 功能中间件 替代方案。

其他参考

排除路由
多个中间件
全局中间件 仅能使用功能中间件

+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\345\256\210\345\215\253.html" "b/cn/back-end/nestjs/\345\256\210\345\215\253.html" index b56192b..5b986c2 100644 --- "a/cn/back-end/nestjs/\345\256\210\345\215\253.html" +++ "b/cn/back-end/nestjs/\345\256\210\345\215\253.html" @@ -12,14 +12,14 @@ - + -
Skip to content

守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。

守卫有一个 单一职责。 它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否将由路由处理程序处理。 这通常称为 authorization。

授权守卫

ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
+    
Skip to content

守卫是一个用 @Injectable() 装饰器注释的类,它实现了 CanActivate 接口。

守卫有一个 单一职责。 它们根据运行时存在的某些条件(如权限、角色、ACL 等)确定给定请求是否将由路由处理程序处理。 这通常称为 authorization。

授权守卫

ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
 import { Observable } from 'rxjs';
 
 @Injectable()
@@ -60,7 +60,7 @@
     },
   ],
 })
-export class AppModule {}

注意

依赖注入方面,从任何模块外部注册的全局守卫(如上例中的 useGlobalGuards())不能注入依赖,因为这是在任何模块的上下文之外完成的。

为每个处理程序设置角色

ts
// roles.decorator.ts;
+export class AppModule {}

注意

依赖注入方面,从任何模块外部注册的全局守卫(如上例中的 useGlobalGuards())不能注入依赖,因为这是在任何模块的上下文之外完成的。

为每个处理程序设置角色

ts
// roles.decorator.ts;
 import { SetMetadata } from '@nestjs/common';
 
 export const Roles = (...roles: string[]) => SetMetadata('roles', roles);
ts
// cats.controller.ts
@@ -91,8 +91,8 @@
     const user = request.user;
     return matchRoles(roles, user.roles);
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.html" "b/cn/back-end/nestjs/\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.html" index d5633a4..e47c3de 100644 --- "a/cn/back-end/nestjs/\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.html" +++ "b/cn/back-end/nestjs/\345\274\202\345\270\270\350\277\207\346\273\244\345\231\250.html" @@ -12,20 +12,20 @@ - + -
Skip to content

抛出标准异常

ts
@Get()
+    
Skip to content

抛出标准异常

ts
@Get()
 async findAll() {
   throw new HttpException('Forbidden', HttpStatus.FORBIDDEN); 
 }

返回

json
{
   "statusCode": 403,
   "message": "Forbidden"
-}

HttpException 接收两个必需参数:

  • response JSON 响应主体
  • status HTTP 状态码,要使用 HttpStatus 枚举

要仅覆盖 JSON 响应正文的消息部分,请在 response 参数中提供一个字符串。 要覆盖整个 JSON 响应主体,请在 response 参数中传递一个对象。

异常过滤器的创建和绑定

有时你可能希望根据某些动态因素添加日志记录或使用不同的 JSON 模式,可以使用异常过滤器

新建 http-exception.filter.ts

ts
// http-exception.filter.ts
+}

HttpException 接收两个必需参数:

  • response JSON 响应主体
  • status HTTP 状态码,要使用 HttpStatus 枚举

要仅覆盖 JSON 响应正文的消息部分,请在 response 参数中提供一个字符串。 要覆盖整个 JSON 响应主体,请在 response 参数中传递一个对象。

异常过滤器的创建和绑定

有时你可能希望根据某些动态因素添加日志记录或使用不同的 JSON 模式,可以使用异常过滤器

新建 http-exception.filter.ts

ts
// http-exception.filter.ts
 import {
   ExceptionFilter,
   Catch,
@@ -83,8 +83,8 @@
     },
   ],
 })
-export class AppModule {}

其他参考

捕获一切

继承

- +export class AppModule {}

其他参考

捕获一切

继承

+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/back-end/nestjs/\345\277\253\351\200\237\345\274\200\345\247\213.html" index eecbe74..3f7321b 100644 --- "a/cn/back-end/nestjs/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/back-end/nestjs/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

快速开始

介绍

参考

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。 它使用渐进式 JavaScript,构建并完全支持 TypeScript(但仍然允许开发者使用纯 JavaScript 进行编码)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。

在幕后,Nest 使用强大的 HTTP 服务器框架,如 Express(默认),也可以选择配置为使用 Fastify!

Nest 在这些常见的 Node.js 框架(Express/Fastify)之上提供了一个抽象级别,但也直接向开发者公开了它们的 API。 这使开发者可以自由使用可用于底层平台的无数第三方模块。

创建项目

  1. npx nest new nest-starter
  2. 全局安装 cli,目前 cli 版本 10.1.11 2023 年 8 月 12 日
sh
npm install -g @nestjs/cli
+    
Skip to content

快速开始

介绍

参考

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架。 它使用渐进式 JavaScript,构建并完全支持 TypeScript(但仍然允许开发者使用纯 JavaScript 进行编码)并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。

在幕后,Nest 使用强大的 HTTP 服务器框架,如 Express(默认),也可以选择配置为使用 Fastify!

Nest 在这些常见的 Node.js 框架(Express/Fastify)之上提供了一个抽象级别,但也直接向开发者公开了它们的 API。 这使开发者可以自由使用可用于底层平台的无数第三方模块。

创建项目

  1. npx nest new nest-starter
  2. 全局安装 cli,目前 cli 版本 10.1.11 2023 年 8 月 12 日
sh
npm install -g @nestjs/cli
 nest new nest-starter

生成样板文件,创建 src 目录,并在其中添加了几个核心文件。

sh
app.controller.ts	# 具有单一路由的基本控制器。
 app.controller.spec.ts	# 控制器的单元测试。
 app.module.ts	# 应用的根模块。
@@ -30,8 +30,8 @@
 
 # 生成一个代码模块
 # 以下命令生成 cats 文件夹,在创建的过程,控制台引导选择是否创建CURD
-nest g resource cats
- +nest g resource cats
+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\346\213\246\346\210\252\345\231\250.html" "b/cn/back-end/nestjs/\346\213\246\346\210\252\345\231\250.html" index 6adc16d..8c6e320 100644 --- "a/cn/back-end/nestjs/\346\213\246\346\210\252\345\231\250.html" +++ "b/cn/back-end/nestjs/\346\213\246\346\210\252\345\231\250.html" @@ -12,14 +12,14 @@ - + -
Skip to content

拦截器是用 @Injectable() 装饰器注释并实现 NestInterceptor 接口的类。

使用场景

  • 在方法执行之前/之后绑定额外的逻辑
  • 转换函数返回的结果
  • 转换函数抛出的异常
  • 扩展基本功能行为
  • 根据特定条件完全覆盖函数(例如,出于缓存目的)

切面拦截

ts
// logging.interceptor.ts
+    
Skip to content

拦截器是用 @Injectable() 装饰器注释并实现 NestInterceptor 接口的类。

使用场景

  • 在方法执行之前/之后绑定额外的逻辑
  • 转换函数返回的结果
  • 转换函数抛出的异常
  • 扩展基本功能行为
  • 根据特定条件完全覆盖函数(例如,出于缓存目的)

切面拦截

ts
// logging.interceptor.ts
 
 import { tap } from 'rxjs/operators';
 import {
@@ -93,8 +93,8 @@
       catchError((err) => throwError(() => new BadGatewayException()))
     );
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\346\216\247\345\210\266\345\231\250.html" "b/cn/back-end/nestjs/\346\216\247\345\210\266\345\231\250.html" index 5b5de02..e0b722f 100644 --- "a/cn/back-end/nestjs/\346\216\247\345\210\266\345\231\250.html" +++ "b/cn/back-end/nestjs/\346\216\247\345\210\266\345\231\250.html" @@ -12,14 +12,14 @@ - + -
Skip to content

控制器文件

cats.controller.ts,使用 nestjs 提供的装饰器来处理请求和响应

WARNING

代码中有 使用 nestjs 提供的装饰器来处理请求和响应使用Express 请求和响应对象的比较

ts
import {
+    
Skip to content

控制器文件

cats.controller.ts,使用 nestjs 提供的装饰器来处理请求和响应

WARNING

代码中有 使用 nestjs 提供的装饰器来处理请求和响应使用Express 请求和响应对象的比较

ts
import {
   Controller,
   Get,
   Post,
@@ -153,8 +153,8 @@
       age: 12,
     },
   })
-  .then(console.log);

其他相关参考

重定向
子域路由
请求负载 DTO

- + .then(console.log);

其他相关参考

重定向
子域路由
请求负载 DTO

+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\347\256\241\351\201\223.html" "b/cn/back-end/nestjs/\347\256\241\351\201\223.html" index 2ebef53..fbd5ca0 100644 --- "a/cn/back-end/nestjs/\347\256\241\351\201\223.html" +++ "b/cn/back-end/nestjs/\347\256\241\351\201\223.html" @@ -12,14 +12,14 @@ - + -
Skip to content

管道是用 @Injectable() 装饰器注释的类,它实现了 PipeTransform 接口。

使用场景

  • transformation: 将输入数据转换为所需的形式(例如,从字符串到整数)
  • validation: 评估输入数据,如果有效,只需将其原样传递; 否则抛出异常

绑定管道

内置管道 ParseIntPipe 例子

ts
import { ParseIntPipe } from "@nest/common"
+    
Skip to content

管道是用 @Injectable() 装饰器注释的类,它实现了 PipeTransform 接口。

使用场景

  • transformation: 将输入数据转换为所需的形式(例如,从字符串到整数)
  • validation: 评估输入数据,如果有效,只需将其原样传递; 否则抛出异常

绑定管道

内置管道 ParseIntPipe 例子

ts
import { ParseIntPipe } from "@nest/common"
 
 @Get(':id')
 async findOne(@Param('id', ParseIntPipe) id: number) {  
@@ -28,7 +28,7 @@
   "statusCode": 400,
   "message": "Validation failed (numeric string is expected)",
   "error": "Bad Request"
-}

对象模式验证

构建一个使用基于 Zod 的模式的验证管道。

安装 zod npm install --save zod

ts
// zod-validation.pip.ts
+}

对象模式验证

构建一个使用基于 Zod 的模式的验证管道。

安装 zod npm install --save zod

ts
// zod-validation.pip.ts
 import {
   PipeTransform,
   ArgumentMetadata,
@@ -64,7 +64,7 @@
 @UsePipes(new ZodValidationPipe(createCatSchema))
 create(@Body() createCatDto: CreateCatDto) {
   return this.catsService.create(createCatDto);
-}

使用 postman 测试

image

类验证器

验证技术的替代实现

安装 pnpm add class-validator class-transformer

ts
// class-validation.dto.ts
+}

使用 postman 测试

image

类验证器

验证技术的替代实现

安装 pnpm add class-validator class-transformer

ts
// class-validation.dto.ts
 import {
   PipeTransform,
   Injectable,
@@ -153,8 +153,8 @@
 const userSchema = z.object({
   username: z.string().min(3).max(30),
   password: z.string().min(6),
-});

联系:

  • 所有这三个库都专注于在运行时执行验证,确保数据的一致性和有效性。
  • 它们都支持异步验证。
  • Joi 和 Zod 在浏览器环境中也可以使用,而 Class-validator 主要针对服务器端开发。

区别:

  • Joi 是链式 API 风格,适用于 JavaScript 和 Node.js,而 Class-validator 和 Zod 是 TypeScript 优先的,支持使用装饰器或声明式语法。
  • Class-validator 更侧重于使用装饰器和类进行验证,而 Joi 和 Zod 更灵活,可以直接操作 schema 或对象。
  • Zod 更强调声明式的验证,使用类似于 TypeScript 的语法来定义 schema,而 Joi 和 Class-validator 更具有过程式的 API。

选择使用哪个库通常取决于您的项目需求、团队的技术栈和个人偏好。

其他参考

转换用例

定制管道

提供默认值

- +});

联系:

  • 所有这三个库都专注于在运行时执行验证,确保数据的一致性和有效性。
  • 它们都支持异步验证。
  • Joi 和 Zod 在浏览器环境中也可以使用,而 Class-validator 主要针对服务器端开发。

区别:

  • Joi 是链式 API 风格,适用于 JavaScript 和 Node.js,而 Class-validator 和 Zod 是 TypeScript 优先的,支持使用装饰器或声明式语法。
  • Class-validator 更侧重于使用装饰器和类进行验证,而 Joi 和 Zod 更灵活,可以直接操作 schema 或对象。
  • Zod 更强调声明式的验证,使用类似于 TypeScript 的语法来定义 schema,而 Joi 和 Class-validator 更具有过程式的 API。

选择使用哪个库通常取决于您的项目需求、团队的技术栈和个人偏好。

其他参考

转换用例

定制管道

提供默认值

+ \ No newline at end of file diff --git "a/cn/back-end/nestjs/\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.html" "b/cn/back-end/nestjs/\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.html" index 77cc126..7b13c85 100644 --- "a/cn/back-end/nestjs/\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.html" +++ "b/cn/back-end/nestjs/\350\207\252\345\256\232\344\271\211\350\243\205\351\245\260\345\231\250.html" @@ -12,14 +12,14 @@ - + -
Skip to content

在 node.js 世界中,将属性附加到 request 对象是常见的做法。 然后在每个路由处理程序中手动提取它们,使用如下代码:

ts
const user = req.user;

为了使你的代码更具可读性和透明性,你可以创建一个 @User() 装饰器并在所有控制器中重复使用它。

ts
// user.decorator.ts
+    
Skip to content

在 node.js 世界中,将属性附加到 request 对象是常见的做法。 然后在每个路由处理程序中手动提取它们,使用如下代码:

ts
const user = req.user;

为了使你的代码更具可读性和透明性,你可以创建一个 @User() 装饰器并在所有控制器中重复使用它。

ts
// user.decorator.ts
 import { createParamDecorator, ExecutionContext } from '@nestjs/common';
 
 export const User = createParamDecorator(
@@ -33,8 +33,8 @@
   async findOne(@User() user: UserEntity) {
     console.log(user);
   }
-}
- +}
+ \ No newline at end of file diff --git "a/cn/back-end/python/\345\217\230\351\207\217.html" "b/cn/back-end/python/\345\217\230\351\207\217.html" index 36afb13..0659e70 100644 --- "a/cn/back-end/python/\345\217\230\351\207\217.html" +++ "b/cn/back-end/python/\345\217\230\351\207\217.html" @@ -12,14 +12,14 @@ - + -
Skip to content

变量

Python 中的变量赋值不需要类型声明。

标准数据类型

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

多变量赋值

py
a = b = c = 1
+    
Skip to content

变量

Python 中的变量赋值不需要类型声明。

标准数据类型

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

多变量赋值

py
a = b = c = 1
 a, b, c = 1, 2, "john"

删除一些对象的引用

py
var1 = 1
 var2 = 2
 
@@ -57,8 +57,8 @@
 print dict[2]              # 输出键为 2 的值
 print tinydict             # 输出完整的字典
 print tinydict.keys()      # 输出所有键
-print tinydict.values()    # 输出所有值
- +print tinydict.values() # 输出所有值
+ \ No newline at end of file diff --git "a/cn/back-end/python/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/back-end/python/\345\277\253\351\200\237\345\274\200\345\247\213.html" index da4607e..74d8341 100644 --- "a/cn/back-end/python/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/back-end/python/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

快速开始

安装

官网下载安装

windows 安装 v3.12.2 成功后测试

py-1

开发相关

  • 开发工具 vscode
  • 格式化插件 yapf 参考

NOTE THAT

python 遵循严格的缩进格式,每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用

多行语句

py
total = item_one + \
+    
Skip to content

快速开始

安装

官网下载安装

windows 安装 v3.12.2 成功后测试

py-1

开发相关

  • 开发工具 vscode
  • 格式化插件 yapf 参考

NOTE THAT

python 遵循严格的缩进格式,每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用

多行语句

py
total = item_one + \
         item_two + \
         item_three
 
@@ -41,8 +41,8 @@
 这是多行注释,使用双引号。
 这是多行注释,使用双引号。
 这是多行注释,使用双引号。
-"""
- +"""
+ \ No newline at end of file diff --git a/cn/embedded-system/esp8266/control.html b/cn/embedded-system/esp8266/control.html index 8eabcf6..5a18d0e 100644 --- a/cn/embedded-system/esp8266/control.html +++ b/cn/embedded-system/esp8266/control.html @@ -13,15 +13,15 @@ - + -
Skip to content

ESP8266 内置灯控制

- +
Skip to content

ESP8266 内置灯控制

+ \ No newline at end of file diff --git a/cn/embedded-system/esp8266/mqtt-client.html b/cn/embedded-system/esp8266/mqtt-client.html index ab8697b..d679ebd 100644 --- a/cn/embedded-system/esp8266/mqtt-client.html +++ b/cn/embedded-system/esp8266/mqtt-client.html @@ -13,15 +13,15 @@ - + - - +
Skip to content
+ \ No newline at end of file diff --git "a/cn/embedded-system/esp8266/\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.html" "b/cn/embedded-system/esp8266/\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.html" index bde3059..0153141 100644 --- "a/cn/embedded-system/esp8266/\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.html" +++ "b/cn/embedded-system/esp8266/\344\275\277\347\224\250PlatformIO\351\200\232\350\277\207\347\275\221\347\273\234\346\216\247\345\210\266LED.html" @@ -12,14 +12,14 @@ - + -
Skip to content

通过 HTTP POST 请求控制 MCU 上的内置 LED 灯

这篇文章同时发表在我的博客

usb 转 串口 ch340h官方驱动下载地址

本文将介绍

  • platform io 的简单使用
  • esp8266 使能一个 GPIO 为输出状态
  • esp8266 的串口输出
  • esp8266 的无线网连接
  • eps8266 的 web service
  • 一款好用的 rest client 插件

新建项目

image.png
现在平台是 NodeMCU 1.0,选择一个自己的目录存储项目。
image.png
需要等一段时间,在这个期间,
image.png
用 VSCODE 打开这个目录。
image.png
看到工程目录如下
image.png
其中 main.cpp是程序的入口文件,lib文件夹存放库文件。platformio.iniplatformio的配置文件。

编写代码

控制 LED 灯的程序:

cpp
#include <Arduino.h>
+    
Skip to content

通过 HTTP POST 请求控制 MCU 上的内置 LED 灯

这篇文章同时发表在我的博客

usb 转 串口 ch340h官方驱动下载地址

本文将介绍

  • platform io 的简单使用
  • esp8266 使能一个 GPIO 为输出状态
  • esp8266 的串口输出
  • esp8266 的无线网连接
  • eps8266 的 web service
  • 一款好用的 rest client 插件

新建项目

image.png
现在平台是 NodeMCU 1.0,选择一个自己的目录存储项目。
image.png
需要等一段时间,在这个期间,
image.png
用 VSCODE 打开这个目录。
image.png
看到工程目录如下
image.png
其中 main.cpp是程序的入口文件,lib文件夹存放库文件。platformio.iniplatformio的配置文件。

编写代码

控制 LED 灯的程序:

cpp
#include <Arduino.h>
 #include <ESP8266WebServer.h> //  ESP8266WebServer库
 #include <ESP8266WiFi.h>
 
@@ -96,8 +96,8 @@
                             // 请求,根据响应头,浏览器判断服务端是否允许跨域。
   server.on("/led", HTTP_POST,
             handleLED); // 设置处理LED控制请求的函数'handleLED'
-}

装好驱动后,可以在 vscode 中选择开发板对应的驱动。
image.png

上传程序

点击向右这个箭头上传程序。
image.png
控制台看到这个提示表示成功。
image.png

测试

这里推荐使用REST Clientvscode 插件 来测试 HTTP 接口。
image.png

测试效果
test9.gif

- +}

装好驱动后,可以在 vscode 中选择开发板对应的驱动。
image.png

上传程序

点击向右这个箭头上传程序。
image.png
控制台看到这个提示表示成功。
image.png

测试

这里推荐使用REST Clientvscode 插件 来测试 HTTP 接口。
image.png

测试效果
test9.gif

+ \ No newline at end of file diff --git a/cn/engineering/index.html b/cn/engineering/index.html index 0b179e0..55f0067 100644 --- a/cn/engineering/index.html +++ b/cn/engineering/index.html @@ -12,15 +12,15 @@ - + -
Skip to content

comming soon

- +
Skip to content

comming soon

+ \ No newline at end of file diff --git a/cn/front-end/base/group-build/rank.html b/cn/front-end/base/group-build/rank.html new file mode 100644 index 0000000..7108aef --- /dev/null +++ b/cn/front-end/base/group-build/rank.html @@ -0,0 +1,26 @@ + + + + + + 前端职级与招聘 | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

前端职级与招聘

Base 太原

V1 Pre-Junior 入门V2 Junior 初级V3 Intermidiate 中级V4 Advanced 高级V5 Tech Lead 技术负责V6 Tech Expert 技术专家
薪资范围[ 3 , 4 ] k( 4 , 6 ] k( 6 , 9 ] k( 9 , 12 ] k( 12 , 15 ] k( 15 , 18 ] k

如何提升

古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。 ―― 陆游《冬夜读书示子聿》

image.png

然后「多复盘多总结」

招聘

简历初筛

加分项:

  • 【前端基础】对底层技术原理有一定(可不深入)理解的
  • 【技术选型】使用三方库,但能有自己的见解,能区分三方库的使用场景和引入项目的利弊
  • 【逻辑思维】能描述清楚自己所做过的业务流程,包括但不限于,模型的抽象,状态的流转等?
  • 【自省好学】善于总结项目经验,并能记录下自己所学所思之人(有技术博客,Github 有大量研究性项目)

减分项:

  • 满篇流水账,如
    • 做了 xxx 项目
    • 实现了 xxx 功能
    • 使用了 xxx(框架/类库等技术名词)
  • 培训班(自学都做不到,迟早会掉队)
  • 前端架构师(前端是整个系统的触手,不存在单独「架构」)

初步沟通

当简历无法清楚判断的使用,可辅助以下问题:

  1. 概述最近一个前端项目整体架构的设计,如模块的划分,技术的选型等,并说明原因(比如三方库引入的目的和结果)。
  2. 选取其中一个业务模块,简述数据结构的设计和状态的流转,及组件的拆分与实现。
  3. 团队的技术栈 ,简单说说自己的理解(可选)

问题 1,2 是为了解应聘者

  • 是否能清楚表述自己做过的事
  • 是否能「带着脑子写代码

问题 3 是为了解应聘者

  • 是否对新技术排斥,能否拥抱变化
  • 能否举一反三

面试

通过上面的流程,其实基本能确定应聘者是否能融入这个团队。 面试时,只需要围绕上面提到的关注点,简单抽查即可:

  • 关于项目的
    • 选一个模块,看看表达是否清晰
  • 技术相关
    • 开源库使用者,问问对应库的基本理念/原理
    • 有一定基础的,问问底层细节,如 DOM,HTTP 等
+ + + + \ No newline at end of file diff --git "a/cn/front-end/base/group-build/\344\271\246\345\206\231\350\247\204\350\214\203.html" "b/cn/front-end/base/group-build/\344\271\246\345\206\231\350\247\204\350\214\203.html" new file mode 100644 index 0000000..3c3f0b8 --- /dev/null +++ "b/cn/front-end/base/group-build/\344\271\246\345\206\231\350\247\204\350\214\203.html" @@ -0,0 +1,41 @@ + + + + + + JavaScript 代码书写规范(from ChatGPT) | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

JavaScript 代码书写规范(from ChatGPT)

JavaScript 代码规范指的是一套关于如何编写、组织和格式化 JavaScript 代码的一致性规则和指南。这些规范旨在提高代码的可读性、可维护性,并降低团队协作时的摩擦。以下是一些遵循 JavaScript 代码规范的重要意义:

  1. 可读性和可维护性:规范化的代码更容易阅读和理解,使开发者能够快速找到他们需要的信息。这也使得在以后维护和修改代码变得更为容易。

  2. 减少错误和漏洞:一致的代码风格可以降低由于书写错误或者混乱的代码结构导致的错误的可能性。同时,规范也可以提供一些避免常见编码错误的建议。

  3. 团队合作:在团队中使用统一的代码规范可以减少开发者之间的歧义和摩擦。每个人都知道在哪里可以找到特定功能或模块的代码,也知道如何与之交互。

  4. 版本控制:规范的代码更容易与版本控制系统(如 Git)结合使用。在代码合并和比较时,格式一致的代码可以减少合并冲突的可能性。

  5. 提高代码质量:规范可以强制执行最佳实践,使得代码更为健壮、高效和可靠。

  6. 可扩展性:符合规范的代码更容易进行扩展,因为开发者可以更容易地理解和修改代码。

  7. 代码审查:在进行代码审查时,规范化的代码可以让审查过程更为高效。审查人员可以更专注于逻辑和功能,而不必担心代码的格式和风格。

总的来说,JavaScript 代码规范的主要目的是提升代码的质量、可维护性和可读性,从而为团队合作和软件项目的长期维护奠定坚实的基础。

变量名

变量名推荐使用驼峰法来命名(camelCase):

js
const firstName = 'John'
+const lastName = 'Doe'
+const price = 19.9
+let tax = 0.2
+
+let fullPrice = price + price * tax

空格与运算符

通常运算符 ( = + - * / ) 前后需要添加空格:

js
var x = y + z
+var values = ['Volvo', 'Saab', 'Fiat']

代码缩进

通常使用 2 个空格符号来缩进代码块:

js
function toCelsius(fahrenheit) {
+  return (5 / 9) * (fahrenheit - 32)
+}

语句规则

通常可使用prettier插件来自动格式化

一条语句不要以分号作为结束符。

将左花括号放在第一行的结尾。
左花括号前添加一空格。
将右花括号独立放在一行。
不要以分号结束一个复杂的声明。
字符串使用单引号。
对象最后一条数据后加逗号。 每行代码字符小于 80。

js
var values = ['Volvo', 'Saab', 'Fiat']
+
+var person = {
+  firstName: 'John',
+  lastName: 'Doe',
+  age: 50,
+  eyeColor: 'blue',
+}

命名规则

  • 变量和函数为小驼峰法标识, 即除第一个单词之外,其他单词首字母大写( lowerCamelCase)
  • 全局变量为大写 (UPPERCASE )
  • 常量 (如 PI) 为大写 (UPPERCASE )

文件命名

  • 一般文件以烤串命名(kebab case)
  • Vue 组件以大写驼峰命名
+ + + + \ No newline at end of file diff --git a/cn/front-end/base/js-docs/index.html b/cn/front-end/base/js-docs/index.html index 4608bac..c20b780 100644 --- a/cn/front-end/base/js-docs/index.html +++ b/cn/front-end/base/js-docs/index.html @@ -12,15 +12,15 @@ - + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/cn/front-end/base/rank.html b/cn/front-end/base/rank.html deleted file mode 100644 index 5f7cf19..0000000 --- a/cn/front-end/base/rank.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - 前端职级与招聘 | MX-CodeCraft - - - - - - - - - - - - - - - -
Skip to content

前端职级与招聘

Base 太原

V1 Pre-Junior 入门V2 Junior 初级V3 Intermidiate 中级V4 Advanced 高级V5 Tech Lead 技术负责V6 Tech Expert 技术专家
薪资范围[ 3 , 4 ] k( 4 , 6 ] k( 6 , 9 ] k( 9 , 12 ] k( 12 , 15 ] k( 15 , 18 ] k

如何提升

古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。 ―― 陆游《冬夜读书示子聿》

image.png

然后「多复盘多总结」

招聘

简历初筛

加分项:

  • 【前端基础】对底层技术原理有一定(可不深入)理解的
  • 【技术选型】使用三方库,但能有自己的见解,能区分三方库的使用场景和引入项目的利弊
  • 【逻辑思维】能描述清楚自己所做过的业务流程,包括但不限于,模型的抽象,状态的流转等?
  • 【自省好学】善于总结项目经验,并能记录下自己所学所思之人(有技术博客,Github 有大量研究性项目)

减分项:

  • 满篇流水账,如
    • 做了 xxx 项目
    • 实现了 xxx 功能
    • 使用了 xxx(框架/类库等技术名词)
  • 培训班(自学都做不到,迟早会掉队)
  • 前端架构师(前端是整个系统的触手,不存在单独「架构」)

初步沟通

当简历无法清楚判断的使用,可辅助以下问题:

  1. 概述最近一个前端项目整体架构的设计,如模块的划分,技术的选型等,并说明原因(比如三方库引入的目的和结果)。
  2. 选取其中一个业务模块,简述数据结构的设计和状态的流转,及组件的拆分与实现。
  3. 团队的技术栈 ,简单说说自己的理解(可选)

问题 1,2 是为了解应聘者

  • 是否能清楚表述自己做过的事
  • 是否能「带着脑子写代码

问题 3 是为了解应聘者

  • 是否对新技术排斥,能否拥抱变化
  • 能否举一反三

面试

通过上面的流程,其实基本能确定应聘者是否能融入这个团队。 面试时,只需要围绕上面提到的关注点,简单抽查即可:

  • 关于项目的
    • 选一个模块,看看表达是否清晰
  • 技术相关
    • 开源库使用者,问问对应库的基本理念/原理
    • 有一定基础的,问问底层细节,如 DOM,HTTP 等
- - - - \ No newline at end of file diff --git "a/cn/front-end/base/ts/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/front-end/base/ts/\345\277\253\351\200\237\345\274\200\345\247\213.html" new file mode 100644 index 0000000..5aa8f19 --- /dev/null +++ "b/cn/front-end/base/ts/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -0,0 +1,33 @@ + + + + + + 快速开始 | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

快速开始

tslint 已经废弃

在使用现代的 TypeScript 项目中,通常不再需要 tslint 了。TSLint 已经被弃用,官方推荐迁移到 ESLint。ESLint 是一个更加通用和强大的工具,并且有很好的 TypeScript 支持。

npm 安装的 eslint 和 vscode 的 eslint 有什么区别

npm 安装的 eslint 在编译阶段检测,而 vscode 的 eslint 是在编辑阶段检测。

初始化项目

shell
mkdir ts-starter # 创建项目文件夹
+cd ts-starter # 进入项目文件夹
+npm init -y # 初始化项目
+
+npm install -g typescript eslint # 安装依赖
+
+tsc --init # 初始化 tsconfig.json
+eslint --init # 初始化 eslint

区分是 tslint 报错还是 ts 报错

不应该在书写代码遇到 TSLint 报错就修改规则,而是应该根据规则去修改代码。

类型声明文件

一些 JS 库的作者已经使用 TypeScript 进行了重写,有些则是提供了声明文件,一些作者没有提供声明文件的,大部分库都有社区的人为他们补充了声明文件,如果使用了自身没有提供声明文件的库时,可以使用npm install @types/{模块名}来安装

+ + + + \ No newline at end of file diff --git "a/cn/front-end/base/ts/\346\225\260\346\215\256\347\261\273\345\236\213.html" "b/cn/front-end/base/ts/\346\225\260\346\215\256\347\261\273\345\236\213.html" new file mode 100644 index 0000000..c39b7d8 --- /dev/null +++ "b/cn/front-end/base/ts/\346\225\260\346\215\256\347\261\273\345\236\213.html" @@ -0,0 +1,87 @@ + + + + + + 数据类型 | MX-CodeCraft + + + + + + + + + + + + + + + +
Skip to content

数据类型

常见数据类型

ts
// boolean
+const bool: boolean = false;
+
+// number
+let num: number;
+num = 1;
+num = 0b0001;
+num = 0o0001;
+num = 0xab;
+
+// string
+let str: string = 'string';
+
+// Array
+let list1: number[] = [1, 2, 3]; // 推荐
+let list3: string | number[] = [1, 2, 3]; //  联合类型
+let list2: Array<number> = [1, 2, 3];
+
+// null 和 undefined
+let u1: undefined = undefined;
+let n1: null = null;
+
+// object
+let obj: object = { name: 'axed' };

Symbol

表示独一无二的值,通过 Symbol 函数生成

js
const s = Symbol();
+typeof s; // 'symbol'
+console.log(Boolean(s)); // true

调用toString方法可以转换为字符串

js
const s1 = Symbol('lison');
+console.log(s1.toString()); // 'Symbol(lison)'

symbol 可以作为属性名

js
let name = Symbol();
+let obj = {
+  [name]: 'lison',
+};
+console.log(obj); // { Symbol(): 'lison' }
+console.log(obj[name]); // lison
+console.log(obj.name); // undefined

以 symbol 值为属性名,这个属性不会被for in 遍历到,也不会被 Object.keys、Object.getOwnPropertyNames、JSON.stringify 方法遍历到。

ts
const name = Symbol('name');
+const obj = {
+  [name]: 'lison',
+  age: 18,
+};
+for (const key in obj) {
+  console.log(key);
+}
+// => 'age'
+console.log(Object.keys(obj));
+// ['age']
+console.log(Object.getOwnPropertyNames(obj));
+// ['age']
+console.log(JSON.stringify(obj));
+// '{ "age": 18 }'

ts 补充的数据类型

元祖 tuple

元祖是固定长度的数组,且数组中的元素类型也是固定的。

ts
let tuple: [string, number, boolean] = ['axed', 1, true];

枚举 enum

枚举是给一组数字或者字符串命名,枚举的每个值都有一个数字索引。

ts
enum Color {
+  Red,
+  Green,
+  Blue,
+}
+
+console.log(Color.Red); // 0
+console.log(Color[0]); // Red

Color.Red 的值为 0,Color.Green 的值为 1,Color.Blue 的值为 2。默认从 0 开始。

ts
enum Color {
+  Red = 1,
+  Green = 5,
+  Blue,
+}

Color.Red 的值为 1,Color.Green 的值为 5,Color.Blue 的值为 6。注意因为指定了 Green 的值为 5,所以 Blue 的值为 6。

any

不要滥用 any,如果任何值都指定为 any 类型,那么 TypeScript 将失去它的意义。

void

void 是表示没有任意类型,就是什么类型都不是,这在我们定义函数,函数没有返回值。

void 类型的变量只能赋值为 undefined 和 null,其他类型不能赋值给 void 类型的变量。

ts
const consoleText = (text: string): void => {
+  console.log(text);
+};

never

never 类型指那些永不存在的值的类型,它是那些总会抛出异常或根本不会有返回值的函数表达式的返回值类型。

ts
const infiniteFunc = (): never => {
+  while (true) {}
+};

unknown

交叉类型 &

交叉类型就是取多个类型的并集

联合类型 |

联合类型是要求只要符合联合类型中任意一种类型即可

+ + + + \ No newline at end of file diff --git "a/cn/front-end/base/\344\271\246\345\206\231\350\247\204\350\214\203.html" "b/cn/front-end/base/\344\271\246\345\206\231\350\247\204\350\214\203.html" deleted file mode 100644 index fbebc7b..0000000 --- "a/cn/front-end/base/\344\271\246\345\206\231\350\247\204\350\214\203.html" +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - JavaScript 代码书写规范(from ChatGPT) | MX-CodeCraft - - - - - - - - - - - - - - - -
Skip to content

JavaScript 代码书写规范(from ChatGPT)

JavaScript 代码规范指的是一套关于如何编写、组织和格式化 JavaScript 代码的一致性规则和指南。这些规范旨在提高代码的可读性、可维护性,并降低团队协作时的摩擦。以下是一些遵循 JavaScript 代码规范的重要意义:

  1. 可读性和可维护性:规范化的代码更容易阅读和理解,使开发者能够快速找到他们需要的信息。这也使得在以后维护和修改代码变得更为容易。

  2. 减少错误和漏洞:一致的代码风格可以降低由于书写错误或者混乱的代码结构导致的错误的可能性。同时,规范也可以提供一些避免常见编码错误的建议。

  3. 团队合作:在团队中使用统一的代码规范可以减少开发者之间的歧义和摩擦。每个人都知道在哪里可以找到特定功能或模块的代码,也知道如何与之交互。

  4. 版本控制:规范的代码更容易与版本控制系统(如 Git)结合使用。在代码合并和比较时,格式一致的代码可以减少合并冲突的可能性。

  5. 提高代码质量:规范可以强制执行最佳实践,使得代码更为健壮、高效和可靠。

  6. 可扩展性:符合规范的代码更容易进行扩展,因为开发者可以更容易地理解和修改代码。

  7. 代码审查:在进行代码审查时,规范化的代码可以让审查过程更为高效。审查人员可以更专注于逻辑和功能,而不必担心代码的格式和风格。

总的来说,JavaScript 代码规范的主要目的是提升代码的质量、可维护性和可读性,从而为团队合作和软件项目的长期维护奠定坚实的基础。

变量名

变量名推荐使用驼峰法来命名(camelCase):

js
const firstName = 'John'
-const lastName = 'Doe'
-const price = 19.9
-let tax = 0.2
-
-let fullPrice = price + price * tax

空格与运算符

通常运算符 ( = + - * / ) 前后需要添加空格:

js
var x = y + z
-var values = ['Volvo', 'Saab', 'Fiat']

代码缩进

通常使用 2 个空格符号来缩进代码块:

js
function toCelsius(fahrenheit) {
-  return (5 / 9) * (fahrenheit - 32)
-}

语句规则

通常可使用prettier插件来自动格式化

一条语句不要以分号作为结束符。

将左花括号放在第一行的结尾。
左花括号前添加一空格。
将右花括号独立放在一行。
不要以分号结束一个复杂的声明。
字符串使用单引号。
对象最后一条数据后加逗号。 每行代码字符小于 80。

js
var values = ['Volvo', 'Saab', 'Fiat']
-
-var person = {
-  firstName: 'John',
-  lastName: 'Doe',
-  age: 50,
-  eyeColor: 'blue',
-}

命名规则

  • 变量和函数为小驼峰法标识, 即除第一个单词之外,其他单词首字母大写( lowerCamelCase)
  • 全局变量为大写 (UPPERCASE )
  • 常量 (如 PI) 为大写 (UPPERCASE )

文件命名

  • 一般文件以烤串命名(kebab case)
  • Vue 组件以大写驼峰命名
- - - - \ No newline at end of file diff --git a/cn/front-end/frame/index.html b/cn/front-end/frame/index.html index 52fbc8b..5fa80ff 100644 --- a/cn/front-end/frame/index.html +++ b/cn/front-end/frame/index.html @@ -12,15 +12,15 @@ - + -
Skip to content

frame

- +
Skip to content

frame

+ \ No newline at end of file diff --git "a/cn/front-end/frame/pure-admin/\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.html" "b/cn/front-end/frame/pure-admin/\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.html" index 70beb00..374ab75 100644 --- "a/cn/front-end/frame/pure-admin/\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.html" +++ "b/cn/front-end/frame/pure-admin/\345\211\215\347\253\257\346\225\260\346\215\256\346\216\245\345\217\243\346\250\241\346\213\237.html" @@ -12,15 +12,15 @@ - + -
Skip to content

Mock

- +
Skip to content

Mock

+ \ No newline at end of file diff --git "a/cn/front-end/frame/pure-admin/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/front-end/frame/pure-admin/\345\277\253\351\200\237\345\274\200\345\247\213.html" index d1b8c3d..380f3f6 100644 --- "a/cn/front-end/frame/pure-admin/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/front-end/frame/pure-admin/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,22 +12,22 @@ - + -
Skip to content

精简版预览地址 精简版仓库地址 文档地址

完整版预览地址 完整版仓库地址

快速开始

启动项目

shell
# clone 项目
+    
Skip to content

精简版预览地址 精简版仓库地址 文档地址

完整版预览地址 完整版仓库地址

快速开始

启动项目

shell
# clone 项目
 git clone git@github.com:pure-admin/pure-admin-thin.git
 
 cd pure-admin-thin
 
 pnpm install
 
-pnpm dev

技术栈:vue3 vite ts pinia tailwindcss element-plus vite-plugin-fake-server(mock) iconify(图标框架)

- +pnpm dev

技术栈:vue3 vite ts pinia tailwindcss element-plus vite-plugin-fake-server(mock) iconify(图标框架)

+ \ No newline at end of file diff --git "a/cn/front-end/frame/pure-admin/\346\235\203\351\231\220.html" "b/cn/front-end/frame/pure-admin/\346\235\203\351\231\220.html" index bca2f23..c2fe799 100644 --- "a/cn/front-end/frame/pure-admin/\346\235\203\351\231\220.html" +++ "b/cn/front-end/frame/pure-admin/\346\235\203\351\231\220.html" @@ -12,14 +12,14 @@ - + -
Skip to content

权限

与路由强相关

静态权限

前端硬编码实现

ts
// src/router/modules/visit.ts
+    
Skip to content

权限

与路由强相关

静态权限

前端硬编码实现

ts
// src/router/modules/visit.ts
 const VisitRecords = () => import('@/views/VisitRecords.vue');
 
 export default {
@@ -130,8 +130,8 @@
       },
     },
   ],
-};
- +};
+ \ No newline at end of file diff --git a/cn/front-end/frame/vue3/index.html b/cn/front-end/frame/vue3/index.html index ec9f013..36e5031 100644 --- a/cn/front-end/frame/vue3/index.html +++ b/cn/front-end/frame/vue3/index.html @@ -12,15 +12,15 @@ - + -
Skip to content

vue

- +
Skip to content

vue

+ \ No newline at end of file diff --git "a/cn/front-end/frame/vue3/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/cn/front-end/frame/vue3/\345\277\253\351\200\237\345\274\200\345\247\213.html" index fbbf05e..964dbf5 100644 --- "a/cn/front-end/frame/vue3/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/cn/front-end/frame/vue3/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -12,14 +12,14 @@ - + -
Skip to content

快速开始

对比

选项式 options api

  • 基于类的心智模型
  • 把响应式相关细节抽象出来,强制按照选项来组织代码,对初学者更为友好

组合式 composition api

  • 更加自由,灵活性使得组织和重用逻辑的模式变得更加强大

支持的场景

参考

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

快速上手

shell
pnpm create vue@latest
+    
Skip to content

快速开始

对比

选项式 options api

  • 基于类的心智模型
  • 把响应式相关细节抽象出来,强制按照选项来组织代码,对初学者更为友好

组合式 composition api

  • 更加自由,灵活性使得组织和重用逻辑的模式变得更加强大

支持的场景

参考

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

快速上手

shell
pnpm create vue@latest
 
 npm create vue@latest
 
@@ -53,8 +53,8 @@
 <a v-on:[eventName]="doSomething">  </a>
 
 <!-- 简写 -->
-<a @[eventName]="doSomething"> </a>
- +<a @[eventName]="doSomething"> </a>
+ \ No newline at end of file diff --git "a/cn/front-end/frame/vue3/\347\233\221\345\220\254\345\231\250.html" "b/cn/front-end/frame/vue3/\347\233\221\345\220\254\345\231\250.html" index 96b8b68..ed64a46 100644 --- "a/cn/front-end/frame/vue3/\347\233\221\345\220\254\345\231\250.html" +++ "b/cn/front-end/frame/vue3/\347\233\221\345\220\254\345\231\250.html" @@ -12,14 +12,14 @@ - + -
Skip to content

监听器

watch

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

javascript
import { ref, watch } from 'vue';
+    
Skip to content

监听器

watch

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

javascript
import { ref, watch } from 'vue';
 const x = ref(0);
 const y = ref(0);
 
@@ -60,8 +60,8 @@
 
 watchEffect(callback, {
   flush: 'post',
-});

watchPostEffectwatchEffect区别?

- +});

watchPostEffectwatchEffect区别?

+ \ No newline at end of file diff --git "a/cn/front-end/frame/vue3/\347\273\204\344\273\266.html" "b/cn/front-end/frame/vue3/\347\273\204\344\273\266.html" index 98a087d..ce40ca6 100644 --- "a/cn/front-end/frame/vue3/\347\273\204\344\273\266.html" +++ "b/cn/front-end/frame/vue3/\347\273\204\344\273\266.html" @@ -12,14 +12,14 @@ - + -
Skip to content

组件

在单文件组件中,子组件推荐PascalCase的标签名。

在 DOM 中直接书写,推荐kebab-case的标签名

父子组件通信

子组件定义 props defineProps

vue
<!-- 运行时声明 -->
+    
Skip to content

组件

在单文件组件中,子组件推荐PascalCase的标签名。

在 DOM 中直接书写,推荐kebab-case的标签名

父子组件通信

子组件定义 props defineProps

vue
<!-- 运行时声明 -->
 <script setup lang="ts">
 defineProps({
   title: {
@@ -89,8 +89,8 @@
 import { useAttrs } from 'vue';
 
 const attrs = useAttrs();
-</script>
- +</script>
+ \ No newline at end of file diff --git a/cn/front-end/visual/leaflet/with-antdv-button.html b/cn/front-end/visual/leaflet/with-antdv-button.html index ee1b28d..a8bb9c0 100644 --- a/cn/front-end/visual/leaflet/with-antdv-button.html +++ b/cn/front-end/visual/leaflet/with-antdv-button.html @@ -13,14 +13,14 @@ - + -
Skip to content

示例是在leaflet->marker-popup中使用 antdv 的 button 组件。核心是使用createApp挂载一个组件。

在所有的第三方库中,但给某个字段传入 html 参数的时候,都可以参考这个方案。

效果

代码参考

地图渲染组件

vue
<template>
+    
Skip to content

示例是在leaflet->marker-popup中使用 antdv 的 button 组件。核心是使用createApp挂载一个组件。

在所有的第三方库中,但给某个字段传入 html 参数的时候,都可以参考这个方案。

效果

代码参考

地图渲染组件

vue
<template>
   <div class="my-map" ref="myMap"></div>
   <div id="myDomContainer"></div>
 </template>
@@ -89,8 +89,8 @@
   btnName: string;
 }>();
 const { btnName } = props;
-</script>
- +</script>
+ \ No newline at end of file diff --git "a/cn/mx-components/common-components/\346\214\211\351\222\256.html" "b/cn/mx-components/common-components/\346\214\211\351\222\256.html" index b70c20e..3febbc3 100644 --- "a/cn/mx-components/common-components/\346\214\211\351\222\256.html" +++ "b/cn/mx-components/common-components/\346\214\211\351\222\256.html" @@ -12,19 +12,19 @@ - + -
Skip to content
[
+    
Skip to content
[
   {
     "undefined": "<script setup lang=\"ts\">\nimport * as pkg from 'naive-ui';\nconst { NButton } =pkg\n</script>\n<template>\n    <n-button>\n        <slot></slot>\n    </n-button>\n</template>"
   }
-]
- +]
+ \ No newline at end of file diff --git a/cn/mx-components/index.html b/cn/mx-components/index.html index b437d74..1a0bd98 100644 --- a/cn/mx-components/index.html +++ b/cn/mx-components/index.html @@ -12,15 +12,15 @@ - + -
Skip to content

基于 Naive-UI 封装的组件库

- +
Skip to content

基于 Naive-UI 封装的组件库

+ \ No newline at end of file diff --git a/en/index.html b/en/index.html index c2e7b55..aa64153 100644 --- a/en/index.html +++ b/en/index.html @@ -12,15 +12,15 @@ - + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 6f1e26e..7ca22b7 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"about-me.md":"9wHsYVTS","cn_mx-components_index.md":"UyJdQsEh","en_index.md":"BJT6H8Yr","index.md":"CxW3bBkY","posts_index.md":"CI8KVTJS","posts_my-first-day.md":"BWX3-leE","packages_foo.md":"CXRT3ItQ","cn_back-end_java_快速开始.md":"DZyRCUCK","cn_back-end_java_springboot_依赖注入和控制反转.md":"C_95ueQm","cn_back-end_java_springboot_自定义配置和表达式.md":"DnYxt3wX","cn_back-end_java_springboot_restful.md":"Cm7SD-pm","cn_front-end_frame_pure-admin_权限.md":"Cbjawa2y","cn_back-end_java_springboot_快速开始.md":"D7pVD-NV","cn_front-end_base_js-docs_index.md":"Z9wnA6R-","cn_engineering_index.md":"Bc5ppXgh","cn_front-end_frame_index.md":"CIjbLLhr","cn_front-end_frame_pure-admin_快速开始.md":"Dy2F_8Gk","cn_back-end_java_运算符.md":"BtjyO-WZ","cn_back-end_nestjs_拦截器.md":"V89VkhOL","cn_back-end_java_mybatis_mapper代理开发.md":"BnlHG9kI","cn_back-end_java_stream,文件和io.md":"C35Ih-S-","cn_embedded-system_esp8266_使用platformio通过网络控制led.md":"BEr8_qY6","cn_back-end_java_方法.md":"IsjnL8J1","cn_back-end_nestjs_practice_intergrate-with-vercel.md":"BC5v_pp1","cn_back-end_nestjs_异常过滤器.md":"DX9dkiWs","cn_back-end_java_数组.md":"-0KdhHL7","cn_back-end_java_枚举.md":"RJZ_YCDL","cn_back-end_java_继承、重载和多态.md":"CwoY92ZF","cn_front-end_frame_pure-admin_前端数据接口模拟.md":"C60XH7I5","cn_back-end_ai_ollama_文生图大模型.md":"FH1Yb-4P","cn_front-end_visual_leaflet_with-antdv-button.md":"DFP6VaVo","cn_back-end_ai_ollama_快速开始.md":"jt46mI5s","cn_back-end_python_变量.md":"B--yoY4V","cn_back-end_java_vscode开发java.md":"BaurqQkP","cn_back-end_nestjs_自定义装饰器.md":"BiTGODGM","cn_back-end_nestjs_practice_sse接口.md":"CAkWXiRF","cn_front-end_base_rank.md":"CKvdtC8S","cn_back-end_java_字符串.md":"DFJYux5v","cn_back-end_java_数据结构.md":"DQQWuCDW","cn_back-end_java_while、for、if和switch.md":"9iBJG72r","cn_back-end_java_mybatis_快速开始.md":"BglxuHnL","cn_back-end_java_基本数据类型.md":"BCZbyXtM","cn_embedded-system_esp8266_control.md":"CA-jCI-v","cn_back-end_python_快速开始.md":"Bep3XAyt","cn_back-end_java_异常处理.md":"CIQyHBhB","cn_back-end_nestjs_管道.md":"cElApXSp","cn_front-end_frame_vue3_index.md":"0NbG7FuH","cn_back-end_nestjs_中间件.md":"DDcoszTZ","cn_front-end_frame_vue3_快速开始.md":"DynXKIWZ","cn_back-end_nestjs_与mysql.md":"B_FkEIjg","cn_back-end_java_对象和类.md":"fswazgI2","cn_embedded-system_esp8266_mqtt-client.md":"BqYx6jQ0","cn_front-end_base_书写规范.md":"DeKqDrN_","cn_front-end_frame_vue3_监听器.md":"D5p4k0n1","cn_back-end_nestjs_控制器.md":"Dfc9f8Pz","cn_back-end_java_抽象类.md":"DkPAOQKq","cn_back-end_nestjs_守卫.md":"EZXxCR6r","cn_back-end_nestjs_快速开始.md":"BAXasixq","cn_front-end_frame_vue3_组件.md":"BTnviDwV","cn_back-end_java_变量.md":"yjV7c7xM","cn_mx-components_common-components_按钮.md":"CrPL-6PG"} +{"cn_back-end_java_springboot_restful.md":"XqxFNTkh","cn_back-end_java_mybatis_快速开始.md":"Dl0CiA0w","cn_back-end_ai_ollama_文生图大模型.md":"BYT2v8hW","about-me.md":"DcXGFENO","cn_back-end_java_springboot_依赖注入和控制反转.md":"C3ctmyRO","cn_back-end_java_mybatis_mapper代理开发.md":"B9lA-DEH","cn_back-end_ai_ollama_快速开始.md":"oYYn0Lka","cn_back-end_java_springboot_与mybatis结合.md":"BghR1Sl_","cn_back-end_java_springboot_异常处理和拦截器.md":"Cq6iAK7T","cn_back-end_java_抽象类.md":"BvwTwcoT","cn_back-end_java_基本数据类型.md":"C3ic3dTu","cn_back-end_nestjs_practice_intergrate-with-vercel.md":"D1tcau4g","cn_back-end_java_变量.md":"BB1KqJGM","cn_back-end_java_while、for、if和switch.md":"D_b_O2An","cn_back-end_nestjs_中间件.md":"I4uhgMQ0","cn_back-end_java_stream,文件和io.md":"Dc5_z6y9","cn_back-end_java_springboot_访问mysql数据.md":"DYxRo87T","cn_back-end_java_快速开始.md":"Cn1RmWoY","cn_back-end_java_字符串.md":"qaq7Ch_W","cn_back-end_java_对象和类.md":"MrFr4t4s","cn_back-end_java_vscode开发java.md":"5kW7XnHu","cn_front-end_base_group-build_rank.md":"BVKXpQu4","cn_back-end_java_方法.md":"B6Ps2WDO","cn_back-end_java_枚举.md":"BRQGn6WS","cn_back-end_nestjs_快速开始.md":"DnhWty34","cn_embedded-system_esp8266_mqtt-client.md":"BJ3hm7BS","cn_front-end_base_ts_快速开始.md":"CAnAV_WL","cn_engineering_index.md":"BzreDnDI","cn_embedded-system_esp8266_使用platformio通过网络控制led.md":"CNiwHqQ2","cn_back-end_java_继承、重载和多态.md":"Cttg-pU1","cn_back-end_nestjs_拦截器.md":"DTW8NnCg","cn_back-end_nestjs_控制器.md":"CxDWQf7D","cn_front-end_frame_index.md":"LdZDHp9B","cn_mx-components_index.md":"BsvAtqZQ","cn_front-end_frame_pure-admin_快速开始.md":"DzVm42MB","en_index.md":"C-6bPfAN","cn_front-end_frame_pure-admin_权限.md":"bFc8S5k8","cn_front-end_frame_vue3_index.md":"D2myUyPq","cn_back-end_java_运算符.md":"BD2DbKtn","index.md":"CbV-hMzj","posts_index.md":"EWW9ss0x","cn_front-end_frame_vue3_快速开始.md":"Cjl6w7BD","posts_my-first-day.md":"DCiAmvyV","cn_front-end_frame_vue3_监听器.md":"CpDXWmdX","packages_foo.md":"CXRT3ItQ","cn_back-end_nestjs_管道.md":"DOHXArpm","cn_back-end_python_变量.md":"BHrR-lVv","cn_back-end_nestjs_practice_sse接口.md":"cvK-C0EM","cn_back-end_python_快速开始.md":"oG_Uc0gX","cn_embedded-system_esp8266_control.md":"DSoEfOfS","cn_front-end_base_group-build_书写规范.md":"Dal3w7Ti","cn_front-end_visual_leaflet_with-antdv-button.md":"23m68R0W","cn_front-end_frame_vue3_组件.md":"BTQbvKsT","cn_front-end_base_js-docs_index.md":"Db2Qhtbc","cn_back-end_java_异常处理.md":"BeHGpOim","cn_back-end_nestjs_自定义装饰器.md":"BYcopKev","cn_back-end_nestjs_与mysql.md":"DbtJfsbp","cn_back-end_nestjs_异常过滤器.md":"VkzUvKXb","cn_back-end_java_springboot_自定义配置和表达式.md":"BZp7IVw9","cn_back-end_java_springboot_快速开始.md":"DP6PVNWw","cn_back-end_java_数据结构.md":"D3jXQd6a","cn_back-end_nestjs_守卫.md":"i9ye8GqR","cn_front-end_frame_pure-admin_前端数据接口模拟.md":"CzLUeX4j","cn_front-end_base_ts_数据类型.md":"FIjfzCfT","cn_back-end_java_数组.md":"Dm5xgZ9v","cn_mx-components_common-components_按钮.md":"XVhE0SPK"} diff --git a/index.html b/index.html index 942337c..8915fd9 100644 --- a/index.html +++ b/index.html @@ -12,15 +12,15 @@ - + -
Skip to content

MX-CodeCraft

动机 | 摆弄 | 沉淀

代码之间的魔法舞蹈

- +
Skip to content

MX-CodeCraft

动机 | 摆弄 | 沉淀

代码之间的魔法舞蹈

+ \ No newline at end of file diff --git a/packages/foo.html b/packages/foo.html index 0e2ca92..0fdf93e 100644 --- a/packages/foo.html +++ b/packages/foo.html @@ -19,7 +19,7 @@ -
Skip to content
{
+    
Skip to content
{
   "title": "Docs with VitePress",
   "description": "",
   "frontmatter": {
@@ -45,7 +45,7 @@
 const line3 = 'This is line 3'
ts
// line-numbers is enabled
 const line2 = 'This is line 2'
 const line3 = 'This is line 3'

test.json

- + \ No newline at end of file diff --git a/posts/index.html b/posts/index.html index 1942527..123eb57 100644 --- a/posts/index.html +++ b/posts/index.html @@ -12,15 +12,15 @@ - + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/posts/my-first-day.html b/posts/my-first-day.html index 1d48f0e..b456de5 100644 --- a/posts/my-first-day.html +++ b/posts/my-first-day.html @@ -12,15 +12,15 @@ - + -
Skip to content
- +
Skip to content
+ \ No newline at end of file