# YwxApp 企业级应用框架 > 基于 ThinkPHP 6 的多应用 + 插件化企业建站/应用市场框架。框架免费,通过插件与模板商业化变现(Discuz! 式闭环:提交 → 审核 → 上架 → 购买 → 支付 → 授权 → 域名绑定 → 运行期巡检 → 分润提现)。 - **版本**:`1.0.16` - **官网**:https://www.ywxapp.cn - **运行环境**:PHP >= 7.4(推荐 8.0+)、MySQL >= 5.7、Redis(可选,用于缓存/队列) --- ## 一、特性 | 特性 | 说明 | | --- | --- | | 多应用架构 | `frontend`(企业站/官网,默认首页)、`backend`(后台,入口 `/admin`)、`member`(会员中心,入口 `/user`)、`api`(接口,入口 `/api`) | | 插件化体系 | 业务功能以插件形式存在(`addon//`),支持在线安装、离线包安装、热重载、一键修复 | | 应用市场 | 内置 `appmall` 插件(中心站),对接自托管市场,支持购买、授权、域名绑定、升级巡检 | | 数据库自愈 | 模型壳内置 `ensureSchema()`,缺表建表、缺列补列,部署无需手跑 SQL | | 可视化设计器 | 开发模式下后台「设计插件」可可视化生成插件骨架、配置项、菜单、路由、页面 | | 前后台皮肤 | 支持模板/皮肤叠加(`SkinOverlay`),核心后台布局与业务视图分离 | | 命令行工具 | 插件管理、脚手架生成、健康检测、授权校验、框架升级等全套 CLI | --- ## 二、环境要求与准备 - PHP 7.4+(推荐 8.0+),需开启扩展:`pdo_mysql`、`mbstring`、`curl`、`openssl`、`fileinfo`、`redis`(可选) - MySQL 5.7+ / MariaDB 10.2+ - Composer 2.x - Web 服务器:Nginx / Apache(推荐 Nginx,已内置伪静态规则) ### 目录权限 部署后请确保以下目录可写(Linux 下建议 `755`,运行时目录 `777`): ``` runtime/ 运行时缓存、日志 public/static/ 插件静态资源发布目录(安装/重载时写入) addon/ 插件源码目录 ``` --- ## 三、安装部署 ### 方式一:Web 安装器(推荐) 项目内置 Web 安装向导,访问站点根目录即可进入: ``` http://your-domain.com/install/ ``` 安装器位于 `public/install/`,流程: 1. 环境检测(PHP 版本、扩展、目录权限) 2. 配置数据库连接(读取/生成 `.env`) 3. 导入 `public/install/install.sql` 初始化数据表与管理员账号 4. 安装完成,**务必删除 `public/install/` 目录**以防被重复触发 > 注意:`.env` 含数据库敏感配置,请勿将其整体覆盖或提交到公开仓库;修改配置请用局部 `replace_in_file`。 ### 方式二:手动部署(已有数据库) ```bash # 1. 安装依赖 composer install --no-dev -o # 2. 复制环境变量模板并填写 cp .env.example .env # 如无模板则手动创建 .env # 3. 导入数据库(自行执行 install.sql 或已有库) # 4. 生成应用密钥并设置运行时权限 php think key:generate # 如支持 chmod -R 755 runtime addon public/static ``` ### 伪静态(Nginx 示例) ```nginx location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } ``` Apache 已内置 `.htaccess`。 --- ## 四、目录结构 ``` ywxapp_dev/ ├── addon/ # 插件目录(核心业务以插件交付) │ ├── blog/ # 博客插件 │ ├── forum/ # 论坛插件 │ ├── articles/ # 内容管理(CMS)插件 │ ├── haonav/ # 网址导航插件 │ ├── appmall/ # 应用市场(中心站) │ └── wxchat/ # 微信客服插件 ├── app/ # 多应用(系统级) │ ├── frontend/ # 企业站/官网(默认首页) │ ├── backend/ # 后台管理(入口 /admin) │ ├── member/ # 会员中心(入口 /user) │ └── api/ # 接口应用(入口 /api) ├── ywxapp/ # 框架核心库 │ ├── AddonBase.php # 插件基类(插件控制器须 use ywxapp\AddonBase) │ ├── service/ # AppService(启动/命令注册/路由加载)、AddonService、MarketService… │ ├── model/ # BaseModel(数据库自愈引擎) │ ├── command/ # 命令行(addon:manage / repair / make / health / license-check / ywxapp:upgrade) │ └── controller/ # BackendBase / FrontendBase / MemberBase 基类 ├── config/ # 全局配置 │ ├── ywxapp.php # 框架主配置(验证码/多语言/API地址/插件开关…) │ ├── app.php # 多应用配置(default_app / app_map) │ ├── route.php # 路由 │ └── database.php # 数据库 ├── public/ # Web 根目录 │ ├── install/ # Web 安装器(安装后删除) │ ├── static/ # 静态资源(插件资源发布到此) │ └── index.php # 入口 ├── runtime/ # 运行时(缓存/日志,可写) ├── extend/ # 扩展目录 ├── composer.json └── README.md ``` > 旧版 `addons/`(复数)已重命名为 `addon/`(单数),核心基类 `ywxapp/Addons.php` 已重命名为 `AddonBase.php`,请勿再使用旧的 `use ywxapp\Addons`。 --- ## 五、多应用与访问入口 `config/app.php` 配置多应用映射(`app_map`): | 访问入口 | 应用目录 | 说明 | | --- | --- | --- | | `/`(默认) | `app/frontend` | 企业站/官网,`default_app=frontend` | | `/admin/*` | `app/backend` | 后台管理(登录页 `/admin/login/index`) | | `/user/*` | `app/member` | 会员中心(登录页 `/user/login/index`) | | `/api/*` | `app/api` | 接口应用 | 后台升级相关控制器使用 `framework` 前缀路由(如 `framework/check`、`framework/upgrade`),请勿改回 `upgrade`。 --- ## 六、插件开发 ### 6.1 插件目录约定 ``` addon// ├── info.php # 插件元信息(name/title/version/state/config…) ├── menu.json # 后台/会员/前台菜单(backend/member/frontend 三段) ├── route/ │ └── app.php # 路由(写相对组名,由 AppService 自动补全插件前缀) ├── controller/ │ ├── Index.php # 前台控制器 │ ├── backend/Article.php # 后台控制器 │ └── member/Article.php # 会员控制器 ├── model/ # 模型(含 ensureSchema() 自愈) ├── service/ # 业务服务 ├── view/ # 模板 ├── install.sql # 安装 SQL(CREATE TABLE + 种子;禁 -- 注释、禁 \' 转义) ├── upgrade.sql # 升级 SQL └── config.php # 插件配置(支持 .env 覆盖) ``` ### 6.2 插件元信息 `info.php` ```php return [ 'name' => 'blog', 'title' => '博客应用', 'version' => '1.0.2', 'state' => 1, // 1=启用 'url' => '/blog', 'config' => [], // 插件配置项 ]; ``` ### 6.3 控制器基类 插件控制器继承框架基类,后台控制器绑定 `AdminAuth` 须用 `static::class`: ```php ')` 补全,**不要**加前缀或 `->prefix('api/')`。 - **后台 URL 必须用「带点」形式**(`blog/backend.article/index`),因为 `Route::group` 下出现 `backend` 层级 TP 会拼成点分隔;斜杠形式恒 404。 - 修改 `menu.json` 后执行 `php think addon:repair --menu` 重载菜单。 - **改完路由务必清路由缓存**:`Remove-Item runtime/route_list.php`,否则旧规则导致 404/500。 ### 6.5 模型与数据库自愈 每个模型壳内置静态 `ensureSchema()` 自建表,`BaseModel` 提供 `ensureTable/ensureColumn/tableExists/ensureAutoIncrementPk/currentPrefix/ensureTableFromInstall`。部署时缺表缺列会自动补齐,无需手跑 SQL。 > 时间字段统一:`create_at` / `update_at` / `delete_at`(软删除 int 时间戳,0=未删)。 > 后台表 `admin_*` → `backend_*`;用户中心 `user_*` → `member_*`。 --- ## 七、命令行工具 命令在 `ywxapp/service/AppService.php` 的 `boot()` 中显式注册(`config/console.php` 的 commands 不生效)。 | 命令 | 说明 | | --- | --- | | `php think addon:manage -a develop` | 开发者模式安装(源码已在 `addon/`,原地建表/注入菜单/启用,免打包) | | `php think addon:manage -a install [--local=] [--force]` | 在线/离线安装插件 | | `php think addon:manage [] -a reload [--force] [--status]` | 热重载插件(重导菜单/资源) | | `php think addon:repair [--menu\|--db\|--config]` | 一键修复:菜单重载 + 数据库自愈 + 配置补全;`` 可为 `all` | | `php think addon:make -a [--name=<类>]` | 脚手架:生成 controller/model/middleware/validate/event/listener/service/subscribe | | `php think addon:health` | 插件健康检测(依赖/表/菜单完整性) | | `php think addon:license-check` | 运行期授权校验 | | `php think ywxapp:upgrade` | 框架在线升级(`framework` 路由配套) | 示例: ```bash # 安装 blog 插件(开发者模式) php think addon:manage blog -a develop # 修复所有插件的菜单与数据库 php think addon:repair all # 用脚手架生成一个后台控制器 php think addon:make blog -a controller --name=backend/Stat ``` --- ## 八、后台使用与配置 - 后台入口:`/admin`(映射 `app/backend`),登录页 `/admin/login/index` - 会员中心:`/user`,登录页 `/user/login/index` - 主配置:`config/ywxapp.php` - `usercenter`:是否开启前台会员中心 - `login_captcha` / `user_register_captcha`:登录/注册验证码 - `api_url`:应用市场 API 地址(中心站留空或 `market_mode=center`,客户机指向中心站域名) - `addon_developer`:开发模式开关(开启后后台出现「设计插件」入口) - `addon_license_check`:运行期授权校验开关 - `lang_switch_on`:多语言开关 ### 中心站 / 客户机模式 由 `config/ywxapp.php` 的 `market_mode`(auto/center/client)决定,`auto` 时按 `api_url` 推导(空=中心站,指向他机=客户机)。解耦设计:中心站逻辑全在 `addon/appmall/`,`ywxapp/`、`app/` 禁直读 `appmall_*` 表;插件控制器只做分发(客户机 → 远程服务,中心站 → `MarketService`,缺失 → 503)。 --- ## 九、打包与分发 - 插件包:`scripts/package_addon.php`(版本号自动递增) - 框架包:`scripts/package_framework.php`(排除 `config/`、`.env`、`addon/`、`public/static/<插件名>/`) - 升级:`AddonService::onlineUpgrade($version)`;`importsql` 仅放行 `CREATE TABLE`/`INSERT`,拒绝 `ALTER`/`DROP`(旧库迁移须手动 `RENAME TABLE`) --- ## 十、常见问题(FAQ) **Q1:后台菜单点了 404?** 先确认 `menu.json` 的 `jump`/路由用的是「带点」形式(`blog/backend.article/index`),再 `php think addon:repair --menu`,最后清路由缓存 `Remove-Item runtime/route_list.php`。 **Q2:插件装完页面破图 / 资源 404?** 执行 `php think addon:manage -a reload` 重新发布静态资源到 `public/static//`。 **Q3:数据库表不存在报错?** 模型壳的 `ensureSchema()` 通常会自动建表;若仍报错执行 `php think addon:repair --db`。 **Q4:改了插件代码不生效?** 多半是路由缓存。`Remove-Item runtime/route_list.php` 后重试;生产环境关闭 `APP_DEBUG` 前请先清缓存。 **Q5:PHP 文件上传后报「已发送头」/ 乱码?** `write_to_file` 可能产生 UTF-8 BOM,上线前请去 BOM(或 `php -l` 校验)。 --- ## 十一、许可与商业化 - 框架核心基于 ThinkPHP 协议,免费使用。 - 商业化通过 `addon/appmall` 应用市场分发插件与模板,支持购买、授权、域名绑定、分润提现。 - 详细商业化与运营文档见 `docs/`。 --- © 2026-2036 YwxApp. All rights reserved. https://www.ywxapp.cn