feat: 上线前安全加固与发布工程化;appmall 由插件迁移为独立应用
安全(P0) - 发布包签名:新增 scripts/package_keygen.php、scripts/package_verify.php、 ywxapp\service\PackageVerifier;FrameworkService::apply() 解压前强制验签 (ywxapp.framework_package_verify,默认开启) - JWT 收紧:config/jwt.php 移除公开默认密钥,JwtService::assertStrongSecret() 校验非空 / 长度≥32 / 已知弱值;.env.production.example 键名由 JWT_SECRET_KEY 修正为 JWT_SECRET - /api/v1/Article:免登录白名单收窄为只读接口,写操作字段白名单 + assertOwner() 越权校验 - 开发者令牌:查找接口不再回显明文、统一失败文案 + 限流 - TemplateInstaller:文件名白名单 + realpath 归一化 + 目录内断言,修复 Zip Slip;补 use ZipArchive - 后台登录:接入验证码、失败锁定与登录限流(config/ratelimit.php) - 缓存 / Session 驱动可由 .env 覆盖(CACHE_DRIVER / SESSION_TYPE),集群部署改 redis - paycenter 支付日志开关改为 PAY_LOG,不再跟随 APP_DEBUG 工程化 / 交付 - 新增 CHANGELOG.md 与 .env.production.example;composer.lock 入库锁定依赖版本 - 插件离线安装 CLI 增加 --uid,后台上传安装透传 uid,付费插件授权校验可通过 - 授权拒绝文案区分「未携带 uid」与「未找到有效授权」,便于排障 - .gitignore 放行 .env.production.example / .env.addon.example / .gitattributes / public/.htaccess 结构 - appmall 由 addon/appmall 迁移为独立应用 app/appmall(市场 / 开发者中心 / 审核 / 分润)
This commit is contained in:
1 parent
1d49e6f5ee
commit
18101cf11a
636 files changed
+58517
-9519
No files matched your search
@@ -0,0 +1,56 @@
|
||||
# 巡检信息与清理缓存
|
||||
|
||||
内置的「系统管理 → 系统信息」页面已于 2026-09-28 下线(System 控制器 / `view/system` / `modules/system.js` 全部删除),
|
||||
原因很直接:它展示的东西控制台首页顶部一字不差地都有(同一份 `SystemInfo::collect()`),留着就是两份要维护。
|
||||
|
||||
现在这两件事都在**控制台首页**(`/admin/console/index.html`,`app/backend/controller/Console.php`):
|
||||
|
||||
- 巡检信息:`Console::index()` 渲染,数据来自 `app/backend/library/SystemInfo.php`
|
||||
- 清理缓存:`Console::clean()`,权限 `console:clean`(挂在「控制台」菜单下)
|
||||
|
||||
## 页面内容(控制台首页)
|
||||
|
||||
| 区块 | 说明 |
|
||||
|------|------|
|
||||
| 运行统计 | 管理员数、插件数、附件数、数据库占用(走 `DbBackup::tables()` 汇总) |
|
||||
| 运行环境 | YwxApp / ThinkPHP / PHP / MySQL 版本、系统、服务器时间、上传限制、内存限制、脚本超时、禁用函数 |
|
||||
| 磁盘 | 已用 / 总量 / 剩余,进度条(取 `app()->getRootPath()` 所在盘) |
|
||||
| 目录权限 | `runtime` / `public/storage` / `config` / `addon` 是否存在、是否可写;不可写会导致缓存无法生成、上传失败、插件装不上 |
|
||||
| 维护 | 清理数据缓存 / 模板缓存 / 全量清理(含路由缓存) |
|
||||
| 安全提示 | 近 7 天操作条数、其中登录失败次数 |
|
||||
| 近 7 天趋势 | 会员注册数、后台操作条数(真数据,`Console::collectStats()` 产出,ECharts 渲染) |
|
||||
| 最新会员 / 最近操作日志 | 各取最近 8 条真数据 |
|
||||
|
||||
## 清理缓存
|
||||
|
||||
```text
|
||||
POST /admin/console/clean body: type=cache|temp|all
|
||||
```
|
||||
|
||||
- `cache` → `runtime/cache`
|
||||
- `temp` → `runtime/temp`
|
||||
- `all` → 上述两个 + `runtime/route_list.php`(下次请求自动重建)
|
||||
|
||||
**不碰 `runtime/log`**:操作日志(`docs/guide/operation_log.md`)与错误日志要留着。
|
||||
清理动作本身会记一条 `console/clean` 日志(写在 `SystemInfo::cleanRuntime()` 里)。
|
||||
|
||||
## 巡检数据怎么取(给排障用)
|
||||
|
||||
- MySQL 版本:`Db::query('SELECT VERSION()')`
|
||||
- 磁盘:`disk_total_space()` / `disk_free_space()` —— 注意这俩返回 **float**,
|
||||
`formatBytes()` 参数必须收 float,否则严格类型下直接 TypeError(页面 500)。
|
||||
- 统计用 `SystemInfo::safeCount()` 包一层:表缺失或查询异常时返回 0,
|
||||
首页不会因为某张插件表没建就整体打不开。`Console::collectStats()` 里的逐个查询同理。
|
||||
|
||||
## 老库迁移
|
||||
|
||||
已装好的库不会自动跟着变(权限表没有自删逻辑),跑一次一次性脚本即可:
|
||||
|
||||
```bash
|
||||
php scripts/migrate_console_clean.php # 预演
|
||||
php scripts/migrate_console_clean.php --force # 执行
|
||||
```
|
||||
|
||||
做的事:删掉 `system:index` 页面节点及其子权限与角色授权,把 `system:clean` **就地改名**为
|
||||
`console:clean`(Route 同步改 `console/clean`,挂到「控制台」下)。
|
||||
就地改名而不是新建,是为了保住 id ⇒ 保住角色授权表里既有的绑定。
|
||||
Reference in new issue
Block a user