Files
YwxAppThink/app/backend/route/app.php
T
yangwx 18101cf11a 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(市场 / 开发者中心 / 审核 / 分润)
2026-10-22 00:53:39 +08:00

118 lines
5.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/*
* @Author: YwxApp <ywx@ywxapp.cn>
* @Date: 2026-04-29 02:32:33
* @LastEditors: YwxApp <ywx@ywxapp.cn>
* @LastEditTime: 2026-08-11 14:03:07
* @Description:
* @FilePath: \ywxapp_dev\app\backend\route\app.php
* @CustomString: Copyright (c) 2026 YwxApp
*/
use think\facade\Route;
// // 支持批量添加
// Route::pattern([
// 'name' => '\w+',
// 'id' => '\d+',
// ]);
// // 指向一级控制器
Route::get('/', 'Index/index');
// 用户相关路由
Route::group('member', function () {
Route::get('index', 'user/index'); // 用户列表
Route::post('add', 'user/add'); // 添加用户
Route::put('update', 'user/update'); // 更新用户
Route::delete('delete/:id', 'user/delete'); // 删除用户
Route::patch('status/:id/:status', 'user/status'); // 更新用户状态
Route::get('roles', 'user/roles'); // 获取所有角色
});
// 用户相关路由
Route::group('admin', function () {
Route::get('list', 'admin/index'); // 用户列表
Route::post('add', 'admin/add'); // 添加用户
Route::put('update', 'admin/update'); // 更新用户
Route::delete('delete/:id', 'admin/delete'); // 删除用户
Route::patch('status/:id/:status', 'admin/status'); // 更新用户状态
Route::get('roles', 'admin/roles'); // 获取所有角色
});
// 角色相关路由
Route::group('role', function () {
Route::get('list', 'Role/index'); // 角色列表
Route::post('add', 'Role/add'); // 添加角色
Route::put('update', 'Role/update'); // 更新角色
Route::delete('delete/:id', 'Role/delete'); // 删除角色
Route::patch('status/:id/:status', 'Role/status'); // 更新角色状态
Route::get('tree', 'Role/tree'); // 获取角色树
});
// 权限相关路由
Route::group('permission', function () {
Route::get('tree', 'Permission/tree'); // 获取权限树
Route::get('menus', 'Permission/menus'); // 获取菜单树
Route::get('permissions', 'Permission/permissions'); // 获取权限树
Route::get('role/:roleId', 'Permission/rolePermissions'); // 获取角色权限
Route::put('role/:roleId', 'Permission/updateRolePermissions'); // 更新角色权限
});
// 主框架在线升级(客户端,对接中心站 upgrade 插件)
Route::group('framework', function () {
Route::get('index', 'Upgrade/index'); // 升级页面 / 检测接口
Route::get('check', 'Upgrade/check'); // 检测更新(AJAX)
Route::post('upgrade', 'Upgrade/upgrade'); // 执行升级
});
// 插件:发布已安装插件到官方市场(需配置 DEVELOPER_TOKEN 开发者令牌)
Route::post('addon/submitOfficial', 'addon/submitOfficial');
// 前台主导航菜单管理(后台可配置,支持两级下拉)
Route::group('navbar', function () {
Route::get('index', 'Navbar/index'); // 列表页
Route::get('edit/:id', 'Navbar/edit'); // 添加/编辑页
Route::post('edit', 'Navbar/edit'); // 添加/编辑提交
Route::post('save', 'Navbar/save'); // 弹窗保存
Route::post('update', 'Navbar/update'); // 弹窗更新
Route::delete('delete/:id', 'Navbar/delete'); // 删除
Route::post('delete', 'Navbar/delete'); // 删除(兼容)
Route::patch('status/:id/:status', 'Navbar/status'); // 状态切换
});
// 数据库备份 / 还原
Route::group('database', function () {
Route::get('index', 'Database/index'); // 列表(表 / 备份记录)
Route::post('backup', 'Database/backup'); // 备份
Route::post('recovery', 'Database/recovery'); // 还原(避开基类 restore)
Route::post('delete', 'Database/delete'); // 删除备份
Route::post('optimize', 'Database/optimize'); // 优化表
Route::get('download', 'Database/download'); // 下载备份
});
// 数据表管理(结构层面:可视化建表 / 查看结构 / 优化 / 删表)
Route::group('datatable', function () {
Route::get('index', 'Datatable/index'); // 表列表
Route::get('structure', 'Datatable/structure'); // 表结构(字段 / 索引 / 建表语句)
Route::post('preview', 'Datatable/preview'); // 生成建表 SQL(不执行)
Route::post('create', 'Datatable/create'); // 执行建表
Route::post('drop', 'Datatable/drop'); // 删表(需回传表名二次确认)
Route::post('optimize', 'Datatable/optimize'); // 优化表
Route::post('export', 'Datatable/export'); // 导出安装 SQL(回写 install.sql 用,不执行)
});
// 操作日志
Route::group('adminlog', function () {
Route::get('index', 'Adminlog/index'); // 日志列表
Route::post('delete', 'Adminlog/delete'); // 删除日志
Route::post('clean', 'Adminlog/clean'); // 按保留天数清理
});
// 清理缓存:「系统信息」页已下线,能力收进控制台首页(Console::clean)
Route::group('console', function () {
Route::post('clean', 'Console/clean'); // 清理 runtime 缓存
});
// 附件统一管理
Route::group('attachment', function () {
Route::get('index', 'Attachment/index'); // 全站附件列表
Route::post('delete', 'Attachment/delete'); // 删除(物理文件 + 软删记录)
});