chore: 重写初始提交(清空历史,整理后全量提交)

This commit is contained in:
ywxapp
2026-08-16 16:54:14 +08:00
commit 6c1a106bc1
1808 changed files with 238144 additions and 0 deletions
+106
View File
@@ -0,0 +1,106 @@
<?php
declare(strict_types=1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* 特性详情(由 app/wxapp 合并至 app/frontend
*/
class Feature extends FrontendBase
{
protected $noNeedLogin = ['index', 'detail'];
protected $noNeedVerify = ['*'];
// 四大特性元数据
private $items = [
'plugin' => [
'title' => '插件机制',
'summary' => '基于 ThinkPHP 事件系统 + 订阅器的热插拔插件架构。',
'points' => [
'插件在 info.php 的 events.subscribe 声明订阅器类',
'AppService 启动时自动 loadEvent 注册,无需手动绑定',
'订阅方法 onXxx 自动监听对应事件,与业务完全解耦',
'后台可在线安装 / 启用 / 禁用 / 卸载',
],
'code' => "## 插件订阅器示例(mqpay
class Payment extends \\ywxapp\\addon {
// 监听支付方式列表事件
public function onPaymentMethods(\$event) {
return ['personal' => ['name'=>'免签支付','sort'=>10]];
}
// 监听支付创建事件,生成收款码
public function onPaymentCreate(\$event) { /* ... */ }
}",
],
'multi-app' => [
'title' => '多应用架构',
'summary' => 'app 目录下按业务域拆分多个独立应用,互不干扰。',
'points' => [
'api → 对外 JSON 接口(移动端 / 第三方)',
'backend → 管理后台(RBAC 权限)',
'member → 会员中心(支付 / 订单 / 会员)',
'frontend → 标准 Web 前端',
'site → 本展示官网',
],
'code' => "# route/app.php 按应用分组
Route::group('api', function () {
Route::get('user/info', 'api/v1.user/info');
});",
],
'member-pay' => [
'title' => '会员 / 支付',
'summary' => 'mqpay 免签支付 + 会员开通事件链,扫码到账自动开通。',
'points' => [
'免签支付:监听系统通知栏,到账自动确认',
'安卓调用 POST /mqpay/pay/notify-app 验签确认',
'confirmOrder() 触发 UserMemberActivate 事件',
'会员监听器顺延会员期限并写入权益',
],
'code' => "// confirmOrder 内触发会员开通
Event::trigger('UserMemberActivate', [
'uid' => \$order['uid'],
'plan_id' => \$order['plan_id'],
'order' => \$order,
'method' => 'personal',
]);",
],
'doc' => [
'title' => '文档 / 示例',
'summary' => '完善的开发文档、API 示例与快速开始指南。',
'points' => [
'插件 README + docs 文档体系',
'API 示例与请求 / 响应契约',
'快速开始指南降低上手成本',
'钩子 / 事件速查表一键索引',
],
'code' => "# 查看支付钩子文档
addon/mqpay/docs/payment_hooks.md
addon/mqpay/docs/listen_app_guide.md",
],
];
public function index()
{
return view('feature/index', [
'controller' => $this->request->controller(),
'items' => $this->items,
]);
}
public function detail($name = 'plugin')
{
if (!isset($this->items[$name])) {
$name = 'plugin';
}
$item = $this->items[$name];
return view('feature/detail', [
'controller' => $this->request->controller(),
'name' => $name,
'item' => $item,
'items' => $this->items,
]);
}
}