1<!doctype html> 2<html lang="en-US"> 3 <head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width,initial-scale=1" /> 6 <meta name="generator" content="VuePress 2.0.0-rc.20" /> 7 <style> 8 :root { 9 --vp-c-bg: #fff; 10 } 11 12 [data-theme='dark'] { 13 --vp-c-bg: #1b1b1f; 14 } 15 16 html, 17 body { 18 background-color: var(--vp-c-bg); 19 } 20 </style> 21
21<script> 22 const useChoice = localStorage.getItem('vuepress-color-scheme') 23 const systemStatus = 24 'matchMedia' in window 25 ? window.matchMedia('(prefers-color-scheme: dark)').matches 26 : false 27 28 if (useChoice === 'light') { 29 document.documentElement.dataset.theme = 'light' 30 } else if (useChoice === 'dark' || systemStatus) { 31 document.documentElement.dataset.theme = 'dark' 32 } 33 </script>
33 34 <title>GoWind Admin 产åä»ç» | GoWind 弿ºçæ</title><meta name="description" content="ä¸ç«å¼ GoWind ç³»å弿ºé¡¹ç®ææ¡£ä¸ä½¿ç¨æå"> 35 <link rel="preload" href="/assets/style-Bs0G1tvg.css" as="style"><link rel="stylesheet" href="/assets/style-Bs0G1tvg.css"> 36 <link rel="modulepreload" href="/assets/app-B7HVJ7q3.js"><link rel="modulepreload" href="/assets/intro.html-B0Ozup5m.js"> 37 <link rel="prefetch" href="/assets/index.html-B8UAfAQs.js" as="script"><link rel="prefetch" href="/assets/backend-api.html-De6K5Ezp.js" as="script"><link rel="prefetch" href="/assets/backend-architecture.html-DFDGrCHn.js" as="script"><link rel="prefetch" href="/assets/backend-config-deploy.html-2QVCJ2LI.js" as="script"><link rel="prefetch" href="/assets/backend-extension.html-DCcFFEwJ.js" as="script"><link rel="prefetch" href="/assets/backend-modules.html-CKYR5LNG.js" as="script"><link rel="prefetch" href="/assets/backend-tutorial-new-module.html-CerawCvH.js" as="script"><link rel="prefetch" href="/assets/frontend-architecture.html-D60icPT0.js" as="script"><link rel="prefetch" href="/assets/frontend-modules.html-BbxGBSZC.js" as="script"><link rel="prefetch" href="/assets/frontend-tutorial-new-page.html-BXJ0xHF1.js" as="script"><link rel="prefetch" href="/assets/installation.html-cedrJdX2.js" as="script"><link rel="prefetch" href="/assets/tutorial-crypto-toolkit.html-Dlo3jn09.js" as="script"><link rel="prefetch" href="/assets/tutorial-eventbus-architecture.html-Dr5lFyBA.js" as="script"><link rel="prefetch" href="/assets/tutorial-file-storage.html-ZeJ3T1Ck.js" as="script"><link rel="prefetch" href="/assets/tutorial-fullstack-integration.html-1AocH_LI.js" as="script"><link rel="prefetch" href="/assets/tutorial-login-security.html-Clv68aIU.js" as="script"><link rel="prefetch" href="/assets/tutorial-lua-extension.html-DsxAHloK.js" as="script"><link rel="prefetch" href="/assets/tutorial-multi-tenancy.html-BJuUatFo.js" as="script"><link rel="prefetch" href="/assets/tutorial-performance-monitoring.html-DO5mzFqd.js" as="script"><link rel="prefetch" href="/assets/tutorial-permission-system.html-BWnHgXKT.js" as="script"><link rel="prefetch" href="/assets/tutorial-sse-push.html-V9dG7ODr.js" as="script"><link rel="prefetch" href="/assets/tutorial-task-scheduling.html-CBwlecGX.js" as="script"><link rel="prefetch" href="/assets/tutorial-theme-i18n.html-BmRHAgqX.js" as="script"><link rel="prefetch" href="/assets/installation.html-MF1JFwbt.js" as="script"><link rel="prefetch" href="/assets/intro.html-TWN-9ep4.js" as="script"><link rel="prefetch" href="/assets/installation.html-C4fvcZHH.js" as="script"><link rel="prefetch" href="/assets/intro.html-XR_nTTO7.js" as="script"><link rel="prefetch" href="/assets/contribution.html-DtEFhDqC.js" as="script"><link rel="prefetch" href="/assets/faq.html-B1niEzme.js" as="script"><link rel="prefetch" href="/assets/getting-started.html-DB6c9OOX.js" as="script"><link rel="prefetch" href="/assets/backend-api.html-CmlOOsHn.js" as="script"><link rel="prefetch" href="/assets/backend-architecture.html-DQyQRmEM.js" as="script"><link rel="prefetch" href="/assets/backend-config-deploy.html-CDIJVjzA.js" as="script"><link rel="prefetch" href="/assets/backend-extension.html-CV6uhTgh.js" as="script"><link rel="prefetch" href="/assets/backend-modules.html-BMOw9WT0.js" as="script"><link rel="prefetch" href="/assets/frontend-architecture.html-BBR4BE7M.js" as="script"><link rel="prefetch" href="/assets/frontend-modules.html-mCBhoNQI.js" as="script"><link rel="prefetch" href="/assets/installation.html-BaQEqgv6.js" as="script"><link rel="prefetch" href="/assets/intro.html-BLICZj2H.js" as="script"><link rel="prefetch" href="/assets/tutorial-codegen.html-4RYnovmS.js" as="script"><link rel="prefetch" href="/assets/tutorial-comment-system.html-DeJIq8LR.js" as="script"><link rel="prefetch" href="/assets/tutorial-content-i18n.html-uoeraLwL.js" as="script"><link rel="prefetch" href="/assets/tutorial-content-workflow.html-BHrB1fTd.js" as="script"><link rel="prefetch" href="/assets/tutorial-crypto-toolkit.html-BqwnwFXn.js" as="script"><link rel="prefetch" href="/assets/tutorial-deploy.html-DCBQHxCO.js" as="script"><link rel="prefetch" href="/assets/tutorial-dict-system.html-B3IvY6ro.js" as="script"><link rel="prefetch" href="/assets/tutorial-eventbus-architecture.html-DRXoy7nu.js" as="script"><link rel="prefetch" href="/assets/tutorial-frontend-app.html-CM91geCK.js" as="script"><link rel="prefetch" href="/assets/tutorial-fullstack-integration.html-senKeuaq.js" as="script"><link rel="prefetch" href="/assets/tutorial-headless-api.html-D2dg7wjW.js" as="script"><link rel="prefetch" href="/assets/tutorial-login-security.html-DhndKlxz.js" as="script"><link rel="prefetch" href="/assets/tutorial-lua-extension.html-nzxWXvks.js" as="script"><link rel="prefetch" href="/assets/tutorial-media-asset.html-DfXbKzpx.js" as="script"><link rel="prefetch" href="/assets/tutorial-multi-site.html-DjJKb8yV.js" as="script"><link rel="prefetch" href="/assets/tutorial-new-content.html-hCpu7FaO.js" as="script"><link rel="prefetch" href="/assets/tutorial-performance-monitoring.html-CbsQzUEi.js" as="script"><link rel="prefetch" href="/assets/tutorial-permission-system.html-Wf3tFDf2.js" as="script"><link rel="prefetch" href="/assets/tutorial-search.html-Mhw6o_-h.js" as="script"><link rel="prefetch" href="/assets/tutorial-section-editor.html-BA7L21n6.js" as="script"><link rel="prefetch" href="/assets/tutorial-sse-push.html-D2gLYbhO.js" as="script"><link rel="prefetch" href="/assets/tutorial-task-scheduling.html-CtS8Ct6x.js" as="script"><link rel="prefetch" href="/assets/architecture.html-CdvqN7ZY.js" as="script"><link rel="prefetch" href="/assets/intro.html-UXdLm_5L.js" as="script"><link rel="prefetch" href="/assets/strategies.html-CyiMI53u.js" as="script"><link rel="prefetch" href="/assets/architecture.html-BmuyxXlX.js" as="script"><link rel="prefetch" href="/assets/bootstrap-cli.html-BygfWRBx.js" as="script"><link rel="prefetch" href="/assets/bootstrap-config.html-Qp00zBVb.js" as="script"><link rel="prefetch" href="/assets/bootstrap-examples.html-DWnSCEGw.js" as="script"><link rel="prefetch" href="/assets/bootstrap-intro.html-CQrx8Cxq.js" as="script"><link rel="prefetch" href="/assets/bootstrap-middleware.html-BKb-GwEL.js" as="script"><link rel="prefetch" href="/assets/bootstrap-spi.html-DODjJ3tQ.js" as="script"><link rel="prefetch" href="/assets/core-context.html-Cu44yI-s.js" as="script"><link rel="prefetch" href="/assets/core-intro.html-cS-EQe1S.js" as="script"><link rel="prefetch" href="/assets/core-lifecycle.html-DXfRnZ1-.js" as="script"><link rel="prefetch" href="/assets/core-logging.html-DGcFSiLB.js" as="script"><link rel="prefetch" href="/assets/core-transport.html-DRZFwBFN.js" as="script"><link rel="prefetch" href="/assets/intro.html-C2z32UF3.js" as="script"><link rel="prefetch" href="/assets/plugins-ai.html-BLvKW08p.js" as="script"><link rel="prefetch" href="/assets/plugins-broker.html-DkHHwAgn.js" as="script"><link rel="prefetch" href="/assets/plugins-cache.html-BPLwQXnG.js" as="script"><link rel="prefetch" href="/assets/plugins-compress.html-JS9VzNtm.js" as="script"><link rel="prefetch" href="/assets/plugins-config.html-Bmof8l72.js" as="script"><link rel="prefetch" href="/assets/plugins-database.html-DrKqg2C7.js" as="script"><link rel="prefetch" href="/assets/plugins-encoding.html-C48laNPo.js" as="script"><link rel="prefetch" href="/assets/plugins-gateway.html-Bvz29v0J.js" as="script"><link rel="prefetch" href="/assets/plugins-intro.html-p5YHJHQ7.js" as="script"><link rel="prefetch" href="/assets/plugins-log.html-enTTS_oD.js" as="script"><link rel="prefetch" href="/assets/plugins-metrics.html-SHMgAZWu.js" as="script"><link rel="prefetch" href="/assets/plugins-oss.html-CpINy7vf.js" as="script"><link rel="prefetch" href="/assets/plugins-ratelimit.html-C83AoLZJ.js" as="script"><link rel="prefetch" href="/assets/plugins-registry.html-BZVbYbP2.js" as="script"><link rel="prefetch" href="/assets/plugins-security.html-DotqAEYp.js" as="script"><link rel="prefetch" href="/assets/plugins-template.html-BdtRMnoE.js" as="script"><link rel="prefetch" href="/assets/plugins-tracer.html-lCjLplqM.js" as="script"><link rel="prefetch" href="/assets/plugins-transport.html-CcZzjCjo.js" as="script"><link rel="prefetch" href="/assets/plugins-workflow.html-DsXIvhWp.js" as="script"><link rel="prefetch" href="/assets/tutorial-custom-plugin.html-jmaHo-Vq.js" as="script"><link rel="prefetch" href="/assets/tutorial-migration.html-CP5hm2ja.js" as="script">
37<link rel="prefetch" href="/assets/tutorial-multi-transport.html-D6nbk8-D.js" as="script"><link rel="prefetch" href="/assets/tutorial-quick-start.html-CosZ_z0p.js" as="script"><link rel="prefetch" href="/assets/backend-code-generation.html-BGKiN8ul.js" as="script"><link rel="prefetch" href="/assets/frontend-code-generation.html-DDSWydA7.js" as="script"><link rel="prefetch" href="/assets/intro.html-iqrg61p8.js" as="script"><link rel="prefetch" href="/assets/analyst-active-users.html-Baqdyf1e.js" as="script"><link rel="prefetch" href="/assets/analyst-anomaly.html-Vxir_aXD.js" as="script"><link rel="prefetch" href="/assets/analyst-attribution.html-CyB4d7OU.js" as="script"><link rel="prefetch" href="/assets/analyst-behavior-sequence.html-BI6PA_gz.js" as="script"><link rel="prefetch" href="/assets/analyst-churn.html-BXEwcsKF.js" as="script"><link rel="prefetch" href="/assets/analyst-click.html-BNz95QgP.js" as="script"><link rel="prefetch" href="/assets/analyst-distribution.html-D3dwyZRg.js" as="script"><link rel="prefetch" href="/assets/analyst-economy.html-n4aMUW4x.js" as="script"><link rel="prefetch" href="/assets/analyst-event-trend.html-g33xjtQM.js" as="script"><link rel="prefetch" href="/assets/analyst-funnel.html-B1Dl9FJq.js" as="script"><link rel="prefetch" href="/assets/analyst-getting-started.html-C41i0F1Z.js" as="script"><link rel="prefetch" href="/assets/analyst-group-by.html-CafmIOiu.js" as="script"><link rel="prefetch" href="/assets/analyst-interval.html-BvBahTqM.js" as="script"><link rel="prefetch" href="/assets/analyst-level-analysis.html-Dec8MVWk.js" as="script"><link rel="prefetch" href="/assets/analyst-lifecycle.html-CQxTglAu.js" as="script"><link rel="prefetch" href="/assets/analyst-ltv.html-BzV_dQA8.js" as="script"><link rel="prefetch" href="/assets/analyst-matrix.html-Dr30nzAx.js" as="script"><link rel="prefetch" href="/assets/analyst-new-vs-old.html-DQyJZ8sX.js" as="script"><link rel="prefetch" href="/assets/analyst-olap-cookbook.html-Bwt0bBO7.js" as="script"><link rel="prefetch" href="/assets/analyst-online-stats.html-Dxi0tJWI.js" as="script"><link rel="prefetch" href="/assets/analyst-path-sankey.html-BHX8255Z.js" as="script"><link rel="prefetch" href="/assets/analyst-retention.html-BfO_40_e.js" as="script"><link rel="prefetch" href="/assets/analyst-revenue.html-BcVJCPPH.js" as="script"><link rel="prefetch" href="/assets/analyst-segmentation.html-DGnpt6Vr.js" as="script"><link rel="prefetch" href="/assets/analyst-server-retention.html-CCMp1uBx.js" as="script"><link rel="prefetch" href="/assets/analyst-session-analysis.html-CT_bdii0.js" as="script"><link rel="prefetch" href="/assets/analyst-whale-tier.html-D7qa86Ta.js" as="script"><link rel="prefetch" href="/assets/appendix.html-VyOTnxld.js" as="script"><link rel="prefetch" href="/assets/architecture.html-CTaFLbZV.js" as="script"><link rel="prefetch" href="/assets/backend-api.html-DDXYosju.js" as="script"><link rel="prefetch" href="/assets/backend-modules.html-CANR4tLP.js" as="script"><link rel="prefetch" href="/assets/deploy-config.html-Ds_rBkwr.js" as="script"><link rel="prefetch" href="/assets/deploy-docker.html-0sPCLOIU.js" as="script"><link rel="prefetch" href="/assets/deploy-pm2.html-Dugw-ell.js" as="script"><link rel="prefetch" href="/assets/deploy-superset.html-TQIx47Ta.js" as="script"><link rel="prefetch" href="/assets/frontend-architecture.html-Bnp6N3Qt.js" as="script"><link rel="prefetch" href="/assets/installation.html-DmADfCti.js" as="script"><link rel="prefetch" href="/assets/intro.html-D-9Tim2U.js" as="script"><link rel="prefetch" href="/assets/sdk-csharp.html-BCDrMzXX.js" as="script"><link rel="prefetch" href="/assets/sdk-web.html-DlCN-pl5.js" as="script"><link rel="prefetch" href="/assets/tutorial-codegen.html-I1IQw5ib.js" as="script"><link rel="prefetch" href="/assets/tutorial-new-entity.html-B3nB6drW.js" as="script"><link rel="prefetch" href="/assets/tutorial-new-page.html-BnhgzMDd.js" as="script"><link rel="prefetch" href="/assets/tutorial-new-service.html-Dw9_276K.js" as="script"><link rel="prefetch" href="/assets/404.html-wee-Vn7-.js" as="script"><link rel="prefetch" href="/assets/mermaid.esm.min-DlmuX3-7.js" as="script"> 38 </head> 39 <body> 40 <div id="app"><!--[--><div class="vp-theme-container external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/">
40<img class="vp-site-logo" src="/logo.png" alt="GoWind 弿ºçæ"><span class="vp-site-name vp-hide-mobile" aria-hidden="true">GoWind 弿ºçæ</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="é¦é¡µ"><!--[--><!--[--><!--]--><!--]-->é¦é¡µ<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/framework/intro.html" aria-label="æ¡æ¶"><!--[--><!--[--><!--]--><!--]-->æ¡æ¶<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/admin/intro.html" aria-label="GoWind Admin"><!--[--><!--[--><!--]--><!--]-->GoWind Admin<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/cms/intro.html" aria-label="GoWind CMS"><!--[--><!--[--><!--]--><!--]-->GoWind CMS<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/im/intro.html" aria-label="GoWind IM"><!--[--><!--[--><!--]--><!--]-->GoWind IM<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/uba/intro.html" aria-label="GoWind UBA"><!--[--><!--[--><!--]--><!--]-->GoWind UBA<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/iot/intro.html" aria-label="GoWind IoT"><!--[--><!--[--><!--]--><!--]-->GoWind IoT<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/toolkit/intro.html" aria-label="GoWind Toolkit"><!--[--><!--[--><!--]--><!--]-->GoWind Toolkit<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/quant/intro.html" aria-label="GoWind Quant"><!--[--><!--[--><!--]--><!--]-->GoWind Quant<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/tx7do" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" placeholder="Search" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="é¦é¡µ"><!--[--><!--[--><!--]--><!--]-->é¦é¡µ<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/framework/intro.html" aria-label="æ¡æ¶"><!--[--><!--[--><!--]--><!--]-->æ¡æ¶<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/admin/intro.html" aria-label="GoWind Admin"><!--[--><!--[--><!--]--><!--]-->GoWind Admin<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/cms/intro.html" aria-label="GoWind CMS"><!--[--><!--[--><!--]--><!--]-->GoWind CMS<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/im/intro.html" aria-label="GoWind IM"><!--[--><!--[--><!--]--><!--]-->GoWind IM<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/uba/intro.html" aria-label="GoWind UBA"><!--[--><!--[--><!--]--><!--]-->GoWind UBA<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/iot/intro.html" aria-label="GoWind IoT"><!--[--><!--[--><!--]--><!--]-->GoWind IoT<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/toolkit/intro.html" aria-label="GoWind Toolkit"><!--[--><!--[--><!--]--><!--]-->GoWind Toolkit<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/quant/intro.html" aria-label="GoWind Quant"><!--[--><!--[--><!--]--><!--]-->GoWind Quant<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/tx7do" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="vp-sidebar-items"><!--[--><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading active">ä»ç» <!----></p><ul class="vp-sidebar-children" style=""><!--[--><li><a class="route-link route-link-active auto-link vp-sidebar-item active" href="/admin/intro.html" aria-label="GoWind Admin 产åä»ç»"><!--[--><!--[--><!--]--><!--]-->GoWind Admin 产åä»ç»<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/installation.html" aria-label="GoWind Admin å®è£
æå"><!--[--><!--[--><!--]--><!--]-->GoWind Admin å®è£
æå<!--[--><!--[--><!--]--><!--]--></a><!----></li>
40<!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading">åç«¯ææ¡£ <!----></p><ul class="vp-sidebar-children" style=""><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/admin/backend-architecture.html" aria-label="åç«¯æ¶ææ»è§"><!--[--><!--[--><!--]--><!--]-->åç«¯æ¶ææ»è§<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/backend-modules.html" aria-label="åç«¯æ ¸å¿æ¨¡å详解"><!--[--><!--[--><!--]--><!--]-->åç«¯æ ¸å¿æ¨¡å详解<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/backend-api.html" aria-label="å端 API ä¸ Protobuf å®ä¹"><!--[--><!--[--><!--]--><!--]-->å端 API ä¸ Protobuf å®ä¹<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/backend-config-deploy.html" aria-label="å端é
ç½®ä¸é¨ç½²"><!--[--><!--[--><!--]--><!--]-->å端é
ç½®ä¸é¨ç½²<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/backend-extension.html" aria-label="å端æ©å±å¼å"><!--[--><!--[--><!--]--><!--]-->å端æ©å±å¼å<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading">åç«¯ææ¡£ <!----></p><ul class="vp-sidebar-children" style=""><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/admin/frontend-architecture.html" aria-label="åç«¯æ¶ææ»è§"><!--[--><!--[--><!--]--><!--]-->åç«¯æ¶ææ»è§<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/frontend-modules.html" aria-label="åç«¯æ ¸å¿åè½è¯¦è§£"><!--[--><!--[--><!--]--><!--]-->åç«¯æ ¸å¿åè½è¯¦è§£<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading">äºå¼æç¨ <!----></p><ul class="vp-sidebar-children" style=""><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/admin/backend-tutorial-new-module.html" aria-label="å端æ°å¢ä¸å¡æ¨¡å宿æç¨"><!--[--><!--[--><!--]--><!--]-->å端æ°å¢ä¸å¡æ¨¡å宿æç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/frontend-tutorial-new-page.html" aria-label="å端æ°å¢ä¸å¡é¡µé¢å®ææç¨"><!--[--><!--[--><!--]--><!--]-->å端æ°å¢ä¸å¡é¡µé¢å®ææç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-fullstack-integration.html" aria-label="åå端èè°å®æ´å®ææç¨"><!--[--><!--[--><!--]--><!--]-->åå端èè°å®æ´å®ææç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading">é«çº§æç¨ <!----></p><ul class="vp-sidebar-children" style=""><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-lua-extension.html" aria-label="Lua èæ¬æ©å±å®ææç¨"><!--[--><!--[--><!--]--><!--]-->Lua èæ¬æ©å±å®ææç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-permission-system.html" aria-label="æéç³»ç»æ·±åº¦è§£ææç¨"><!--[--><!--[--><!--]--><!--]-->æéç³»ç»æ·±åº¦è§£ææç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-multi-tenancy.html" aria-label="å¤ç§æ·æ¶æå®ææç¨"><!--[--><!--[--><!--]--><!--]-->å¤ç§æ·æ¶æå®ææç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-task-scheduling.html" aria-label="ä»»å¡è°åº¦ä¸å¼æ¥å¤çæç¨"><!--[--><!--[--><!--]--><!--]-->ä»»å¡è°åº¦ä¸å¼æ¥å¤çæç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-file-storage.html" aria-label="æä»¶ä¸ä¼ ä¸å¯¹è±¡å卿ç¨"><!--[--><!--[--><!--]--><!--]-->æä»¶ä¸ä¼ ä¸å¯¹è±¡å卿ç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-eventbus-architecture.html" aria-label="äºä»¶æ»çº¿ä¸è§£è¦æ¶ææç¨"><!--[--><!--[--><!--]--><!--]-->äºä»¶æ»çº¿ä¸è§£è¦æ¶ææç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-theme-i18n.html" aria-label="å端主é¢å®å¶ä¸å½é
åæç¨"><!--[--><!--[--><!--]--><!--]-->å端主é¢å®å¶ä¸å½é
åæç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-performance-monitoring.html" aria-label="æ§è½ä¼åä¸çæ§æç¨"><!--[--><!--[--><!--]--><!--]-->æ§è½ä¼åä¸çæ§æç¨<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-sse-push.html" aria-label="SSE 宿¶æ¨é"><!--[--><!--[--><!--]--><!--]-->SSE 宿¶æ¨é<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-login-security.html" aria-label="ç»å½çç¥ä¸å®å
¨å åº"><!--[--><!--[--><!--]--><!--]-->ç»å½çç¥ä¸å®å
¨å åº<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/admin/tutorial-crypto-toolkit.html" aria-label="å å¯å·¥å
·å®æ"><!--[--><!--[--><!--]--><!--]-->å å¯å·¥å
·å®æ<!--[--><!--[--><!--]--><!--]--></a><!----></li>
40<!--]--></ul></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h1 id="gowind-admin-产åä»ç»" tabindex="-1"><a class="header-anchor" href="#gowind-admin-产åä»ç»"><span>GoWind Admin 产åä»ç»</span></a></h1><p>GoWind Admin æ¯ä¸å¥é¢åä¸å¤§å项ç®çä¼ä¸çº§ä¸åå°è§£å³æ¹æ¡ï¼åºäº Go å¾®æå¡æ¡æ¶ï¼Kratosï¼æå»ºï¼<strong>éç¨å使¶æé¨ç½²</strong>ï¼åæ¶ä¿æå¾®æå¡çº§å«ç代ç åå±ä¸æ¨¡åå设计ï¼å¯éä¸å¡å¢é¿å¹³æ»æå为微æå¡ãå端æä¾å¤å¥ç°ä»£æ¡æ¶å®ç°ï¼å
·å¤å¼ç®±å³ç¨çåå°ç®¡çè½åãå®åçå¤ç§æ·æéä½ç³»ã丰å¯çç»ä»¶åºå坿©å±çæä»¶æºå¶ã</p><h2 id="ä¸ãæ ¸å¿ç¹æ§" tabindex="-1"><a class="header-anchor" href="#ä¸ãæ ¸å¿ç¹æ§"><span>ä¸ãæ ¸å¿ç¹æ§</span></a></h2><h3 id="_1-ææ¯æ " tabindex="-1"><a class="header-anchor" href="#_1-ææ¯æ "><span>1. ææ¯æ </span></a></h3><table><thead><tr><th>维度</th><th>æ ¸å¿ææ¯</th><th>ä¼å¿è¯´æ</th></tr></thead><tbody><tr><td>å端</td><td>GoãKratos å¾®æå¡æ¡æ¶ãEnt ORMãProtobuf + Buf</td><td>åºäºå¾®æå¡æ¡æ¶çå使¶æï¼æ åå API å®ä¹ä¸ä»£ç çæï¼å¯å¹³æ»æå为微æå¡</td></tr><tr><td>å端</td><td>Vue3 + Ant Design Vue (Vben)ãVue3 + Element PlusãReact + Ant Design</td><td>ä¸å¥å端å®ç°ï¼è¦çä¸»æµ UI æ¡æ¶ï¼æ¯æä¸»é¢å®å¶ãååºå¼å¸å±</td></tr><tr><td>åå¨</td><td>PostgreSQL / MySQLãRedisãMinIO</td><td>å
³ç³»åæ°æ®åº + ç¼å + 对象åå¨ï¼å®æ´çå卿¹æ¡</td></tr><tr><td>ä»»å¡è°åº¦</td><td>Asynq</td><td>åºäº Redis çåå¸å¼ä»»å¡éåï¼æ¯æå®æ¶/å»¶è¿/弿¥ä»»å¡</td></tr><tr><td>æé</td><td>Casbin + OPAãJWT 认è¯</td><td>å弿æéæ ¡éªï¼ç»ç²åº¦è§è²æéæ§å¶ï¼å¤ç§æ·æ°æ®é离</td></tr><tr><td>å·¥ç¨å</td><td>MakefileãDocker ComposeãBuf 代ç çæãESLint/Prettier</td><td>å
¨æµç¨å·¥ç¨å管æ§ï¼ä¸é®æå»ºé¨ç½²</td></tr><tr><td>æ©å±è½å</td><td>Lua / JavaScript èæ¬å¼æãèªå®ä¹ API 模åãEventBus äºä»¶æ»çº¿</td><td>
40çµæ´»æ©å±ä¸å¡é»è¾ï¼æ éä¿®æ¹æ ¸å¿ä»£ç </td></tr></tbody></table><h3 id="_2-æ ¸å¿åè½" tabindex="-1"><a class="header-anchor" href="#_2-æ ¸å¿åè½"><span>2. æ ¸å¿åè½</span></a></h3><ul><li><strong>å¤ç§æ·æ¯æ</strong>ï¼æ¯æä¸å¯¹ä¸/ä¸å¯¹å¤ä¸¤ç§ç§æ·å
³ç³»æ¨¡åï¼åºäº Ent Viewer æºå¶å®ç°åºç¨çº§æ°æ®é离</li><li><strong>å®åçæéä½ç³»</strong>ï¼å端åºäº Casbin/OPA å弿å®ç°æ¥å£çº§æéæ ¡éªï¼å端éé
è·¯ç±/ç»ä»¶/èå级æéæ§å¶</li><li><strong>ä¸å¥å端å®ç°</strong>ï¼Vue Vben (Ant Design Vue)ãVue Element (Element Plus)ãReact (Ant Design)ï¼æééæ©</li><li><strong>æ åå API ä½ç³»</strong>ï¼åºäº Protobuf å®ä¹æ¥å£ï¼èªå¨çæ Go/TypeScript 代ç å OpenAPI ææ¡£</li><li><strong>åå¸å¼ä»»å¡è°åº¦</strong>ï¼åºäº Asynq å®ç°å®æ¶ä»»å¡ãå»¶è¿ä»»å¡å弿¥ä»»å¡ï¼æ¯æä¼å
级éååéè¯çç¥</li><li><strong>æä»¶å卿å¡</strong>ï¼éæ MinIO 对象åå¨ï¼æ¯ææä»¶ä¸ä¼ ãä¸è½½å管ç</li><li><strong>èæ¬å¼ææ©å±</strong>ï¼å
ç½® Lua/JavaScript èæ¬å¼æå EventBusï¼æ¯æèªå®ä¹ API 模åå¼å</li><li><strong>坿æ¬ç¼è¾å¨</strong>ï¼éæ TipTap 坿æ¬ç¼è¾å¨ï¼æ¯æè¡¨æ ¼ã代ç åãå¾çä¸ä¼ ç</li><li><strong>å¤ç¯å¢éé
</strong>ï¼å¼å/æµè¯/ç产ç¯å¢é
ç½®é离ï¼Docker Compose ä¸é®å¯å¨ä¾èµæå¡</li></ul><h2 id="äºãæ¶æè®¾è®¡" tabindex="-1"><a class="header-anchor" href="#äºãæ¶æè®¾è®¡"><span>äºãæ¶æè®¾è®¡</span></a></h2><h3 id="_1-æ´ä½æ¶æ" tabindex="-1"><a class="header-anchor" href="#_1-æ´ä½æ¶æ"><span>1. æ´ä½æ¶æ</span></a></h3><p>GoWind Admin éç¨åå端åç¦»æ¶æï¼æ ¸å¿å为ä¸å±ï¼</p><!--[--><div class="mermaid-actions"><button class="preview-button" title="preview"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1316 1024" fill="currentColor"><path d="M658.286 0C415.89 0 0 297.106 0 512c0 214.82 415.89 512 658.286 512 242.322 0 658.285-294.839 658.285-512S900.608 0 658.286 0zm0 877.714c-161.573 0-512-221.769-512-365.714 0-144.018 350.427-365.714 512-365.714 161.572 0 512 217.16 512 365.714s-350.428 365.714-512 365.714z"/><path d="M658.286 292.571a219.429 219.429 0 1 0 0 438.858 219.429 219.429 0 0 0 0-438.858zm0 292.572a73.143 73.143 0 1 1 0-146.286 73.143 73.143 0 0 1 0 146.286z"/></svg></button><button class="download-button" title="download"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor"><path d="M828.976 894.125H190.189c-70.55 0-127.754-57.185-127.754-127.753V606.674c0-17.634 14.31-31.933 31.933-31.933h63.889c17.634 0 31.932 14.299 31.932 31.933v95.822c0 35.282 28.596 63.877 63.877 63.877h511.033c35.281 0 63.877-28.595 63.877-63.877v-95.822c0-17.634 14.298-31.933 31.943-31.933h63.878c17.635 0 31.933 14.299 31.933 31.933v159.7c0 70.566-57.191 127.751-127.754 127.751zM249.939 267.51c12.921-12.92 33.885-12.92 46.807 0l148.97 148.972V94.893c0-17.634 14.302-31.947 31.934-31.947h63.876c17.638 0 31.946 14.313 31.946 31.947v321.589l148.97-148.972c12.922-12.92 33.876-12.92 46.797 0l46.814 46.818c12.922 12.922 12.922 33.874 0 46.807L552.261 624.93c-1.14 1.138-21.664 13.684-42.315 13.693-20.877.01-41.88-12.542-43.021-13.693L203.122 361.135c-12.923-12.934-12.923-33.885 0-46.807l46.817-46.818z"/></svg></button></div><div class="mermaid-wrapper"><div style="display:flex;align-items:center;justify-content:center;height:96px;" class="mermaid-loading"><span style="--loading-icon: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid' viewBox='25 25 50 50'%3E%3CanimateTransform attributeName='transform' type='rotate' dur='2s' keyTimes='0;1' repeatCount='indefinite' values='0;360'%3E%3C/animateTransform%3E%3Ccircle cx='50' cy='50' r='20' fill='none' stroke='currentColor' stroke-width='4' stroke-linecap='round'%3E%3Canimate attributeName='stroke-dasharray' dur='1.5s' keyTimes='0;0.5;1' repeatCount='indefinite' values='1,200;90,200;1,200'%3E%3C/animate%3E%3Canimate attributeName='stroke-dashoffset' dur='1.5s' keyTimes='0;0.5;1' repeatCount='indefinite' values='0;
40-35px;-125px'%3E%3C/animate%3E%3C/circle%3E%3C/svg%3E");--icon-size: 48px;display: inline-block;width: var(--icon-size);height: var(--icon-size);background-color: currentcolor;-webkit-mask-image: var(--loading-icon);mask-image: var(--loading-icon)"></span></div></div><!--]--><ul><li><strong>å端å±</strong>ï¼ä¸å¥ç¬ç«å端å®ç°ï¼Vue Vben / Vue Element / Reactï¼ï¼æééæ©</li><li><strong>API å±</strong>ï¼åºäº Kratos æ¡æ¶æå»ºçå使å¡ï¼å é¨ä¿æå¾®æå¡çº§å«çå屿¶æï¼æ¯æ HTTP REST + SSE æ¨é + Asynq ä»»å¡è°åº¦ï¼æªæ¥å¯å¹³æ»æå为ç¬ç«å¾®æå¡</li><li><strong>æ°æ®å±</strong>ï¼PostgreSQL/MySQL ä¸»æ°æ®åº + Redis ç¼å/æ¶æ¯éå + MinIO 对象åå¨</li></ul><h3 id="_2-å端项ç®ç»æ" tabindex="-1"><a class="header-anchor" href="#_2-å端项ç®ç»æ"><span>2. å端项ç®ç»æ</span></a></h3><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code><span class="line">backend/</span> 41<span class="line">âââ api/ # Protobuf API å®ä¹ä¸èªå¨çæä»£ç </span> 42<span class="line">â âââ gen/ # èªå¨çæç Go / TypeScript 代ç </span> 43<span class="line">âââ app/ # åºç¨æå¡ä»£ç </span> 44<span class="line">â âââ admin/service/ # Admin æå¡</span> 45<span class="line">â âââ cmd/server/ # æå¡å ¥å£</span> 46<span class="line">â âââ configs/ # æå¡é ç½®ï¼æ°æ®åºãRedisãOSSãæå¡å¨çï¼</span> 47<span class="line">â âââ internal/ # å é¨é»è¾ï¼data/ent/schemaãserviceãserverï¼</span> 48<span class="line">âââ pkg/ # éç¨å·¥å ·å </span> 49<span class="line">â âââ authorizer/ # Casbin/OPA æé弿</span> 50<span class="line">â âââ constants/ # 常éï¼æéãè§è²ãç§æ·ç±»åï¼</span> 51<span class="line">â âââ crypto/ # å å¯å·¥å ·ï¼AES-GCMï¼</span> 52<span class="line">â âââ entgo/ # Ent ORM æ©å±</span> 53<span class="line">â âââ eventbus/ # äºä»¶æ»çº¿</span> 54<span class="line">â âââ jwt/ # JWT å·¥å ·</span> 55<span class="line">â âââ lua/ # Lua èæ¬å¼æ</span> 56<span class="line">â âââ middleware/ # ä¸é´ä»¶ï¼authãent viewerï¼</span> 57<span class="line">â âââ oss/ # 对象åå¨ï¼MinIOï¼</span> 58<span class="line">â âââ task/ # ä»»å¡ç±»åå®ä¹</span> 59<span class="line">âââ scripts/ # èªå¨åèæ¬</span> 60<span class="line">â âââ env/ # ç¯å¢å®è£ èæ¬ï¼Windows/Unixï¼</span> 61<span class="line">â âââ docker/ # Docker é¨ç½²èæ¬</span> 62<span class="line">â âââ deploy/ # PM2 é¨ç½²èæ¬</span> 63<span class="line">âââ sql/ # æ°æ®åºåå§åèæ¬</span> 64<span class="line">âââ docker-compose.yaml # å ¨éé¨ç½²ï¼åºç¨ + ä¾èµï¼</span> 65<span class="line">âââ docker-compose.libs.yaml # ä» ä¾èµæå¡</span> 66<span class="line">âââ Makefile # èªå¨åæå»ºæä»¤</span> 67<span class="line">
67âââ Dockerfile # Docker éåæå»ºï¼å¤é¶æ®µï¼</span> 68<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_3-å端项ç®ç»æ" tabindex="-1"><a class="header-anchor" href="#_3-å端项ç®ç»æ"><span>3. å端项ç®ç»æ</span></a></h3><p>GoWind Admin æä¾ä¸å¥å端å®ç°ï¼åä½äº <code>frontend/admin/</code> ç®å½ï¼</p><table><thead><tr><th>åç«¯çæ¬</th><th>ç®å½</th><th>UI æ¡æ¶</th><th>å¼å端å£</th></tr></thead><tbody><tr><td>Vue Vben</td><td><code>vue-vben/</code></td><td>Ant Design Vue</td><td>5666</td></tr><tr><td>Vue Element</td><td><code>vue-element/</code></td><td>Element Plus</td><td>3000</td></tr><tr><td>React</td><td><code>react/</code></td><td>Ant Design</td><td>7000</td></tr></tbody></table><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code><span class="line">frontend/admin/</span> 69<span class="line">âââ vue-vben/ # Vue Vben çï¼Monorepoï¼</span> 70<span class="line">â âââ apps/admin/ # 管ç端åºç¨</span> 71<span class="line">â âââ packages/ # éç¨å ï¼ç»ä»¶åºãå·¥å ·ãå½é åï¼</span> 72<span class="line">â âââ scripts/deploy/ # Docker é¨ç½²èæ¬</span> 73<span class="line">âââ vue-element/ # Vue Element ç</span> 74<span class="line">â âââ src/pages/ # ä¸å¡é¡µé¢</span> 75<span class="line">â âââ src/core/ # æ ¸å¿é»è¾ï¼å好ãi18nãè·¯ç±ï¼</span> 76<span class="line">â âââ src/utils/ # å·¥å ·å½æ°</span> 77<span class="line">âââ react/ # React ç</span> 78<span class="line"> âââ src/pages/ # ä¸å¡é¡µé¢</span> 79<span class="line"> âââ src/core/ # æ ¸å¿é»è¾ï¼å好ãi18nï¼</span> 80<span class="line"> âââ src/locales/ # å½é åèµæº</span> 81<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="ä¸ãå¿«éä½éª" tabindex="-1"><a class="header-anchor" href="#ä¸ãå¿«éä½éª"><span>ä¸ãå¿«éä½éª</span></a></h2><h3 id="_1-ç¯å¢åå¤" tabindex="-1"><a class="header-anchor" href="#_1-ç¯å¢åå¤"><span>1. ç¯å¢åå¤</span></a></h3><ul><li><strong>å端</strong>ï¼å®è£ GoãDockerãBufãMake</li><li><strong>å端</strong>ï¼å®è£ Node.js 16+ãpnpm</li></ul><p>详ç»å®è£ æ¥éª¤è¯·åè <a class="route-link" href="/admin/installation.html">å®è£ æå</a>ã</p><h3 id="_2-å¨çº¿æ¼ç¤º" tabindex="-1"><a class="header-anchor" href="#_2-å¨çº¿æ¼ç¤º"><span>2. å¨çº¿æ¼ç¤º</span></a></h3><p>æ éé¨ç½²ï¼ç´æ¥ä½éªå®æ´åè½ï¼</p><ul><li><strong>å端管ç页é¢</strong>ï¼<a href="https://demo.admin.gowind.cloud" target="_blank" rel="noopener noreferrer">https://demo.admin.gowind.cloud</a></li><li><strong>å端 API ææ¡£ï¼Swaggerï¼</strong>ï¼<a href="https://api.demo.admin.gowind.cloud/docs/" target="_blank" rel="noopener noreferrer">https://api.demo.admin.gowind.cloud/docs/</a></li><li><strong>é»è®¤è´¦å·å¯ç </strong>ï¼<code>admin</code> / <code>admin</code></li></ul><h3 id="_3-ä¸é®å¯å¨" tabindex="-1"><a class="header-anchor" href="#_3-ä¸é®å¯å¨"><span>3. ä¸é®å¯å¨</span></a></h3><h4 id="å端å¯å¨" tabindex="-1"><a class="header-anchor" href="#å端å¯å¨"><span>å端å¯å¨</span></a></h4><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token function">git</span> clone https://github.com/tx7do/go-wind-admin.git</span> 82<span class="line"></span> 83<span class="line"><span class="token builtin class-name">cd</span> go-wind-admin/backend</span> 84<span class="line"></span> 85<span class="line"><span class="token comment"># å®è£ ä¾èµæä»¶å CLI å·¥å ·</span></span> 86<span class="line"><span class="token function">make</span> init</span> 87<span class="line"></span> 88<span class="line"><span class="token comment"># å¯å¨ä¾èµæå¡ï¼PostgreSQL / Redis / MinIOï¼</span></span> 89<span class="line"><span class="token function">make</span> docker-libs</span> 90<span class="line"></span> 91<span class="line"><span class="token comment"># å¯å¨å端æå¡</span></span> 92<span class="line">gow run admin</span> 93<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="å端å¯å¨" tabindex="-1"><a class="header-anchor" href="#å端å¯å¨"><span>å端å¯å¨</span></a></h4><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token builtin class-name">cd</span> go-wind-admin/frontend/admin</span> 94<span class="line"></span> 95<span class="line"><span class="token comment"># Vue Vben çæ¬</span></span> 96<span class="line"></span> 97<span class="line"><span class="token builtin class-name">cd</span> vue-vben</span> 98<span class="line"><span class="token function">pnpm</span> <span class="token function">install</span></span> 99<span class="line"><span class="token function">pnpm</span> dev:antd</span> 100<span class="line"></span> 101<span class="line"><span class="token comment"># Vue Element çæ¬</span></span> 102<span class="line"><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/vue-element</span> 103<span class="line"><span class="token function">pnpm</span> <span class="token function">install</span></span> 104<span class="line"><span class="token function">pnpm</span> dev</span> 105<span class="line"></span> 106<span class="line"><span class="token comment"># React çæ¬</span></span> 107<span class="line"><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/react</span> 108<span class="line"><span class="token function">pnpm</span> <span class="token function">install</span></span> 109<span class="line"><span class="token function">pnpm</span> dev</span> 110<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_4-访é®å°å" tabindex="-1"><a class="header-anchor" href="#_4-访é®å°å"><span>4. 访é®å°å</span></a></h3><table><thead><tr><th>
110æå¡</th><th>å°å</th></tr></thead><tbody><tr><td>Vue Vben å端</td><td><a href="http://localhost:5666" target="_blank" rel="noopener noreferrer">http://localhost:5666</a></td></tr><tr><td>Vue Element å端</td><td><a href="http://localhost:3000" target="_blank" rel="noopener noreferrer">http://localhost:3000</a></td></tr><tr><td>React å端</td><td><a href="http://localhost:7000" target="_blank" rel="noopener noreferrer">http://localhost:7000</a></td></tr><tr><td>å端 REST API</td><td><a href="http://localhost:7788" target="_blank" rel="noopener noreferrer">http://localhost:7788</a></td></tr><tr><td>å端 Swagger ææ¡£</td><td><a href="http://localhost:7788/docs/" target="_blank" rel="noopener noreferrer">http://localhost:7788/docs/</a></td></tr><tr><td>å端 SSE æå¡</td><td><a href="http://localhost:7789/events" target="_blank" rel="noopener noreferrer">http://localhost:7789/events</a></td></tr><tr><td>MinIO æ§å¶å°</td><td><a href="http://localhost:9001" target="_blank" rel="noopener noreferrer">http://localhost:9001</a></td></tr></tbody></table><h2 id="åãæ ¸å¿è½å详解" tabindex="-1"><a class="header-anchor" href="#åãæ ¸å¿è½å详解"><span>åãæ ¸å¿è½å详解</span></a></h2><h3 id="_1-å¤ç§æ·ä¸æéä½ç³»" tabindex="-1"><a class="header-anchor" href="#_1-å¤ç§æ·ä¸æéä½ç³»"><span>1. å¤ç§æ·ä¸æéä½ç³»</span></a></h3><p>GoWind Admin å ç½®å¤ç§æ·æ¯æï¼æä¾ä¸¤ç§ç§æ·å ³ç³»æ¨¡åï¼</p><ul><li><strong>ä¸å¯¹ä¸</strong>ï¼æ¯ä¸ªç¨æ·åªå±äºä¸ä¸ªç§æ·ï¼éè¿ <code>user_role</code> å ³èè§è²</li><li><strong>ä¸å¯¹å¤</strong>ï¼æ¯ä¸ªç¨æ·å¯å±äºå¤ä¸ªç§æ·ï¼éè¿ <code>membership</code> 表管ç身份</li></ul><p>æéä½ç³»åºäºåå¼ææ¶æï¼</p><ul><li><strong>认è¯ï¼Authenticationï¼</strong>ï¼JWT Token å åµç¨æ· IDãç§æ· IDãè§è²ãæ°æ®æéèå´</li><li><strong>ææï¼Authorizationï¼</strong>ï¼Casbin + OPA åå¼æï¼æ¯æ RBAC / ABAC æé模å</li><li><strong>æ°æ®é离</strong>ï¼éè¿ Ent Viewer æºå¶èªå¨æ³¨å ¥ç§æ·è¿æ»¤ï¼æ éæå¨æ·»å WHERE æ¡ä»¶</li><li><strong>å端éé </strong>ï¼è·¯ç±å®å«ãç»ä»¶çº§æéãèåå¯è§æ§æ§å¶</li></ul><p>è¯¦è§ <a class="route-link" href="/admin/tutorial-permission-system.html">æéç³»ç»æ·±åº¦è§£æ</a> å <a class="route-link" href="/admin/tutorial-multi-tenancy.html">å¤ç§æ·æ¶æå®æ</a>ã</p><h3 id="_2-æ åå-api-å¼å" tabindex="-1"><a class="header-anchor" href="#_2-æ åå-api-å¼å"><span>2. æ åå API å¼å</span></a></h3><p>åºäº Protobuf å®ä¹æ¥å£ï¼éè¿ Buf èªå¨çæï¼</p><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># çæ Go æå¡ç«¯ä»£ç </span></span> 111<span class="line"><span class="token function">make</span> api</span> 112<span class="line"></span> 113<span class="line"><span class="token comment"># çæ OpenAPI ææ¡£</span></span> 114<span class="line"><span class="token function">make</span> openapi</span> 115<span class="line"></span> 116<span class="line"><span class="token comment"># çæ TypeScript å端请æ±ä»£ç </span></span> 117<span class="line"><span class="token function">make</span> ts</span> 118<span class="line"></span> 119<span class="line"><span class="token comment"># ä¸é®çæææï¼Ent + Wire + API + OpenAPIï¼</span></span> 120<span class="line"><span class="token function">make</span> gen</span> 121<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_3-ä»»å¡è°åº¦" tabindex="-1"><a class="header-anchor" href="#_3-ä»»å¡è°åº¦"><span>3. ä»»å¡è°åº¦</span></a></h3><p>åºäº Asynq å®ç°åå¸å¼ä»»å¡éåï¼</p><ul><li><strong>ç«å³ä»»å¡</strong>
121ï¼åéé®ä»¶ãçä¿¡éç¥</li><li><strong>å»¶è¿ä»»å¡</strong>ï¼è®¢åè¶ æ¶èªå¨åæ¶</li><li><strong>宿¶ä»»å¡</strong>ï¼æ¯æ¥æ°æ®æ¥è¡¨ãå®ææ°æ®æ¸ ç</li><li>æ¯æä¼å 级éåï¼critical / default / lowï¼åèªå¨éè¯</li><li>æä¾ Asynqmon Web UI çæ§ä»»å¡ç¶æ</li></ul><p>è¯¦è§ <a class="route-link" href="/admin/tutorial-task-scheduling.html">ä»»å¡è°åº¦ä¸å¼æ¥å¤çæç¨</a>ã</p><h3 id="_4-æ©å±å¼å" tabindex="-1"><a class="header-anchor" href="#_4-æ©å±å¼å"><span>4. æ©å±å¼å</span></a></h3><h4 id="å端æ©å±-èæ¬å¼æ" tabindex="-1"><a class="header-anchor" href="#å端æ©å±-èæ¬å¼æ"><span>å端æ©å±ï¼èæ¬å¼æï¼</span></a></h4><p>å ç½® Lua/JavaScript èæ¬å¼æå EventBus äºä»¶æ»çº¿ï¼æ¯ææ éç¼è¯çä¸å¡é»è¾æ©å±ï¼</p><div class="language-lua line-numbers-mode" data-highlighter="prismjs" data-ext="lua"><pre><code><span class="line"><span class="token comment">-- çå¬ç¨æ·å建äºä»¶ï¼èªå¨æé欢è¿é®ä»¶ä»»å¡</span></span> 122<span class="line">eventbus<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token string">"user.created"</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span>event<span class="token punctuation">)</span></span> 123<span class="line"> task<span class="token punctuation">.</span><span class="token function">enqueue</span><span class="token punctuation">(</span><span class="token string">"send_welcome_email"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span></span> 124<span class="line"> user_id <span class="token operator">=</span> event<span class="token punctuation">.</span>user_id<span class="token punctuation">,</span></span> 125<span class="line"> email <span class="token operator">=</span> event<span class="token punctuation">.</span>email</span> 126<span class="line"> <span class="token punctuation">}</span><span class="token punctuation">)</span></span> 127<span class="line"><span class="token keyword">end</span><span class="token punctuation">)</span></span> 128<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>è¯¦è§ <a class="route-link" href="/admin/tutorial-lua-extension.html">Lua èæ¬æ©å±å®æ</a> å <a class="route-link" href="/admin/tutorial-eventbus-architecture.html">äºä»¶æ»çº¿æ¶æ</a>ã</p><h4 id="å端æ©å±-ç»ä»¶å¼å" tabindex="-1"><a class="header-anchor" href="#å端æ©å±-ç»ä»¶å¼å"><span>å端æ©å±ï¼ç»ä»¶å¼åï¼</span></a></h4><p>å¤ç¨éç¨ç»ä»¶åºå¿«éå¼åä¸å¡é¡µé¢ï¼ä¸å¥åç«¯åæ¯æèªå®ä¹ç»ä»¶æ©å±ã</p><h3 id="_5-æä»¶åå¨" tabindex="-1"><a class="header-anchor" href="#_5-æä»¶åå¨"><span>5. æä»¶åå¨</span></a></h3><p>éæ MinIO 对象å卿å¡ï¼æ¯ææä»¶ä¸ä¼ ãä¸è½½å管çï¼é ç½®åçå卿¡¶çç¥ã</p><p>è¯¦è§ <a class="route-link" href="/admin/tutorial-file-storage.html">æä»¶å卿塿ç¨</a>ã</p><h3 id="_6-坿æ¬ç¼è¾å¨" tabindex="-1"><a class="header-anchor" href="#_6-坿æ¬ç¼è¾å¨"><span>6. 坿æ¬ç¼è¾å¨</span></a></h3><p>Vue Element å React çæ¬éæ TipTap 坿æ¬ç¼è¾å¨ï¼æ¯æï¼</p><ul><li>æ ¼å¼åææ¬ãè¡¨æ ¼ã代ç åãå ¬å¼</li><li>å¾çä¸ä¼ </li><li>é¢è²ãé«äº®ãæ é¢çå¯ææ¬æ ·å¼</li></ul><h2 id="äºãå·¥ç¨åä¸è§è" tabindex="-1"><a class="header-anchor" href="#äºãå·¥ç¨åä¸è§è"><span>äºãå·¥ç¨åä¸è§è</span></a></h2><h3 id="_1-代ç è§è" tabindex="-1"><a class="header-anchor" href="#_1-代ç è§è"><span>1. 代ç è§è</span></a></h3><ul><li><strong>å端</strong>ï¼Go 代ç éµå¾ª golangci-lint è§èï¼éè¿ <code>make lint</code> èªå¨æ ¡éª</li><li><strong>å端</strong>ï¼ESLint + Prettier è§èï¼ä¿é代ç 飿 ¼ä¸è´</li><li><strong>API å®ä¹</strong>ï¼Protobuf æ¥å£å®ä¹æ ååï¼Buf æ ¼å¼åå lint æ£æ¥</li></ul><h3 id="_2-æå»ºä¸é¨ç½²" tabindex="-1"><a class="header-anchor" href="#_2-æå»ºä¸é¨ç½²"><span>2. æå»ºä¸é¨ç½²</span></a></h3><!--[--><div class="mermaid-actions"><button class="preview-button" title="preview"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1316 1024" fill="currentColor"><path d="M658.286 0C415.89 0 0 297.106 0 512c0 214.82 415.89 512 658.286 512 242.322 0 658.285-294.839 658.285-512S900.608 0 658.286 0zm0 877.714c-161.573 0-512-221.769-512-365.714 0-144.018 350.427-365.714 512-365.714 161.572 0 512 217.16 512 365.714s-350.428 365.714-512 365.714z"/><path d="M658.286 292.571a219.429 219.429 0 1 0 0 438.858 219.429 219.429 0 0 0 0-438.858zm0 292.572a73.143 73.143 0 1 1 0-146.286 73.143 73.143 0 0 1 0 146.286z"/></svg></button><button class="download-button" title="download"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor"><path d="M828.976 894.125H190.189c-70.55 0-127.754-57.185-127.754-127.753V606.674c0-17.634 14.31-31.933 31.933-31.933h63.889c17.634 0 31.932 14.299 31.932 31.933v95.822c0 35.282 28.596 63.877 63.877 63.877h511.033c35.281 0 63.877-28.595 63.877-63.877v-95.822c0-17.634 14.298-31.933 31.943-31.933h63.878c17.635 0 31.933 14.299 31.933 31.933v159.7c0 70.566-57.191 127.751-127.754 127.751zM249.939 267.51c12.921-12.92 33.885-12.92 46.807 0l148.97 148.972V94.893c0-17.634 14.302-31.947 31.934-31.947h63.876c17.638 0 31.946 14.313 31.946 31.947v321.589l148.97-148.972c12.922-12.92 33.876-12.92 46.797 0l46.814 46.818c12.922 12.922 12.922 33.874 0 46.807L552.261 624.93c-1.14 1.138-21.664 13.684-42.3
12815 13.693-20.877.01-41.88-12.542-43.021-13.693L203.122 361.135c-12.923-12.934-12.923-33.885 0-46.807l46.817-46.818z"/></svg></button></div><div class="mermaid-wrapper"><div style="display:flex;align-items:center;justify-content:center;height:96px;" class="mermaid-loading"><span style="--loading-icon: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='xMidYMid' viewBox='25 25 50 50'%3E%3CanimateTransform attributeName='transform' type='rotate' dur='2s' keyTimes='0;1' repeatCount='indefinite' values='0;360'%3E%3C/animateTransform%3E%3Ccircle cx='50' cy='50' r='20' fill='none' stroke='currentColor' stroke-width='4' stroke-linecap='round'%3E%3Canimate attributeName='stroke-dasharray' dur='1.5s' keyTimes='0;0.5;1' repeatCount='indefinite' values='1,200;90,200;1,200'%3E%3C/animate%3E%3Canimate attributeName='stroke-dashoffset' dur='1.5s' keyTimes='0;0.5;1' repeatCount='indefinite' values='0;-35px;-125px'%3E%3C/animate%3E%3C/circle%3E%3C/svg%3E");--icon-size: 48px;display: inline-block;width: var(--icon-size);height: var(--icon-size);background-color: currentcolor;-webkit-mask-image: var(--loading-icon);mask-image: var(--loading-icon)"></span></div></div><!--]--><ul><li><strong>å
¨ Docker é¨ç½²</strong>ï¼<code>make docker-up</code>ï¼ä¸æ¹ä¸é´ä»¶åå¾®æå¡åè¿è¡å¨ Docker 容å¨ä¸</li><li><strong>æ··åé¨ç½²</strong>ï¼Docker è¿è¡ä¸é´ä»¶ + PM2 管ç宿主æºå¾®æå¡</li><li><strong>å端é¨ç½²</strong>ï¼éæèµæºæå»ºï¼<code>pnpm build</code>ï¼æ Docker éå</li></ul><p>è¯¦è§ <a class="route-link" href="/admin/installation.html">å®è£
æå</a>ã</p><h2 id="å
ã弿ºåè®®ä¸çæ" tabindex="-1"><a class="header-anchor" href="#å
ã弿ºåè®®ä¸çæ"><span>å
ã弿ºåè®®ä¸çæ</span></a></h2><p>GoWind Admin åºäº MIT åè®®å¼æºï¼å¯èªç±ç¨äºåä¸é¡¹ç®ã</p><p>æ ¸å¿çæä¾èµï¼</p><ul><li><strong>åç«¯æ¡æ¶</strong>ï¼<a href="https://go-kratos.dev/docs/" target="_blank" rel="noopener noreferrer">Kratos</a> å¾®æå¡æ¡æ¶ã<a href="https://entgo.io/" target="_blank" rel="noopener noreferrer">Ent</a> ORMã<a href="https://buf.build/" target="_blank" rel="noopener noreferrer">Buf</a> å·¥å
·é¾</li><li><strong>åç«¯æ¡æ¶</strong>ï¼<a href="https://doc.vben.pro" target="_blank" rel="noopener noreferrer">Vben Admin</a>ã<a href="https://antdv.com/" target="_blank" rel="noopener noreferrer">Ant Design Vue</a>ã<a href="https://element-plus.org/" target="_blank" rel="noopener noreferrer">Element Plus</a>ã<a href="https://ant.design/" target="_blank" rel="noopener noreferrer">Ant Design</a></li><li><strong>åºç¡è®¾æ½</strong>ï¼<a href="https://github.com/hibiken/asynq" target="_blank" rel="noopener noreferrer">Asynq</a> ä»»å¡éåã<a href="https://casbin.org/" target="_blank" rel="noopener noreferrer">Casbin</a> æé弿ã<a href="https://min.io/" target="_blank" rel="noopener noreferrer">MinIO</a> 对象åå¨</li></ul><h2 id="ä¸ãéç¨åºæ¯" tabindex="-1"><a class="header-anchor" href="#ä¸ãéç¨åºæ¯"><span>ä¸ãéç¨åºæ¯</span></a></h2><ul><li>ä¼ä¸çº§ä¸åå°ç³»ç»å¼å</li><li>SaaS å¤ç§æ·å¹³å°å»ºè®¾</li><li>åºäºå¾®æå¡æ¡æ¶çå使¶æç®¡çå¹³å°</li><li>éè¦å¿«é交ä»ãææ©å±çåå°é¡¹ç®</li><li>对æé管æ§ãå·¥ç¨åæé«è¦æ±çå¢é</li></ul><h2 id="å
«ãç¸å
³èµæº" tabindex="-1"><a class="header-anchor" href="#å
«ãç¸å
³èµæº"><span>å
«ãç¸å
³èµæº</span></a></h2><ul><li>æºç ä»åºï¼<a href="https://github.com/tx7do/go-wind-admin" target="_blank" rel="noopener noreferrer">GitHub</a>ã<a href="https://gitee.com/tx7do/go-wind-admin" target="_blank" rel="noopener noreferrer">Gitee</a></li><li>ææ¯ç«ç¹ï¼<a href="https://www.gowind.cloud" target="_blank" rel="noopener noreferrer">https://www.gowind.cloud</a></li><li><a class="route-link" href="/admin/installation.html">å®è£
æå</a></li><li><a class="route-link" href="/admin/backend-architecture.html">åç«¯æ¶æè®¾è®¡</a></li><li><a class="route-link" href="/admin/frontend-architecture.html">åç«¯æ¶æè®¾è®¡</a></li></ul></div><!--[--><!--]--></div><footer class="vp-page-meta"><div class="vp-meta-item edit-link"><a class="auto-link external-link label" href="https://github.com/tx7do/edit/main/admin/intro.md" aria-label="Edit this page" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><svg class="edit-icon" viewbox="0 0 1024 1024"><g fill="currentColor"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 8
1286.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></g></svg><!--]--><!--]-->Edit this page<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">Last Updated:: </span><time class="meta-item-info" datetime="2026-06-05T04:42:07.000Z" data-allow-mismatch>6/5/26, 12:42 PM</time></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: [email protected]">Bobo</span><!----><!--]--><!--]--></span></div></div></footer><nav class="vp-page-nav" aria-label="page navigation"><!----><a class="route-link auto-link next" href="/admin/installation.html" aria-label="GoWind Admin å®è£ æå"><!--[--><div class="hint">Next <span class="arrow right"></span></div><div class="link"><span class="external-link">GoWind Admin å®è£ æå</span></div><!--]--></a></nav><!--[--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div> 129
129<script type="module" src="/assets/app-B7HVJ7q3.js" defer></script>
129 130 </body> 131</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.