- 🏠 简介
- 📥 源码下载
- 🚀 安装指南
- 🔧 niucloud (服务端)
- 🖥️ admin (后台管理端)
- 📱 uni-app(手机端前端)
- 🌐 web端(PC前端)
- ⚙️ 代码生成器
- ⚙️ 配置手册
- 📚 使用手册
- 🔄 版本更新
-
❓ 常见问题
- 服务器问题
- 安装问题
- 使用问题
- 版本问题
-
其他问题
- 怎么添加菜单,添加了菜单不出现怎么回事
- 站点site端(租户端、商家端)和saas管理端(平台端)究竟啥意思,有啥区别
- 框架中是有订单表order,假如开发一个商城插件,请问商城的订单数据是不是重新搞一个订单表shop_order
- 有些支付平台是绑定回调唯一网址或目录,如果有几个开发者开发插件都有支付那这块怎么解决?
- 站点过期,可以登录,这样对吗?
- 计划任务怎么启动啊
- Git多分支开发,切换分支
- 安装应用出现is_dir()报错处理方案
- 绑定授权时出现“请求来源产品与授权产品不一致”解决方案
- “未找到admin源码所在目录”的解决方案
- 页面装修本地开发环境配置
- 接口请求错误处理方案
- 未获取到授权信息问题处理方案
- 腾讯地图配置
- 请求超时问题处理方案
- 下载应用时提示找不到zip解决方案
- 怎么关闭开发调试模式
- 获取数据失败问题处理方案
- 框架安装后,访问域名无法进入admin端(多数发生在本地)
- 底部导航失效问题
- 开放平台小程序审核通过发布失败问题
- 先升级插件后升级框架,导致云编译报debounce的错误
- 微信公众号自动回复不通
- 如何修改访问域名默认跳转端口
- 插件与框架的版本兼容问题处理方案
- 升级提示mkdir()处理方案
- 云编译时node.js内存不足导致内存溢出处理方案
- 报错Allowed memory size of ** bytes exhausted (tried to allocate ** bytes)处理方法
- Mysql修改sql_mode模式
- 框架1.0.2之前升级最新版错误Undefined array key "content"
- 安装插件提示不适配框架版本的处理
控制器
控制器概述
控制器是MVC架构中的核心组件,负责接收请求、处理业务逻辑(通常通过调用Service层)、并返回响应结果。
控制器目录结构
主要包含两种类型的控制器:管理后台API控制器和前端API控制器。
目录分布
niucloud/
├── app/
│ ├── adminapi/controller/ #管理后台API控制器
│ ├── api/controller/ #前端API控制器
模块化组织
两种类型的控制器均按功能模块进行分组,每个目录对应一个业务模块:
adminapi控制器模块(部分):
-
addon/: 插件管理相关接口 -
member/: 会员管理相关接口 -
site/: 站点管理相关接口 -
sys/: 系统管理相关接口 -
wechat/: 微信相关接口
api控制器模块(部分):
-
member/: 会员中心相关接口 -
pay/: 支付相关接口 -
weapp/: 微信小程序相关接口 -
wechat/: 微信相关接口
控制器类层次结构
采用继承机制构建控制器体系,通过基类提供通用功能,子类专注于具体业务实现。
基础控制器
BaseController是所有控制器的基类,定义在core/base/BaseController.php中,提供了控制器的基础功能:
abstract class BaseController
{
protected $request; // Request实例
protected $app; // 应用实例
protected $batchValidate = false; // 是否批量验证
protected $middleware = []; // 控制器中间件
// 构造方法
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
$this->initialize();
}
// 初始化方法(子类可重写)
protected function initialize() {}
// 数据验证方法
protected function validate(array $data, $validate, array $message = [], bool $batch = false) {}
}
应用控制器
基于基础控制器,派生出两类应用控制器:
管理后台控制器基类:BaseAdminController,位于core/base/BaseAdminController.php,用于管理后台API控制器继承
class BaseAdminController extends BaseController
{
public function initialize()
{
}
}
API控制器基类:BaseApiController,位于core/base/BaseApiController.php,用于前端API控制器继承
class BaseApiController extends BaseController
{
public function initialize()
{
}
}
业务控制器
业务控制器继承自对应的应用控制器基类,实现具体的业务逻辑,例如:
管理后台插件控制器:app/adminapi/controller/addon/Addon.php
通过继承BaseAdminController,自动实现了权限和路由的控制。调用Service方法直接返回给api接口。
namespace app\adminapi\controller\addon;
use app\dict\addon\AddonDict;
use app\service\admin\addon\AddonService;
use app\service\core\addon\CoreAddonService;
use core\base\BaseAdminController;
use think\Response;
/**
* 插件管理
* Class Addon
* @description 插件管理
* @package app\adminapi\controller\addon
*/
class Addon extends BaseAdminController
{
/**
* 插件初始化
* @description 插件初始化
* @return Response
*/
public function init()
{
return success((new CoreAddonService())->getInitList());
}
/**
* 获取已下载插架
* @description 获取已下载插架
*/
public function getLocalAddonList()
{
return success((new CoreAddonService())->getLocalAddonList());
}
/**
* 获取首页应用
* @description 获取首页应用
* @return Response
*/
public function getIndexAddonList()
{
$data = $this->request->params([
['label_id', ''],
]);
return success((new CoreAddonService())->getIndexAddonList($data['label_id']));
}
}
前端会员控制器:app/api/controller/member/Member.php
前台会员控制器继承自BaseApiController, 实现了各种前台会员的api接口。
namespace app\api\controller\member;
use app\service\api\login\AuthService;
use app\service\api\member\MemberLogService;
use app\service\api\member\MemberService;
use core\base\BaseApiController;
use think\Response;
class Member extends BaseApiController
{
/**
* 会员信息
* @return Response
*/
public function info()
{
return success(( new MemberService() )->getInfo());
}
/**
* 会员中心
* @return Response
*/
public function center()
{
return success(( new MemberService() )->center());
}
/**
* 修改会员
* @param $field
* @return Response
*/
public function modify($field)
{
$data = $this->request->params([
[ 'value', '' ],
[ 'field', $field ],
]);
$data[ $field ] = $data[ 'value' ];
$data['member_id'] = $this->request->memberId();
$this->validate($data, 'app\validate\member\Member.modify');
( new MemberService() )->modify($field, $data[ 'value' ]);
return success('MODIFY_SUCCESS');
}
/**
* 编辑会员
* @return Response
*/
public function edit()
{
$data = $this->request->params([
[ 'data', [] ],
]);
( new MemberService() )->edit($data[ 'data' ]);
return success('MODIFY_SUCCESS');
}
/**
* 绑定手机号
* @return Response
*/
public function mobile()
{
$data = $this->request->params([
[ 'mobile', '' ],
[ 'mobile_code', '' ],
]);
return success(( new AuthService() )->bindMobile($data[ 'mobile' ], $data[ 'mobile_code' ]));
}
/**
* 会员日志
* @return Response
*/
public function log()
{
$data = $this->request->params([
[ 'route', '' ],
[ 'params', '' ],
[ 'pre_route', '' ]
]);
( new MemberLogService() )->log($data);
return success();
}
/**
* 获取会员码
*/
public function qrcode()
{
return success(( new MemberService() )->getQrcode());
}
/**
* 获取手机号
* @return Response
*/
public function getMobile()
{
$data = $this->request->params([
[ 'mobile_code', '' ],
]);
return success(( new AuthService() )->getMobile($data[ 'mobile_code' ]));
}
}