515 lines
15 KiB
PHP
515 lines
15 KiB
PHP
<?php
|
||
|
||
namespace app\common\model;
|
||
|
||
use think\Model;
|
||
|
||
/**
|
||
* 基础扩展模型
|
||
*/
|
||
class BaseModel extends Model
|
||
{
|
||
|
||
|
||
use \traits\ModelTrait;
|
||
// use \traits\ErrorTrait;
|
||
|
||
public $timeKey = 'createtime';
|
||
public static $staticTimeKey = 'createtime';
|
||
|
||
//允许修改的字段
|
||
public $no_auth_fields = [];
|
||
|
||
//更新数据是否需要触发审核开关
|
||
|
||
public $have_auth = false;
|
||
//更新数据是否需要触发审核开关
|
||
public $need_auth = false;
|
||
|
||
|
||
public $success_auth = false;
|
||
public $error_auth = false;
|
||
|
||
|
||
|
||
/**
|
||
* 是否开启Validate验证
|
||
*/
|
||
protected $modelValidate = false;
|
||
|
||
/**
|
||
* 是否开启模型场景验证
|
||
*/
|
||
protected $modelSceneValidate = false;
|
||
|
||
|
||
|
||
/**
|
||
* 是否开启数据限制
|
||
* 支持auth/personal
|
||
* 表示按权限判断/仅限个人
|
||
* 默认为禁用,若启用请务必保证表中存在admin_id字段
|
||
*/
|
||
protected $dataLimit = false;
|
||
|
||
|
||
/**
|
||
* 数据限制字段
|
||
*/
|
||
protected $dataLimitField = 'admin_id';
|
||
|
||
/**
|
||
* 数据限制开启时自动填充限制字段值
|
||
*/
|
||
protected $dataLimitFieldAutoFill = true;
|
||
|
||
|
||
|
||
|
||
|
||
/**
|
||
* 获取数据限制的管理员ID(后台api版本)
|
||
* 禁用数据限制时返回的是null
|
||
* @return mixed
|
||
*/
|
||
protected function getDataLimitAdminIds()
|
||
{
|
||
if (!$this->dataLimit) {
|
||
return null;
|
||
}
|
||
$auth = \app\adminapi\library\Auth::instance();
|
||
if ($auth->isSuperAdmin()) {
|
||
return null;
|
||
}
|
||
$adminIds = [];
|
||
if (in_array($this->dataLimit, ['auth', 'personal'])) {
|
||
$adminIds = $this->dataLimit == 'auth' ? $auth->getChildrenAdminIds(true) : [$auth->id];
|
||
}
|
||
return $adminIds;
|
||
}
|
||
|
||
|
||
public function checkAssemblyParameters($get=[],$exclude = []){
|
||
//得到所有get参数
|
||
$get = $get ?: request()->get();
|
||
//得到当前model所有字段
|
||
|
||
|
||
$fields = $this->getTableFields();
|
||
|
||
// $commonFields = (new Field())->getCommonFields();
|
||
// var_dump($commonFields);
|
||
$fieldLists = $fields;
|
||
// foreach ($commonFields as $commonField) {
|
||
// if (!in_array($commonField['column_name'], $fields)) {
|
||
// $fieldLists[] = $commonField;
|
||
// }
|
||
// }
|
||
$q_fields = [];
|
||
|
||
foreach ($get as $kay=>$getField) {
|
||
if (in_array($kay, $fieldLists) && !in_array($kay, $exclude)) {
|
||
$q_fields[$kay] = $getField;
|
||
}
|
||
}
|
||
|
||
return $q_fields;
|
||
|
||
//将q_fields塞入模板中
|
||
// foreach ($q_fields as $k=>$v) {
|
||
// //渲染站点配置
|
||
// $this->assign('q_'.$k, $v);
|
||
// }
|
||
|
||
// foreach ($this->qFields as $k) {
|
||
// //渲染站点配置
|
||
// if(!isset($q_fields[$k]))$this->assign('q_'.$k, "");
|
||
// }
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
public function no_auth_fields_check($params,$row){
|
||
|
||
$this->have_auth = false;
|
||
if($this->no_auth_fields == "*")return $this->have_auth;
|
||
// $this->getTableFields();
|
||
$params = $this->checkAssemblyParameters($params);
|
||
foreach ($params as $k=>$v){
|
||
|
||
//说明数值有变动
|
||
//$params[$k] 去掉两端空格
|
||
$params[$k] = trim($v);
|
||
|
||
if($row[$k]!=$params[$k]){
|
||
//当修改参数不在允许修改的字段中
|
||
if(!in_array($k,$this->no_auth_fields)){
|
||
// var_dump($k,$row[$k],$params[$k]);
|
||
$this->have_auth = true;break;
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
return $this->have_auth;
|
||
|
||
}
|
||
|
||
|
||
/**得到基础条件
|
||
* @param $status
|
||
* @param null $model
|
||
* @param string $alisa
|
||
*/
|
||
public static function getBaseWhere($whereData = [], $model = null, $alisa = '',$with = false)
|
||
{
|
||
if (!$model) {
|
||
$model = new static;
|
||
if ($alisa&&!$with) $model = $model->alias($alisa);
|
||
}
|
||
if ($alisa) $alisa = $alisa . '.';
|
||
//$model = $model->where($alisa . 'status', '1');
|
||
$tableFields = (new static)->getTableFields();
|
||
foreach ($tableFields as $fields)
|
||
{
|
||
if (isset($whereData[$fields]) && $whereData[$fields]){
|
||
if(is_array($whereData[$fields])){
|
||
$model = $model->where("{$alisa}{$fields}", $whereData[$fields][0], $whereData[$fields][1]);
|
||
}else{
|
||
$model = $model->where("{$alisa}{$fields}", '=', $whereData[$fields]);
|
||
}
|
||
|
||
}
|
||
}
|
||
//关联查询条件
|
||
if($with && is_array($with)){
|
||
foreach ($whereData as $param => $value)
|
||
{
|
||
//如果存在.则按.分割取到表别名
|
||
//如果表别名属于$with中的表别名,则塞入查询条件里
|
||
if(strpos($param,'.')!==false){
|
||
$param_alisa = explode('.',$param)[0];
|
||
if(in_array($param_alisa,$with)){
|
||
if(is_array($value)){
|
||
$model = $model->where($param, $value[0], $value[1]);
|
||
}else{
|
||
$model = $model->where($param, $value);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return self::getDivWhere($whereData, $model, $alisa,$with);
|
||
}
|
||
public static function getDivWhere($whereData = [], $model = null, $alisa = '',$with = false)
|
||
{
|
||
return $model;
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 基础列表
|
||
*/
|
||
public function getBaseList($whereData = [], $page = 0, $limit = 0, $sort = '',$field =[],$where=[],$toArray = true)
|
||
{
|
||
$alisa = $this->getWithAlisaName();
|
||
if($field){
|
||
//如果是一维数组
|
||
if(is_array($field)&&count($field) == count($field,1)) $field = ['base'=>$field];
|
||
//如果是字符串
|
||
if(is_string($field)) $field = ['base'=>explode(',',$field)];
|
||
}
|
||
$this->withTable = array_keys($field);
|
||
$base_i = array_search("base",$this->withTable);
|
||
if($base_i!==false)unset($this->withTable[$base_i]);
|
||
if(!$this->withTable)$alisa = '';
|
||
$alisa_name = '';
|
||
if($alisa)$alisa_name = "{$alisa}.";
|
||
if(!$sort)$sort = "{$alisa_name}id asc";
|
||
$self = static::getBaseWhere($whereData, null, $alisa,$this->withTable);
|
||
if($this->withTable)$self = $self->with($this->withTable);
|
||
if($page&&$limit)$self = $self->orderRaw($sort)->where($where)->page($page, $limit);
|
||
$list = $self->select();
|
||
foreach ($list as $row) {
|
||
|
||
if(isset($field['base'])&&$field['base']!=['*']){
|
||
$row->visible($field['base']);
|
||
}else{
|
||
$getTableFields = $this->getTableFields();
|
||
if(!empty($this->hidden) && is_array($this->hidden)){
|
||
$getTableFields = array_diff($getTableFields,$this->hidden);
|
||
}
|
||
$row->visible($getTableFields);
|
||
}
|
||
foreach ($this->withTable as $withName) {
|
||
if(isset($field[$withName])&&$field[$withName]!=['*']){
|
||
$row->visible([$withName]);
|
||
$row->getRelation($withName)->visible($field[$withName]);
|
||
}elseif(isset($field[$withName])&&$field[$withName]==['*']){
|
||
$row->visible([$withName]);
|
||
}
|
||
}
|
||
}
|
||
if($toArray)$list = collection($list)->toArray();
|
||
$countSelf = static::getBaseWhere($whereData, null, $alisa,$this->withTable);
|
||
if($this->withTable)$countSelf = $countSelf->with($this->withTable);
|
||
$count = $countSelf->where($where)->count();
|
||
return compact('list', 'count','page','limit');
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 时间段搜索器
|
||
* @param Model $query
|
||
* @param $value
|
||
*/
|
||
public function scopeTime($query, $value)
|
||
{
|
||
$timeKey = $this->timeKey;
|
||
if(static::$staticTimeKey)$timeKey =static::$staticTimeKey;
|
||
|
||
if(is_array($value)){
|
||
$timeKey = $value[0];
|
||
$value = $value[1];
|
||
}
|
||
|
||
|
||
switch ($value) {
|
||
case 'today':
|
||
case 'week':
|
||
case 'month':
|
||
case 'year':
|
||
case 'yesterday':
|
||
case 'last year':
|
||
case 'last week':
|
||
case 'last month':
|
||
$query->whereTime($timeKey, $value);
|
||
break;
|
||
case 'quarter':
|
||
list($startTime, $endTime) = static::getMonth();
|
||
$query->whereTime($timeKey, 'between', [$startTime, $endTime]);
|
||
break;
|
||
case 'lately7':
|
||
$query->whereTime($timeKey, 'between', [strtotime("-7 day"), time()]);
|
||
break;
|
||
case 'lately30':
|
||
$query->whereTime($timeKey, 'between', [strtotime("-30 day"), time()]);
|
||
break;
|
||
default:
|
||
if (strstr($value, '---') !== false||strstr($value, '-') !== false) {
|
||
if(strstr($value, '---') !== false){
|
||
[$startTime, $endTime] = explode('---', $value);
|
||
}elseif (strstr($value, '-') !== false){
|
||
[$startTime, $endTime] = explode('-', $value);
|
||
}
|
||
$startTime = trim($startTime);
|
||
$endTime = trim($endTime);
|
||
if ($startTime && $endTime) {
|
||
$query->whereTime($timeKey, 'between', [strtotime($startTime), $startTime == $endTime ? strtotime($endTime) + 86400 : strtotime($endTime)]);
|
||
} else if (!$startTime && $endTime) {
|
||
$query->whereTime($timeKey, '<', strtotime($endTime) + 86400);
|
||
} else if ($startTime && !$endTime) {
|
||
$query->whereTime($timeKey, '>=', strtotime($startTime));
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
public function demo($id,$trans=false){
|
||
//判断逻辑
|
||
if($trans){
|
||
self::beginTrans();
|
||
}
|
||
$res = true;
|
||
try{
|
||
|
||
if($trans){
|
||
self::commitTrans();
|
||
}
|
||
}catch (\Exception $e){
|
||
if($trans){
|
||
self::rollbackTrans();
|
||
}
|
||
throw new \Exception($e->getMessage().$e->getFile().$e->getLine());
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
|
||
// /** 通用新增(后台api版本)
|
||
// * @param $params
|
||
// * @param $trans
|
||
// * @return $this
|
||
// * @throws \Exception
|
||
// */
|
||
// public function add($params,$trans=false){
|
||
//
|
||
// if (empty($params)) {
|
||
// throw new \Exception(__('Parameter %s can not be empty', ''));
|
||
// }
|
||
//
|
||
// if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
|
||
// $params[$this->dataLimitField] = $this->auth->id;
|
||
// }
|
||
////判断逻辑
|
||
// if($trans){
|
||
// self::beginTrans();
|
||
// }
|
||
// $res = true;
|
||
// try{
|
||
//
|
||
// //是否采用模型验证
|
||
// if ($this->modelValidate) {
|
||
// $name = str_replace("\\model\\", "\\validate\\", get_class($this));
|
||
// $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
|
||
// $this->validateFailException()->validate($validate);
|
||
// }
|
||
//
|
||
// $result = $this->allowField(true)->save($params);
|
||
//
|
||
// if($trans){
|
||
// self::commitTrans();
|
||
// }
|
||
// }catch (\Exception $e){
|
||
// if($trans){
|
||
// self::rollbackTrans();
|
||
// }
|
||
// throw new \Exception($e->getMessage().$e->getFile().$e->getLine());
|
||
// }
|
||
// return $this;
|
||
// }
|
||
//
|
||
//
|
||
// /** 通用编辑(后台api版本)
|
||
// * @param $params
|
||
// * @param $trans
|
||
// * @return $this
|
||
// * @throws \Exception
|
||
// */
|
||
// public function edit($id,$params,$trans=false){
|
||
//
|
||
// $row = $this->get($id);
|
||
// if (!$row) {
|
||
// throw new \Exception(__('No Results were found'));
|
||
// }
|
||
//
|
||
// $adminIds = $this->getDataLimitAdminIds();
|
||
// if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
|
||
// throw new \Exception(__('You have no permission'));
|
||
// }
|
||
//
|
||
// if (empty($params)) {
|
||
// throw new \Exception(__('Parameter %s can not be empty', ''));
|
||
// }
|
||
////判断逻辑
|
||
// if($trans){
|
||
// self::beginTrans();
|
||
// }
|
||
// $res = true;
|
||
// try{
|
||
//
|
||
// //是否采用模型验证
|
||
// if ($this->modelValidate) {
|
||
// $name = str_replace("\\model\\", "\\validate\\", get_class($this));
|
||
// $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
|
||
// $row->validateFailException()->validate($validate);
|
||
// }
|
||
// $result = $row->allowField(true)->save($params);
|
||
//
|
||
// if($trans){
|
||
// self::commitTrans();
|
||
// }
|
||
// }catch (\Exception $e){
|
||
// if($trans){
|
||
// self::rollbackTrans();
|
||
// }
|
||
// throw new \Exception($e->getMessage().$e->getFile().$e->getLine());
|
||
// }
|
||
// return $row;
|
||
// }
|
||
//
|
||
//
|
||
// /** 通用详情(后台api版本)
|
||
// * @param $params
|
||
// * @param $trans
|
||
// * @return $this
|
||
// * @throws \Exception
|
||
// */
|
||
// public function detail($id,$show_field=[],$except_field=[]){
|
||
// $row = $this->get($id);
|
||
// if (!$row) {
|
||
// throw new \Exception(__('No Results were found'));
|
||
// }
|
||
// if($show_field){
|
||
// $row->visible($show_field);
|
||
// }
|
||
// if($except_field){
|
||
// $row->hidden($except_field);
|
||
// }
|
||
// return $row;
|
||
// }
|
||
//
|
||
//// public function index($page,$limit,$where=[])
|
||
//// {
|
||
//// $adminIds = $this->getDataLimitAdminIds();
|
||
//// $aliasName = "" ;
|
||
//// if (is_array($adminIds)) {
|
||
//// $where[] = [$aliasName . $this->dataLimitField, 'in', $adminIds];
|
||
//// }
|
||
////
|
||
//// }
|
||
//
|
||
//
|
||
// /** 通用删除(后台api版本)
|
||
// * @param $params
|
||
// * @param $trans
|
||
// * @return $this
|
||
// * @throws \Exception
|
||
// */
|
||
// public function del($ids = null,$trans=false){
|
||
// if (empty($ids)) {
|
||
// throw new \Exception(__('Parameter %s can not be empty', 'ids'));
|
||
// }
|
||
////判断逻辑
|
||
//
|
||
// $pk = $this->getPk();
|
||
// $adminIds = $this->getDataLimitAdminIds();
|
||
// if (is_array($adminIds)) {
|
||
// $this->where($this->dataLimitField, 'in', $adminIds);
|
||
// }
|
||
// $list = $this->where($pk, 'in', $ids)->select();
|
||
// $count = 0;
|
||
// if($trans){
|
||
// self::beginTrans();
|
||
// }
|
||
// $res = true;
|
||
// try{
|
||
//
|
||
// foreach ($list as $item) {
|
||
// $count += $item->delete();
|
||
// }
|
||
//
|
||
// if($trans){
|
||
// self::commitTrans();
|
||
// }
|
||
// }catch (\Exception $e){
|
||
// if($trans){
|
||
// self::rollbackTrans();
|
||
// }
|
||
// throw new \Exception($e->getMessage().$e->getFile().$e->getLine());
|
||
// }
|
||
// return $count;
|
||
// }
|
||
//
|
||
|
||
|
||
}
|