473 lines
200 KiB
HTML
473 lines
200 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN" dir="ltr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>2.8 Docker 快速体验 | 小蚂蚁云</title>
|
||
<meta name="description" content="RXThinkCMF 企业级前后端分离后台管理系统 - Laravel 13 + Vue3 + NaiveUI">
|
||
<meta name="generator" content="VitePress v1.3.4">
|
||
<link rel="preload stylesheet" href="/assets/style.bvRZWfHW.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.Ccv6ul3o.js"></script>
|
||
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.BAYk2F26.js">
|
||
<link rel="modulepreload" href="/assets/chunks/framework.BbmSSMjL.js">
|
||
<link rel="modulepreload" href="/assets/zh_quickstart_docker.md.DvE63qVu.lean.js">
|
||
<link rel="icon" type="image/svg+xml" href="/logo.svg">
|
||
<link rel="icon" type="image/png" href="/logo.png">
|
||
<meta property="og:type" content="website">
|
||
<meta property="twitter:card" content="summary_large_image">
|
||
<meta property="twitter:image" content="/social.png">
|
||
<script src="/banner.js" async type="text/javascript"></script>
|
||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"light",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||
<meta property="og:url" content="https://www.rxthink.cn">
|
||
<meta property="og:description" content="RXThinkCMF 企业级前后端分离后台管理系统 - Laravel 13 + Vue3 + NaiveUI">
|
||
<meta property="twitter:url" content="https://www.rxthink.cn">
|
||
<meta property="twitter:title" content="RXThinkCMF Laravel13+NaiveUI 开发文档">
|
||
<meta property="twitter:description" content="RXThinkCMF 企业级前后端分离后台管理系统 - Laravel 13 + Vue3 + NaiveUI">
|
||
<script>var _hmt=_hmt||[];(function(){var e=document.createElement("script");e.src="https://hm.baidu.com/hm.js?4f06f01017cdd5c1a95a58a6787f4d10";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})();</script>
|
||
</head>
|
||
<body>
|
||
<div id="app"><div class="Layout" data-v-4dae6186><!--[--><!--]--><!--[--><span tabindex="-1" data-v-b1d023f7></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-b1d023f7> Skip to content </a><!--]--><!----><header class="VPNav" data-v-4dae6186 data-v-6677dd63><div class="VPNavBar" data-v-6677dd63 data-v-9ee283ce><div class="wrapper" data-v-9ee283ce><div class="container" data-v-9ee283ce><div class="title" data-v-9ee283ce><div class="VPNavBarTitle has-sidebar" data-v-9ee283ce data-v-a535d338><a class="title" href="/" data-v-a535d338><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-6214f9fb><!--]--><span data-v-a535d338>小蚂蚁云</span><!--[--><!--]--></a></div></div><div class="content" data-v-9ee283ce><div class="content-body" data-v-9ee283ce><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9ee283ce><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9ee283ce data-v-b192e9c1><span id="main-nav-aria-label" class="visually-hidden" data-v-b192e9c1> Main Navigation </span><!--[--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://www.rxthink.cn" target="_blank" rel="noreferrer" tabindex="0" data-v-b192e9c1 data-v-5fb253b1><!--[--><span data-v-5fb253b1>官网</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://www.rxthink.cn/goods/detail/2" target="_blank" rel="noreferrer" tabindex="0" data-v-b192e9c1 data-v-5fb253b1><!--[--><span data-v-5fb253b1>授权</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-b192e9c1 data-v-223824a4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-223824a4><span class="text" data-v-223824a4><!----><span data-v-223824a4>部署文档</span><span class="vpi-chevron-down text-icon" data-v-223824a4></span></span></button><div class="menu" data-v-223824a4><div class="VPMenu" data-v-223824a4 data-v-b6be4b39><div class="items" data-v-b6be4b39><!--[--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF混编版ThinkPHP6+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP6+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp6.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF混编版ThinkPHP8+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP8+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.thinkphp8.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF混编版Laravel13+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离Laravel13+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离Laravel13+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://docs.laravel13.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离Laravel13+NaiveUI版本<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-b192e9c1 data-v-223824a4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-223824a4><span class="text" data-v-223824a4><!----><span data-v-223824a4>在线演示</span><span class="vpi-chevron-down text-icon" data-v-223824a4></span></span></button><div class="menu" data-v-223824a4><div class="VPMenu" data-v-223824a4 data-v-b6be4b39><div class="items" data-v-b6be4b39><!--[--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF混编版ThinkPHP6+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP6+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp6.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF混编版ThinkPHP8+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP8+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.thinkphp8.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.layui.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF混编版Laravel13+Layui版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.elevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离Laravel13+ElementPlus版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.antdvue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离Laravel13+AntDesign版本<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="http://manage.laravel13.naivevue.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->RXThinkCMF前后端分离Laravel13+NaiveUI版本<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/zh/other/sponsor.html" tabindex="0" data-v-b192e9c1 data-v-5fb253b1><!--[--><span data-v-5fb253b1>广告赞助</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-b192e9c1 data-v-223824a4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-223824a4><span class="text" data-v-223824a4><!----><span data-v-223824a4>相关链接</span><span class="vpi-chevron-down text-icon" data-v-223824a4></span></span></button><div class="menu" data-v-223824a4><div class="VPMenu" data-v-223824a4 data-v-b6be4b39><div class="items" data-v-b6be4b39><!--[--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="https://www.rxthink.cn" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->官方网站<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->Gitee 仓库<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="https://laravel.com/" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->Laravel 官网<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="https://cn.vuejs.org/" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->Vue3 文档<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b6be4b39 data-v-f956f3ad><a class="VPLink link vp-external-link-icon" href="https://www.naiveui.com/" target="_blank" rel="noreferrer" data-v-f956f3ad><!--[-->NaiveUI<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9ee283ce data-v-0b7bb029><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-0b7bb029 data-v-fef60102 data-v-3a5bff6c><span class="check" data-v-3a5bff6c><span class="icon" data-v-3a5bff6c><!--[--><span class="vpi-sun sun" data-v-fef60102></span><span class="vpi-moon moon" data-v-fef60102></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9ee283ce data-v-929d9abf data-v-9e0f05cc><!--[--><a class="VPSocialLink no-icon" href="https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue" aria-label="github" target="_blank" rel="noopener" data-v-9e0f05cc data-v-d8bc420f><span class="vpi-social-github" /></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9ee283ce data-v-78391181 data-v-223824a4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-223824a4><span class="vpi-more-horizontal icon" data-v-223824a4></span></button><div class="menu" data-v-223824a4><div class="VPMenu" data-v-223824a4 data-v-b6be4b39><!----><!--[--><!--[--><!----><div class="group" data-v-78391181><div class="item appearance" data-v-78391181><p class="label" data-v-78391181>Appearance</p><div class="appearance-action" data-v-78391181><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-78391181 data-v-fef60102 data-v-3a5bff6c><span class="check" data-v-3a5bff6c><span class="icon" data-v-3a5bff6c><!--[--><span class="vpi-sun sun" data-v-fef60102></span><span class="vpi-moon moon" data-v-fef60102></span><!--]--></span></span></button></div></div></div><div class="group" data-v-78391181><div class="item social-links" data-v-78391181><div class="VPSocialLinks social-links-list" data-v-78391181 data-v-9e0f05cc><!--[--><a class="VPSocialLink no-icon" href="https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue" aria-label="github" target="_blank" rel="noopener" data-v-9e0f05cc data-v-d8bc420f><span class="vpi-social-github" /></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9ee283ce data-v-9173bc9b><span class="container" data-v-9173bc9b><span class="top" data-v-9173bc9b></span><span class="middle" data-v-9173bc9b></span><span class="bottom" data-v-9173bc9b></span></span></button></div></div></div></div><div class="divider" data-v-9ee283ce><div class="divider-line" data-v-9ee283ce></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-4dae6186 data-v-b4df0add><div class="container" data-v-b4df0add><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-b4df0add><span class="vpi-align-left menu-icon" data-v-b4df0add></span><span class="menu-text" data-v-b4df0add>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-b4df0add data-v-3a3ce8d3><button data-v-3a3ce8d3>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-4dae6186 data-v-bf80c8a3><div class="curtain" data-v-bf80c8a3></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-bf80c8a3><span class="visually-hidden" id="sidebar-aria-label" data-v-bf80c8a3> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>📖 1. 了解项目</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/introduction.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>1.1 项目介绍</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/why.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>1.2 为什么选择我们</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/directory.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>1.3 项目目录结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/course.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>1.4 新手入门指南</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tech-stack.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>1.5 技术栈说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/changelog.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>1.6 更新日志</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible has-active" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🚀 2. 快速入门</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/environment.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.1 开发环境准备</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/laragon.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.2 Laragon 环境搭建</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/backend-start.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.3 后端服务启动</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/frontend-start.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.4 前端服务启动</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/database-init.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.5 数据库初始化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/env-vars.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.6 环境变量配置</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/first-api.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.7 第一个接口调试</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/docker.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.8 Docker 快速体验</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/quickstart/faq.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>2.9 常见问题 FAQ</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🧪 3. 模块开发实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/overview.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.1 概述与目标</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/database.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.2 数据库建表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/model.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.3 模型层开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/validator.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.4 FormRequest 验证器</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/logic.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.5 Service 层开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/controller.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.6 控制器开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/route.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.7 路由注册</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/permission.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.8 权限节点配置</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/frontend-integration.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.9 前端联调指引</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/code-list.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.10 完整代码清单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/guide/faq.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>3.11 常见问题与排错</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🏛️ 4. 架构设计</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/overview.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.1 整体架构概览</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/request-flow.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.2 请求处理链路</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/backend-layer.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.3 后端分层架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/frontend-layer.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.4 前端分层架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/directory-design.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.5 目录结构设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/base-classes.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.6 核心基类体系</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/cross-cutting.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.7 横切机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/cache.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.8 缓存架构设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/database-design.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.9 数据库设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/security.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.10 安全架构设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/architecture/extensibility.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>4.11 扩展性设计</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🔐 5. 核心功能</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>认证与安全</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/jwt.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.1 用户认证(JWT)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/auth-flow.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.2 认证流程实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/captcha.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.3 验证码机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/rbac.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.4 权限管理(RBAC)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/cors.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.5 跨域资源共享</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/password.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.6 密码加密服务</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/demo-mode.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.7 演示模式</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>数据与配置</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/tenant.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.8 多租户隔离</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/data-scope.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.9 数据权限</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/dict.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.10 字典模块</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/dict-guide.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.11 字典配置与使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/config.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.12 系统配置管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/param.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.13 系统参数管理</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>日志与监控</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/operation-log.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.14 操作日志</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/login-log.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.15 登录日志</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>响应与异常</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/exception.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.16 统一响应与异常抛出</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>注解系统</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/core/attributes.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>5.17 注解系统总览</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>📦 6. 业务模块</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/user.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.1 用户管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/role.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.2 角色管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/menu.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.3 菜单管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/dept.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.4 部门管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/level.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.5 职级管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/position.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.6 岗位管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/article.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.7 文章管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/content.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.8 公告与链接管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/city.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.9 行政区划管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/category.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.10 分类管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/job.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.11 定时任务</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/param.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.12 参数管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/tenant.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.13 租户管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/filetemplate.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.14 文件模板管理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/modules/index.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>6.15 首页与个人中心</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🧰 7. 文件处理</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tools/upload.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>7.1 文件上传全流程</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tools/upload-config.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>7.2 上传配置详解</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tools/rich-text.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>7.3 富文本处理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tools/excel.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>7.4 数据导入导出</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tools/file-components.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>7.5 前端文件组件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/tools/db-migrate.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>7.6 数据库迁移工具</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🔗 8. 接口规范与对接</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/response.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.1 统一响应格式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/error-code.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.2 错误码对照表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/pagination.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.3 分页查询规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/upload.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.4 文件上传接口</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/dict-api.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.5 字典数据接口</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/token.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.6 Token 使用说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/api-spec/overview.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>8.7 API 接口总览</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🖥️ 9. 前端开发</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>工程基础</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/overview.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.1 前端工程概述</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/directory.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.2 目录结构详解</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/env-config.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.3 环境与构建配置</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>核心机制</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/http.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.4 HTTP 请求封装</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/router.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.5 路由与动态菜单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/store.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.6 状态管理(Pinia)</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/permission.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.7 权限控制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/login.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.8 登录流程</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>公共组件</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/display-components.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.9 数据展示组件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/form-components.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.10 数据录入组件</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/excel-components.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.11 Excel 导入导出组件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>开发实践</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/new-page.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.12 新增页面开发步骤</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/api-module.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.13 API 模块编写规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/style.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.14 样式与主题定制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/layout.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.15 布局系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/frontend/utils.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>9.16 工具函数</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>🔧 10. 代码生成器</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/overview.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.1 概述与架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/cli.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.2 CLI 命令行使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/web-ui.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.3 Web 管理界面</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/parser.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.4 表结构解析引擎</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/code-engine.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.5 代码生成引擎</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/templates.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.6 自定义模板开发</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/config.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.7 配置文件详解</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/demo.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.8 实战案例</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/generator/faq.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>10.9 常见问题</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>⚙️ 11. 运维部署</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/checklist.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.1 部署 Checklist</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/env-plan.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.2 环境规划</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/db-migrate.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.3 数据库迁移</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/backend.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.4 后端部署</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/frontend.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.5 前端部署</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/docker.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.6 Docker 生产部署</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/performance.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.7 性能调优</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/security.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.8 安全加固清单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/backup.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.9 备份与恢复</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/troubleshooting.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.10 故障排查手册</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/deploy/ci-cd.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>11.11 CI/CD 流水线</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>📋 12. 规范标准</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>⭐ 必须遵守</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/api-response.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.1 API 响应规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/pagination.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.2 分页查询规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/git.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.3 Git 提交规范</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible" data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h3 class="text" data-v-e32f8976>📌 建议遵守</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/deletion.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.4 数据删除规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/code-review.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.5 代码审查清单</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/backend-code.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.6 后端编码规范</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/standards/frontend-code.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>12.7 前端编码规范</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-f04be081><section class="VPSidebarItem level-0 collapsible" data-v-f04be081 data-v-e32f8976><div class="item" role="button" tabindex="0" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><h2 class="text" data-v-e32f8976>📄 附录</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e32f8976><span class="vpi-chevron-right caret-icon" data-v-e32f8976></span></div></div><div class="items" data-v-e32f8976><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/faq.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>A. 常见问题汇总</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/database-tables.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>B. 数据库表结构速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/config-reference.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>C. 配置项速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/functions.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>D. 公共函数速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/api-cheatsheet.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>E. API 接口速查表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/middleware.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>F. 中间件执行顺序</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/components.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>G. 前端组件速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/stores.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>H. 前端 Store 速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/enums.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>I. 前端 Enums 速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/glossary.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>J. 术语表</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/appendix/commands.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>K. Artisan 命令速查</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/other/contributing.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>L. 贡献指南</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/other/declare.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>M. 免责声明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link link" href="/zh/other/sponsor.html" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>N. 广告赞助</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e32f8976><div class="item" data-v-e32f8976><div class="indicator" data-v-e32f8976></div><a class="VPLink link vp-external-link-icon link" href="https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue" target="_blank" rel="noreferrer" data-v-e32f8976><!--[--><p class="text" data-v-e32f8976>O. 开源协议</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-4dae6186 data-v-e52db3a1><div class="VPDoc has-sidebar has-aside" data-v-e52db3a1 data-v-b97a2373><!--[--><!--]--><div class="container" data-v-b97a2373><div class="aside" data-v-b97a2373><div class="aside-curtain" data-v-b97a2373></div><div class="aside-container" data-v-b97a2373><div class="aside-content" data-v-b97a2373><div class="VPDocAside" data-v-b97a2373 data-v-c23100fe><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-c23100fe data-v-b5a1c08a><div class="content" data-v-b5a1c08a><div class="outline-marker" data-v-b5a1c08a></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-b5a1c08a>本页内容</div><ul class="VPDocOutlineItem root" data-v-b5a1c08a data-v-67a5fa10><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-c23100fe></div><!--[--><!--[--><!--[--><!--[--><!--[--><div class="VPDocAsideSponsors" data-v-46d2db61><div class="VPSponsors vp-sponsor aside"><!--[--><section class="vp-sponsor-section"><!----><div class="VPSponsorsGrid vp-sponsor-grid mini"><!--[--><div class="vp-sponsor-grid-item"><a class="vp-sponsor-grid-link" href="https://www.rxthink.cn" target="_blank" rel="sponsored noopener"><article class="vp-sponsor-grid-box"><h4 class="visually-hidden">Become a sponsor</h4><img class="vp-sponsor-grid-image" src="/sponsor/rxthinkcmf.png" alt="Become a sponsor"></article></a></div><!--]--></div></section><section class="vp-sponsor-section"><!----><div class="VPSponsorsGrid vp-sponsor-grid xmini"><!--[--><div class="vp-sponsor-grid-item"><a class="vp-sponsor-grid-link" href="https://www.rxthink.cn" target="_blank" rel="sponsored noopener"><article class="vp-sponsor-grid-box"><h4 class="visually-hidden">企业级中台解决方案</h4><img class="vp-sponsor-grid-image" src="/sponsor/rxthinkcmf.png" alt="企业级中台解决方案"></article></a></div><div class="vp-sponsor-grid-item"><a class="vp-sponsor-grid-link" href="https://www.rxthink.cn" target="_blank" rel="sponsored noopener"><article class="vp-sponsor-grid-box"><h4 class="visually-hidden">企业级中台解决方案</h4><img class="vp-sponsor-grid-image" src="/sponsor/rxthinkcmf.png" alt="企业级中台解决方案"></article></a></div><!--]--></div></section><!--]--></div></div><a class="banner mp" href="https://www.rxthink.cn" target="_blank" data-v-46d2db61><img width="22" height="22" src="/sponsor/rxthinkcmf.png" data-v-46d2db61><span data-v-46d2db61><p class="extra-info" data-v-46d2db61>赋能开发者</p><p class="heading" data-v-46d2db61>企业级中台解决方案</p><p class="extra-info" data-v-46d2db61>助力企业发展</p></span></a><a class="banner cert" href="https://www.rxthink.cn" target="_blank" data-v-46d2db61><img width="22" height="22" src="/sponsor/rxthinkcmf.png" data-v-46d2db61><span data-v-46d2db61><p class="extra-info" data-v-46d2db61>赋能开发者</p><p class="heading" data-v-46d2db61>企业级中台解决方案</p><p class="extra-info" data-v-46d2db61>助力企业发展</p></span></a><!--]--><!--]--><!--]--><!--]--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-b97a2373><div class="content-container" data-v-b97a2373><!--[--><!--]--><main class="main" data-v-b97a2373><div style="position:relative;" class="vp-doc _zh_quickstart_docker" data-v-b97a2373><div><h1 id="_2-8-Docker-快速体验" tabindex="-1">2.8 Docker 快速体验 <a class="header-anchor" href="#_2-8-Docker-快速体验" aria-label="Permalink to "2.8 Docker 快速体验""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>Docker 方案适合快速体验项目功能,无需在本机手动安装 PHP、MySQL、Redis 等环境。项目内置完整的 Nginx + PHP-FPM 架构配置,一条命令即可启动,脚本全文见下方(供参考,无需手动创建)。生产环境部署请参考 <a href="/zh/deploy/docker.html">11.6 Docker 生产部署</a>。</p></div><h2 id="架构说明" tabindex="-1">架构说明 <a class="header-anchor" href="#架构说明" aria-label="Permalink to "架构说明""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>浏览器 → admin.laravel13.naivevue → [Nginx 容器:80] → [PHP-FPM 容器:9000] → Laravel 应用</span></span>
|
||
<span class="line"><span> ↕</span></span>
|
||
<span class="line"><span> [MySQL 容器:3306] + [Redis 容器:6379]</span></span></code></pre></div><ul><li><strong>Nginx</strong>:监听 80 端口(宿主机映射 8000),处理 HTTP 请求、URL 重写、静态资源缓存</li><li><strong>PHP-FPM</strong>:监听 9000 端口,执行 PHP 代码(镜像内置 PHP 8.3 + 扩展 + Composer 依赖)</li><li><strong>MySQL</strong>:数据库服务,数据持久化到 Docker 命名卷,<strong>首次启动自动导入</strong>数据库脚本</li><li><strong>Redis</strong>:缓存 / 会话 / 队列服务(JWT 会话、字典缓存均依赖),数据持久化到命名卷</li></ul><h2 id="文件结构" tabindex="-1">文件结构 <a class="header-anchor" href="#文件结构" aria-label="Permalink to "文件结构""></a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>RXThinkCMF_Laravel13_NaiveVue/</span></span>
|
||
<span class="line"><span>├── docker-compose.yml # 容器编排(项目根目录)</span></span>
|
||
<span class="line"><span>├── .dockerignore # 构建上下文排除(.env、vendor、SQL 等)</span></span>
|
||
<span class="line"><span>├── docker/</span></span>
|
||
<span class="line"><span>│ ├── Dockerfile # PHP-FPM 镜像定义</span></span>
|
||
<span class="line"><span>│ ├── nginx.conf # Nginx 站点配置</span></span>
|
||
<span class="line"><span>│ └── .env.docker # 环境变量(密码等)</span></span>
|
||
<span class="line"><span>├── .env # 应用配置(Laravel 读取)</span></span>
|
||
<span class="line"><span>└── ...</span></span></code></pre></div><h2 id="前置要求" tabindex="-1">前置要求 <a class="header-anchor" href="#前置要求" aria-label="Permalink to "前置要求""></a></h2><table tabindex="0"><thead><tr><th>依赖</th><th>版本要求</th><th>说明</th></tr></thead><tbody><tr><td>Docker Desktop</td><td>>= 20.10(含 Compose v2)</td><td>已安装并<strong>启动</strong>,<code>docker compose version</code> 可验证</td></tr><tr><td>项目已初始化</td><td>根目录存在 <code>.env</code> 且 <code>APP_KEY</code> 已生成</td><td>未初始化见下方命令</td></tr><tr><td>JWT_SECRET</td><td><code>.env</code> 中 >= 32 字符</td><td>应用启动 fail-close 校验,不满足拒绝启动</td></tr></tbody></table><p>尚未初始化时,先在宿主机执行(依赖 <a href="/zh/quickstart/environment.html">2.1 开发环境准备</a> 中的 PHP 8.3 + Composer):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">composer</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> setup</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 等价于:composer install → 复制 .env → key:generate → migrate --force → npm install → npm run build</span></span></code></pre></div><h2 id="快速启动" tabindex="-1">快速启动 <a class="header-anchor" href="#快速启动" aria-label="Permalink to "快速启动""></a></h2><p>项目已内置完整的 Docker 配置文件(<code>docker-compose.yml</code>、<code>docker/Dockerfile</code>、<code>docker/nginx.conf</code>),无需手动创建,直接启动即可:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">cd</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> RXThinkCMF_Laravel13_NaiveVue</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 启动所有服务(首次会自动构建镜像,约 2-5 分钟)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看运行状态(首次 mysql 需导入约 226MB SQL,初始化 1~3 分钟,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 等到 mysql 变为 healthy,app 依赖健康检查会自动等待)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ps</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看日志(确认无报错)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">说明</p><p><code>docker-compose.yml</code> 使用 <code>${VAR:-默认值}</code> 语法,未配置 <code>docker/.env.docker</code> 时自动使用默认密码(root123 / redis123),适合快速体验。生产部署请参考 <a href="/zh/deploy/docker.html">11.6 Docker 生产部署</a> 使用 <code>--env-file</code> 指定生产密码。</p></div><h3 id="端口冲突处理-本机有-Laragon-时-" tabindex="-1">端口冲突处理(本机有 Laragon 时) <a class="header-anchor" href="#端口冲突处理-本机有-Laragon-时-" aria-label="Permalink to "端口冲突处理(本机有 Laragon 时)""></a></h3><p>本机 Laragon 已占用 3306(MySQL)/ 6379(Redis)时,修改 <code>docker/.env.docker</code> 中的宿主机端口即可:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">NGINX_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">8000 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Web 端口(被占用时改为 8080 等)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MYSQL_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3307 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 与 Laragon MySQL 冲突时改为 3307</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">6380 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 与 Laragon Redis 冲突时改为 6380</span></span></code></pre></div><p>容器之间通过<strong>服务名</strong>(<code>mysql</code> / <code>redis</code>)互相通信,改宿主机端口不影响容器内部连接。</p><h2 id="docker-compose-yml" tabindex="-1">docker-compose.yml <a class="header-anchor" href="#docker-compose-yml" aria-label="Permalink to "docker-compose.yml""></a></h2><p>项目根目录的 <code>docker-compose.yml</code> 内容如下(供参考,无需手动创建):</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Docker Compose — RXThinkCMF Laravel13 容器编排</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 架构:Nginx(80) → PHP-FPM(9000) → MySQL(3306) + Redis(6379)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">#</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 快速启动(使用默认密码):</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># docker compose up -d</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">#</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 生产部署(使用 .env.docker 中的密码):</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># docker compose --env-file docker/.env.docker up -d --build</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">services</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Nginx 反向代理</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> nginx</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> image</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> nginx:1.25-alpine</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-nginx</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ports</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">${NGINX_PORT:-8000}:80</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 宿主机端口(默认 8000),可通过环境变量覆盖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 站点配置(只读)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./:/var/www/html:ro</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 项目代码(只读)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> depends_on</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # PHP-FPM 应用服务</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 执行 Laravel 代码,处理 API 请求和业务逻辑</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> app</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> build</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> context</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> .</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 构建上下文为项目根目录</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> dockerfile</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> docker/Dockerfile</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Dockerfile 路径</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./:/var/www/html</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 项目代码(可写,上传文件随宿主机持久化)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> environment</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> APP_DEBUG=${APP_DEBUG:-true}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 调试模式(快速体验默认开启)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 数据库:容器内通过服务名 mysql 访问(覆盖 .env 中的 127.0.0.1)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_CONNECTION=mysql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_HOST=mysql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_PORT=3306</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_DATABASE=${MYSQL_DATABASE:-rxthinkcmf.laravel13.naivevue}</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_USERNAME=root</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 缓存 / 会话 / 队列:统一走 Redis(数据库脚本不含 framework 表)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> CACHE_STORE=redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> SESSION_DRIVER=redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> QUEUE_CONNECTION=redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> REDIS_HOST=redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> REDIS_PORT=6379</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> REDIS_PASSWORD=${REDIS_PASSWORD:-redis123}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # JWT 签名密钥(应用启动要求 >= 32 字符)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> JWT_SECRET=${JWT_SECRET:-your_random_jwt_secret_key_at_least_32_bytes_long}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 文件访问域名(接口返回上传文件的完整地址)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> FILE_DOMAIN_URL=${DOMAIN_URL:-http://admin.laravel13.naivevue}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 跨域来源(快速体验默认放开)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> CORS_ALLOW_ORIGIN=${CORS_ALLOW_ORIGIN:-*}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> depends_on</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> mysql</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> condition</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> service_healthy</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 等待 MySQL 就绪(含首次 SQL 导入)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> redis</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> condition</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> service_started</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 等待 Redis 启动</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # MySQL 数据库</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 存储业务数据,首次启动自动导入数据库脚本</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> mysql</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> image</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql:8.0</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-mysql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ports</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">${MYSQL_PORT:-3306}:3306</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 宿主机端口(默认 3306),可通过环境变量覆盖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> environment</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> MYSQL_ROOT_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ${MYSQL_ROOT_PASSWORD:-root123}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # root 密码</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> MYSQL_DATABASE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ${MYSQL_DATABASE:-rxthinkcmf.laravel13.naivevue}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 自动创建的数据库</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql_data:/var/lib/mysql</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 数据持久化</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./document/mysql/rxthinkcmf.laravel13.naivevue.sql:/docker-entrypoint-initdb.d/init.sql:ro</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 初始化 SQL(仅首次启动执行)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> command</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> --character-set-server=utf8mb4</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> --collation-server=utf8mb4_general_ci</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> --default-authentication-plugin=mysql_native_password</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> healthcheck</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 健康检查:确保 MySQL 可接受连接</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> test</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">CMD</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">mysqladmin</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">ping</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-h</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">localhost</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-u</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">root</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-p${MYSQL_ROOT_PASSWORD:-root123}</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> interval</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 10s</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> timeout</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 5s</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> retries</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 30</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> start_period</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 60s</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 首次启动需导入约 226MB SQL,给足缓冲时间</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Redis 缓存</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 提供缓存加速(JWT 会话/字典/权限缓存),与 config/database.php 中 redis 配合</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> redis</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> image</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis:7-alpine</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ports</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">${REDIS_PORT:-6379}:6379</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 宿主机端口(默认 6379),可通过环境变量覆盖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> command</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis-server --requirepass ${REDIS_PASSWORD:-redis123}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 访问密码</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis_data:/data</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 数据持久化</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-laravel13-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 命名卷 — 持久化存储</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 容器删除后数据保留,彻底重置请执行:docker compose down -v</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> mysql_data</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # MySQL 数据文件</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> redis_data</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Redis RDB 快照</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 内部网络</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 容器间通过服务名(mysql / redis / app)互相访问</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> rxthinkcmf-laravel13-net</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> driver</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> bridge</span></span></code></pre></div><h2 id="Dockerfile" tabindex="-1">Dockerfile <a class="header-anchor" href="#Dockerfile" aria-label="Permalink to "Dockerfile""></a></h2><p>将以下内容保存为 <code>docker/Dockerfile</code>:</p><div class="language-dockerfile vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">dockerfile</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Dockerfile — PHP-FPM 应用镜像(RXThinkCMF Laravel13)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 基础镜像:PHP 8.3 + FPM(FastCGI 进程管理器)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 构建命令:docker compose build app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 运行方式:由 Nginx 容器通过 FastCGI 协议调用本容器的 9000 端口</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FROM</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> php:8.3-fpm</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 1. 安装系统依赖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> apt-get update && apt-get install -y --no-install-recommends \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libpng-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # GD 扩展 — PNG 支持</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libjpeg-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # GD 扩展 — JPEG 支持</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libfreetype6-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # GD 扩展 — 字体渲染(验证码依赖)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libzip-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # zip 扩展依赖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> zip </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # Composer 安装依赖包时可能用到</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> unzip </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # Composer 解压依赖包</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && rm -rf /var/lib/apt/lists/* # 清理 apt 缓存,减小镜像体积</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 2. 安装 PHP 扩展</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 项目必需扩展(根据 composer.json 和 config/ 推导):</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># pdo_mysql — MySQL 数据库驱动(config/database.php 使用)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># mbstring — 多字节字符串处理(Laravel 框架依赖)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># gd — 图片处理(验证码生成、图片缩放)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># bcmath — 高精度数学运算(phpspreadsheet 依赖)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># zip — ZIP 压缩(phpspreadsheet 读写 xlsx 依赖)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># redis — Redis 扩展(phpredis:缓存/会话/队列/JWT 会话均依赖)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> docker-php-ext-configure gd --with-freetype --with-jpeg \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && docker-php-ext-install -j$(nproc) \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> pdo_mysql \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mbstring \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> gd \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> bcmath \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> zip \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && pecl install redis \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && docker-php-ext-enable redis</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 3. 安装 Composer</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">COPY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> --from=composer:latest /usr/bin/composer /usr/bin/composer</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 4. 配置 PHP 生产环境参数</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mv </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"$PHP_INI_DIR/php.ini-production"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> "$PHP_INI_DIR/php.ini"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> echo </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">'</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">; ====== 生产环境追加配置(Docker 自动生成) ====== </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">display_errors = Off</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">memory_limit = 256M</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">max_execution_time = 60</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">max_input_time = 60</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">upload_max_filesize = 50M</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">post_max_size = 50M</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">max_file_uploads = 20</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">date.timezone = Asia/Shanghai</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.enable = 1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.memory_consumption = 256</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.interned_strings_buffer = 16</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.max_accelerated_files = 10000</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.validate_timestamps = 1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.revalidate_freq = 0</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.save_comments = 1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> >> </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"$PHP_INI_DIR/php.ini"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 5. 设置工作目录</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">WORKDIR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /var/www/html</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 6. 复制项目文件并安装依赖(利用 Docker 层缓存)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">COPY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> composer.json composer.lock ./</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> composer install --no-dev --optimize-autoloader --no-interaction</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">COPY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> . .</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 7. 设置 Laravel 可写目录权限</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># storage — 日志、缓存、会话、编译视图(必须可写)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># bootstrap/cache — 配置/路由/事件缓存(必须可写)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># public/uploads — 用户上传文件目录(必须可写)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mkdir -p \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> storage/framework/cache \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> storage/framework/sessions \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> storage/framework/views \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> storage/logs \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> bootstrap/cache \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> public/uploads \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && chown -R www-data:www-data storage bootstrap/cache public/uploads \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && chmod -R 775 storage bootstrap/cache public/uploads</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 8. 暴露端口并启动</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">EXPOSE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 9000</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CMD</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"php-fpm"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">]</span></span></code></pre></div><h2 id="Nginx-配置" tabindex="-1">Nginx 配置 <a class="header-anchor" href="#Nginx-配置" aria-label="Permalink to "Nginx 配置""></a></h2><p>将以下内容保存为 <code>docker/nginx.conf</code>:</p><div class="language-nginx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Nginx 配置 — RXThinkCMF Laravel13 反向代理</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">server</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> {</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 监听容器内 80 端口(宿主机通过 docker-compose ports 映射到 8000)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> listen </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">80</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> server_name </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">localhost</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 网站根目录指向 Laravel 公开目录(容器内代码挂载在 /var/www/html)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> root </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">/var/www/html/public</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> index </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">index.php</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # URL 重写(Laravel 路由)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 真实文件直接返回,其余交给 public/index.php 由 Laravel 路由解析</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;"> / </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> try_files </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">uri</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">uri</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">/ /index.php?</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">query_string</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # PHP-FPM 处理(仅入口 index.php 可执行)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # "app" 是 docker-compose 中 PHP-FPM 服务的名称,Docker 内部 DNS 自动解析</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> /index.php </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_pass </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> app:9000</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 转发到 PHP-FPM 容器的 9000 端口</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_index </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> index.php</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_param </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> SCRIPT_FILENAME </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">document_root</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">fastcgi_script_name</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> include </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> fastcgi_params</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 引入标准 FastCGI 参数</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_read_timeout </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 300</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 超时设置(秒),防止长请求被提前断开</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_send_timeout </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 300</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 其余 .php 文件(含上传目录)一律 404,防止恶意脚本被执行</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> \.php$ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> return</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 404</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 安全规则:禁止访问隐藏文件(如 .env、.git、.htaccess)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> /\. </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> deny </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;">all</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 静态资源缓存 30 天</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~*</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> expires </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">30d</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> add_header </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Cache-Control </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"public, immutable"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Gzip 压缩</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # -----------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;"> on</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip_types </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> text/plain text/css application/json application/javascript text/xml application/xml</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip_min_length </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">1024</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip_comp_level </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">}</span></span></code></pre></div><h2 id="环境变量配置" tabindex="-1">环境变量配置 <a class="header-anchor" href="#环境变量配置" aria-label="Permalink to "环境变量配置""></a></h2><p>将以下内容保存为 <code>docker/.env.docker</code>:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Docker 环境变量(密码等敏感信息,切勿提交 Git)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 端口(宿主机端口,冲突时修改)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">NGINX_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">8000</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MYSQL_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">3306</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">6379</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># MySQL(首次启动自动导入 document/mysql/rxthinkcmf.laravel13.naivevue.sql)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MYSQL_ROOT_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Your_Strong_Password_2024</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MYSQL_DATABASE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">rxthinkcmf.laravel13.naivevue</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Your_Redis_Password_2024</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 应用</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">JWT_SECRET</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"><32 字符以上随机值,openssl rand -base64 32 生成></span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">APP_DEBUG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">false</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DOMAIN_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">http://admin.laravel13.naivevue</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CORS_ALLOW_ORIGIN</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">http://admin.laravel13.naivevue</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">与本地 .env 的关系</p><p><code>docker-compose.yml</code> 的 <code>environment</code> 块会把数据库 / Redis / JWT 等配置<strong>以容器环境变量注入,优先级高于 <code>.env</code> 文件</strong>——因此容器内自动使用服务名 <code>mysql</code> / <code>redis</code>,<strong>无需修改本地 <code>.env</code></strong>(与手动部署用同一份 <code>.env</code> 互不干扰)。</p></div><h2 id="配置优先级" tabindex="-1">配置优先级 <a class="header-anchor" href="#配置优先级" aria-label="Permalink to "配置优先级""></a></h2><p>变量插值优先级(高 → 低):</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>1. shell 环境变量</span></span>
|
||
<span class="line"><span>2. --env-file 指定的文件(如 docker/.env.docker)</span></span>
|
||
<span class="line"><span>3. 项目根目录 .env(compose 自动读取)</span></span>
|
||
<span class="line"><span>4. docker-compose.yml 中的 ${VAR:-默认值}</span></span></code></pre></div><h2 id="访问服务" tabindex="-1">访问服务 <a class="header-anchor" href="#访问服务" aria-label="Permalink to "访问服务""></a></h2><p>启动成功后:</p><table tabindex="0"><thead><tr><th>服务</th><th>地址</th><th>说明</th></tr></thead><tbody><tr><td>后端 API</td><td><a href="http://admin.laravel13.naivevue" target="_blank" rel="noreferrer">http://admin.laravel13.naivevue</a></td><td>Nginx → PHP-FPM → Laravel</td></tr><tr><td>健康检查</td><td><a href="http://admin.laravel13.naivevue/up" target="_blank" rel="noreferrer">http://admin.laravel13.naivevue/up</a></td><td>Laravel 内置健康路由</td></tr><tr><td>MySQL</td><td>localhost:3306</td><td>用户名 root,默认密码 root123</td></tr><tr><td>Redis</td><td>localhost:6379</td><td>默认密码 redis123</td></tr></tbody></table><p>验证后端是否正常:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 健康检查</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">curl</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> http://admin.laravel13.naivevue/up</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 验证码(同时验证 PHP→Redis 链路,返回 code=0 即成功)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">curl</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> http://admin.laravel13.naivevue/api/captcha</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># → {"code":0,"ok":true,"msg":"操作成功","data":{...}}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 登录获取 Token(默认管理员账号 admin / 123456,登录后立即修改)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 验证码参数 key/code 与 /api/captcha 响应字段一致</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">curl</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -X</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> POST</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> http://admin.laravel13.naivevue/api/login</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -H</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">Content-Type: application/json</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> '</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">{"username":"admin","password":"123456","key":"<captcha_key>","code":"<验证码字符>"}</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span></span></code></pre></div><h2 id="数据持久化" tabindex="-1">数据持久化 <a class="header-anchor" href="#数据持久化" aria-label="Permalink to "数据持久化""></a></h2><table tabindex="0"><thead><tr><th>数据</th><th>位置</th><th><code>down</code> 后</th><th><code>down -v</code> 后</th></tr></thead><tbody><tr><td>MySQL 数据</td><td>命名卷 <code>mysql_data</code></td><td>保留</td><td><strong>删除</strong></td></tr><tr><td>Redis 数据</td><td>命名卷 <code>redis_data</code></td><td>保留</td><td><strong>删除</strong></td></tr><tr><td>上传文件</td><td>宿主机项目目录(挂载)</td><td>保留</td><td>保留</td></tr><tr><td>代码</td><td>宿主机项目目录(挂载)</td><td>保留</td><td>保留</td></tr></tbody></table><h2 id="常用命令" tabindex="-1">常用命令 <a class="header-anchor" href="#常用命令" aria-label="Permalink to "常用命令""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 服务管理</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 启动服务</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 停止服务(保留数据)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> down</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 停止并清空所有数据(重新开始)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> down</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -v</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 重建镜像(Dockerfile 或 composer.json 变更后)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --build</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 日志排查</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看所有日志</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看应用日志 / 数据库日志(首次看导入进度)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入 PHP-FPM 容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> bash</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入 MySQL 容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> bash</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 数据库操作</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 导入 SQL(手动方式,首次启动已自动导入)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -T</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -uroot</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -pYour_Strong_Password_2024</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf.laravel13.naivevue</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> <</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> document/mysql/rxthinkcmf.laravel13.naivevue.sql</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入 MySQL 命令行</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -uroot</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -pYour_Strong_Password_2024</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf.laravel13.naivevue</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Laravel Artisan 命令</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 清除配置缓存</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> config:clear</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 容器内执行 tinker 验证 Redis 连通</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> tinker</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看路由列表</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> route:list</span></span></code></pre></div><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to "常见问题""></a></h2><h3 id="端口被占用" tabindex="-1">端口被占用 <a class="header-anchor" href="#端口被占用" aria-label="Permalink to "端口被占用""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Windows 查看占用端口的进程</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">netstat</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -ano</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> :8000</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Linux/Mac</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">lsof</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -i</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> :8000</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 解决方案:修改 docker/.env.docker 中的端口</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># NGINX_PORT=8080 # 改为 8080</span></span></code></pre></div><h3 id="数据库连接失败" tabindex="-1">数据库连接失败 <a class="header-anchor" href="#数据库连接失败" aria-label="Permalink to "数据库连接失败""></a></h3><p><code>docker-compose.yml</code> 的 <code>environment</code> 块会把 <code>DB_HOST</code> 覆盖为 <code>mysql</code>(Docker 服务名)。若手动改过 compose 导致覆盖失效,确认容器内环境变量 <code>DB_HOST=mysql</code>,不是 <code>127.0.0.1</code>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> printenv</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> DB_HOST</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># → mysql</span></span></code></pre></div><h3 id="容器启动后立即退出" tabindex="-1">容器启动后立即退出 <a class="header-anchor" href="#容器启动后立即退出" aria-label="Permalink to "容器启动后立即退出""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看退出原因</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 常见原因:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 1. JWT_SECRET 长度不足(< 32 字符)→ 应用 fail-close 拒绝启动,重新生成密钥</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 2. PHP 扩展缺失 → 检查 Dockerfile 中的 docker-php-ext-install</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 3. 目录权限问题 → 确认 storage 和 bootstrap/cache 目录可写</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 4. composer install 失败 → 检查网络或镜像源</span></span></code></pre></div><h3 id="首次启动-mysql-一直-unhealthy" tabindex="-1">首次启动 mysql 一直 unhealthy <a class="header-anchor" href="#首次启动-mysql-一直-unhealthy" aria-label="Permalink to "首次启动 mysql 一直 unhealthy""></a></h3><p>首次启动需导入约 226MB 数据库脚本,初始化 1~3 分钟属正常。查看进度:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 等待 "ready for connections" 出现后,mysql 变为 healthy,app 自动启动</span></span></code></pre></div><h3 id="验证码一直失败" tabindex="-1">验证码一直失败 <a class="header-anchor" href="#验证码一直失败" aria-label="Permalink to "验证码一直失败""></a></h3><p>Redis 未启动或密码不匹配:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ps</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 确认 redis 容器状态</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 查看 Redis 日志</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> artisan</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> tinker</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 容器内验证连通</span></span></code></pre></div><h3 id="重新开始" tabindex="-1">重新开始 <a class="header-anchor" href="#重新开始" aria-label="Permalink to "重新开始""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 删除所有容器、网络、数据卷,完全重来</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> down</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -v</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --build</span></span></code></pre></div><h2 id="相关文档" tabindex="-1">相关文档 <a class="header-anchor" href="#相关文档" aria-label="Permalink to "相关文档""></a></h2><ul><li><a href="/zh/deploy/docker.html">生产部署</a> — 生产环境完整方案与安全加固</li><li><a href="/zh/quickstart/backend-start.html">后端启动</a> — 不用 Docker,手动启动</li><li><a href="/zh/quickstart/database-init.html">数据库初始化</a> — 手动导入 SQL</li><li><a href="/zh/quickstart/env-vars.html">环境变量配置</a> — <code>.env</code> 全部配置项说明</li></ul></div></div></main><footer class="VPDocFooter" data-v-b97a2373 data-v-11181de8><!--[--><!--]--><div class="edit-info" data-v-11181de8><div class="edit-link" data-v-11181de8><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue" target="_blank" rel="noreferrer" data-v-11181de8><!--[--><span class="vpi-square-pen edit-link-icon" data-v-11181de8></span> 对本页提出修改建议<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-11181de8><span class="visually-hidden" id="doc-footer-aria-label" data-v-11181de8>Pager</span><div class="pager" data-v-11181de8><a class="VPLink link pager-link prev" href="/zh/quickstart/first-api.html" data-v-11181de8><!--[--><span class="desc" data-v-11181de8>上一页</span><span class="title" data-v-11181de8>2.7 第一个接口调试</span><!--]--></a></div><div class="pager" data-v-11181de8><a class="VPLink link pager-link next" href="/zh/quickstart/faq.html" data-v-11181de8><!--[--><span class="desc" data-v-11181de8>下一页</span><span class="title" data-v-11181de8>2.9 常见问题 FAQ</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-4dae6186 data-v-04f60575><div class="container" data-v-04f60575><p class="message" data-v-04f60575>小蚂蚁云团队 · 提供技术支持</p><p class="copyright" data-v-04f60575>Copyright © 2018~2026 www.rxthink.cn. All rights reserved.</p></div></footer><!--[--><!--]--></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"claude.md\":\"CmwsTUDV\",\"index.md\":\"BfVev3oF\",\"readme.md\":\"C09rhUuk\",\"zh_api-spec_dict-api.md\":\"DDWerLVj\",\"zh_api-spec_error-code.md\":\"BaMdlFcG\",\"zh_api-spec_overview.md\":\"CJmp0iBV\",\"zh_api-spec_pagination.md\":\"CD3kk-p4\",\"zh_api-spec_response.md\":\"BR1SH64U\",\"zh_api-spec_token.md\":\"C8eA4flk\",\"zh_api-spec_upload.md\":\"tTgjlj7M\",\"zh_appendix_api-cheatsheet.md\":\"DCWbgKhm\",\"zh_appendix_commands.md\":\"BMuJZ489\",\"zh_appendix_components.md\":\"C4NOE5Ox\",\"zh_appendix_config-reference.md\":\"nnJb-uYE\",\"zh_appendix_database-tables.md\":\"DQRRHJAO\",\"zh_appendix_enums.md\":\"CHa54FfU\",\"zh_appendix_faq.md\":\"FINi6NjZ\",\"zh_appendix_functions.md\":\"DRlatkVI\",\"zh_appendix_glossary.md\":\"CYHL2mf_\",\"zh_appendix_middleware.md\":\"DaJw1rqi\",\"zh_appendix_stores.md\":\"WakVjBl-\",\"zh_architecture_backend-layer.md\":\"DL6NIOvW\",\"zh_architecture_base-classes.md\":\"BjZtEl_g\",\"zh_architecture_cache.md\":\"CeiGf4J5\",\"zh_architecture_cross-cutting.md\":\"DxOn90lE\",\"zh_architecture_database-design.md\":\"CvsADRAM\",\"zh_architecture_directory-design.md\":\"BdWF79zf\",\"zh_architecture_extensibility.md\":\"BdkIodwA\",\"zh_architecture_frontend-layer.md\":\"BTb5fo1h\",\"zh_architecture_overview.md\":\"DcE5KaMd\",\"zh_architecture_request-flow.md\":\"BCm7FLJF\",\"zh_architecture_security.md\":\"zD5PJKA2\",\"zh_changelog.md\":\"DStIxD4p\",\"zh_core_attributes.md\":\"Dxf-Lk5K\",\"zh_core_auth-flow.md\":\"CsyHMQGW\",\"zh_core_captcha.md\":\"QMW9xc-p\",\"zh_core_config.md\":\"B81O9WZO\",\"zh_core_cors.md\":\"ByOJcf5i\",\"zh_core_data-scope.md\":\"BqyY0NV-\",\"zh_core_demo-mode.md\":\"C0wamQs1\",\"zh_core_dict-guide.md\":\"CZXiT8Ag\",\"zh_core_dict.md\":\"BaqYSD1C\",\"zh_core_exception.md\":\"CrxM2cX-\",\"zh_core_jwt.md\":\"DgQb75oj\",\"zh_core_login-log.md\":\"DG154zhF\",\"zh_core_operation-log.md\":\"RQ85qwMA\",\"zh_core_param.md\":\"Bvhk-7TM\",\"zh_core_password.md\":\"BntXAdZB\",\"zh_core_rbac.md\":\"DijWsyoz\",\"zh_core_tenant.md\":\"K6ScUaAh\",\"zh_course.md\":\"CCEPzzlU\",\"zh_deploy_backend.md\":\"Cdzc4Bc1\",\"zh_deploy_backup.md\":\"DtITKH9r\",\"zh_deploy_checklist.md\":\"CQKt9KGj\",\"zh_deploy_ci-cd.md\":\"FFit-2qd\",\"zh_deploy_db-migrate.md\":\"D93GA9lH\",\"zh_deploy_docker.md\":\"D8Put12h\",\"zh_deploy_env-plan.md\":\"BNyeiZJf\",\"zh_deploy_frontend.md\":\"DKRH-5WD\",\"zh_deploy_performance.md\":\"Hn728dgB\",\"zh_deploy_security.md\":\"kihNF0uU\",\"zh_deploy_troubleshooting.md\":\"CJckLTaA\",\"zh_directory.md\":\"Dhamxx49\",\"zh_frontend_api-module.md\":\"CIo8WV2b\",\"zh_frontend_directory.md\":\"CDZ_NJnc\",\"zh_frontend_display-components.md\":\"6yamzql6\",\"zh_frontend_env-config.md\":\"Du5rmWen\",\"zh_frontend_excel-components.md\":\"s0ZizcdL\",\"zh_frontend_form-components.md\":\"CU5GmwCD\",\"zh_frontend_http.md\":\"DGhTiM86\",\"zh_frontend_layout.md\":\"C-xPG49T\",\"zh_frontend_login.md\":\"Cd03yqgJ\",\"zh_frontend_new-page.md\":\"Cmgik6NI\",\"zh_frontend_overview.md\":\"CsNqve6R\",\"zh_frontend_permission.md\":\"Dt7SbNpk\",\"zh_frontend_router.md\":\"Cb4WtU8g\",\"zh_frontend_store.md\":\"tGoYqIu8\",\"zh_frontend_style.md\":\"B0z_IP3L\",\"zh_frontend_utils.md\":\"COeAcmls\",\"zh_generator_cli.md\":\"BoDYsLF2\",\"zh_generator_code-engine.md\":\"DhDRl6aA\",\"zh_generator_config.md\":\"CW46mVW7\",\"zh_generator_demo.md\":\"BYHkGExa\",\"zh_generator_faq.md\":\"Bm5s34Ny\",\"zh_generator_overview.md\":\"BgPKwBEK\",\"zh_generator_parser.md\":\"UvQUB6Et\",\"zh_generator_templates.md\":\"AWt_lQ8w\",\"zh_generator_web-ui.md\":\"nMpjMNvK\",\"zh_guide_code-list.md\":\"CHhHtuIC\",\"zh_guide_controller.md\":\"BE9fZ12j\",\"zh_guide_database.md\":\"DAp8OT-x\",\"zh_guide_faq.md\":\"Bicj0pYB\",\"zh_guide_frontend-integration.md\":\"CBn2lKMC\",\"zh_guide_logic.md\":\"B76W2jcR\",\"zh_guide_model.md\":\"fgvcrXBy\",\"zh_guide_overview.md\":\"64HA48-e\",\"zh_guide_permission.md\":\"Bxxf1oIM\",\"zh_guide_route.md\":\"B9RFEXKZ\",\"zh_guide_validator.md\":\"C9bhgaRm\",\"zh_introduction.md\":\"eNRcdTBB\",\"zh_modules_article.md\":\"LPeUWzyJ\",\"zh_modules_category.md\":\"CNvSXO3h\",\"zh_modules_city.md\":\"CqNkAo1M\",\"zh_modules_content.md\":\"DsOkYZvD\",\"zh_modules_dept.md\":\"DjZqLPgi\",\"zh_modules_filetemplate.md\":\"DPH2nwER\",\"zh_modules_index.md\":\"aaATpoxP\",\"zh_modules_job.md\":\"DK6NCL1O\",\"zh_modules_level.md\":\"BZJvkqI9\",\"zh_modules_menu.md\":\"CBUBhsFY\",\"zh_modules_param.md\":\"Dg7bhSTv\",\"zh_modules_position.md\":\"D9rqZcZh\",\"zh_modules_role.md\":\"D2hQwyXY\",\"zh_modules_tenant.md\":\"CHKESGQX\",\"zh_modules_user.md\":\"CFLGMMZk\",\"zh_other_contributing.md\":\"4xlKv8BB\",\"zh_other_declare.md\":\"DHuZ7YkB\",\"zh_other_sponsor.md\":\"CMHRySP4\",\"zh_quickstart_backend-start.md\":\"CLJGSOAE\",\"zh_quickstart_database-init.md\":\"DAesTSl_\",\"zh_quickstart_docker.md\":\"DvE63qVu\",\"zh_quickstart_env-vars.md\":\"D2Miq5_X\",\"zh_quickstart_environment.md\":\"Ci1mzkEy\",\"zh_quickstart_faq.md\":\"CY12C6Ut\",\"zh_quickstart_first-api.md\":\"D8Q3WCqA\",\"zh_quickstart_frontend-start.md\":\"CmeeXuh1\",\"zh_quickstart_laragon.md\":\"jlt-NXUN\",\"zh_standards_api-response.md\":\"B0t-HsZ0\",\"zh_standards_backend-code.md\":\"CjaDe9TZ\",\"zh_standards_code-review.md\":\"DdUiyZfB\",\"zh_standards_deletion.md\":\"DL7wC1_i\",\"zh_standards_frontend-code.md\":\"Cffga4H9\",\"zh_standards_git.md\":\"a4ticXht\",\"zh_standards_pagination.md\":\"JDydSfsf\",\"zh_tech-stack.md\":\"CMuUu74U\",\"zh_tools_db-migrate.md\":\"BgZKYDUU\",\"zh_tools_excel.md\":\"pIKYeP9z\",\"zh_tools_file-components.md\":\"N8x8FmPa\",\"zh_tools_rich-text.md\":\"D12kT3xb\",\"zh_tools_upload-config.md\":\"CZsUkg1z\",\"zh_tools_upload.md\":\"CTM3IUUL\",\"zh_why.md\":\"CxzKxklC\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"小蚂蚁云\",\"description\":\"A VitePress site\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":\"light\",\"themeConfig\":{\"logo\":\"/logo.svg\",\"outline\":[2,3],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue\"}],\"footer\":{\"copyright\":\"Copyright © 2018~2026 www.rxthink.cn. All rights reserved.\",\"message\":\"小蚂蚁云团队 · 提供技术支持\"},\"editLink\":{\"pattern\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue\",\"text\":\"对本页提出修改建议\"},\"search\":{\"provider\":\"local\"}},\"locales\":{\"root\":{\"label\":\"简体中文\",\"lang\":\"zh-CN\",\"link\":\"/\",\"description\":\"RXThinkCMF 企业级前后端分离后台管理系统 - Laravel 13 + Vue3 + NaiveUI\",\"head\":[[\"meta\",{\"property\":\"og:url\",\"content\":\"https://www.rxthink.cn\"}],[\"meta\",{\"property\":\"og:description\",\"content\":\"RXThinkCMF 企业级前后端分离后台管理系统 - Laravel 13 + Vue3 + NaiveUI\"}],[\"meta\",{\"property\":\"twitter:url\",\"content\":\"https://www.rxthink.cn\"}],[\"meta\",{\"property\":\"twitter:title\",\"content\":\"RXThinkCMF Laravel13+NaiveUI 开发文档\"}],[\"meta\",{\"property\":\"twitter:description\",\"content\":\"RXThinkCMF 企业级前后端分离后台管理系统 - Laravel 13 + Vue3 + NaiveUI\"}],[\"script\",{},\"\\n var _hmt = _hmt || [];\\n (function() {\\n var hm = document.createElement(\\\"script\\\");\\n hm.src = \\\"https://hm.baidu.com/hm.js?4f06f01017cdd5c1a95a58a6787f4d10\\\";\\n var s = document.getElementsByTagName(\\\"script\\\")[0];\\n s.parentNode.insertBefore(hm, s);\\n })();\\n \"]],\"themeConfig\":{\"editLink\":{\"pattern\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue\",\"text\":\"对本页提出修改建议\"},\"outline\":{\"label\":\"本页内容\"},\"docFooter\":{\"prev\":\"上一页\",\"next\":\"下一页\"},\"nav\":[{\"text\":\"官网\",\"link\":\"https://www.rxthink.cn\"},{\"text\":\"授权\",\"link\":\"https://www.rxthink.cn/goods/detail/2\"},{\"text\":\"部署文档\",\"items\":[{\"text\":\"RXThinkCMF混编版ThinkPHP6+Layui版本\",\"link\":\"http://docs.thinkphp6.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本\",\"link\":\"http://docs.thinkphp6.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+AntDesign版本\",\"link\":\"http://docs.thinkphp6.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本\",\"link\":\"http://docs.thinkphp6.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版ThinkPHP8+Layui版本\",\"link\":\"http://docs.thinkphp8.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本\",\"link\":\"http://docs.thinkphp8.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+AntDesign版本\",\"link\":\"http://docs.thinkphp8.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本\",\"link\":\"http://docs.thinkphp8.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版Laravel13+Layui版本\",\"link\":\"http://docs.laravel13.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+ElementPlus版本\",\"link\":\"http://docs.laravel13.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+AntDesign版本\",\"link\":\"http://docs.laravel13.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+NaiveUI版本\",\"link\":\"http://docs.laravel13.naivevue.rxthink.cn\"}]},{\"text\":\"在线演示\",\"items\":[{\"text\":\"RXThinkCMF混编版ThinkPHP6+Layui版本\",\"link\":\"http://manage.thinkphp6.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+ElementPlus版本\",\"link\":\"http://manage.thinkphp6.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+AntDesign版本\",\"link\":\"http://manage.thinkphp6.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP6+NaiveUI版本\",\"link\":\"http://manage.thinkphp6.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版ThinkPHP8+Layui版本\",\"link\":\"http://manage.thinkphp8.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+ElementPlus版本\",\"link\":\"http://manage.thinkphp8.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+AntDesign版本\",\"link\":\"http://manage.thinkphp8.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离ThinkPHP8+NaiveUI版本\",\"link\":\"http://manage.thinkphp8.naivevue.rxthink.cn\"},{\"text\":\"RXThinkCMF混编版Laravel13+Layui版本\",\"link\":\"http://manage.laravel13.layui.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+ElementPlus版本\",\"link\":\"http://manage.laravel13.elevue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+AntDesign版本\",\"link\":\"http://manage.laravel13.antdvue.rxthink.cn\"},{\"text\":\"RXThinkCMF前后端分离Laravel13+NaiveUI版本\",\"link\":\"http://manage.laravel13.naivevue.rxthink.cn\"}]},{\"text\":\"广告赞助\",\"link\":\"/zh/other/sponsor.html\"},{\"text\":\"相关链接\",\"items\":[{\"text\":\"官方网站\",\"link\":\"https://www.rxthink.cn\"},{\"text\":\"Gitee 仓库\",\"link\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue\"},{\"text\":\"Laravel 官网\",\"link\":\"https://laravel.com/\"},{\"text\":\"Vue3 文档\",\"link\":\"https://cn.vuejs.org/\"},{\"text\":\"NaiveUI\",\"link\":\"https://www.naiveui.com/\"}]}],\"sidebar\":{\"/zh/\":[{\"text\":\"📖 1. 了解项目\",\"collapsed\":false,\"items\":[{\"text\":\"1.1 项目介绍\",\"link\":\"/zh/introduction.html\"},{\"text\":\"1.2 为什么选择我们\",\"link\":\"/zh/why.html\"},{\"text\":\"1.3 项目目录结构\",\"link\":\"/zh/directory.html\"},{\"text\":\"1.4 新手入门指南\",\"link\":\"/zh/course.html\"},{\"text\":\"1.5 技术栈说明\",\"link\":\"/zh/tech-stack.html\"},{\"text\":\"1.6 更新日志\",\"link\":\"/zh/changelog.html\"}]},{\"text\":\"🚀 2. 快速入门\",\"collapsed\":false,\"items\":[{\"text\":\"2.1 开发环境准备\",\"link\":\"/zh/quickstart/environment.html\"},{\"text\":\"2.2 Laragon 环境搭建\",\"link\":\"/zh/quickstart/laragon.html\"},{\"text\":\"2.3 后端服务启动\",\"link\":\"/zh/quickstart/backend-start.html\"},{\"text\":\"2.4 前端服务启动\",\"link\":\"/zh/quickstart/frontend-start.html\"},{\"text\":\"2.5 数据库初始化\",\"link\":\"/zh/quickstart/database-init.html\"},{\"text\":\"2.6 环境变量配置\",\"link\":\"/zh/quickstart/env-vars.html\"},{\"text\":\"2.7 第一个接口调试\",\"link\":\"/zh/quickstart/first-api.html\"},{\"text\":\"2.8 Docker 快速体验\",\"link\":\"/zh/quickstart/docker.html\"},{\"text\":\"2.9 常见问题 FAQ\",\"link\":\"/zh/quickstart/faq.html\"}]},{\"text\":\"🧪 3. 模块开发实战\",\"collapsed\":false,\"items\":[{\"text\":\"3.1 概述与目标\",\"link\":\"/zh/guide/overview.html\"},{\"text\":\"3.2 数据库建表\",\"link\":\"/zh/guide/database.html\"},{\"text\":\"3.3 模型层开发\",\"link\":\"/zh/guide/model.html\"},{\"text\":\"3.4 FormRequest 验证器\",\"link\":\"/zh/guide/validator.html\"},{\"text\":\"3.5 Service 层开发\",\"link\":\"/zh/guide/logic.html\"},{\"text\":\"3.6 控制器开发\",\"link\":\"/zh/guide/controller.html\"},{\"text\":\"3.7 路由注册\",\"link\":\"/zh/guide/route.html\"},{\"text\":\"3.8 权限节点配置\",\"link\":\"/zh/guide/permission.html\"},{\"text\":\"3.9 前端联调指引\",\"link\":\"/zh/guide/frontend-integration.html\"},{\"text\":\"3.10 完整代码清单\",\"link\":\"/zh/guide/code-list.html\"},{\"text\":\"3.11 常见问题与排错\",\"link\":\"/zh/guide/faq.html\"}]},{\"text\":\"🏛️ 4. 架构设计\",\"collapsed\":false,\"items\":[{\"text\":\"4.1 整体架构概览\",\"link\":\"/zh/architecture/overview.html\"},{\"text\":\"4.2 请求处理链路\",\"link\":\"/zh/architecture/request-flow.html\"},{\"text\":\"4.3 后端分层架构\",\"link\":\"/zh/architecture/backend-layer.html\"},{\"text\":\"4.4 前端分层架构\",\"link\":\"/zh/architecture/frontend-layer.html\"},{\"text\":\"4.5 目录结构设计\",\"link\":\"/zh/architecture/directory-design.html\"},{\"text\":\"4.6 核心基类体系\",\"link\":\"/zh/architecture/base-classes.html\"},{\"text\":\"4.7 横切机制\",\"link\":\"/zh/architecture/cross-cutting.html\"},{\"text\":\"4.8 缓存架构设计\",\"link\":\"/zh/architecture/cache.html\"},{\"text\":\"4.9 数据库设计\",\"link\":\"/zh/architecture/database-design.html\"},{\"text\":\"4.10 安全架构设计\",\"link\":\"/zh/architecture/security.html\"},{\"text\":\"4.11 扩展性设计\",\"link\":\"/zh/architecture/extensibility.html\"}]},{\"text\":\"🔐 5. 核心功能\",\"collapsed\":false,\"items\":[{\"text\":\"认证与安全\",\"collapsed\":false,\"items\":[{\"text\":\"5.1 用户认证(JWT)\",\"link\":\"/zh/core/jwt.html\"},{\"text\":\"5.2 认证流程实战\",\"link\":\"/zh/core/auth-flow.html\"},{\"text\":\"5.3 验证码机制\",\"link\":\"/zh/core/captcha.html\"},{\"text\":\"5.4 权限管理(RBAC)\",\"link\":\"/zh/core/rbac.html\"},{\"text\":\"5.5 跨域资源共享\",\"link\":\"/zh/core/cors.html\"},{\"text\":\"5.6 密码加密服务\",\"link\":\"/zh/core/password.html\"},{\"text\":\"5.7 演示模式\",\"link\":\"/zh/core/demo-mode.html\"}]},{\"text\":\"数据与配置\",\"collapsed\":false,\"items\":[{\"text\":\"5.8 多租户隔离\",\"link\":\"/zh/core/tenant.html\"},{\"text\":\"5.9 数据权限\",\"link\":\"/zh/core/data-scope.html\"},{\"text\":\"5.10 字典模块\",\"link\":\"/zh/core/dict.html\"},{\"text\":\"5.11 字典配置与使用\",\"link\":\"/zh/core/dict-guide.html\"},{\"text\":\"5.12 系统配置管理\",\"link\":\"/zh/core/config.html\"},{\"text\":\"5.13 系统参数管理\",\"link\":\"/zh/core/param.html\"}]},{\"text\":\"日志与监控\",\"collapsed\":false,\"items\":[{\"text\":\"5.14 操作日志\",\"link\":\"/zh/core/operation-log.html\"},{\"text\":\"5.15 登录日志\",\"link\":\"/zh/core/login-log.html\"}]},{\"text\":\"响应与异常\",\"collapsed\":false,\"items\":[{\"text\":\"5.16 统一响应与异常抛出\",\"link\":\"/zh/core/exception.html\"}]},{\"text\":\"注解系统\",\"collapsed\":false,\"items\":[{\"text\":\"5.17 注解系统总览\",\"link\":\"/zh/core/attributes.html\"}]}]},{\"text\":\"📦 6. 业务模块\",\"collapsed\":false,\"items\":[{\"text\":\"6.1 用户管理\",\"link\":\"/zh/modules/user.html\"},{\"text\":\"6.2 角色管理\",\"link\":\"/zh/modules/role.html\"},{\"text\":\"6.3 菜单管理\",\"link\":\"/zh/modules/menu.html\"},{\"text\":\"6.4 部门管理\",\"link\":\"/zh/modules/dept.html\"},{\"text\":\"6.5 职级管理\",\"link\":\"/zh/modules/level.html\"},{\"text\":\"6.6 岗位管理\",\"link\":\"/zh/modules/position.html\"},{\"text\":\"6.7 文章管理\",\"link\":\"/zh/modules/article.html\"},{\"text\":\"6.8 公告与链接管理\",\"link\":\"/zh/modules/content.html\"},{\"text\":\"6.9 行政区划管理\",\"link\":\"/zh/modules/city.html\"},{\"text\":\"6.10 分类管理\",\"link\":\"/zh/modules/category.html\"},{\"text\":\"6.11 定时任务\",\"link\":\"/zh/modules/job.html\"},{\"text\":\"6.12 参数管理\",\"link\":\"/zh/modules/param.html\"},{\"text\":\"6.13 租户管理\",\"link\":\"/zh/modules/tenant.html\"},{\"text\":\"6.14 文件模板管理\",\"link\":\"/zh/modules/filetemplate.html\"},{\"text\":\"6.15 首页与个人中心\",\"link\":\"/zh/modules/index.html\"}]},{\"text\":\"🧰 7. 文件处理\",\"collapsed\":false,\"items\":[{\"text\":\"7.1 文件上传全流程\",\"link\":\"/zh/tools/upload.html\"},{\"text\":\"7.2 上传配置详解\",\"link\":\"/zh/tools/upload-config.html\"},{\"text\":\"7.3 富文本处理\",\"link\":\"/zh/tools/rich-text.html\"},{\"text\":\"7.4 数据导入导出\",\"link\":\"/zh/tools/excel.html\"},{\"text\":\"7.5 前端文件组件\",\"link\":\"/zh/tools/file-components.html\"},{\"text\":\"7.6 数据库迁移工具\",\"link\":\"/zh/tools/db-migrate.html\"}]},{\"text\":\"🔗 8. 接口规范与对接\",\"collapsed\":false,\"items\":[{\"text\":\"8.1 统一响应格式\",\"link\":\"/zh/api-spec/response.html\"},{\"text\":\"8.2 错误码对照表\",\"link\":\"/zh/api-spec/error-code.html\"},{\"text\":\"8.3 分页查询规范\",\"link\":\"/zh/api-spec/pagination.html\"},{\"text\":\"8.4 文件上传接口\",\"link\":\"/zh/api-spec/upload.html\"},{\"text\":\"8.5 字典数据接口\",\"link\":\"/zh/api-spec/dict-api.html\"},{\"text\":\"8.6 Token 使用说明\",\"link\":\"/zh/api-spec/token.html\"},{\"text\":\"8.7 API 接口总览\",\"link\":\"/zh/api-spec/overview.html\"}]},{\"text\":\"🖥️ 9. 前端开发\",\"collapsed\":false,\"items\":[{\"text\":\"工程基础\",\"collapsed\":false,\"items\":[{\"text\":\"9.1 前端工程概述\",\"link\":\"/zh/frontend/overview.html\"},{\"text\":\"9.2 目录结构详解\",\"link\":\"/zh/frontend/directory.html\"},{\"text\":\"9.3 环境与构建配置\",\"link\":\"/zh/frontend/env-config.html\"}]},{\"text\":\"核心机制\",\"collapsed\":false,\"items\":[{\"text\":\"9.4 HTTP 请求封装\",\"link\":\"/zh/frontend/http.html\"},{\"text\":\"9.5 路由与动态菜单\",\"link\":\"/zh/frontend/router.html\"},{\"text\":\"9.6 状态管理(Pinia)\",\"link\":\"/zh/frontend/store.html\"},{\"text\":\"9.7 权限控制\",\"link\":\"/zh/frontend/permission.html\"},{\"text\":\"9.8 登录流程\",\"link\":\"/zh/frontend/login.html\"}]},{\"text\":\"公共组件\",\"collapsed\":false,\"items\":[{\"text\":\"9.9 数据展示组件\",\"link\":\"/zh/frontend/display-components.html\"},{\"text\":\"9.10 数据录入组件\",\"link\":\"/zh/frontend/form-components.html\"},{\"text\":\"9.11 Excel 导入导出组件\",\"link\":\"/zh/frontend/excel-components.html\"}]},{\"text\":\"开发实践\",\"collapsed\":false,\"items\":[{\"text\":\"9.12 新增页面开发步骤\",\"link\":\"/zh/frontend/new-page.html\"},{\"text\":\"9.13 API 模块编写规范\",\"link\":\"/zh/frontend/api-module.html\"},{\"text\":\"9.14 样式与主题定制\",\"link\":\"/zh/frontend/style.html\"},{\"text\":\"9.15 布局系统\",\"link\":\"/zh/frontend/layout.html\"},{\"text\":\"9.16 工具函数\",\"link\":\"/zh/frontend/utils.html\"}]}]},{\"text\":\"🔧 10. 代码生成器\",\"collapsed\":false,\"items\":[{\"text\":\"10.1 概述与架构\",\"link\":\"/zh/generator/overview.html\"},{\"text\":\"10.2 CLI 命令行使用\",\"link\":\"/zh/generator/cli.html\"},{\"text\":\"10.3 Web 管理界面\",\"link\":\"/zh/generator/web-ui.html\"},{\"text\":\"10.4 表结构解析引擎\",\"link\":\"/zh/generator/parser.html\"},{\"text\":\"10.5 代码生成引擎\",\"link\":\"/zh/generator/code-engine.html\"},{\"text\":\"10.6 自定义模板开发\",\"link\":\"/zh/generator/templates.html\"},{\"text\":\"10.7 配置文件详解\",\"link\":\"/zh/generator/config.html\"},{\"text\":\"10.8 实战案例\",\"link\":\"/zh/generator/demo.html\"},{\"text\":\"10.9 常见问题\",\"link\":\"/zh/generator/faq.html\"}]},{\"text\":\"⚙️ 11. 运维部署\",\"collapsed\":false,\"items\":[{\"text\":\"11.1 部署 Checklist\",\"link\":\"/zh/deploy/checklist.html\"},{\"text\":\"11.2 环境规划\",\"link\":\"/zh/deploy/env-plan.html\"},{\"text\":\"11.3 数据库迁移\",\"link\":\"/zh/deploy/db-migrate.html\"},{\"text\":\"11.4 后端部署\",\"link\":\"/zh/deploy/backend.html\"},{\"text\":\"11.5 前端部署\",\"link\":\"/zh/deploy/frontend.html\"},{\"text\":\"11.6 Docker 生产部署\",\"link\":\"/zh/deploy/docker.html\"},{\"text\":\"11.7 性能调优\",\"link\":\"/zh/deploy/performance.html\"},{\"text\":\"11.8 安全加固清单\",\"link\":\"/zh/deploy/security.html\"},{\"text\":\"11.9 备份与恢复\",\"link\":\"/zh/deploy/backup.html\"},{\"text\":\"11.10 故障排查手册\",\"link\":\"/zh/deploy/troubleshooting.html\"},{\"text\":\"11.11 CI/CD 流水线\",\"link\":\"/zh/deploy/ci-cd.html\"}]},{\"text\":\"📋 12. 规范标准\",\"collapsed\":false,\"items\":[{\"text\":\"⭐ 必须遵守\",\"collapsed\":false,\"items\":[{\"text\":\"12.1 API 响应规范\",\"link\":\"/zh/standards/api-response.html\"},{\"text\":\"12.2 分页查询规范\",\"link\":\"/zh/standards/pagination.html\"},{\"text\":\"12.3 Git 提交规范\",\"link\":\"/zh/standards/git.html\"}]},{\"text\":\"📌 建议遵守\",\"collapsed\":false,\"items\":[{\"text\":\"12.4 数据删除规范\",\"link\":\"/zh/standards/deletion.html\"},{\"text\":\"12.5 代码审查清单\",\"link\":\"/zh/standards/code-review.html\"},{\"text\":\"12.6 后端编码规范\",\"link\":\"/zh/standards/backend-code.html\"},{\"text\":\"12.7 前端编码规范\",\"link\":\"/zh/standards/frontend-code.html\"}]}]},{\"text\":\"📄 附录\",\"collapsed\":false,\"items\":[{\"text\":\"A. 常见问题汇总\",\"link\":\"/zh/appendix/faq.html\"},{\"text\":\"B. 数据库表结构速查\",\"link\":\"/zh/appendix/database-tables.html\"},{\"text\":\"C. 配置项速查\",\"link\":\"/zh/appendix/config-reference.html\"},{\"text\":\"D. 公共函数速查\",\"link\":\"/zh/appendix/functions.html\"},{\"text\":\"E. API 接口速查表\",\"link\":\"/zh/appendix/api-cheatsheet.html\"},{\"text\":\"F. 中间件执行顺序\",\"link\":\"/zh/appendix/middleware.html\"},{\"text\":\"G. 前端组件速查\",\"link\":\"/zh/appendix/components.html\"},{\"text\":\"H. 前端 Store 速查\",\"link\":\"/zh/appendix/stores.html\"},{\"text\":\"I. 前端 Enums 速查\",\"link\":\"/zh/appendix/enums.html\"},{\"text\":\"J. 术语表\",\"link\":\"/zh/appendix/glossary.html\"},{\"text\":\"K. Artisan 命令速查\",\"link\":\"/zh/appendix/commands.html\"},{\"text\":\"L. 贡献指南\",\"link\":\"/zh/other/contributing.html\"},{\"text\":\"M. 免责声明\",\"link\":\"/zh/other/declare.html\"},{\"text\":\"N. 广告赞助\",\"link\":\"/zh/other/sponsor.html\"},{\"text\":\"O. 开源协议\",\"link\":\"https://gitee.com/rxthinkcmf/RXThinkCMF_Laravel13_NaiveVue\"}]}]}}}},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
||
|
||
</body>
|
||
</html> |