Files
Xinyue-Search/app/admin/QfShop.php
T
2024-04-26 12:07:45 +08:00

680 lines
20 KiB
PHP

<?php
declare(strict_types=1);
namespace app\admin;
use think\App;
use think\facade\View;
use app\model\Admin as AdminModel;
use app\model\Access as AccessModel;
use app\model\Auth as AuthModel;
use app\model\Node as NodeModel;
use app\model\Group as GroupModel;
use app\model\Conf as ConfModel;
/**
* 控制器基础类
*/
abstract class QfShop
{
protected $model = null;
//搜索字段
protected $selectList = '*';
protected $selectDetail = '*';
//筛选字段
protected $searchFilter = [];
//更新字段
protected $updateFields = [];
//更新时的必须字段
protected $updateRequire = [];
//添加字段
protected $insertFields = [];
//添加时的必须字段
protected $insertRequire = [];
//excel查询字段 用来查询
protected $excelField = [
"join_id" => "编号",
];
//excel 表头
protected $excelTitle = "数据导出表";
//EXCEL 单元格字母
protected $excelCells = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD'];
//主键key
protected $pk = '';
//表名称
protected $table = '';
//主键value
protected $pk_value = 0;
//模型
protected $adminModel;
protected $accessModel;
protected $authModel;
protected $nodeModel;
protected $groupModel;
protected $confModel;
/**
* Request实例
* @var \think\Request
*/
protected $request;
/**
* 应用实例
* @var \think\App
*/
protected $app;
protected $plat = 'all';
protected $version = 0;
protected $module;
protected $controller;
protected $action;
/**
* 构造方法
* @access public
* @param App $app 应用对象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
//TODO !!!如有特殊需求请重写下面的方法到子类,请勿修改此处!!! BEGIN.........//
/**
* 添加接口基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function add()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
//校验Insert字段是否填写
$error = $this->validateInsertFields();
if ($error) {
return $error;
}
//从请求中获取Insert数据
$data = $this->getInsertDataFromRequest();
//添加这行数据
$this->insertRow($data);
return jok('添加成功');
}
/**
* 修改接口基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function update()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
if (!$this->pk_value) {
return jerr($this->pk . "参数必须填写", 400);
}
//根据主键获取一行数据
$item = $this->getRowByPk();
if (empty($item)) {
return jerr("数据查询失败", 404);
}
//校验Update字段是否填写
$error = $this->validateUpdateFields();
if ($error) {
return $error;
}
//从请求中获取Update数据
$data = $this->getUpdateDataFromRequest();
//根据主键更新这条数据
$this->updateByPk($data);
return jok('修改成功');
}
/**
* 禁用接口基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function disable()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
if (!$this->pk_value) {
return jerr($this->pk . "参数必须填写", 400);
}
if (isInteger($this->pk_value)) {
//根据主键获取一行数据
$item = $this->getRowByPk();
if (empty($item)) {
return jerr("数据查询失败", 404);
}
//单个操作
$this->disableBySingle();
} else {
//批量操作
$this->disableByMultiple();
}
return jok("禁用成功");
}
/**
* 启用接口基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function enable()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
if (!$this->pk_value) {
return jerr($this->pk . "参数必须填写", 400);
}
if (isInteger($this->pk_value)) {
//根据主键获取一行数据
$item = $this->getRowByPk();
if (empty($item)) {
return jerr("数据查询失败", 404);
}
//单个操作
$this->enableBySingle();
} else {
//批量操作
$this->enableByMultiple();
}
return jok("启用成功");
}
/**
* 删除接口基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function delete()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
if (!$this->pk_value) {
return jerr($this->pk . "必须填写", 400);
}
if (isInteger($this->pk_value)) {
//根据主键获取一行数据
$item = $this->getRowByPk();
if (empty($item)) {
return jerr("数据查询失败", 404);
}
//单个操作
$this->deleteBySingle();
} else {
//批量操作
$this->deleteByMultiple();
}
return jok('删除成功');
}
/**
* 获取列表接口基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function getList()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
//从请求中获取筛选数据的数组
$map = $this->getDataFilterFromRequest();
//从请求中获取排序方式
$order = $this->getorderfromRequest();
//设置Model中的 per_page
$this->setGetListPerPage();
//查询数据
$dataList = $this->model->getListByPage($map, $order, $this->selectList);
return jok('数据获取成功', $dataList);
}
/**
* 获取详情基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function detail()
{
//校验Access与RBAC
$error = $this->access();
if ($error) {
return $error;
}
if (!$this->pk_value) {
return jerr($this->pk . "必须填写", 400);
}
//根据主键获取一行数据
$item = $this->getRowByPk();
if (empty($item)) {
return jerr("没有查询到数据", 404);
}
return jok('数据加载成功', $item);
}
/**
* 导出Excel基类 子类自动继承 如有特殊需求 可重写到子类 请勿修改父类方法
*
* @return void
*/
public function excel()
{
$error = $this->access();
if ($error) {
return $error;
}
$this->exportExcelData();
}
// !!!如有特殊需求请重写下面的方法到子类,请勿修改此处!!! END.........//
// 初始化
protected function initialize()
{
$this->module = "api";
$this->controller = $this->request->controller() ? $this->request->controller() : "Index";
$this->action = strtolower($this->request->action()) ? strtolower($this->request->action()) : "index";
View::assign('controller', strtolower($this->controller));
View::assign('action', strtolower($this->action));
$this->table = strtolower($this->controller);
$this->pk = $this->table . "_id";
$this->pk_value = input($this->pk);
$this->adminModel = new AdminModel();
$this->accessModel = new AccessModel();
$this->authModel = new AuthModel();
$this->nodeModel = new NodeModel();
$this->groupModel = new GroupModel();
$this->confModel = new ConfModel();
$configs = $this->confModel->select()->toArray();
$c = [];
foreach ($configs as $config) {
$c[$config['conf_key']] = $config['conf_value'];
}
config($c, 'qfshop');
}
/**
* 检测授权
*
* @return void
*/
protected function access()
{
if (!input("plat")) {
return jerr("plat参数为必须", 400);
}
$this->plat = input('plat');
if (!input("version")) {
return jerr("version参数为必须", 400);
}
$this->version = input('version');
if (!input("access_token")) {
return jerr("AccessToken为必要参数", 400);
}
$access_token = input("access_token");
$this->admin = $this->adminModel->getAdminByAccessToken($access_token);
if (!$this->admin) {
return jerr("登录过期,请重新登录", 401);
}
if ($this->admin['admin_status'] == 1) {
return jerr("你的账户被禁用,登录失败", 401);
}
}
/**
* 从请求中获取Request数据
*
* @return void
*/
protected function getInsertDataFromRequest()
{
$data = [];
foreach (input('post.') as $k => $v) {
if (in_array($k, $this->insertFields)) {
$data[$k] = $v;
}
}
return $data;
}
/**
* 校验Insert的字段
*
* @return void
*/
protected function validateInsertFields()
{
foreach ($this->insertRequire as $k => $v) {
if (!input($k)) {
return jerr($v, 400);
}
}
return null;
}
/**
* 从请求中获取Update数据
*
* @return void
*/
protected function getUpdateDataFromRequest()
{
$data = [];
foreach (input('post.') as $k => $v) {
if (in_array($k, $this->updateFields)) {
$data[$k] = $v;
}
}
return $data;
}
/**
* 校验Update的字段
*
* @return void
*/
protected function validateUpdateFields()
{
foreach ($this->updateRequire as $k => $v) {
if (!input($k)) {
return jerr($v, 400);
}
}
return null;
}
/**
* 按主键集合批量禁用 1,2,3,4
*
* @return void
*/
protected function disableByMultiple()
{
$list = explode(',', $this->pk_value);
$this->model->where($this->pk, 'in', $list)->update([
$this->table . "_status" => 1,
$this->table . "_updatetime" => time(),
]);
}
/**
* 单个禁用 可传入自定义$map
* 默认按主键ID禁用
*
* @param array $map
* @return void
*/
protected function disableBySingle($map = null)
{
if ($map == null) {
$map = [$this->pk => $this->pk_value];
}
$this->model->where($map)->update([
$this->table . "_status" => 1,
$this->table . "_updatetime" => time(),
]);
}
/**
* 按主键集合批量启用 1,2,3,4
*
* @return void
*/
protected function enableByMultiple()
{
$list = explode(',', $this->pk_value);
$this->model->where($this->pk, 'in', $list)->update([
$this->table . "_status" => 0,
$this->table . "_updatetime" => time(),
]);
}
/**
* 单个启用 可传入自定义$map
* 默认按主键ID启用
*
* @param array $map
* @return void
*/
protected function enableBySingle($map = null)
{
if ($map == null) {
$map = [$this->pk => $this->pk_value];
}
$this->model->where($map)->update([
$this->table . "_status" => 0,
$this->table . "_updatetime" => time(),
]);
}
/**
* 按主键集合批量删除1,2,3,4
*
* @return void
*/
protected function deleteByMultiple()
{
$list = explode(',', $this->pk_value);
$this->model->where($this->pk, 'in', $list)->delete();
}
/**
* 单个删除 默认主键ID
*
* @param array $map
* @return void
*/
protected function deleteBySingle($map = null)
{
if ($map == null) {
$map = [$this->pk => $this->pk_value];
}
$this->model->where($map)->delete();
}
/**
* 根据主键ID获取一行数据
*
* @param int|null 主键ID
* @return array|null
*/
protected function getRowByPk($pk_value = null)
{
if (!$pk_value) {
$pk_value = $this->pk_value;
}
$item = $this->model->where($this->pk, $pk_value)->field($this->selectDetail)->find();
return $item ? $item->toArray() : null;
}
/**
* 根据主键ID更新数据
*
* @param array 需要更新的KV数组
* @param int|null 主键ID 默认$this->pk_value
* @param bool 是否更新_updatetime字段 默认TRUE
* @return void
*/
protected function updateByPk($data, $pk_value = null, $auto_updatetime = true)
{
if (!$pk_value) {
$pk_value = $this->pk_value;
}
if ($auto_updatetime) {
$data[$this->table . "_updatetime"] = time();
}
$this->model->where($this->pk, $this->pk_value)->update($data);
}
/**
* 添加一行数据
*
* @param array 需要添加的KV数组
* @param bool 是否自动记录_createtime和_updatetime字段 默认true
* @return int 添加返回的主键ID
*/
protected function insertRow($data, $auto_inserttime = true)
{
if ($auto_inserttime) {
$data[$this->table . "_updatetime"] = time();
$data[$this->table . "_createtime"] = time();
} else {
$data[$this->table . "_updatetime"] = 0;
$data[$this->table . "_createtime"] = 0;
}
$id = $this->model->insertGetId($data);
return $id;
}
/**
* 从请求中获取查询排序(默认主键DESC)
*
* @return void
*/
protected function getOrderFromRequest()
{
if (input('order')) {
$order = urldecode(input('order'));
} else {
$order = strtolower($this->controller) . "_id desc";
}
return $order;
}
/**
* 设置分页查询每页数量
*
* @param int|null 每页数量
* @return void
*/
protected function setGetListPerPage($per_page = null)
{
if ($per_page) {
$this->model->per_page = intval($per_page);
} else if (input('per_page')) {
$this->model->per_page = input('per_page');
} else {
$this->model->per_page = 10;
}
}
/**
* 获取查询列表的Where参数
*
* @return array
*/
protected function getDataFilterFromRequest()
{
$map = [];
$filter = input('post.');
foreach ($filter as $k => $v) {
if ($k == 'filter') {
$k = input('filter');
$v = input('keyword');
}
if ($v === '' || $v === null) {
continue;
}
if (array_key_exists($k, $this->searchFilter)) {
switch ($this->searchFilter[$k]) {
case "like":
array_push($map, [$k, 'like', "%" . $v . "%"]);
break;
case "=":
array_push($map, [$k, '=', $v]);
break;
default:
}
}
}
return $map;
}
protected function getExcelFields()
{
$excelField = [];
foreach ($this->excelField as $k => $v) {
if ($k == "*") {
continue;
} else {
array_push($excelField, [
$k, $v
]);
}
}
return $excelField;
}
/**
* 导出Excel
*
* @return string 下载文件名
*/
protected function exportExcelData($data)
{
$datalist = $data ? $data->toArray() : [];
$excelField = $this->getExcelFields();
$PHPExcel = new \PHPExcel(); //实例化
$PHPExcel
->getProperties() //获得文件属性对象,给下文提供设置资源
->setCreator("qfshop") //设置文件的创建者
->setLastModifiedBy("qfshop") //设置最后修改者
->setDescription("Export by qfshop"); //设置备注
$PHPSheet = $PHPExcel->getActiveSheet();
if (count($excelField) > count($this->excelCells)) {
echo 'Error and you need check Excel Cells Keys...';
die;
}
$PHPSheet->getRowDimension(1)->setRowHeight(30);
for ($column = 0; $column < count($excelField); $column++) {
$PHPSheet->setCellValue($this->excelCells[$column] . "1", $excelField[$column][1]);
$PHPSheet->getStyle($this->excelCells[$column])->getNumberFormat()
->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
for ($line = 0; $line < count($datalist); $line++) {
$string = $datalist[$line][$excelField[$column][0]];
$PHPSheet->getColumnDimension($this->excelCells[$column])->setWidth(20);
$PHPSheet->setCellValueExplicit($this->excelCells[$column] . ($line + 2), $string, \PHPExcel_Cell_DataType::TYPE_STRING);
}
}
//***********************画出单元格边框*****************************
$styleArray = array(
);
$PHPSheet->getStyle('A2:' . $this->excelCells[count($excelField) - 1] . (count(
$datalist
) + 2))->applyFromArray($styleArray);
//***********************画出单元格边框结束*****************************
//设置全部居中对齐
$PHPSheet->getStyle('A1:' . $this->excelCells[count($excelField) - 1] . (count(
$datalist
) + 2))->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
//设置全部字体
$PHPSheet->getStyle('A1:' . $this->excelCells[count($excelField) - 1] . (count(
$datalist
) + 2))->getFont()->setName('微软雅黑');
$PHPWriter = \PHPExcel_IOFactory::createWriter($PHPExcel, "Excel2007"); //创建生成的格式
header('Content-Disposition: attachment;filename="' . $this->excelTitle . "_" . date('Y-m-d_H:i:s') . '.xlsx"'); //下载下来的表格名
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$PHPWriter->save("php://output"); //表示在$path路径下面生成demo.xlsx文件
exit;
return $this->excelTitle . "_" . date('Y-m-d_H:i:s') . '.xlsx"';
}
public function __call($method, $args)
{
return jerr("访问异常", 404);
}
}