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(`

1.5 技术栈说明 ​

概述

本页列出项目前后端完整技术选型与版本要求,包含语言、框架、核心依赖及其选型理由,评估兼容性或升级影响时对照本表。

后端技术栈 ​

类别技术选型版本说明
语言PHP>= 8.3强类型严格模式(composer.json ^8.3)
框架Laravel13.x核心 Web 框架(laravel/framework ^13.0)
ORMEloquent随框架数据库操作,模型薄封装 + Trait 复用
认证firebase/php-jwt7.1+JWT 双令牌签发与解析(Redis 有状态)
Excelphpoffice/phpspreadsheet5.10+Excel 导入导出
IP 归属地zoujingli/ip2region3.0+登录日志 IP 归属地解析(IPv4/IPv6)
数据库MySQL8.0+主数据库(另支持 PostgreSQL / SQL Server / Oracle / SQLite,五套初始化脚本齐备)
缓存Redis6.0+必需:JWT 会话、权限缓存、验证码、字典缓存(phpredis 扩展)
Web 服务器Nginx1.18+推荐(Docker 方案内置)
Web 服务器Apache2.4+兼容(Laragon mod_php 方式,见 2.2 Laragon 环境搭建)
包管理Composer2.x依赖管理(composer setup 一键初始化)
代码格式化laravel/pint1.27+(dev)提交前格式化(Pint 风格)
日志查看laravel/pail1.2+(dev)实时日志流(composer dev 内置)
测试phpunit/phpunit12.5+(dev)Feature / Unit 测试

前端技术栈 ​

前端为本仓库 ui/ 目录内的 EleVue 管理后台(Vue3 + ElementPlus),与本后端通过 API 对接:

类别技术选型版本说明
框架Vue3.4+核心 UI 框架(Composition API)
语言TypeScript4.9+(实际 ^4.9.5)类型安全
UI 库ElementPlus2.7+组件库
构建工具Vite3.2+(实际 ^3.2.10)开发服务器与构建
状态管理Pinia2.1+全局状态管理
路由Vue Router4.3+路由管理
HTTPAxios0.27+(实际 ^0.27.2)HTTP 请求(注:0.27.x 版本较老)
富文本TinyMce5.10+富文本编辑器
图表ECharts5.5+数据可视化
CSSTailwindCSS3.4+原子化 CSS
权限v-perm 指令-按钮级权限指令,与后端 #[Permission] 对应
包管理pnpm-高效包管理器

TIP

前端工程结构、开发实践详见 第 9 章 前端开发;后端代码生成器会把前端页面模板输出到 ui/ 目录(见 10.6 自定义模板开发)。

架构特点 ​

一次 API 请求的完整链路(与 4.2 请求处理链路 一致):

text
┌─────────────────────────────────────────────────────────┐
│                  前端(Vue3 + ElementPlus)               │
│            通过 API 调用后端服务,纯 JSON 交互              │
└──────────────────────────┬──────────────────────────────┘
                           │ HTTP (JSON)
                           ▼
┌─────────────────────────────────────────────────────────┐
│                     后端(Laravel 13)                    │
│                                                          │
│  路由(routes/api.php) → 中间件栈 → 控制器 → 服务 → 模型    │
│                                                          │
│  中间件栈(7 个):                                        │
│  Proxy(真实IP) → Cors(跨域) → ForceJsonResponse(强制JSON) │
│    → auth.jwt(JWT认证+#[Permission]鉴权)                   │
│    → tenant(租户上下文) → log.operation(操作日志)            │
│    → Demo(演示模式防护)                                    │
│                                                          │
│  Service 层:BaseService 属性声明 + 6 个 Trait 组合          │
│  (CRUD / 查询 / 文件 / 数据权限 / 字典翻译 / 唯一校验)      │
└──────────────────────────┬──────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│                   数据层(MySQL + Redis)                  │
│   MySQL 主存储(Eloquent + 软删除 + 审计字段)               │
│   Redis 会话 / 缓存 / 队列(JWT 双令牌、字典、权限缓存)      │
└─────────────────────────────────────────────────────────┘

核心设计决策:

决策说明
声明式配置 + 基类钩子Service 子类只声明属性(查询字段、唯一规则、字典映射…),通用逻辑由 BaseService + 6 个 Trait 完成
菜单即权限menu.permission 字段即权限编码,#[Permission] 注解 + 中间件反射鉴权
统一响应HTTP 200 + body {code, ok, msg, data},camelCase/snake_case 自动转换
fail-close 安全JWT_SECRET 为空或不足 32 字符时拒绝启动(AppServiceProvider 启动校验)
验证职责分层FormRequest 只做格式验证,Service 只做业务规则
`,13)])])}const m=d(n,[["render",p]]);export{u as __pageData,m as default};