签入版本

This commit is contained in:
2026-09-29 10:14:04 +08:00
parent 3e5fc01124
commit d6b552103d
1664 changed files with 298944 additions and 0 deletions
@@ -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();
```