28 lines
9.6 KiB
JavaScript
28 lines
9.6 KiB
JavaScript
import{_ as d,o as a,c as s,a2 as e}from"./chunks/framework.B-QBKwc1.js";const u=JSON.parse('{"title":"技术栈说明","description":"本页列出项目前后端完整技术选型与版本要求,包含语言、框架、核心依赖及其选型理由,评估兼容性或升级影响时对照本表。","frontmatter":{},"headers":[],"relativePath":"zh/tech-stack.md","filePath":"zh/tech-stack.md"}'),n={name:"zh/tech-stack.md"};function p(r,t,l,i,o,c){return a(),s("div",null,[...t[0]||(t[0]=[e(`<h1 id="_1-5-技术栈说明" tabindex="-1">1.5 技术栈说明 <a class="header-anchor" href="#_1-5-技术栈说明" aria-label="Permalink to "1.5 技术栈说明""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>本页列出项目前后端完整技术选型与版本要求,包含语言、框架、核心依赖及其选型理由,评估兼容性或升级影响时对照本表。</p></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><th>说明</th></tr></thead><tbody><tr><td>语言</td><td>PHP</td><td>>= 8.3</td><td>强类型严格模式(composer.json <code>^8.3</code>)</td></tr><tr><td>框架</td><td>Laravel</td><td>13.x</td><td>核心 Web 框架(<code>laravel/framework ^13.0</code>)</td></tr><tr><td>ORM</td><td>Eloquent</td><td>随框架</td><td>数据库操作,模型薄封装 + Trait 复用</td></tr><tr><td>认证</td><td>firebase/php-jwt</td><td>7.1+</td><td>JWT 双令牌签发与解析(Redis 有状态)</td></tr><tr><td>Excel</td><td>phpoffice/phpspreadsheet</td><td>5.10+</td><td>Excel 导入导出</td></tr><tr><td>IP 归属地</td><td>zoujingli/ip2region</td><td>3.0+</td><td>登录日志 IP 归属地解析(IPv4/IPv6)</td></tr><tr><td>数据库</td><td>MySQL</td><td>8.0+</td><td>主数据库(另支持 PostgreSQL / SQL Server / Oracle / SQLite,五套初始化脚本齐备)</td></tr><tr><td>缓存</td><td>Redis</td><td>6.0+</td><td><strong>必需</strong>:JWT 会话、权限缓存、验证码、字典缓存(phpredis 扩展)</td></tr><tr><td>Web 服务器</td><td>Nginx</td><td>1.18+</td><td>推荐(Docker 方案内置)</td></tr><tr><td>Web 服务器</td><td>Apache</td><td>2.4+</td><td>兼容(Laragon mod_php 方式,见 <a href="/zh/quickstart/laragon.html">2.2 Laragon 环境搭建</a>)</td></tr><tr><td>包管理</td><td>Composer</td><td>2.x</td><td>依赖管理(<code>composer setup</code> 一键初始化)</td></tr><tr><td>代码格式化</td><td>laravel/pint</td><td>1.27+(dev)</td><td>提交前格式化(Pint 风格)</td></tr><tr><td>日志查看</td><td>laravel/pail</td><td>1.2+(dev)</td><td>实时日志流(<code>composer dev</code> 内置)</td></tr><tr><td>测试</td><td>phpunit/phpunit</td><td>12.5+(dev)</td><td>Feature / Unit 测试</td></tr></tbody></table><h2 id="前端技术栈" tabindex="-1">前端技术栈 <a class="header-anchor" href="#前端技术栈" aria-label="Permalink to "前端技术栈""></a></h2><p>前端为本仓库 <code>ui/</code> 目录内的 EleVue 管理后台(Vue3 + ElementPlus),与本后端通过 API 对接:</p><table tabindex="0"><thead><tr><th>类别</th><th>技术选型</th><th>版本</th><th>说明</th></tr></thead><tbody><tr><td>框架</td><td>Vue</td><td>3.4+</td><td>核心 UI 框架(Composition API)</td></tr><tr><td>语言</td><td>TypeScript</td><td>4.9+(实际 ^4.9.5)</td><td>类型安全</td></tr><tr><td>UI 库</td><td>ElementPlus</td><td>2.7+</td><td>组件库</td></tr><tr><td>构建工具</td><td>Vite</td><td>3.2+(实际 ^3.2.10)</td><td>开发服务器与构建</td></tr><tr><td>状态管理</td><td>Pinia</td><td>2.1+</td><td>全局状态管理</td></tr><tr><td>路由</td><td>Vue Router</td><td>4.3+</td><td>路由管理</td></tr><tr><td>HTTP</td><td>Axios</td><td>0.27+(实际 ^0.27.2)</td><td>HTTP 请求(注:0.27.x 版本较老)</td></tr><tr><td>富文本</td><td>TinyMce</td><td>5.10+</td><td>富文本编辑器</td></tr><tr><td>图表</td><td>ECharts</td><td>5.5+</td><td>数据可视化</td></tr><tr><td>CSS</td><td>TailwindCSS</td><td>3.4+</td><td>原子化 CSS</td></tr><tr><td>权限</td><td>v-perm 指令</td><td>-</td><td>按钮级权限指令,与后端 <code>#[Permission]</code> 对应</td></tr><tr><td>包管理</td><td>pnpm</td><td>-</td><td>高效包管理器</td></tr></tbody></table><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>前端工程结构、开发实践详见 <a href="/zh/frontend/overview.html">第 9 章 前端开发</a>;后端代码生成器会把前端页面模板输出到 <code>ui/</code> 目录(见 <a href="/zh/generator/templates.html">10.6 自定义模板开发</a>)。</p></div><h2 id="架构特点" tabindex="-1">架构特点 <a class="header-anchor" href="#架构特点" aria-label="Permalink to "架构特点""></a></h2><p>一次 API 请求的完整链路(与 <a href="/zh/architecture/request-flow.html">4.2 请求处理链路</a> 一致):</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>┌─────────────────────────────────────────────────────────┐</span></span>
|
||
<span class="line"><span>│ 前端(Vue3 + ElementPlus) │</span></span>
|
||
<span class="line"><span>│ 通过 API 调用后端服务,纯 JSON 交互 │</span></span>
|
||
<span class="line"><span>└──────────────────────────┬──────────────────────────────┘</span></span>
|
||
<span class="line"><span> │ HTTP (JSON)</span></span>
|
||
<span class="line"><span> ▼</span></span>
|
||
<span class="line"><span>┌─────────────────────────────────────────────────────────┐</span></span>
|
||
<span class="line"><span>│ 后端(Laravel 13) │</span></span>
|
||
<span class="line"><span>│ │</span></span>
|
||
<span class="line"><span>│ 路由(routes/api.php) → 中间件栈 → 控制器 → 服务 → 模型 │</span></span>
|
||
<span class="line"><span>│ │</span></span>
|
||
<span class="line"><span>│ 中间件栈(7 个): │</span></span>
|
||
<span class="line"><span>│ Proxy(真实IP) → Cors(跨域) → ForceJsonResponse(强制JSON) │</span></span>
|
||
<span class="line"><span>│ → auth.jwt(JWT认证+#[Permission]鉴权) │</span></span>
|
||
<span class="line"><span>│ → tenant(租户上下文) → log.operation(操作日志) │</span></span>
|
||
<span class="line"><span>│ → Demo(演示模式防护) │</span></span>
|
||
<span class="line"><span>│ │</span></span>
|
||
<span class="line"><span>│ Service 层:BaseService 属性声明 + 6 个 Trait 组合 │</span></span>
|
||
<span class="line"><span>│ (CRUD / 查询 / 文件 / 数据权限 / 字典翻译 / 唯一校验) │</span></span>
|
||
<span class="line"><span>└──────────────────────────┬──────────────────────────────┘</span></span>
|
||
<span class="line"><span> │</span></span>
|
||
<span class="line"><span> ▼</span></span>
|
||
<span class="line"><span>┌─────────────────────────────────────────────────────────┐</span></span>
|
||
<span class="line"><span>│ 数据层(MySQL + Redis) │</span></span>
|
||
<span class="line"><span>│ MySQL 主存储(Eloquent + 软删除 + 审计字段) │</span></span>
|
||
<span class="line"><span>│ Redis 会话 / 缓存 / 队列(JWT 双令牌、字典、权限缓存) │</span></span>
|
||
<span class="line"><span>└─────────────────────────────────────────────────────────┘</span></span></code></pre></div><p>核心设计决策:</p><table tabindex="0"><thead><tr><th>决策</th><th>说明</th></tr></thead><tbody><tr><td>声明式配置 + 基类钩子</td><td>Service 子类只声明属性(查询字段、唯一规则、字典映射…),通用逻辑由 BaseService + 6 个 Trait 完成</td></tr><tr><td>菜单即权限</td><td><code>menu.permission</code> 字段即权限编码,<code>#[Permission]</code> 注解 + 中间件反射鉴权</td></tr><tr><td>统一响应</td><td>HTTP 200 + body <code>{code, ok, msg, data}</code>,camelCase/snake_case 自动转换</td></tr><tr><td>fail-close 安全</td><td><code>JWT_SECRET</code> 为空或不足 32 字符时拒绝启动(AppServiceProvider 启动校验)</td></tr><tr><td>验证职责分层</td><td>FormRequest 只做格式验证,Service 只做业务规则</td></tr></tbody></table>`,13)])])}const m=d(n,[["render",p]]);export{u as __pageData,m as default};
|