109 lines
39 KiB
JavaScript
109 lines
39 KiB
JavaScript
import{_ as i,o as a,c as t,a2 as n}from"./chunks/framework.B-QBKwc1.js";const c=JSON.parse('{"title":"环境变量配置","description":"项目使用 .env 文件管理环境变量,支持开发、测试、生产等多环境切换。","frontmatter":{},"headers":[],"relativePath":"zh/quickstart/env-vars.md","filePath":"zh/quickstart/env-vars.md"}'),h={name:"zh/quickstart/env-vars.md"};function e(l,s,d,p,k,r){return a(),t("div",null,[...s[0]||(s[0]=[n(`<h1 id="_2-5-环境变量配置" tabindex="-1">2.5 环境变量配置 <a class="header-anchor" href="#_2-5-环境变量配置" aria-label="Permalink to "2.5 环境变量配置""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>项目使用 <code>.env</code> 文件管理环境变量,支持开发、测试、生产等多环境切换。配置优先级:<code>.env</code> > <code>config/*.php</code> > 代码默认值。</p></div><h2 id="-env-文件结构" tabindex="-1">.env 文件结构 <a class="header-anchor" href="#-env-文件结构" aria-label="Permalink to ".env 文件结构""></a></h2><p>项目 <code>.env</code> 文件采用 INI 分组格式,每个分组对应一个 <code>config/*.php</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;">; =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; .env 环境变量配置文件</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;">; 格式:INI 分组格式,[分组] 下的键值对通过 env() 函数读取</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 优先级:.env > config/*.php > 代码默认值</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:#7B7F8B;--shiki-light:#A0ADA0;">; 全局开关(不属于任何分组)</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;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 调试模式(开发 true,生产 false)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">APP</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DEFAULT_TIMEZONE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> Asia/Shanghai </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 默认时区</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DEMO</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> false </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 演示模式(true=拦截所有写操作)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SHOW_ERROR_MSG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 显示错误详情(生产环境设为 false)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">TYPE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mysql </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 数据库类型(mysql / pgsql / sqlsrv / oracle / sqlite)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">HOSTNAME</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 127.0.0.1 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 数据库服务器地址</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DATABASE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> rxthinkcmf.thinkphp8.elevue </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 数据库名</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">USERNAME</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> root </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 用户名</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> root </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 密码</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">HOSTPORT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 3306 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 端口</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CHARSET</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> utf8mb4 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 字符集(支持 emoji)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DEBUG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; SQL 调试(显示执行的 SQL 语句)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">PREFIX</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> think_ </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 表前缀</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">JWT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SECRET</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> rxthinkcmf_jwt_secret_key_2024 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 签名密钥(生产环境务必修改)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ACCESS_TTL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 7200 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; access_token 有效期(秒),默认 2 小时</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REFRESH_TTL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 604800 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; refresh_token 有效期(秒),默认 7 天</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ISSUER</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> rxthinkcmf </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 签发者标识</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> D:\\xampp8.2\\htdocs\\RXThinkCMF_ThinkPhp8_EleVue\\uploads </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 上传根目录(绝对路径)</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://file.thinkphp8.elevue </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 文件访问域名</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">IMAGE_EXT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> gif,jpg,jpeg,png,bmp,webp,svg </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 允许的图片后缀</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FILE_EXT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> gif,jpg,jpeg,png,bmp,webp,svg,doc,docx,xls,xlsx,ppt,pptx,pdf,zip,rar,txt,csv,mp3,mp4,sql,js,css </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 允许的文件后缀</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MAX_SIZE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 10 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 单文件最大大小(MB)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CACHE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DRIVER</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> file </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 缓存驱动(file=文件,redis=Redis)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_HOST</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 127.0.0.1 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; Redis 地址(driver=redis 时生效)</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 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:#7B7F8B;--shiki-light:#A0ADA0;"> ; Redis 密码(无密码留空)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_DB</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 0 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; Redis 数据库编号</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PREFIX</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> rx: </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 缓存键前缀</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CORS</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ALLOW_ORIGIN</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> * </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 允许的来源(* = 所有)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">API</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CAMEL_SNAKE_CONVERT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 驼峰/下划线自动转换</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CAPTCHA</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CAPTCHA_BYPASS_CODE</span><span style="--shiki-dark:#F286C4;--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;">CAPTCHA_LENGTH</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 6 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 验证码字符长度(4-6位)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CAPTCHA_EXPIRE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 300 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 验证码过期时间(秒)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">LANG</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">default_lang</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> zh-cn </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 默认语言</span></span></code></pre></div><h2 id="配置项详解" tabindex="-1">配置项详解 <a class="header-anchor" href="#配置项详解" aria-label="Permalink to "配置项详解""></a></h2><h3 id="应用配置-APP-" tabindex="-1">应用配置 <code>[APP]</code> <a class="header-anchor" href="#应用配置-APP-" aria-label="Permalink to "应用配置 \`[APP]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>DEFAULT_TIMEZONE</code></td><td><code>Asia/Shanghai</code></td><td>默认时区</td></tr><tr><td><code>DEMO</code></td><td><code>false</code></td><td>演示模式,开启后拦截所有写操作</td></tr><tr><td><code>SHOW_ERROR_MSG</code></td><td><code>true</code></td><td>是否显示错误详情,生产环境设为 <code>false</code></td></tr></tbody></table><p>全局变量(不属于任何分组):</p><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>APP_DEBUG</code></td><td><code>true</code></td><td>调试模式,生产环境设为 <code>false</code></td></tr></tbody></table><h3 id="数据库配置-DATABASE-" tabindex="-1">数据库配置 <code>[DATABASE]</code> <a class="header-anchor" href="#数据库配置-DATABASE-" aria-label="Permalink to "数据库配置 \`[DATABASE]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>TYPE</code></td><td><code>mysql</code></td><td>数据库类型:mysql / pgsql / sqlsrv / oracle / sqlite</td></tr><tr><td><code>HOSTNAME</code></td><td><code>127.0.0.1</code></td><td>数据库主机</td></tr><tr><td><code>DATABASE</code></td><td>-</td><td>数据库名称(SQLite 为文件路径)</td></tr><tr><td><code>USERNAME</code></td><td><code>root</code></td><td>数据库用户名</td></tr><tr><td><code>PASSWORD</code></td><td>-</td><td>数据库密码</td></tr><tr><td><code>HOSTPORT</code></td><td><code>3306</code></td><td>数据库端口</td></tr><tr><td><code>CHARSET</code></td><td><code>utf8mb4</code></td><td>字符集</td></tr><tr><td><code>DEBUG</code></td><td><code>true</code></td><td>是否开启 SQL 调试</td></tr><tr><td><code>PREFIX</code></td><td><code>think_</code></td><td>表前缀</td></tr></tbody></table><h3 id="JWT-配置-JWT-" tabindex="-1">JWT 配置 <code>[JWT]</code> <a class="header-anchor" href="#JWT-配置-JWT-" aria-label="Permalink to "JWT 配置 \`[JWT]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>SECRET</code></td><td>内置默认值</td><td>签名密钥,<strong>生产环境务必修改</strong></td></tr><tr><td><code>ACCESS_TTL</code></td><td><code>7200</code></td><td>access_token 有效期(秒),默认 2 小时</td></tr><tr><td><code>REFRESH_TTL</code></td><td><code>604800</code></td><td>refresh_token 有效期(秒),默认 7 天</td></tr><tr><td><code>ISSUER</code></td><td><code>rxthinkcmf</code></td><td>签发者标识</td></tr></tbody></table><h3 id="文件上传配置-FILE-" tabindex="-1">文件上传配置 <code>[FILE]</code> <a class="header-anchor" href="#文件上传配置-FILE-" aria-label="Permalink to "文件上传配置 \`[FILE]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>UPLOAD_DIR</code></td><td>-</td><td>上传根目录(绝对路径)</td></tr><tr><td><code>DOMAIN_URL</code></td><td>-</td><td>文件访问域名</td></tr><tr><td><code>IMAGE_EXT</code></td><td><code>gif,jpg,jpeg,png,bmp,webp,svg</code></td><td>允许的图片后缀</td></tr><tr><td><code>FILE_EXT</code></td><td>多种后缀</td><td>允许的文件后缀</td></tr><tr><td><code>MAX_SIZE</code></td><td><code>10</code></td><td>单文件最大大小(MB)</td></tr></tbody></table><h3 id="缓存配置-CACHE-" tabindex="-1">缓存配置 <code>[CACHE]</code> <a class="header-anchor" href="#缓存配置-CACHE-" aria-label="Permalink to "缓存配置 \`[CACHE]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>DRIVER</code></td><td><code>file</code></td><td>缓存驱动:<code>file</code> 或 <code>redis</code></td></tr><tr><td><code>REDIS_HOST</code></td><td><code>127.0.0.1</code></td><td>Redis 主机(driver=redis 时生效)</td></tr><tr><td><code>REDIS_PORT</code></td><td><code>6379</code></td><td>Redis 端口(driver=redis 时生效)</td></tr><tr><td><code>REDIS_PASSWORD</code></td><td>-</td><td>Redis 密码</td></tr><tr><td><code>REDIS_DB</code></td><td><code>0</code></td><td>Redis 数据库编号</td></tr><tr><td><code>REDIS_PREFIX</code></td><td><code>rx:</code></td><td>缓存键前缀</td></tr></tbody></table><h3 id="CORS-配置-CORS-" tabindex="-1">CORS 配置 <code>[CORS]</code> <a class="header-anchor" href="#CORS-配置-CORS-" aria-label="Permalink to "CORS 配置 \`[CORS]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>ALLOW_ORIGIN</code></td><td><code>*</code></td><td>允许的来源,<code>*</code> 表示所有</td></tr></tbody></table><h3 id="API-配置-API-" tabindex="-1">API 配置 <code>[API]</code> <a class="header-anchor" href="#API-配置-API-" aria-label="Permalink to "API 配置 \`[API]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>CAMEL_SNAKE_CONVERT</code></td><td><code>true</code></td><td>驼峰/下划线自动转换开关</td></tr></tbody></table><h3 id="验证码配置-CAPTCHA-" tabindex="-1">验证码配置 <code>[CAPTCHA]</code> <a class="header-anchor" href="#验证码配置-CAPTCHA-" aria-label="Permalink to "验证码配置 \`[CAPTCHA]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>CAPTCHA_BYPASS_CODE</code></td><td>(空)</td><td>万能验证码,跳过验证。仅用于开发调试,<strong>生产环境务必留空</strong></td></tr><tr><td><code>CAPTCHA_LENGTH</code></td><td><code>6</code></td><td>验证码字符长度(4-6位)</td></tr><tr><td><code>CAPTCHA_EXPIRE</code></td><td><code>300</code></td><td>验证码过期时间(秒),默认 5 分钟</td></tr><tr><td><code>CAPTCHA_RATE_WINDOW</code></td><td><code>60</code></td><td>防刷窗口期(秒)</td></tr><tr><td><code>CAPTCHA_RATE_LIMIT</code></td><td><code>20</code></td><td>窗口期内最大获取次数</td></tr><tr><td><code>CAPTCHA_CHARS</code></td><td><code>ABCDEFGHJKLMNPQRSTUVWXYZ2346789</code></td><td>字符集(已排除 0O、1lI 等易混淆字符)</td></tr><tr><td><code>CAPTCHA_FONT_PATH</code></td><td><code>static/fonts/Vera.ttf</code></td><td>字体路径</td></tr><tr><td><code>CAPTCHA_IMAGE_WIDTH</code></td><td><code>160</code></td><td>图片宽度(像素)</td></tr><tr><td><code>CAPTCHA_IMAGE_HEIGHT</code></td><td><code>50</code></td><td>图片高度(像素)</td></tr><tr><td><code>CAPTCHA_FONT_SIZE</code></td><td><code>28</code></td><td>字体大小</td></tr><tr><td><code>CAPTCHA_NOISE_LINES</code></td><td><code>8</code></td><td>干扰线数量</td></tr><tr><td><code>CAPTCHA_NOISE_DOTS</code></td><td><code>500</code></td><td>噪点数量</td></tr></tbody></table><h3 id="国际化配置-LANG-" tabindex="-1">国际化配置 <code>[LANG]</code> <a class="header-anchor" href="#国际化配置-LANG-" aria-label="Permalink to "国际化配置 \`[LANG]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>default_lang</code></td><td><code>zh-cn</code></td><td>默认语言</td></tr></tbody></table><h3 id="代码生成器配置-GENERATOR-" tabindex="-1">代码生成器配置 <code>[GENERATOR]</code> <a class="header-anchor" href="#代码生成器配置-GENERATOR-" aria-label="Permalink to "代码生成器配置 \`[GENERATOR]\`""></a></h3><table tabindex="0"><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>PARENT_MENU_ID</code></td><td><code>189</code></td><td>生成模块的父菜单ID</td></tr><tr><td><code>APP_NAME</code></td><td><code>tool</code></td><td>模块应用名(影响路由前缀和前端目录)</td></tr></tbody></table><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-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;">; 开发环境配置(调试开启,使用文件缓存)</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;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 开启调试模式</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">APP</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SHOW_ERROR_MSG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 显示错误详情</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DEBUG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> true </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 显示执行的 SQL</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CACHE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DRIVER</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> file </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 使用文件缓存(无需 Redis)</span></span></code></pre></div><h3 id="生产环境" tabindex="-1">生产环境 <a class="header-anchor" href="#生产环境" aria-label="Permalink to "生产环境""></a></h3><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;">; 生产环境配置(调试关闭,使用 Redis 缓存)</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 style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 关闭调试模式</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">APP</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SHOW_ERROR_MSG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> false </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 不显示错误详情(防止泄露)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DEBUG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> false </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 不显示 SQL</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CACHE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DRIVER</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> redis </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 使用 Redis 缓存</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_HOST</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 127.0.0.1 </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; Redis 地址</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 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;"> <你的Redis密码> </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; Redis 密码</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">JWT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">SECRET</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> <随机生成的强密钥> </span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 签名密钥(必须修改)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CORS</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">ALLOW_ORIGIN</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> https://admin.example.com </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;"># Linux / macOS:使用 OpenSSL 生成 32 字节随机 Base64 字符串</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">openssl</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rand</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -base64</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 32</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># PHP:生成 32 字节随机十六进制字符串(64 个字符)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># random_bytes(32) → 32 字节密码学安全随机数</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># bin2hex() → 转为十六进制字符串</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">php</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -r</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">echo bin2hex(random_bytes(32));</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><p>前端使用 Vite 的环境变量机制,配置文件位于 <code>ui/</code> 目录:</p><h3 id="-env-development-开发环境-" tabindex="-1"><code>.env.development</code>(开发环境) <a class="header-anchor" href="#-env-development-开发环境-" aria-label="Permalink to "\`.env.development\`(开发环境)""></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;"># API 接口基础路径(Vite 代理会将此路径的请求转发到后端)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">VITE_GLOB_API_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">/api</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># API 前缀(一般留空)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">VITE_GLOB_API_URL_PREFIX</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;"># 是否启用 Mock 数据(false = 使用真实后端 API)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">VITE_USE_MOCK</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">false</span></span></code></pre></div><h3 id="-env-production-生产环境-" tabindex="-1"><code>.env.production</code>(生产环境) <a class="header-anchor" href="#-env-production-生产环境-" aria-label="Permalink to "\`.env.production\`(生产环境)""></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;"># API 接口基础路径(生产环境的实际后端地址)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">VITE_GLOB_API_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">/api</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># API 前缀</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">VITE_GLOB_API_URL_PREFIX</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span></span></code></pre></div><p>在代码中访问环境变量:</p><div class="language-typescript vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">typescript</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;">// 通过 import.meta.env 访问 Vite 环境变量</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// VITE_ 前缀的变量才会被暴露给客户端代码</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">const</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;"> apiUrl</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> import</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">.</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#998418;">meta</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">.</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">env</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">.</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#B07D48;">VITE_GLOB_API_URL</span></span></code></pre></div>`,43)])])}const o=i(h,[["render",e]]);export{c as __pageData,o as default};
|