签入版本
This commit is contained in:
@@ -0,0 +1,279 @@
|
||||
# E. API 接口速查表
|
||||
|
||||
:::tip 概述
|
||||
本表列出所有 API 路由的完整清单,包含 HTTP 方法、路径和所需权限码。
|
||||
:::
|
||||
|
||||
## 公开接口
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| POST | `/api/login` | 用户登录 |
|
||||
| GET | `/api/logout` | 用户登出 |
|
||||
| GET | `/api/captcha` | 获取验证码 |
|
||||
| POST | `/api/oauth2/token` | 刷新 Token |
|
||||
| DELETE | `/api/oauth2/remove/:token` | 移除 Token |
|
||||
| GET | `/api/oauth2/check/token` | 检查 Token |
|
||||
|
||||
## 首页 / 个人中心
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/index/getUser` | - | 获取当前用户信息 |
|
||||
| GET | `/api/index/getMenus` | - | 获取菜单列表 |
|
||||
| PUT | `/api/index/updatePassword` | - | 修改密码 |
|
||||
| PUT | `/api/index/updateProfile` | - | 修改个人资料 |
|
||||
|
||||
## 用户管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/user/page` | sys:user:page | 分页列表 |
|
||||
| GET | `/api/user/detail/:id` | sys:user:detail | 详情 |
|
||||
| POST | `/api/user/add` | sys:user:add | 新增 |
|
||||
| PUT | `/api/user/update` | sys:user:update | 修改 |
|
||||
| PUT | `/api/user/resetPwd` | sys:user:resetPwd | 重置密码 |
|
||||
| DELETE | `/api/user/delete/:id` | sys:user:delete | 删除 |
|
||||
| DELETE | `/api/user/batchDelete` | sys:user:batchDelete | 批量删除 |
|
||||
| POST | `/api/user/import` | sys:user:import | 导入 |
|
||||
| GET | `/api/user/export` | sys:user:export | 导出 |
|
||||
|
||||
## 角色管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/role/page` | sys:role:page | 分页列表 |
|
||||
| GET | `/api/role/list` | sys:role:list | 全量列表 |
|
||||
| GET | `/api/role/detail/:id` | sys:role:detail | 详情 |
|
||||
| POST | `/api/role/add` | sys:role:add | 新增 |
|
||||
| PUT | `/api/role/update` | sys:role:update | 修改 |
|
||||
| DELETE | `/api/role/delete/:id` | sys:role:delete | 删除 |
|
||||
| DELETE | `/api/role/batchDelete` | sys:role:batchDelete | 批量删除 |
|
||||
| GET | `/api/role/menu/list/:id` | - | 角色菜单列表 |
|
||||
| POST | `/api/role/menu/save` | sys:role:authorize | 保存角色菜单 |
|
||||
|
||||
## 菜单管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/menu/list` | sys:menu:page | 菜单列表(树形) |
|
||||
| GET | `/api/menu/detail/:id` | sys:menu:detail | 详情 |
|
||||
| POST | `/api/menu/add` | sys:menu:add | 新增 |
|
||||
| PUT | `/api/menu/update` | sys:menu:update | 修改 |
|
||||
| DELETE | `/api/menu/delete/:id` | sys:menu:delete | 删除 |
|
||||
|
||||
## 部门管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/dept/list` | sys:dept:page | 部门列表(树形) |
|
||||
| GET | `/api/dept/detail/:id` | sys:dept:detail | 详情 |
|
||||
| POST | `/api/dept/add` | sys:dept:add | 新增 |
|
||||
| PUT | `/api/dept/update` | sys:dept:update | 修改 |
|
||||
| DELETE | `/api/dept/delete/:id` | sys:dept:delete | 删除 |
|
||||
|
||||
## 岗位管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/position/page` | sys:position:page | 分页列表 |
|
||||
| GET | `/api/position/list` | sys:position:list | 全量列表 |
|
||||
| GET | `/api/position/detail/:id` | sys:position:detail | 详情 |
|
||||
| POST | `/api/position/add` | sys:position:add | 新增 |
|
||||
| PUT | `/api/position/update` | sys:position:update | 修改 |
|
||||
| DELETE | `/api/position/delete/:id` | sys:position:delete | 删除 |
|
||||
| DELETE | `/api/position/batchDelete` | sys:position:batchDelete | 批量删除 |
|
||||
|
||||
## 职级管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/level/page` | sys:level:page | 分页列表 |
|
||||
| GET | `/api/level/list` | sys:level:list | 全量列表 |
|
||||
| GET | `/api/level/detail/:id` | sys:level:detail | 详情 |
|
||||
| POST | `/api/level/add` | sys:level:add | 新增 |
|
||||
| PUT | `/api/level/update` | sys:level:update | 修改 |
|
||||
| DELETE | `/api/level/delete/:id` | sys:level:delete | 删除 |
|
||||
| DELETE | `/api/level/batchDelete` | sys:level:batchDelete | 批量删除 |
|
||||
| GET | `/api/level/export` | sys:level:export | 导出 |
|
||||
| POST | `/api/level/import` | sys:level:import | 导入 |
|
||||
|
||||
## 数据字典
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/dict/page` | sys:dict:page | 分页列表 |
|
||||
| GET | `/api/dict/detail/:id` | sys:dict:detail | 详情 |
|
||||
| GET | `/api/dict/refreshCache` | sys:dict:refreshCache | 刷新缓存 |
|
||||
| POST | `/api/dict/add` | sys:dict:add | 新增 |
|
||||
| PUT | `/api/dict/update` | sys:dict:update | 修改 |
|
||||
| DELETE | `/api/dict/delete/:id` | sys:dict:delete | 删除 |
|
||||
| DELETE | `/api/dict/batchDelete` | sys:dict:batchDelete | 批量删除 |
|
||||
|
||||
## 字典项
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/dict/item/page` | sys:dict:item:page | 分页列表 |
|
||||
| GET | `/api/dict/item/detail/:id` | sys:dict:item:detail | 详情 |
|
||||
| GET | `/api/dict/item/getDictItemList/:code` | - | 按编码获取字典项 |
|
||||
| POST | `/api/dict/item/add` | sys:dict:item:add | 新增 |
|
||||
| PUT | `/api/dict/item/update` | sys:dict:item:update | 修改 |
|
||||
| DELETE | `/api/dict/item/delete/:id` | sys:dict:item:delete | 删除 |
|
||||
| DELETE | `/api/dict/item/batchDelete` | sys:dict:item:batchDelete | 批量删除 |
|
||||
|
||||
## 租户管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/tenant/page` | sys:tenant:page | 分页列表 |
|
||||
| GET | `/api/tenant/detail/:id` | sys:tenant:detail | 详情 |
|
||||
| GET | `/api/tenant/users/:tenantId` | - | 租户用户列表 |
|
||||
| POST | `/api/tenant/add` | sys:tenant:add | 新增 |
|
||||
| POST | `/api/tenant/account` | sys:tenant:add | 创建租户账号 |
|
||||
| PUT | `/api/tenant/update` | sys:tenant:update | 修改 |
|
||||
| DELETE | `/api/tenant/delete/:id` | sys:tenant:delete | 删除 |
|
||||
| DELETE | `/api/tenant/batchDelete` | sys:tenant:batchDelete | 批量删除 |
|
||||
|
||||
## 系统配置
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/config/page` | sys:config:page | 分页列表 |
|
||||
| GET | `/api/config/list` | sys:config:list | 全量列表 |
|
||||
| GET | `/api/config/detail/:id` | sys:config:detail | 详情 |
|
||||
| GET | `/api/config/web/index` | sys:config:web | 网站配置 |
|
||||
| POST | `/api/config/web/save` | sys:config:web | 保存网站配置 |
|
||||
| POST | `/api/config/add` | sys:config:add | 新增 |
|
||||
| PUT | `/api/config/update` | sys:config:update | 修改 |
|
||||
| DELETE | `/api/config/delete/:id` | sys:config:delete | 删除 |
|
||||
|
||||
## 配置项
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/config/item/page` | sys:config:item:page | 分页列表 |
|
||||
| GET | `/api/config/item/list` | sys:config:item:list | 全量列表 |
|
||||
| GET | `/api/config/item/detail/:id` | sys:config:item:detail | 详情 |
|
||||
| POST | `/api/config/item/add` | sys:config:item:add | 新增 |
|
||||
| PUT | `/api/config/item/update` | sys:config:item:update | 修改 |
|
||||
| DELETE | `/api/config/item/delete/:id` | sys:config:item:delete | 删除 |
|
||||
|
||||
## 系统参数
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/param/page` | sys:param:page | 分页列表 |
|
||||
| GET | `/api/param/list` | sys:param:list | 全量列表 |
|
||||
| GET | `/api/param/detail/:id` | sys:param:detail | 详情 |
|
||||
| POST | `/api/param/add` | sys:param:add | 新增 |
|
||||
| PUT | `/api/param/update` | sys:param:update | 修改 |
|
||||
| DELETE | `/api/param/delete/:id` | sys:param:delete | 删除 |
|
||||
|
||||
## 通知公告
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/notice/page` | sys:notice:page | 分页列表 |
|
||||
| GET | `/api/notice/list` | - | 全量列表 |
|
||||
| GET | `/api/notice/detail/:id` | sys:notice:detail | 详情 |
|
||||
| POST | `/api/notice/add` | sys:notice:add | 新增 |
|
||||
| PUT | `/api/notice/update` | sys:notice:update | 修改 |
|
||||
| DELETE | `/api/notice/delete/:id` | sys:notice:delete | 删除 |
|
||||
|
||||
## 城市行政区划
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/city/list` | sys:city:page | 城市列表 |
|
||||
| GET | `/api/city/detail/:id` | sys:city:detail | 详情 |
|
||||
| POST | `/api/city/add` | sys:city:add | 新增 |
|
||||
| PUT | `/api/city/update` | sys:city:update | 修改 |
|
||||
| DELETE | `/api/city/delete/:id` | sys:city:delete | 删除 |
|
||||
| GET | `/api/city/getCityList/:parentCode` | - | 按父编码获取城市 |
|
||||
|
||||
## 文章管理
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/article/page` | sys:article:page | 分页列表 |
|
||||
| GET | `/api/article/list` | sys:article:list | 全量列表 |
|
||||
| GET | `/api/article/detail/:id` | sys:article:detail | 详情 |
|
||||
| POST | `/api/article/add` | sys:article:add | 新增 |
|
||||
| PUT | `/api/article/update` | sys:article:update | 修改 |
|
||||
| DELETE | `/api/article/delete/:id` | sys:article:delete | 删除 |
|
||||
| DELETE | `/api/article/batchDelete` | sys:article:batchDelete | 批量删除 |
|
||||
|
||||
## 文章分类
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/category/page` | sys:category:page | 分页列表 |
|
||||
| GET | `/api/category/list` | sys:category:list | 全量列表 |
|
||||
| GET | `/api/category/detail/:id` | sys:category:detail | 详情 |
|
||||
| POST | `/api/category/add` | sys:category:add | 新增 |
|
||||
| PUT | `/api/category/update` | sys:category:update | 修改 |
|
||||
| DELETE | `/api/category/delete/:id` | sys:category:delete | 删除 |
|
||||
|
||||
## 友情链接
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/link/page` | sys:link:page | 分页列表 |
|
||||
| GET | `/api/link/detail/:id` | sys:link:detail | 详情 |
|
||||
| POST | `/api/link/add` | sys:link:add | 新增 |
|
||||
| PUT | `/api/link/update` | sys:link:update | 修改 |
|
||||
| DELETE | `/api/link/delete/:id` | sys:link:delete | 删除 |
|
||||
|
||||
## 定时任务
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/job/page` | sys:job:page | 分页列表 |
|
||||
| GET | `/api/job/list` | sys:job:list | 全量列表 |
|
||||
| GET | `/api/job/detail/:id` | sys:job:detail | 详情 |
|
||||
| GET | `/api/job/runOnce/:id` | sys:job:execute | 手动执行一次 |
|
||||
| GET | `/api/job/pause/:id` | sys:job:pause | 暂停任务 |
|
||||
| GET | `/api/job/resume/:id` | sys:job:resume | 恢复任务 |
|
||||
| POST | `/api/job/add` | sys:job:add | 新增 |
|
||||
| PUT | `/api/job/update` | sys:job:update | 修改 |
|
||||
| DELETE | `/api/job/delete/:id` | sys:job:delete | 删除 |
|
||||
|
||||
## 任务日志
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/job/log/page` | sys:job:log:page | 分页列表 |
|
||||
| GET | `/api/job/log/detail/:id` | sys:job:log:detail | 详情 |
|
||||
| DELETE | `/api/job/log/delete/:id` | sys:job:log:delete | 删除 |
|
||||
|
||||
## 操作日志
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/oper/log/page` | sys:oper:log:page | 分页列表 |
|
||||
| GET | `/api/oper/log/detail/:id` | sys:oper:log:detail | 详情 |
|
||||
| DELETE | `/api/oper/log/delete/:id` | sys:oper:log:delete | 删除 |
|
||||
|
||||
## 登录日志
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/login/log/page` | sys:login:log:page | 分页列表 |
|
||||
| GET | `/api/login/log/detail/:id` | sys:login:log:detail | 详情 |
|
||||
| DELETE | `/api/login/log/delete/:id` | sys:login:log:delete | 删除 |
|
||||
|
||||
## 文件上传
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| POST | `/api/upload/uploadFile` | - | 上传文件 |
|
||||
|
||||
## 代码生成器
|
||||
|
||||
| 方法 | 路径 | 权限码 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| GET | `/api/generator/page` | sys:generator:page | 可生成表列表 |
|
||||
| POST | `/api/generator/preview` | sys:generator:preview | 预览生成代码 |
|
||||
| POST | `/api/generator/generate` | sys:generator:generate | 生成代码 |
|
||||
| POST | `/api/generator/batchGenerate` | sys:generator:generate | 批量生成 |
|
||||
@@ -0,0 +1,105 @@
|
||||
# G. 前端组件速查
|
||||
|
||||
:::tip 概述
|
||||
以下组件定义在 `ui/src/components/` 目录下,可在页面中直接引入使用。
|
||||
:::
|
||||
|
||||
## 数据展示
|
||||
|
||||
| 组件 | 路径 | 说明 | 核心 Props |
|
||||
|------|------|------|-----------|
|
||||
| BasicTable | `components/Table/` | 数据表格 | `columns`、`dataSource`、`pagination` |
|
||||
| PageWrapper | `components/Page/` | 页面容器 | `title`、`contentFullHeight` |
|
||||
| CountTo | `components/CountTo/` | 数字动画 | `startVal`、`endVal`、`duration` |
|
||||
| Qrcode | `components/Qrcode/` | 二维码 | `value`、`size`、`level` |
|
||||
| Icon | `components/icon/` | 图标选择器 | `value`、`disabled` |
|
||||
|
||||
## 数据录入
|
||||
|
||||
| 组件 | 路径 | 说明 | 核心 Props |
|
||||
|------|------|------|-----------|
|
||||
| BasicForm | `components/Form/` | 动态表单 | `schemas`、`labelWidth` |
|
||||
| BasicModal | `components/Modal/` | 弹窗 | `title`、`width`、`okText` |
|
||||
| BasicUpload | `components/Upload/` | 文件上传 | `action`、`maxCount`、`accept` |
|
||||
| Editor | `components/Editor/` | 富文本编辑器 | `value`、`height`、`placeholder` |
|
||||
| Password | `components/Password/` | 密码强度 | `value`、`placeholder` |
|
||||
| ChinaArea | `components/ChinaArea/` | 省市区联动 | `value`、`placeholder` |
|
||||
| Region | `components/Region/` | 行政区划 | `value`、`level` |
|
||||
| Cropper | `components/Cropper/` | 头像裁剪 | `image`、`aspectRatio` |
|
||||
| NumberInput | `components/numberInput/` | 数字输入 | `value`、`min`、`max` |
|
||||
| PriceInput | `components/priceInput/` | 价格输入 | `value`、`precision` |
|
||||
|
||||
## Excel
|
||||
|
||||
| 组件 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| ImportExcel | `components/Excel/` | Excel 导入(解析文件) |
|
||||
| Export2Excel | `components/Excel/` | Excel 导出(生成文件) |
|
||||
|
||||
## 其他
|
||||
|
||||
| 组件 | 路径 | 说明 |
|
||||
|------|------|------|
|
||||
| Authority | `components/Authority/` | 权限组件(根据权限显示/隐藏) |
|
||||
| CheckToken | `components/CheckToken/` | Token 校验组件 |
|
||||
| Lockscreen | `components/Lockscreen/` | 锁屏组件 |
|
||||
| Websocket | `components/Websocket/` | WebSocket 组件 |
|
||||
|
||||
## 使用示例
|
||||
|
||||
### BasicTable
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<BasicTable @register="registerTable" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { BasicTable, useTable } from '@/components/Table';
|
||||
|
||||
const [registerTable] = useTable({
|
||||
api: getExamplePage,
|
||||
columns: [
|
||||
{ title: 'ID', field: 'id', width: 80 },
|
||||
{ title: '名称', field: 'name' },
|
||||
{ title: '状态', field: 'statusText', width: 100 },
|
||||
],
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
### BasicForm
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<BasicForm @register="registerForm" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { BasicForm, useForm } from '@/components/Form';
|
||||
|
||||
const [registerForm] = useForm({
|
||||
schemas: [
|
||||
{ field: 'name', label: '名称', component: 'Input', required: true },
|
||||
{ field: 'status', label: '状态', component: 'Select', componentProps: { options: [...] } },
|
||||
],
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
### BasicModal
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<BasicModal @register="registerModal" @ok="handleSubmit" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { BasicModal, useModal } from '@/components/Modal';
|
||||
|
||||
const [registerModal, { openModal, closeModal }] = useModal();
|
||||
|
||||
const handleAdd = () => openModal(true, { isUpdate: false });
|
||||
const handleSubmit = async () => { /* ... */ closeModal(); };
|
||||
</script>
|
||||
```
|
||||
@@ -0,0 +1,145 @@
|
||||
# C. 配置项速查
|
||||
|
||||
## 后端 .env 配置
|
||||
|
||||
:::tip 格式说明
|
||||
`.env` 文件采用 INI 分组格式,`[SECTION]` 表示分组,分组下的 `KEY = value` 对应该分组的配置项。
|
||||
:::
|
||||
|
||||
### 全局变量
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `APP_DEBUG` | `true` | 调试模式(生产环境设为 false) |
|
||||
|
||||
### 应用配置 `[APP]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `DEFAULT_TIMEZONE` | `Asia/Shanghai` | 默认时区 |
|
||||
| `DEMO` | `false` | 演示模式(开启后拦截写操作) |
|
||||
| `SHOW_ERROR_MSG` | `true` | 显示错误详情(生产环境设为 false) |
|
||||
|
||||
### 数据库配置 `[DATABASE]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `TYPE` | `mysql` | 数据库类型:mysql / pgsql / sqlsrv / oracle / sqlite |
|
||||
| `HOSTNAME` | `127.0.0.1` | 数据库主机 |
|
||||
| `DATABASE` | - | 数据库名(SQLite 为文件路径) |
|
||||
| `USERNAME` | `root` | 数据库用户 |
|
||||
| `PASSWORD` | - | 数据库密码 |
|
||||
| `HOSTPORT` | `3306` | 数据库端口 |
|
||||
| `CHARSET` | `utf8mb4` | 字符集 |
|
||||
| `DEBUG` | `true` | 是否开启 SQL 调试 |
|
||||
| `PREFIX` | `think_` | 表前缀 |
|
||||
|
||||
各数据库默认端口:
|
||||
|
||||
| 数据库 | 默认端口 | 默认用户 |
|
||||
|--------|----------|----------|
|
||||
| MySQL | 3306 | root |
|
||||
| PostgreSQL | 5432 | postgres |
|
||||
| SQL Server | 1433 | sa |
|
||||
| Oracle | 1521 | - |
|
||||
| SQLite | - | - |
|
||||
|
||||
### JWT 配置 `[JWT]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `SECRET` | 内置默认 | 签名密钥(**生产环境务必修改**) |
|
||||
| `ACCESS_TTL` | `7200` | access_token 有效期(秒) |
|
||||
| `REFRESH_TTL` | `604800` | refresh_token 有效期(秒) |
|
||||
| `ISSUER` | `rxthinkcmf` | 签发者标识 |
|
||||
|
||||
### 文件上传配置 `[FILE]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `UPLOAD_DIR` | - | 上传根目录(绝对路径) |
|
||||
| `DOMAIN_URL` | - | 文件访问域名 |
|
||||
| `IMAGE_EXT` | `gif,jpg,jpeg,png,bmp,webp,svg` | 图片允许后缀 |
|
||||
| `FILE_EXT` | 多种后缀 | 文件允许后缀 |
|
||||
| `MAX_SIZE` | `10` | 最大文件大小(MB) |
|
||||
|
||||
### 缓存配置 `[CACHE]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `DRIVER` | `file` | 缓存驱动:file / redis |
|
||||
| `REDIS_HOST` | `127.0.0.1` | Redis 主机(driver=redis 时生效) |
|
||||
| `REDIS_PORT` | `6379` | Redis 端口(driver=redis 时生效) |
|
||||
| `REDIS_PASSWORD` | - | Redis 密码 |
|
||||
| `REDIS_DB` | `0` | Redis 数据库编号 |
|
||||
| `REDIS_PREFIX` | `rx:` | 缓存键前缀 |
|
||||
|
||||
### CORS 配置 `[CORS]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `ALLOW_ORIGIN` | `*` | 允许的跨域来源 |
|
||||
|
||||
### API 配置 `[API]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `CAMEL_SNAKE_CONVERT` | `true` | 驼峰/下划线自动转换 |
|
||||
| `PROXY_IPS` | (空) | 受信代理 IP 列表(逗号分隔,支持 CIDR)。部署在 CDN/负载均衡后面时配置,中间件会从 `X-Forwarded-For` / `X-Real-IP` 头提取真实客户端 IP。未配置时默认信任 `127.0.0.1` 和 `::1`。 |
|
||||
|
||||
### 验证码配置 `[CAPTCHA]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `CAPTCHA_BYPASS_CODE` | (空) | 万能验证码,仅开发调试用,**生产环境务必留空** |
|
||||
| `CAPTCHA_LENGTH` | `6` | 验证码字符长度(4-6位) |
|
||||
| `CAPTCHA_EXPIRE` | `300` | 过期时间(秒) |
|
||||
| `CAPTCHA_RATE_WINDOW` | `60` | 防刷窗口期(秒) |
|
||||
| `CAPTCHA_RATE_LIMIT` | `20` | 窗口期内最大获取次数 |
|
||||
| `CAPTCHA_CHARS` | `ABCDEFGHJKLMNPQRSTUVWXYZ2346789` | 字符集 |
|
||||
| `CAPTCHA_FONT_PATH` | `static/fonts/Vera.ttf` | 字体路径 |
|
||||
| `CAPTCHA_IMAGE_WIDTH` | `160` | 图片宽度(像素) |
|
||||
| `CAPTCHA_IMAGE_HEIGHT` | `50` | 图片高度(像素) |
|
||||
| `CAPTCHA_FONT_SIZE` | `28` | 字体大小 |
|
||||
| `CAPTCHA_NOISE_LINES` | `8` | 干扰线数量 |
|
||||
| `CAPTCHA_NOISE_DOTS` | `500` | 噪点数量 |
|
||||
|
||||
### 代码生成器配置 `[GENERATOR]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `PARENT_MENU_ID` | `189` | 生成模块的父菜单ID |
|
||||
| `APP_NAME` | `tool` | 模块应用名(路由前缀) |
|
||||
|
||||
### 国际化配置 `[LANG]`
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `default_lang` | `zh-cn` | 默认语言 |
|
||||
|
||||
## 前端环境变量
|
||||
|
||||
| 变量 | 说明 |
|
||||
|------|------|
|
||||
| `VITE_GLOB_API_URL` | API 基础路径(如 `/api`) |
|
||||
| `VITE_GLOB_API_URL_PREFIX` | API 前缀 |
|
||||
|
||||
## 配置文件对照
|
||||
|
||||
| .env 分组 | 配置文件 | 主要配置键 |
|
||||
|-----------|---------|-----------|
|
||||
| `[DATABASE]` | `config/database.php` | `type` / `hostname` / `database` / `username` / `password` |
|
||||
| `[JWT]` | `config/jwt.php` | `secret` / `access_ttl` / `refresh_ttl` |
|
||||
| `[FILE]` | `config/file.php` | `upload_dir` / `domain_url` / `max_size` |
|
||||
| `[CACHE]` | `config/cache.php` | `driver` / `redis_host` / `redis_port` |
|
||||
| `[CORS]` | `config/cors.php` | `allow_origin` |
|
||||
| `[API]` | `config/api.php` | `camel_snake_convert` |
|
||||
| `[CAPTCHA]` | 无配置文件,`CaptchaService` 直接读取 `env()` | `captcha_bypass_code` / `captcha_length` / `captcha_expire` |
|
||||
| `[LANG]` | `config/lang.php` | `default_lang` |
|
||||
| — | `config/tenant.php` | `default_tenant_id` |
|
||||
|
||||
### 租户配置
|
||||
|
||||
| 配置文件 | 配置键 | 默认值 | 说明 |
|
||||
|----------|--------|--------|------|
|
||||
| `config/tenant.php` | `default_tenant_id` | `1` | 默认租户ID,超管操作租户隔离表时自动代入 |
|
||||
@@ -0,0 +1,76 @@
|
||||
# B. 数据库表结构速查
|
||||
|
||||
## SQL 脚本目录
|
||||
|
||||
项目为每种数据库提供了独立的 SQL 脚本:
|
||||
|
||||
```text
|
||||
document/
|
||||
├── mysql/rxthinkcmf.thinkphp6.elevue.sql # MySQL 版本
|
||||
├── postgresql/rxthinkcmf.thinkphp6.elevue.sql # PostgreSQL 版本
|
||||
├── sqlserver/rxthinkcmf.thinkphp6.elevue.sql # SQL Server 版本
|
||||
├── oracle/rxthinkcmf.thinkphp6.elevue.sql # Oracle 版本
|
||||
└── sqlite/rxthinkcmf.thinkphp6.elevue.sql # SQLite 版本
|
||||
```
|
||||
|
||||
各脚本已针对对应数据库的 SQL 语法做了适配,可直接导入使用。
|
||||
|
||||
## 用户相关
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_user | 用户表 | tenant_id, code, username, password, salt, realname, gender, avatar, mobile, email, status, dept_id, level_id, position_id, province_code, city_code, district_code, street_code, city_info, address, intro, note, sort |
|
||||
| think_user_role | 用户角色关联 | user_id, role_id |
|
||||
| think_role | 角色表 | tenant_id, name, code, data_scope, sort, note |
|
||||
| think_role_menu | 角色菜单关联 | role_id, menu_id |
|
||||
| think_menu | 菜单表 | parent_id, name, permission, type, path, component |
|
||||
| think_dept | 部门表 | parent_id, name, sort |
|
||||
| think_position | 岗位表 | name, status, sort |
|
||||
| think_level | 职级表 | name, status, sort |
|
||||
|
||||
## 系统配置
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_dict | 字典表 | name, code |
|
||||
| think_dict_item | 字典项 | dict_id, name, value, sort |
|
||||
| think_config | 配置表 | name, code |
|
||||
| think_config_item | 配置项 | config_id, name, code, value |
|
||||
| think_param | 参数表 | name, code, value, status |
|
||||
|
||||
## 租户
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_tenant | 租户表 | name, code, contact, mobile, email, address, status, expire_time, max_user_num, note |
|
||||
|
||||
## 内容
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_article | 文章表 | title, category_id, cover, content, status |
|
||||
| think_category | 分类表 | parent_id, name, sort |
|
||||
| think_link | 链接表 | name, url, sort |
|
||||
| think_notice | 公告表 | title, content, status |
|
||||
|
||||
## 日志
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_login_log | 登录日志 | username, status, ip, location |
|
||||
| think_operation_log | 操作日志 | title, type, method, url, param, ip |
|
||||
|
||||
## 定时任务
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_job | 任务表 | job_name, url, cron_expression, status |
|
||||
| think_job_log | 任务日志 | job_id, status, job_message |
|
||||
|
||||
## 其他
|
||||
|
||||
| 表名 | 说明 | 关键字段 |
|
||||
|------|------|----------|
|
||||
| think_city | 城市表 | name, code, parent_code, level |
|
||||
| think_file_template | 文件模板 | name, code, file_path |
|
||||
| think_example | 案例演示 | name, type, status, sort, avatar |
|
||||
@@ -0,0 +1,84 @@
|
||||
# I. 前端 Enums 速查
|
||||
|
||||
:::tip 概述
|
||||
前端枚举定义在 `ui/src/enums/` 目录下,用于统一管理常量值。
|
||||
:::
|
||||
|
||||
## httpEnum
|
||||
|
||||
**文件**:`enums/httpEnum.ts`
|
||||
|
||||
```typescript
|
||||
// 请求方法
|
||||
export enum RequestEnum {
|
||||
GET = 'GET',
|
||||
POST = 'POST',
|
||||
PUT = 'PUT',
|
||||
DELETE = 'DELETE',
|
||||
}
|
||||
|
||||
// 响应状态码
|
||||
export enum ResultEnum {
|
||||
SUCCESS = 0, // 业务成功
|
||||
FAIL = 1, // 业务失败
|
||||
}
|
||||
|
||||
// 内容类型
|
||||
export enum ContentTypeEnum {
|
||||
JSON = 'application/json',
|
||||
FORM_URLENCODED = 'application/x-www-form-urlencoded',
|
||||
}
|
||||
```
|
||||
|
||||
## pageEnum
|
||||
|
||||
**文件**:`enums/pageEnum.ts`
|
||||
|
||||
```typescript
|
||||
export enum PageEnum {
|
||||
// 登录页
|
||||
BASE_LOGIN = '/login',
|
||||
// 首页
|
||||
BASE_HOME = '/dashboard',
|
||||
// 错误页
|
||||
BASE_ERROR_LOG = '/exception/404',
|
||||
REDIRECT = '/redirect',
|
||||
}
|
||||
```
|
||||
|
||||
## 使用示例
|
||||
|
||||
```typescript
|
||||
import { ResultEnum } from '@/enums/httpEnum';
|
||||
import { PageEnum } from '@/enums/pageEnum';
|
||||
|
||||
// 判断响应是否成功
|
||||
if (response.code === ResultEnum.SUCCESS) {
|
||||
// 处理成功
|
||||
}
|
||||
|
||||
// 跳转登录页
|
||||
router.push(PageEnum.BASE_LOGIN);
|
||||
|
||||
// 判断请求方法
|
||||
if (method === RequestEnum.POST) {
|
||||
// POST 请求
|
||||
}
|
||||
```
|
||||
|
||||
## 自定义枚举
|
||||
|
||||
```typescript
|
||||
// 添加新枚举时,在 enums/ 目录下创建文件
|
||||
// ui/src/enums/statusEnum.ts
|
||||
|
||||
export enum UserStatus {
|
||||
ENABLE = 1,
|
||||
DISABLE = 2,
|
||||
}
|
||||
|
||||
export enum ArticleStatus {
|
||||
DRAFT = 0,
|
||||
PUBLISHED = 1,
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,57 @@
|
||||
# A. 常见问题汇总
|
||||
|
||||
:::tip 概述
|
||||
本页汇总了项目各模块的常见问题及解决方案,按场景分类索引。遇到问题时可先查阅本页,再深入各章节详细文档。
|
||||
:::
|
||||
|
||||
## 环境问题
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|----------|
|
||||
| PHP 版本低于 8.2 | 升级到 PHP 8.2+,项目使用了 8.2 的强类型特性 |
|
||||
| 缺少 pdo_mysql 扩展 | `apt install php8.2-mysql` 或 `dnf install php-mysqlnd` |
|
||||
| 缺少 gd 扩展 | `apt install php8.2-gd` 或 `dnf install php-gd` |
|
||||
| Composer 下载慢 | `composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/` |
|
||||
| Redis 未安装 | 可选,改用 file 缓存:`.env` 中 `[CACHE]` 下设置 `DRIVER = file` |
|
||||
| 缺少 redis 扩展 | `pecl install redis` |
|
||||
| Oracle pdo_oci 加载失败(Windows) | 安装 Oracle Instant Client 19c + VC++ 2015-2022 Redistributable,php.ini 启用 `extension=pdo_oci`,配置系统 PATH 后重启 Apache |
|
||||
| 命令行有 pdo_oci,浏览器 phpinfo 没有 | Apache 服务启动时 PATH 未刷新,完全停止再启动 Apache 即可 |
|
||||
| Oracle Instant Client 路径含中文/空格导致加载失败 | 解压到 `C:\oracle\instantclient_19_20` 等固定路径,避免空格与中文 |
|
||||
|
||||
## 启动问题
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|----------|
|
||||
| 端口被占用 | `php think run --port 8080` |
|
||||
| 数据库连接失败 | 检查 `.env` 中的数据库配置 |
|
||||
| 401 未授权 | 检查请求头是否携带 `Authorization: Bearer <token>` |
|
||||
| 403 禁止访问 | 检查用户权限配置,确认角色已分配菜单 |
|
||||
| 502 Bad Gateway | 检查 PHP-FPM 是否启动:`systemctl status php8.2-fpm` |
|
||||
|
||||
## 业务问题
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|----------|
|
||||
| 唯一性校验报错 | 检查数据是否重复,确认 `uniqueFields` 配置 |
|
||||
| 枚举显示名为空 | 检查字典配置,确认 `serializeMaps` 正确 |
|
||||
| 文件上传失败 | 检查 `FILE.UPLOAD_DIR` 配置和目录权限 |
|
||||
| 导入失败 | 检查 Excel 表头是否与 `headerMap` 一致 |
|
||||
| 排序不生效 | 检查 `pageOrderBy` 配置,或前端 `orderField` 参数 |
|
||||
|
||||
## 前端问题
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|----------|
|
||||
| pnpm install 失败 | `rm -rf node_modules pnpm-lock.yaml && pnpm install` |
|
||||
| API 404 | 检查后端路由注册和 Vite 代理配置 |
|
||||
| 菜单不显示 | 检查菜单配置、组件路径、角色权限 |
|
||||
| 白屏 | 打开 F12 控制台查看错误 |
|
||||
| Token 频繁过期 | 检查 `JWT.ACCESS_TTL` 配置(默认 7200 秒) |
|
||||
|
||||
## 定时任务问题
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|----------|
|
||||
| 任务不执行 | 检查 crontab 配置:`crontab -l` |
|
||||
| 任务重复执行 | 检查是否有多个 cron 或 daemon 在运行 |
|
||||
| 任务执行超时 | 检查 PHP `max_execution_time` 配置 |
|
||||
@@ -0,0 +1,66 @@
|
||||
# D. 公共函数速查
|
||||
|
||||
:::tip 概述
|
||||
以下函数定义在 `app/common.php` 中,可在任何地方直接调用。
|
||||
:::
|
||||
|
||||
## 字符串 / 加密
|
||||
|
||||
| 函数 | 说明 | 签名 |
|
||||
|------|------|------|
|
||||
| `random_string($length)` | 生成随机字符串 | `string random_string(int $length = 16)` |
|
||||
| `encrypt_password($password, $salt)` | 密码加密(bcrypt) | `array encrypt_password(string $password, ?string $salt = null)` |
|
||||
| `verify_password($password, $hash, $salt)` | 验证密码 | `bool verify_password(string $password, string $encryptPassword, string $salt)` |
|
||||
|
||||
## 文件处理
|
||||
|
||||
| 函数 | 说明 | 签名 |
|
||||
|------|------|------|
|
||||
| `upload_file($formName, $type)` | 上传文件到临时目录 | `array upload_file(string $formName = 'file', string $type = 'file')` |
|
||||
| `save_file($fileUrl, $saveDir)` | 临时文件迁移到正式目录 | `string\|false save_file(string $fileUrl, string $saveDir = '')` |
|
||||
| `save_content(&$content, $saveDir)` | 处理富文本中的媒体文件 | `bool save_content(string &$content, string $saveDir = 'article')` |
|
||||
| `get_file_url($path)` | 相对路径转完整 URL | `string get_file_url(string $path)` |
|
||||
| `create_file_path($saveDir, $ext)` | 生成文件存储路径 | `string create_file_path(string $saveDir = '', string $ext = '')` |
|
||||
| `save_remote_file($url, $saveDir)` | 保存远程文件 | `string\|false save_remote_file(string $url, string $saveDir = '')` |
|
||||
| `detect_image_ext($content)` | 根据内容检测图片后缀 | `?string detect_image_ext(string $content)` |
|
||||
|
||||
## 驼峰 / 下划线转换
|
||||
|
||||
| 函数 | 说明 | 签名 |
|
||||
|------|------|------|
|
||||
| `snake_to_camel($str)` | 下划线转驼峰 | `string snake_to_camel(string $str)` |
|
||||
| `camel_to_snake($str)` | 驼峰转下划线 | `string camel_to_snake(string $str)` |
|
||||
| `array_snake_to_camel($data)` | 数组键名下划线转驼峰(递归) | `array array_snake_to_camel(array $data)` |
|
||||
| `array_camel_to_snake($data, $except)` | 数组键名驼峰转下划线(递归) | `array array_camel_to_snake(array $data, array $except = [])` |
|
||||
| `is_camel_convert_enabled()` | 是否开启转换 | `bool is_camel_convert_enabled()` |
|
||||
|
||||
## 工具函数
|
||||
|
||||
| 函数 | 说明 | 签名 |
|
||||
|------|------|------|
|
||||
| `get_client_ip()` | 获取客户端 IP | `string get_client_ip()` |
|
||||
| `format_page_params($params)` | 格式化分页参数 | `array format_page_params(array $params)` |
|
||||
|
||||
## 使用示例
|
||||
|
||||
```php
|
||||
// 生成随机字符串
|
||||
$str = random_string(32);
|
||||
|
||||
// 密码加密
|
||||
$result = encrypt_password('123456');
|
||||
// ['password' => '$2y$12$...', 'salt' => 'xK7pMn3qRt']
|
||||
|
||||
// 验证密码
|
||||
$ok = verify_password('123456', $user->password, $user->salt);
|
||||
|
||||
// 文件上传
|
||||
$result = upload_file('avatar', 'image');
|
||||
if (isset($result['error'])) {
|
||||
return Result::fail($result['error']);
|
||||
}
|
||||
|
||||
// 驼峰转换
|
||||
camel_to_snake('createTime'); // 'create_time'
|
||||
snake_to_camel('create_time'); // 'createTime'
|
||||
```
|
||||
@@ -0,0 +1,72 @@
|
||||
# J. 术语表
|
||||
|
||||
## 后端术语
|
||||
|
||||
| 术语 | 全称 | 说明 |
|
||||
|------|------|------|
|
||||
| JWT | JSON Web Token | 无状态认证令牌,用于接口认证 |
|
||||
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
|
||||
| CORS | Cross-Origin Resource Sharing | 跨域资源共享 |
|
||||
| ORM | Object-Relational Mapping | 对象关系映射,数据库操作抽象层 |
|
||||
| CRUD | Create/Read/Update/Delete | 增删改查 |
|
||||
| API | Application Programming Interface | 应用程序编程接口 |
|
||||
| bcrypt | - | 密码哈希算法,内置盐值 |
|
||||
| OPcache | - | PHP 字节码缓存扩展 |
|
||||
| Redis | - | 内存数据库,用于缓存 |
|
||||
| Nginx | - | Web 服务器 / 反向代理 |
|
||||
| Composer | - | PHP 依赖管理工具 |
|
||||
| PSR | PHP Standards Recommendation | PHP 标准推荐 |
|
||||
| FPM | FastCGI Process Manager | PHP 进程管理器 |
|
||||
| DNF | Dandified Yum | Rocky Linux / CentOS 包管理器 |
|
||||
| PECL | PHP Extension Community Library | PHP 扩展安装工具 |
|
||||
|
||||
## 前端术语
|
||||
|
||||
| 术语 | 全称 | 说明 |
|
||||
|------|------|------|
|
||||
| Vue | - | 渐进式 JavaScript 框架 |
|
||||
| TypeScript | - | JavaScript 超集,类型安全 |
|
||||
| Vite | - | 前端构建工具 |
|
||||
| Pinia | - | Vue 3 官方状态管理库 |
|
||||
| ElementPlus | - | Vue 3 UI 组件库 |
|
||||
| Axios | - | HTTP 请求库 |
|
||||
| TailwindCSS | - | 原子化 CSS 框架 |
|
||||
| TinyMce | - | 富文本编辑器 |
|
||||
| ECharts | - | 数据可视化图表库 |
|
||||
| pnpm | - | 高性能 Node.js 包管理器 |
|
||||
| ESLint | - | JavaScript/TypeScript 代码检查工具 |
|
||||
| Prettier | - | 代码格式化工具 |
|
||||
| keep-alive | - | Vue 组件缓存机制 |
|
||||
|
||||
## 业务术语
|
||||
|
||||
| 术语 | 说明 |
|
||||
|------|------|
|
||||
| 软删除 | 通过 `is_delete` 字段标记删除,不物理删除 |
|
||||
| 租户隔离 | 通过 `tenant_id` 字段实现多租户数据隔离 |
|
||||
| 数据权限 | 基于角色的 data_scope 控制数据可见范围 |
|
||||
| access_token | 访问令牌,短期有效(默认 2 小时) |
|
||||
| refresh_token | 刷新令牌,长期有效(默认 7 天) |
|
||||
| 驼峰命名 | camelCase,如 `createTime` |
|
||||
| 下划线命名 | snake_case,如 `create_time` |
|
||||
| RBAC | 基于角色的访问控制:用户 → 角色 → 菜单/权限 |
|
||||
| 超级管理员 | uid=1 的用户,跳过所有权限校验 |
|
||||
| 租户管理员 | tenant_id=0 的用户,不受租户隔离限制 |
|
||||
| 声明式 CRUD | 通过属性配置定义行为,无需编写通用代码 |
|
||||
| 生命周期钩子 | beforeAdd/afterAdd 等,用于注入定制逻辑 |
|
||||
|
||||
## 框架术语
|
||||
|
||||
| 术语 | 说明 |
|
||||
|------|------|
|
||||
| BaseLogic | 业务逻辑基类,提供声明式 CRUD 能力 |
|
||||
| BaseTenantLogic | 租户逻辑基类,继承 BaseLogic,自动租户隔离 |
|
||||
| BaseController | 控制器基类,提供统一响应和通用 CRUD 方法 |
|
||||
| BaseModel | 模型基类,提供软删除和审计字段 |
|
||||
| Result | 统一响应类,构造标准 JSON 响应 |
|
||||
| ExceptionHandle | 异常处理类,统一捕获异常并返回 JSON |
|
||||
| AttributeService | 注解服务,通过反射读取控制器方法注解 |
|
||||
| DictService | 字典服务,提供字典项读取和缓存 |
|
||||
| ParamService | 参数服务,提供系统参数读取和缓存 |
|
||||
| PasswordService | 密码服务,bcrypt 双重加盐加密 |
|
||||
| JwtService | JWT 服务,签发/刷新/解析令牌 |
|
||||
@@ -0,0 +1,120 @@
|
||||
# F. 中间件执行顺序
|
||||
|
||||
:::tip 概述
|
||||
本页展示请求在框架中的完整中间件执行流程,包括全局中间件和应用中间件的执行顺序,帮助开发者理解请求处理链路。
|
||||
:::
|
||||
|
||||
## 执行流程图
|
||||
|
||||
```text
|
||||
请求进入
|
||||
│
|
||||
▼
|
||||
┌────────────────┐
|
||||
│ProxyMiddleware │ 全局中间件(最先执行)
|
||||
│ │ 从代理头提取真实客户端 IP
|
||||
└──────┬─────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────┐
|
||||
│CorsMiddleware│ 全局中间件
|
||||
│ │ 处理 OPTIONS 预检 + 跨域响应头
|
||||
└──────┬───────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────┐ 401
|
||||
│AuthMiddleware│──────────► 未认证(Token 缺失/无效/过期)
|
||||
│ │ 403
|
||||
│ JWT认证 │──────────► 无权限
|
||||
│ 权限校验 │
|
||||
└──────┬───────┘
|
||||
│ 注入 userInfo
|
||||
▼
|
||||
┌──────────────┐ 403
|
||||
│TenantMiddleware│──────────► 租户异常(禁用/过期)
|
||||
│ │
|
||||
│ 租户上下文 │
|
||||
└──────┬───────┘
|
||||
│ 注入 tenantId, tenantInfo
|
||||
▼
|
||||
┌──────────────┐ 403
|
||||
│DemoMiddleware│──────────► 演示环境禁止写操作
|
||||
└──────┬───────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────┐
|
||||
│ LogMiddleware│ 记录操作日志(写操作始终记录)
|
||||
└──────┬───────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────┐
|
||||
│ 控制器方法 │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
## 中间件职责
|
||||
|
||||
| 中间件 | 类型 | 职责 | 配置 |
|
||||
|--------|------|------|------|
|
||||
| ProxyMiddleware | 全局 | 代理头解析,提取真实客户端 IP | .env → `[API]` PROXY_IPS |
|
||||
| CorsMiddleware | 全局 | 跨域处理 | config/cors.php |
|
||||
| AuthMiddleware | 路由级 | JWT 认证 + 权限校验 | config/middleware.php → auth_except |
|
||||
| TenantMiddleware | 路由级 | 租户上下文注入 | 内置排除列表 |
|
||||
| DemoMiddleware | 路由级 | 演示环境拦截 | .env → [APP] DEMO |
|
||||
| LogMiddleware | 路由级 | 操作日志记录 | config/middleware.php → log_except |
|
||||
|
||||
## 排除配置
|
||||
|
||||
```php
|
||||
// config/middleware.php
|
||||
return [
|
||||
'auth_except' => [
|
||||
'login',
|
||||
'captcha',
|
||||
'oauth2/token',
|
||||
'oauth2/check/token',
|
||||
],
|
||||
'log_except' => [
|
||||
'login',
|
||||
'logout',
|
||||
'captcha',
|
||||
'oauth2',
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
## 注入内容
|
||||
|
||||
| 中间件 | 注入字段 | 说明 |
|
||||
|--------|---------|------|
|
||||
| ProxyMiddleware | `$_SERVER['REMOTE_ADDR']` | 覆盖为真实客户端 IP |
|
||||
| AuthMiddleware | `$request->userInfo` | 用户信息(uid, username, type 等) |
|
||||
| TenantMiddleware | `$request->tenantId` | 租户 ID(0=超级管理员) |
|
||||
| TenantMiddleware | `$request->isSuperAdmin` | 是否超级管理员 |
|
||||
| TenantMiddleware | `$request->tenantInfo` | 租户信息对象 |
|
||||
|
||||
## ProxyMiddleware 详解
|
||||
|
||||
当项目部署在 CDN / 负载均衡 / Nginx 反向代理后面时,PHP 的 `REMOTE_ADDR` 是代理服务器的 IP(通常是 `127.0.0.1`),真实客户端 IP 由代理通过 `X-Forwarded-For` / `X-Real-IP` 请求头传递。
|
||||
|
||||
### 工作原理
|
||||
|
||||
```text
|
||||
客户端(真实IP) → CDN/代理 → Nginx → PHP-FPM
|
||||
↓ 设置头
|
||||
X-Forwarded-For: 真实IP, 代理IP
|
||||
X-Real-IP: 真实IP
|
||||
```
|
||||
|
||||
1. 检查 `REMOTE_ADDR` 是否在受信代理列表(`.env` → `PROXY_IPS`)
|
||||
2. 如果是,从 `X-Real-IP` 或 `X-Forwarded-For` 头提取真实 IP
|
||||
3. 覆盖 `$_SERVER['REMOTE_ADDR']`,后续 `request()->ip()` 返回真实 IP
|
||||
|
||||
### 配置
|
||||
|
||||
```ini
|
||||
# .env [API] 段
|
||||
# 受信代理 IP(逗号分隔,支持 CIDR 网段)
|
||||
# 未配置时默认信任 127.0.0.1 和 ::1
|
||||
PROXY_IPS = 127.0.0.1,::1,101.226.0.0/15,180.101.0.0/16
|
||||
```
|
||||
@@ -0,0 +1,131 @@
|
||||
# H. 前端 Store 速查
|
||||
|
||||
:::tip 概述
|
||||
前端使用 Pinia 进行全局状态管理,核心 Store 定义在 `ui/src/store/modules/` 目录下。
|
||||
:::
|
||||
|
||||
## userStore
|
||||
|
||||
**文件**:`store/modules/user.ts`
|
||||
|
||||
### 状态
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `token` | string | JWT Token |
|
||||
| `username` | string | 用户名 |
|
||||
| `avatar` | string | 头像 URL |
|
||||
| `permissions` | string[] | 权限列表 |
|
||||
| `info` | object | 用户信息 |
|
||||
|
||||
### Actions
|
||||
|
||||
| Action | 说明 | 返回 |
|
||||
|--------|------|------|
|
||||
| `login(userInfo)` | 登录 | Promise |
|
||||
| `GetInfo()` | 获取用户信息 | Promise |
|
||||
| `logout()` | 登出 | Promise |
|
||||
|
||||
### 使用示例
|
||||
|
||||
```typescript
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
|
||||
const userStore = useUserStore();
|
||||
|
||||
// 登录
|
||||
await userStore.login({ username: 'admin', password: '123456' });
|
||||
|
||||
// 获取用户信息
|
||||
const info = userStore.getUserInfo;
|
||||
const permissions = userStore.getPermissions;
|
||||
|
||||
// 登出
|
||||
await userStore.logout();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## asyncRouteStore
|
||||
|
||||
**文件**:`store/modules/asyncRoute.ts`
|
||||
|
||||
### 状态
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `menus` | array | 菜单列表 |
|
||||
| `keepAliveComponents` | string[] | 缓存的组件名 |
|
||||
| `isDynamicAddedRoute` | boolean | 是否已添加动态路由 |
|
||||
|
||||
### Actions
|
||||
|
||||
| Action | 说明 |
|
||||
|--------|------|
|
||||
| `generateRoutes(userInfo)` | 从后端获取菜单并生成路由 |
|
||||
| `setDynamicAddedRoute(flag)` | 设置动态路由添加状态 |
|
||||
| `setKeepAliveComponents(components)` | 设置 keep-alive 组件列表 |
|
||||
|
||||
---
|
||||
|
||||
## projectSettingStore
|
||||
|
||||
**文件**:`store/modules/projectSetting.ts`
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `navMode` | 导航模式(侧边/顶部) |
|
||||
| `navTheme` | 导航主题(暗色/亮色) |
|
||||
| `isShowMenuBar` | 是否显示菜单栏 |
|
||||
| `isCollapse` | 菜单是否折叠 |
|
||||
|
||||
---
|
||||
|
||||
## ossConfigStore
|
||||
|
||||
**文件**:`store/modules/ossConfig.ts`
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `ossConfig` | 云存储配置 |
|
||||
|
||||
路由守卫中初始化,用于文件上传。
|
||||
|
||||
---
|
||||
|
||||
## designSettingStore
|
||||
|
||||
**文件**:`store/modules/designSetting.ts`
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `appTheme` | 主题色 |
|
||||
| `darkMode` | 是否暗色模式 |
|
||||
|
||||
---
|
||||
|
||||
## tabsViewStore
|
||||
|
||||
**文件**:`store/modules/tabsView.ts`
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `tabsList` | 标签页列表 |
|
||||
|
||||
| Action | 说明 |
|
||||
|--------|------|
|
||||
| `addTab(route)` | 添加标签 |
|
||||
| `removeTab(route)` | 关闭标签 |
|
||||
| `closeOtherTabs(route)` | 关闭其他标签 |
|
||||
| `closeAllTabs()` | 关闭所有标签 |
|
||||
|
||||
---
|
||||
|
||||
## 在组件外使用
|
||||
|
||||
```typescript
|
||||
// 在 setup 外使用 Store
|
||||
import { useUserStoreWidthOut } from '@/store/modules/user';
|
||||
|
||||
const userStore = useUserStoreWidthOut();
|
||||
```
|
||||
Reference in New Issue
Block a user