mirror of https://gitee.com/karson/fastadmin.git
新增菜单快捷搜索,支持单拼、全拼、中文搜索
新增基类的selectpage方法,用于独立提供下拉列表搜索 新增前台SMS控制器,用于验证码的发送 新增JS的Fast的全局方法 新增CRUD生成Model中自动更新权重weigh字段的功能 修复install.php文件检测和目录检测的BUG 修复前台Ucenter方法公开访问的BUG 修复在路由中禁用Admin模块的路由 修复部分脚本显示编码的BUG 修复CRUD时自定义主键时的生成的Model关联错误的BUG 移除冗余的LESS文件和CSS文件 移除Configvalue模块功能pull/135/MERGE
parent
a34086faf5
commit
311f1d7626
|
|
@ -214,8 +214,12 @@ class Crud extends Command
|
||||||
throw new Exception("table not found");
|
throw new Exception("table not found");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$table = stripos($table, $prefix) === 0 ? substr($table, strlen($prefix)) : $table;
|
||||||
|
}
|
||||||
$tableInfo = $tableInfo[0];
|
$tableInfo = $tableInfo[0];
|
||||||
|
|
||||||
$relationModelTableType = 'table';
|
$relationModelTableType = 'table';
|
||||||
//检查关联表
|
//检查关联表
|
||||||
if ($relation)
|
if ($relation)
|
||||||
|
|
@ -232,6 +236,10 @@ class Crud extends Command
|
||||||
throw new Exception("relation table not found");
|
throw new Exception("relation table not found");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$relation = stripos($relation, $prefix) === 0 ? substr($relation, strlen($prefix)) : $relation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//根据表名匹配对应的Fontawesome图标
|
//根据表名匹配对应的Fontawesome图标
|
||||||
|
|
@ -442,8 +450,8 @@ class Crud extends Command
|
||||||
$fieldName = "row[{$field}]";
|
$fieldName = "row[{$field}]";
|
||||||
$defaultValue = $v['COLUMN_DEFAULT'];
|
$defaultValue = $v['COLUMN_DEFAULT'];
|
||||||
$editValue = "{\$row.{$field}}";
|
$editValue = "{\$row.{$field}}";
|
||||||
// 如果默认值为空,则是一个必选项
|
// 如果默认值非null,则是一个必选项
|
||||||
if ($v['COLUMN_DEFAULT'] == '')
|
if (!is_null($v['COLUMN_DEFAULT']))
|
||||||
{
|
{
|
||||||
$attrArr['data-rule'] = 'required';
|
$attrArr['data-rule'] = 'required';
|
||||||
}
|
}
|
||||||
|
|
@ -511,6 +519,7 @@ class Crud extends Command
|
||||||
}
|
}
|
||||||
else if ($inputType == 'checkbox' || $inputType == 'radio')
|
else if ($inputType == 'checkbox' || $inputType == 'radio')
|
||||||
{
|
{
|
||||||
|
unset($attrArr['data-rule']);
|
||||||
$fieldName = $inputType == 'checkbox' ? $fieldName .= "[]" : $fieldName;
|
$fieldName = $inputType == 'checkbox' ? $fieldName .= "[]" : $fieldName;
|
||||||
$attrArr['name'] = "row[{$fieldName}]";
|
$attrArr['name'] = "row[{$fieldName}]";
|
||||||
|
|
||||||
|
|
@ -534,6 +543,7 @@ class Crud extends Command
|
||||||
}
|
}
|
||||||
else if ($inputType == 'switch')
|
else if ($inputType == 'switch')
|
||||||
{
|
{
|
||||||
|
unset($attrArr['data-rule']);
|
||||||
if ($defaultValue === '1' || $defaultValue === 'Y')
|
if ($defaultValue === '1' || $defaultValue === 'Y')
|
||||||
{
|
{
|
||||||
$yes = $defaultValue;
|
$yes = $defaultValue;
|
||||||
|
|
@ -560,10 +570,12 @@ class Crud extends Command
|
||||||
$defaultValue = '';
|
$defaultValue = '';
|
||||||
$attrArr['data-rule'] = 'required';
|
$attrArr['data-rule'] = 'required';
|
||||||
$cssClassArr[] = 'selectpage';
|
$cssClassArr[] = 'selectpage';
|
||||||
$attrArr['data-db-table'] = substr($field, 0, strripos($field, '_'));
|
$selectpageController = str_replace('_', '/', substr($field, 0, strripos($field, '_')));
|
||||||
|
$attrArr['data-source'] = $selectpageController . "/index";
|
||||||
//如果是类型表需要特殊处理下
|
//如果是类型表需要特殊处理下
|
||||||
if ($attrArr['data-db-table'] == 'category')
|
if ($selectpageController == 'category')
|
||||||
{
|
{
|
||||||
|
$attrArr['data-source'] = 'category/selectpage';
|
||||||
$attrArr['data-params'] = '##replacetext##';
|
$attrArr['data-params'] = '##replacetext##';
|
||||||
$search = '"##replacetext##"';
|
$search = '"##replacetext##"';
|
||||||
$replace = '\'{"custom[type]":"' . $table . '"}\'';
|
$replace = '\'{"custom[type]":"' . $table . '"}\'';
|
||||||
|
|
@ -677,6 +689,12 @@ class Crud extends Command
|
||||||
$validateNamespace = "{$appNamespace}\\" . $moduleName . "\\validate";
|
$validateNamespace = "{$appNamespace}\\" . $moduleName . "\\validate";
|
||||||
$validateName = $modelName;
|
$validateName = $modelName;
|
||||||
|
|
||||||
|
$modelInit = '';
|
||||||
|
if ($priKey != $order)
|
||||||
|
{
|
||||||
|
$modelInit = $this->getReplacedStub('mixins' . DS . 'modelinit', ['order' => $order]);
|
||||||
|
}
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'controllerNamespace' => $controllerNamespace,
|
'controllerNamespace' => $controllerNamespace,
|
||||||
'modelNamespace' => $modelNamespace,
|
'modelNamespace' => $modelNamespace,
|
||||||
|
|
@ -716,7 +734,8 @@ class Crud extends Command
|
||||||
'getEnumList' => implode("\n\n", $getEnumArr),
|
'getEnumList' => implode("\n\n", $getEnumArr),
|
||||||
'getAttrList' => implode("\n\n", $getAttrArr),
|
'getAttrList' => implode("\n\n", $getAttrArr),
|
||||||
'setAttrList' => implode("\n\n", $setAttrArr),
|
'setAttrList' => implode("\n\n", $setAttrArr),
|
||||||
'modelMethod' => '',
|
'modelInit' => $modelInit,
|
||||||
|
'modelRelationMethod' => '',
|
||||||
];
|
];
|
||||||
|
|
||||||
//如果使用关联模型
|
//如果使用关联模型
|
||||||
|
|
@ -734,7 +753,7 @@ class Crud extends Command
|
||||||
$data['relationForeignKey'] = $relationForeignKey;
|
$data['relationForeignKey'] = $relationForeignKey;
|
||||||
$data['relationPrimaryKey'] = $relationPrimaryKey ? $relationPrimaryKey : $priKey;
|
$data['relationPrimaryKey'] = $relationPrimaryKey ? $relationPrimaryKey : $priKey;
|
||||||
//构造关联模型的方法
|
//构造关联模型的方法
|
||||||
$data['modelMethod'] = $this->getReplacedStub('modelmethod', $data);
|
$data['modelRelationMethod'] = $this->getReplacedStub('mixins' . DS . 'modelrelationmethod', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成控制器文件
|
// 生成控制器文件
|
||||||
|
|
@ -1138,7 +1157,6 @@ EOD;
|
||||||
protected function getJsColumn($field, $datatype = '', $extend = '')
|
protected function getJsColumn($field, $datatype = '', $extend = '')
|
||||||
{
|
{
|
||||||
$lang = ucfirst($field);
|
$lang = ucfirst($field);
|
||||||
$html = str_repeat(" ", 24) . "{field: '{$field}{$extend}', title: __('{$lang}')";
|
|
||||||
$formatter = '';
|
$formatter = '';
|
||||||
foreach ($this->fieldFormatterSuffix as $k => $v)
|
foreach ($this->fieldFormatterSuffix as $k => $v)
|
||||||
{
|
{
|
||||||
|
|
@ -1159,7 +1177,12 @@ EOD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$formatter = $extend ? '' : $formatter;
|
if ($formatter)
|
||||||
|
{
|
||||||
|
$extend = '';
|
||||||
|
}
|
||||||
|
$html = str_repeat(" ", 24) . "{field: '{$field}{$extend}', title: __('{$lang}')";
|
||||||
|
//$formatter = $extend ? '' : $formatter;
|
||||||
if ($extend)
|
if ($extend)
|
||||||
{
|
{
|
||||||
$html .= ", operate:false";
|
$html .= ", operate:false";
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@
|
||||||
{
|
{
|
||||||
//当前是否为关联查询
|
//当前是否为关联查询
|
||||||
$this->relationSearch = {%relationSearch%};
|
$this->relationSearch = {%relationSearch%};
|
||||||
|
//设置过滤方法
|
||||||
|
$this->request->filter(['strip_tags', 'htmlspecialchars']);
|
||||||
if ($this->request->isAjax())
|
if ($this->request->isAjax())
|
||||||
{
|
{
|
||||||
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
{foreach name="{%fieldList%}" item="vo"}
|
{foreach name="{%fieldList%}" item="vo"}
|
||||||
<label for="{%fieldName%}-{$key}"><input id="{%fieldName%}-{$key}" name="{%fieldName%}" type="checkbox" value="{$key}" {in name="key" value="{%selectedValue%}"}checked{/in} /> {$vo}</label>
|
<label for="{%fieldName%}-{$key}"><input id="{%fieldName%}-{$key}" name="{%fieldName%}" type="checkbox" value="{$key}" {in name="key" value="{%selectedValue%}"}checked{/in} /> {$vo}</label>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
|
|
||||||
{foreach name="{%fieldList%}" item="vo"}
|
{foreach name="{%fieldList%}" item="vo"}
|
||||||
<label for="{%fieldName%}-{$key}"><input id="{%fieldName%}-{$key}" name="{%fieldName%}" type="radio" value="{$key}" {in name="key" value="{%selectedValue%}"}checked{/in} /> {$vo}</label>
|
<label for="{%fieldName%}-{$key}"><input id="{%fieldName%}-{$key}" name="{%fieldName%}" type="radio" value="{$key}" {in name="key" value="{%selectedValue%}"}checked{/in} /> {$vo}</label>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
protected static function init()
|
||||||
|
{
|
||||||
|
self::afterInsert(function ($row) {
|
||||||
|
$row->save(['{%order%}' => $row['id']]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
public function {%relationMethod%}()
|
public function {%relationMethod%}()
|
||||||
{
|
{
|
||||||
return $this->{%relationMode%}('{%relationModelName%}', '{%relationForeignKey%}', '{%pk%}')->setEagerlyType(0);
|
return $this->{%relationMode%}('{%relationModelName%}', '{%relationForeignKey%}', '{%relationPrimaryKey%}')->setEagerlyType(0);
|
||||||
}
|
}
|
||||||
|
|
@ -21,6 +21,7 @@ class {%modelName%} extends Model
|
||||||
{%appendAttrList%}
|
{%appendAttrList%}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
{%modelInit%}
|
||||||
|
|
||||||
{%getEnumList%}
|
{%getEnumList%}
|
||||||
|
|
||||||
|
|
@ -28,5 +29,5 @@ class {%modelName%} extends Model
|
||||||
|
|
||||||
{%setAttrList%}
|
{%setAttrList%}
|
||||||
|
|
||||||
{%modelMethod%}
|
{%modelRelationMethod%}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -58,7 +58,7 @@ class Min extends Command
|
||||||
{
|
{
|
||||||
if (IS_WIN)
|
if (IS_WIN)
|
||||||
{
|
{
|
||||||
throw new Exception("node environment require nodejs!please check http://doc.fastadmin.net/322813 !");
|
throw new Exception("node environment not found!please check http://doc.fastadmin.net/faq.html !");
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,10 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use app\common\model\Category;
|
use app\common\model\Category;
|
||||||
use app\common\model\Configvalue;
|
|
||||||
use fast\Form;
|
use fast\Form;
|
||||||
use fast\Tree;
|
use fast\Tree;
|
||||||
use think\Db;
|
use think\Db;
|
||||||
|
|
||||||
/**
|
|
||||||
* 重新生成上传的参数配置
|
|
||||||
* @param array $params
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
function get_upload_multipart($params = [])
|
|
||||||
{
|
|
||||||
// 加载配置
|
|
||||||
$configvalue = new Configvalue;
|
|
||||||
// 上传参数配置配置
|
|
||||||
$uploadcfg = $configvalue->upload($params);
|
|
||||||
|
|
||||||
return json_encode(isset($uploadcfg['multipart']) ? $uploadcfg['multipart'] : []);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成下拉列表
|
* 生成下拉列表
|
||||||
* @param string $name
|
* @param string $name
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ namespace app\admin\controller;
|
||||||
|
|
||||||
use app\common\controller\Backend;
|
use app\common\controller\Backend;
|
||||||
use fast\Random;
|
use fast\Random;
|
||||||
use fast\Tree;
|
|
||||||
use RecursiveDirectoryIterator;
|
use RecursiveDirectoryIterator;
|
||||||
use RecursiveIteratorIterator;
|
use RecursiveIteratorIterator;
|
||||||
use think\Cache;
|
use think\Cache;
|
||||||
|
|
@ -23,114 +22,12 @@ class Ajax extends Backend
|
||||||
protected $noNeedRight = ['*'];
|
protected $noNeedRight = ['*'];
|
||||||
protected $layout = '';
|
protected $layout = '';
|
||||||
|
|
||||||
/**
|
public function _initialize()
|
||||||
* 自动完成
|
|
||||||
*/
|
|
||||||
public function typeahead()
|
|
||||||
{
|
{
|
||||||
$search = $this->request->get("search");
|
parent::_initialize();
|
||||||
$field = $this->request->get("field");
|
|
||||||
$field = str_replace(['row[', ']'], '', $field);
|
|
||||||
if (substr($field, -3) !== '_id' && substr($field, -4) !== '_ids')
|
|
||||||
{
|
|
||||||
$this->code = -1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$searchfield = 'name';
|
|
||||||
$fieldArr = explode('_', $field);
|
|
||||||
$field = $fieldArr[0];
|
|
||||||
switch ($field)
|
|
||||||
{
|
|
||||||
case 'category':
|
|
||||||
$field = 'category';
|
|
||||||
$searchfield = 'name';
|
|
||||||
break;
|
|
||||||
case 'user':
|
|
||||||
$searchfield = 'nickname';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$searchlist = Db::name($field)
|
//设置过滤方法
|
||||||
->whereOr($searchfield, 'like', "%{$search}%")
|
$this->request->filter(['strip_tags', 'htmlspecialchars']);
|
||||||
->whereOr('id', 'like', "%{$search}%")
|
|
||||||
->limit(10)
|
|
||||||
->field("id,{$searchfield} AS name")
|
|
||||||
->select();
|
|
||||||
|
|
||||||
$this->code = 1;
|
|
||||||
$this->data = ['searchlist' => $searchlist];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SelectPage通用下拉列表搜索
|
|
||||||
*/
|
|
||||||
public function selectpage()
|
|
||||||
{
|
|
||||||
//搜索关键词,客户端输入以空格分开,这里接收为数组
|
|
||||||
$word = $this->request->request("q_word/a");
|
|
||||||
//当前页
|
|
||||||
$page = $this->request->request("pageNumber");
|
|
||||||
//分页大小
|
|
||||||
$pagesize = $this->request->request("pageSize");
|
|
||||||
//搜索条件
|
|
||||||
$andor = $this->request->request("and_or");
|
|
||||||
//排序方式
|
|
||||||
$orderby = $this->request->request("order_by/a");
|
|
||||||
//表名
|
|
||||||
$table = $this->request->request("db_table");
|
|
||||||
//显示的字段
|
|
||||||
$field = $this->request->request("field");
|
|
||||||
//主键
|
|
||||||
$primarykey = $this->request->request("pkey_name");
|
|
||||||
//主键值
|
|
||||||
$primaryvalue = $this->request->request("pkey_value");
|
|
||||||
//搜索字段
|
|
||||||
$searchfield = $this->request->request("search_field/a");
|
|
||||||
//自定义搜索条件
|
|
||||||
$custom = $this->request->request("custom/a");
|
|
||||||
$order = [];
|
|
||||||
foreach ($orderby as $k => $v)
|
|
||||||
{
|
|
||||||
$order[$v[0]] = $v[1];
|
|
||||||
}
|
|
||||||
$field = $field ? $field : 'name';
|
|
||||||
|
|
||||||
//如果不使用ajax/selectpage这个页面提供结果,则是自己的控制器单独写搜索条件,$where按自己的需求写即可
|
|
||||||
//这里只是能用考虑,所以搜索条件写得比较复杂
|
|
||||||
//如果有primaryvalue,说明当前是初始化传值
|
|
||||||
if ($primaryvalue)
|
|
||||||
{
|
|
||||||
$where = [$primarykey => ['in', $primaryvalue]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$where = function($query) use($word, $andor, $field, $searchfield, $custom) {
|
|
||||||
$where = $andor == "OR" ? "whereOr" : "where";
|
|
||||||
foreach ($word as $k => $v)
|
|
||||||
{
|
|
||||||
foreach ($searchfield as $m => $n)
|
|
||||||
{
|
|
||||||
$query->{$where}($n, "like", "%{$v}%");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($custom && is_array($custom))
|
|
||||||
{
|
|
||||||
foreach ($custom as $k => $v)
|
|
||||||
{
|
|
||||||
$query->where($k, '=', $v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
$list = [];
|
|
||||||
$total = Db::name($table)->where($where)->count();
|
|
||||||
if ($total > 0)
|
|
||||||
{
|
|
||||||
$list = Db::name($table)->where($where)->order($order)->page($page, $pagesize)->field("{$primarykey},{$field}")->select();
|
|
||||||
}
|
|
||||||
|
|
||||||
//这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮
|
|
||||||
return json(['list' => $list, 'total' => $total]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -147,87 +44,6 @@ class Ajax extends Backend
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 读取角色权限树
|
|
||||||
*/
|
|
||||||
public function roletree()
|
|
||||||
{
|
|
||||||
$this->loadlang('auth/group');
|
|
||||||
|
|
||||||
$model = model('AuthGroup');
|
|
||||||
$id = $this->request->post("id");
|
|
||||||
$pid = $this->request->post("pid");
|
|
||||||
$parentgroupmodel = $model->get($pid);
|
|
||||||
$currentgroupmodel = NULL;
|
|
||||||
if ($id)
|
|
||||||
{
|
|
||||||
$currentgroupmodel = $model->get($id);
|
|
||||||
}
|
|
||||||
if (($pid || $parentgroupmodel) && (!$id || $currentgroupmodel))
|
|
||||||
{
|
|
||||||
$id = $id ? $id : NULL;
|
|
||||||
$ruleList = collection(model('AuthRule')->order('weigh', 'desc')->select())->toArray();
|
|
||||||
//读取父类角色所有节点列表
|
|
||||||
$parentRuleList = [];
|
|
||||||
if (in_array('*', explode(',', $parentgroupmodel->rules)))
|
|
||||||
{
|
|
||||||
$parentRuleList = $ruleList;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$parent_rule_ids = explode(',', $parentgroupmodel->rules);
|
|
||||||
foreach ($ruleList as $k => $v)
|
|
||||||
{
|
|
||||||
if (in_array($v['id'], $parent_rule_ids))
|
|
||||||
{
|
|
||||||
$parentRuleList[] = $v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//当前所有正常规则列表
|
|
||||||
Tree::instance()->init($ruleList);
|
|
||||||
|
|
||||||
//读取当前角色下规则ID集合
|
|
||||||
$admin_rule_ids = $this->auth->getRuleIds();
|
|
||||||
//是否是超级管理员
|
|
||||||
$superadmin = $this->auth->isSuperAdmin();
|
|
||||||
//当前拥有的规则ID集合
|
|
||||||
$current_rule_ids = $id ? explode(',', $currentgroupmodel->rules) : [];
|
|
||||||
|
|
||||||
if (!$id || !in_array($pid, Tree::instance()->getChildrenIds($id, TRUE)))
|
|
||||||
{
|
|
||||||
$ruleList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name');
|
|
||||||
$hasChildrens = [];
|
|
||||||
foreach ($ruleList as $k => $v)
|
|
||||||
{
|
|
||||||
if ($v['haschild'])
|
|
||||||
$hasChildrens[] = $v['id'];
|
|
||||||
}
|
|
||||||
$nodelist = [];
|
|
||||||
foreach ($parentRuleList as $k => $v)
|
|
||||||
{
|
|
||||||
if (!$superadmin && !in_array($v['id'], $admin_rule_ids))
|
|
||||||
continue;
|
|
||||||
$state = array('selected' => in_array($v['id'], $current_rule_ids) && !in_array($v['id'], $hasChildrens));
|
|
||||||
$nodelist[] = array('id' => $v['id'], 'parent' => $v['pid'] ? $v['pid'] : '#', 'text' => $v['title'], 'type' => 'menu', 'state' => $state);
|
|
||||||
}
|
|
||||||
$this->code = 1;
|
|
||||||
$this->data = $nodelist;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->code = -1;
|
|
||||||
$this->data = __('Can not change the parent to child');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->code = -1;
|
|
||||||
$this->data = __('Group not found');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传文件
|
* 上传文件
|
||||||
*/
|
*/
|
||||||
|
|
@ -337,6 +153,8 @@ class Ajax extends Backend
|
||||||
$ids = explode(',', $ids);
|
$ids = explode(',', $ids);
|
||||||
$prikey = 'id';
|
$prikey = 'id';
|
||||||
$pid = $this->request->post("pid");
|
$pid = $this->request->post("pid");
|
||||||
|
//限制更新的字段
|
||||||
|
$field = in_array($field, ['weigh']) ? $field : 'weigh';
|
||||||
|
|
||||||
// 如果设定了pid的值,此时只匹配满足条件的ID,其它忽略
|
// 如果设定了pid的值,此时只匹配满足条件的ID,其它忽略
|
||||||
if ($pid !== '')
|
if ($pid !== '')
|
||||||
|
|
@ -430,7 +248,7 @@ class Ajax extends Backend
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取分类数据
|
* 读取分类数据,联动列表
|
||||||
*/
|
*/
|
||||||
public function category()
|
public function category()
|
||||||
{
|
{
|
||||||
|
|
@ -457,7 +275,7 @@ class Ajax extends Backend
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取省市区数据
|
* 读取省市区数据,联动列表
|
||||||
*/
|
*/
|
||||||
public function area()
|
public function area()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,12 @@ class Category extends Backend
|
||||||
|
|
||||||
protected $model = null;
|
protected $model = null;
|
||||||
protected $categorylist = [];
|
protected $categorylist = [];
|
||||||
|
protected $noNeedRight = ['selectpage'];
|
||||||
|
|
||||||
public function _initialize()
|
public function _initialize()
|
||||||
{
|
{
|
||||||
parent::_initialize();
|
parent::_initialize();
|
||||||
|
$this->request->filter(['strip_tags']);
|
||||||
$this->model = model('Category');
|
$this->model = model('Category');
|
||||||
|
|
||||||
$tree = Tree::instance();
|
$tree = Tree::instance();
|
||||||
|
|
@ -54,4 +56,14 @@ class Category extends Backend
|
||||||
return $this->view->fetch();
|
return $this->view->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selectpage搜索
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
public function selectpage()
|
||||||
|
{
|
||||||
|
return parent::selectpage();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ class Page extends Backend
|
||||||
{
|
{
|
||||||
|
|
||||||
protected $model = null;
|
protected $model = null;
|
||||||
|
protected $relationSearch = true;
|
||||||
|
|
||||||
public function _initialize()
|
public function _initialize()
|
||||||
{
|
{
|
||||||
|
|
@ -21,4 +22,30 @@ class Page extends Backend
|
||||||
$this->model = model('Page');
|
$this->model = model('Page');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查看
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
if ($this->request->isAjax())
|
||||||
|
{
|
||||||
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
||||||
|
$total = $this->model
|
||||||
|
->with("category")
|
||||||
|
->where($where)
|
||||||
|
->order($sort, $order)
|
||||||
|
->count();
|
||||||
|
$list = $this->model
|
||||||
|
->with("category")
|
||||||
|
->where($where)
|
||||||
|
->order($sort, $order)
|
||||||
|
->limit($offset, $limit)
|
||||||
|
->select();
|
||||||
|
$result = array("total" => $total, "rows" => $list);
|
||||||
|
|
||||||
|
return json($result);
|
||||||
|
}
|
||||||
|
return $this->view->fetch();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\admin\controller;
|
||||||
|
|
||||||
|
use app\common\controller\Backend;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会员管理
|
||||||
|
*
|
||||||
|
* @icon fa fa-circle-o
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
class User extends Backend
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User模型对象
|
||||||
|
*/
|
||||||
|
protected $model = null;
|
||||||
|
|
||||||
|
public function _initialize()
|
||||||
|
{
|
||||||
|
parent::_initialize();
|
||||||
|
$this->model = model('User');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -22,4 +22,5 @@ class Version extends Backend
|
||||||
parent::_initialize();
|
parent::_initialize();
|
||||||
$this->model = model('Version');
|
$this->model = model('Version');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ class Group extends Backend
|
||||||
protected $childrenIds = [];
|
protected $childrenIds = [];
|
||||||
//当前组别列表数据
|
//当前组别列表数据
|
||||||
protected $groupdata = [];
|
protected $groupdata = [];
|
||||||
|
//无需要权限判断的方法
|
||||||
|
protected $noNeedRight = ['roletree'];
|
||||||
|
|
||||||
public function _initialize()
|
public function _initialize()
|
||||||
{
|
{
|
||||||
|
|
@ -78,7 +80,7 @@ class Group extends Backend
|
||||||
if ($this->request->isPost())
|
if ($this->request->isPost())
|
||||||
{
|
{
|
||||||
$this->code = -1;
|
$this->code = -1;
|
||||||
$params = $this->request->post("row/a");
|
$params = $this->request->post("row/a", [], 'strip_tags');
|
||||||
$params['rules'] = explode(',', $params['rules']);
|
$params['rules'] = explode(',', $params['rules']);
|
||||||
if (!in_array($params['pid'], $this->childrenIds))
|
if (!in_array($params['pid'], $this->childrenIds))
|
||||||
{
|
{
|
||||||
|
|
@ -124,7 +126,7 @@ class Group extends Backend
|
||||||
if ($this->request->isPost())
|
if ($this->request->isPost())
|
||||||
{
|
{
|
||||||
$this->code = -1;
|
$this->code = -1;
|
||||||
$params = $this->request->post("row/a");
|
$params = $this->request->post("row/a", [], 'strip_tags');
|
||||||
// 父节点不能是它自身的子节点
|
// 父节点不能是它自身的子节点
|
||||||
if (!in_array($params['pid'], $this->childrenIds))
|
if (!in_array($params['pid'], $this->childrenIds))
|
||||||
{
|
{
|
||||||
|
|
@ -171,8 +173,7 @@ class Group extends Backend
|
||||||
{
|
{
|
||||||
$ids = explode(',', $ids);
|
$ids = explode(',', $ids);
|
||||||
$grouplist = $this->auth->getGroups();
|
$grouplist = $this->auth->getGroups();
|
||||||
$group_ids = array_map(function($group)
|
$group_ids = array_map(function($group) {
|
||||||
{
|
|
||||||
return $group['id'];
|
return $group['id'];
|
||||||
}, $grouplist);
|
}, $grouplist);
|
||||||
// 移除掉当前管理员所在组别
|
// 移除掉当前管理员所在组别
|
||||||
|
|
@ -223,4 +224,87 @@ class Group extends Backend
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取角色权限树
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
public function roletree()
|
||||||
|
{
|
||||||
|
$this->loadlang('auth/group');
|
||||||
|
|
||||||
|
$model = model('AuthGroup');
|
||||||
|
$id = $this->request->post("id");
|
||||||
|
$pid = $this->request->post("pid");
|
||||||
|
$parentgroupmodel = $model->get($pid);
|
||||||
|
$currentgroupmodel = NULL;
|
||||||
|
if ($id)
|
||||||
|
{
|
||||||
|
$currentgroupmodel = $model->get($id);
|
||||||
|
}
|
||||||
|
if (($pid || $parentgroupmodel) && (!$id || $currentgroupmodel))
|
||||||
|
{
|
||||||
|
$id = $id ? $id : NULL;
|
||||||
|
$ruleList = collection(model('AuthRule')->order('weigh', 'desc')->select())->toArray();
|
||||||
|
//读取父类角色所有节点列表
|
||||||
|
$parentRuleList = [];
|
||||||
|
if (in_array('*', explode(',', $parentgroupmodel->rules)))
|
||||||
|
{
|
||||||
|
$parentRuleList = $ruleList;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$parent_rule_ids = explode(',', $parentgroupmodel->rules);
|
||||||
|
foreach ($ruleList as $k => $v)
|
||||||
|
{
|
||||||
|
if (in_array($v['id'], $parent_rule_ids))
|
||||||
|
{
|
||||||
|
$parentRuleList[] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//当前所有正常规则列表
|
||||||
|
Tree::instance()->init($ruleList);
|
||||||
|
|
||||||
|
//读取当前角色下规则ID集合
|
||||||
|
$admin_rule_ids = $this->auth->getRuleIds();
|
||||||
|
//是否是超级管理员
|
||||||
|
$superadmin = $this->auth->isSuperAdmin();
|
||||||
|
//当前拥有的规则ID集合
|
||||||
|
$current_rule_ids = $id ? explode(',', $currentgroupmodel->rules) : [];
|
||||||
|
|
||||||
|
if (!$id || !in_array($pid, Tree::instance()->getChildrenIds($id, TRUE)))
|
||||||
|
{
|
||||||
|
$ruleList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name');
|
||||||
|
$hasChildrens = [];
|
||||||
|
foreach ($ruleList as $k => $v)
|
||||||
|
{
|
||||||
|
if ($v['haschild'])
|
||||||
|
$hasChildrens[] = $v['id'];
|
||||||
|
}
|
||||||
|
$nodelist = [];
|
||||||
|
foreach ($parentRuleList as $k => $v)
|
||||||
|
{
|
||||||
|
if (!$superadmin && !in_array($v['id'], $admin_rule_ids))
|
||||||
|
continue;
|
||||||
|
$state = array('selected' => in_array($v['id'], $current_rule_ids) && !in_array($v['id'], $hasChildrens));
|
||||||
|
$nodelist[] = array('id' => $v['id'], 'parent' => $v['pid'] ? $v['pid'] : '#', 'text' => $v['title'], 'type' => 'menu', 'state' => $state);
|
||||||
|
}
|
||||||
|
$this->code = 1;
|
||||||
|
$this->data = $nodelist;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->code = -1;
|
||||||
|
$this->data = __('Can not change the parent to child');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->code = -1;
|
||||||
|
$this->data = __('Group not found');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ class Rule extends Backend
|
||||||
if ($this->request->isPost())
|
if ($this->request->isPost())
|
||||||
{
|
{
|
||||||
$this->code = -1;
|
$this->code = -1;
|
||||||
$params = $this->request->post("row/a");
|
$params = $this->request->post("row/a", [], 'strip_tags');
|
||||||
if ($params)
|
if ($params)
|
||||||
{
|
{
|
||||||
if (!$params['ismenu'] && !$params['pid'])
|
if (!$params['ismenu'] && !$params['pid'])
|
||||||
|
|
@ -90,7 +90,7 @@ class Rule extends Backend
|
||||||
if ($this->request->isPost())
|
if ($this->request->isPost())
|
||||||
{
|
{
|
||||||
$this->code = -1;
|
$this->code = -1;
|
||||||
$params = $this->request->post("row/a");
|
$params = $this->request->post("row/a", [], 'strip_tags');
|
||||||
if ($params)
|
if ($params)
|
||||||
{
|
{
|
||||||
if (!$params['ismenu'] && !$params['pid'])
|
if (!$params['ismenu'] && !$params['pid'])
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,8 @@ class Multitable extends Backend
|
||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
|
$this->loadlang('general/attachment');
|
||||||
|
$this->loadlang('general/crontab');
|
||||||
return $this->view->fetch();
|
return $this->view->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,10 @@
|
||||||
|
|
||||||
namespace app\admin\controller\general;
|
namespace app\admin\controller\general;
|
||||||
|
|
||||||
use app\common\library\Email;
|
|
||||||
use app\common\controller\Backend;
|
use app\common\controller\Backend;
|
||||||
|
use app\common\library\Email;
|
||||||
|
use app\common\model\Config as ConfigModel;
|
||||||
|
use think\Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统配置
|
* 系统配置
|
||||||
|
|
@ -25,7 +27,7 @@ class Config extends Backend
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$siteList = [];
|
$siteList = [];
|
||||||
$groupList = \app\admin\model\Config::getGroupList();
|
$groupList = ConfigModel::getGroupList();
|
||||||
foreach ($groupList as $k => $v)
|
foreach ($groupList as $k => $v)
|
||||||
{
|
{
|
||||||
$siteList[$k]['name'] = $k;
|
$siteList[$k]['name'] = $k;
|
||||||
|
|
@ -58,8 +60,8 @@ class Config extends Backend
|
||||||
$index++;
|
$index++;
|
||||||
}
|
}
|
||||||
$this->view->assign('siteList', $siteList);
|
$this->view->assign('siteList', $siteList);
|
||||||
$this->view->assign('typeList', \app\admin\model\Config::getTypeList());
|
$this->view->assign('typeList', ConfigModel::getTypeList());
|
||||||
$this->view->assign('groupList', \app\admin\model\Config::getGroupList());
|
$this->view->assign('groupList', ConfigModel::getGroupList());
|
||||||
return $this->view->fetch();
|
return $this->view->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -116,7 +118,7 @@ class Config extends Backend
|
||||||
$this->msg = $this->model->getError();
|
$this->msg = $this->model->getError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (think\Exception $e)
|
catch (Exception $e)
|
||||||
{
|
{
|
||||||
$this->msg = $e->getMessage();
|
$this->msg = $e->getMessage();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,130 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace app\admin\controller\general;
|
|
||||||
|
|
||||||
use app\common\controller\Backend;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 基本配置
|
|
||||||
*
|
|
||||||
* @icon fa fa-cog
|
|
||||||
* @remark 用于管理一些字典数据,通常以键值格式进行录入,保存的数据格式为JSON
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
class Configvalue extends Backend
|
|
||||||
{
|
|
||||||
|
|
||||||
protected $model = null;
|
|
||||||
|
|
||||||
public function _initialize()
|
|
||||||
{
|
|
||||||
parent::_initialize();
|
|
||||||
$this->model = model('Configvalue');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查看
|
|
||||||
*/
|
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
if ($this->request->isAjax())
|
|
||||||
{
|
|
||||||
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
|
||||||
$total = $this->model
|
|
||||||
->where($where)
|
|
||||||
->order($sort, $order)
|
|
||||||
->count();
|
|
||||||
|
|
||||||
$list = $this->model
|
|
||||||
->where($where)
|
|
||||||
->order($sort, $order)
|
|
||||||
->limit($offset, $limit)
|
|
||||||
->select();
|
|
||||||
|
|
||||||
$result = array("total" => $total, "rows" => $list);
|
|
||||||
|
|
||||||
return json($result);
|
|
||||||
}
|
|
||||||
return $this->view->fetch();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加
|
|
||||||
*/
|
|
||||||
public function add()
|
|
||||||
{
|
|
||||||
if ($this->request->isPost())
|
|
||||||
{
|
|
||||||
$this->code = -1;
|
|
||||||
$params = $this->request->post("row/a");
|
|
||||||
if ($params)
|
|
||||||
{
|
|
||||||
if ($this->request->has('field'))
|
|
||||||
{
|
|
||||||
//JSON字段
|
|
||||||
$fieldarr = $valuearr = [];
|
|
||||||
$field = $this->request->post('field/a');
|
|
||||||
$value = $this->request->post('value/a');
|
|
||||||
foreach ($field as $k => $v)
|
|
||||||
{
|
|
||||||
if ($v != '')
|
|
||||||
{
|
|
||||||
$fieldarr[] = $field[$k];
|
|
||||||
$valuearr[] = $value[$k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$params['content'] = array_combine($fieldarr, $valuearr);
|
|
||||||
}
|
|
||||||
$this->model->save($params);
|
|
||||||
$this->code = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return $this->view->fetch();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 编辑
|
|
||||||
*/
|
|
||||||
public function edit($ids = NULL)
|
|
||||||
{
|
|
||||||
$row = $this->model->get(['id' => $ids]);
|
|
||||||
if (!$row)
|
|
||||||
$this->error(__('No Results were found'));
|
|
||||||
// 状态为locked时不允许编辑
|
|
||||||
if ($row['status'] == 'locked')
|
|
||||||
$this->error(__('The current item can not be edited'));
|
|
||||||
if ($this->request->isPost())
|
|
||||||
{
|
|
||||||
$this->code = -1;
|
|
||||||
$params = $this->request->post("row/a");
|
|
||||||
if ($params)
|
|
||||||
{
|
|
||||||
if ($this->request->has('field'))
|
|
||||||
{
|
|
||||||
//JSON字段
|
|
||||||
$fieldarr = $valuearr = [];
|
|
||||||
$field = $this->request->post('field/a');
|
|
||||||
$value = $this->request->post('value/a');
|
|
||||||
foreach ($field as $k => $v)
|
|
||||||
{
|
|
||||||
if ($v != '')
|
|
||||||
{
|
|
||||||
$fieldarr[] = $field[$k];
|
|
||||||
$valuearr[] = $value[$k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$params['content'] = array_combine($fieldarr, $valuearr);
|
|
||||||
}
|
|
||||||
$row->save($params);
|
|
||||||
$this->code = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$this->view->assign("row", $row);
|
|
||||||
return $this->view->fetch();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -28,14 +28,6 @@ class Database extends Backend
|
||||||
$tables[] = ['name' => reset($row), 'rows' => 0];
|
$tables[] = ['name' => reset($row), 'rows' => 0];
|
||||||
}
|
}
|
||||||
$data['tables'] = $tables;
|
$data['tables'] = $tables;
|
||||||
/*
|
|
||||||
$one = Db::table('configvalue')->where('name', 'sql')->find();
|
|
||||||
$saved_sql = [];
|
|
||||||
if ($one && $one['content'])
|
|
||||||
$saved_sql = explode('###', $one['content']);
|
|
||||||
|
|
||||||
$data['saved_sql'] = array_values(array_filter($saved_sql));
|
|
||||||
* */
|
|
||||||
$data['saved_sql'] = [];
|
$data['saved_sql'] = [];
|
||||||
$this->view->assign($data);
|
$this->view->assign($data);
|
||||||
return $this->view->fetch();
|
return $this->view->fetch();
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,6 @@ return [
|
||||||
'The parent group can not found' => '父组别未找到',
|
'The parent group can not found' => '父组别未找到',
|
||||||
'Group not found' => '组别未找到',
|
'Group not found' => '组别未找到',
|
||||||
'Can not change the parent to child' => '父组别不能是它的子组别',
|
'Can not change the parent to child' => '父组别不能是它的子组别',
|
||||||
|
'Can not change the parent to self' => '父组别不能是它的子组别',
|
||||||
'You can not delete group that contain child group and administrators' => '你不能删除含有子组和管理员的组',
|
'You can not delete group that contain child group and administrators' => '你不能删除含有子组和管理员的组',
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'Pid' => '父ID',
|
'Id' => 'ID',
|
||||||
'Type' => '栏目类型',
|
'Pid' => '父ID',
|
||||||
'Image' => '图片',
|
'Type' => '栏目类型',
|
||||||
'Keywords' => '关键字',
|
'Image' => '图片',
|
||||||
'Description' => '描述',
|
'Keywords' => '关键字',
|
||||||
'Diyname' => '自定义名称',
|
'Description' => '描述',
|
||||||
'Createtime' => '创建时间',
|
'Diyname' => '自定义名称',
|
||||||
'Updatetime' => '更新时间',
|
'Createtime' => '创建时间',
|
||||||
'Weigh' => '权重',
|
'Updatetime' => '更新时间',
|
||||||
'Status' => '状态'
|
'Weigh' => '权重',
|
||||||
|
'Status' => '状态'
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => '变量名称',
|
'name' => '变量名称',
|
||||||
'intro' => '描述',
|
'intro' => '描述',
|
||||||
'group' => '分组',
|
'group' => '分组',
|
||||||
'type' => '类型',
|
'type' => '类型',
|
||||||
'value' => '变量值'
|
'value' => '变量值'
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'Title' => '标题',
|
'Title' => '标题',
|
||||||
|
'Search menu' => '搜索菜单',
|
||||||
'Layout Options' => '布局设定',
|
'Layout Options' => '布局设定',
|
||||||
'Fixed Layout' => '固定布局',
|
'Fixed Layout' => '固定布局',
|
||||||
'You can\'t use fixed and boxed layouts together' => '盒子模型和固定布局不能同时启作用',
|
'You can\'t use fixed and boxed layouts together' => '盒子模型和固定布局不能同时启作用',
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
return [
|
return [
|
||||||
'id' => 'ID',
|
'id' => 'ID',
|
||||||
'category_id' => '分类ID',
|
'category_id' => '分类ID',
|
||||||
|
'category' => '分类',
|
||||||
'title' => '标题',
|
'title' => '标题',
|
||||||
'keywords' => '关键字',
|
'keywords' => '关键字',
|
||||||
'flag' => '标志',
|
'flag' => '标志',
|
||||||
|
|
|
||||||
|
|
@ -288,10 +288,12 @@ class Auth extends \fast\Auth
|
||||||
$select_id = $v['name'] == $activeUrl ? $v['id'] : $select_id;
|
$select_id = $v['name'] == $activeUrl ? $v['id'] : $select_id;
|
||||||
$v['url'] = $v['name'];
|
$v['url'] = $v['name'];
|
||||||
$v['badge'] = isset($badgeList[$v['name']]) ? $badgeList[$v['name']] : '';
|
$v['badge'] = isset($badgeList[$v['name']]) ? $badgeList[$v['name']] : '';
|
||||||
|
$v['py'] = \fast\Pinyin::get($v['title'], true);
|
||||||
|
$v['pinyin'] = \fast\Pinyin::get($v['title']);
|
||||||
}
|
}
|
||||||
// 构造菜单数据
|
// 构造菜单数据
|
||||||
Tree::instance()->init($ruleList);
|
Tree::instance()->init($ruleList);
|
||||||
$menu = Tree::instance()->getTreeMenu(0, '<li class="@class"><a href="@url" addtabs="@id" url="@url"><i class="@icon"></i> <span>@title</span> <span class="pull-right-container">@caret @badge</span></a> @childlist</li>', $select_id, '', 'ul', 'class="treeview-menu"');
|
$menu = Tree::instance()->getTreeMenu(0, '<li class="@class"><a href="@url" addtabs="@id" url="@url" py="@py" pinyin="@pinyin"><i class="@icon"></i> <span>@title</span> <span class="pull-right-container">@caret @badge</span></a> @childlist</li>', $select_id, '', 'ul', 'class="treeview-menu"');
|
||||||
return $menu;
|
return $menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,15 @@ trait Backend
|
||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
|
//设置过滤方法
|
||||||
|
$this->request->filter(['strip_tags', 'htmlspecialchars']);
|
||||||
if ($this->request->isAjax())
|
if ($this->request->isAjax())
|
||||||
{
|
{
|
||||||
|
//如果发送的来源是Selectpage,则转发到Selectpage
|
||||||
|
if ($this->request->request('pkey_name'))
|
||||||
|
{
|
||||||
|
return $this->selectpage();
|
||||||
|
}
|
||||||
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
||||||
$total = $this->model
|
$total = $this->model
|
||||||
->where($where)
|
->where($where)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,203 @@
|
||||||
|
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-category_id" data-rule="required" data-source="category/selectpage" data-params='{"custom[type]":""}' class="form-control selectpage" name="row[category_id]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-category_ids" class="control-label col-xs-12 col-sm-2">{:__('Category_ids')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-category_ids" data-rule="required" data-source="category/selectpage" data-params='{"custom[type]":""}' data-multiple="true" class="form-control selectpage" name="row[category_ids]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-user_id" data-rule="required" data-source="user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-user_ids" class="control-label col-xs-12 col-sm-2">{:__('User_ids')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-user_ids" data-rule="required" data-source="user/index" data-multiple="true" data-field="nickname" class="form-control selectpage" name="row[user_ids]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-week" class="control-label col-xs-12 col-sm-2">{:__('Week')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
<select id="c-week" data-rule="required" class="form-control selectpicker" name="row[week]">
|
||||||
|
{foreach name="weekList" item="vo"}
|
||||||
|
<option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-flag" class="control-label col-xs-12 col-sm-2">{:__('Flag')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
<select id="c-flag" data-rule="required" class="form-control selectpicker" multiple="" name="row[flag][]">
|
||||||
|
{foreach name="flagList" item="vo"}
|
||||||
|
<option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-genderdata" class="control-label col-xs-12 col-sm-2">{:__('Genderdata')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="genderdataList" item="vo"}
|
||||||
|
<label for="row[genderdata]-{$key}"><input id="row[genderdata]-{$key}" name="row[genderdata]" type="radio" value="{$key}" {in name="key" value="male"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-hobbydata" class="control-label col-xs-12 col-sm-2">{:__('Hobbydata')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="hobbydataList" item="vo"}
|
||||||
|
<label for="row[hobbydata][]-{$key}"><input id="row[hobbydata][]-{$key}" name="row[hobbydata][]" type="checkbox" value="{$key}" {in name="key" value=""}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-content" class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<textarea id="c-content" data-rule="required" class="form-control summernote" rows="5" name="row[content]" cols="50"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-image" class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<div class="form-inline">
|
||||||
|
<input id="c-image" data-rule="required" class="form-control" size="50" name="row[image]" type="text" value="">
|
||||||
|
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/*" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
<ul class="row list-inline plupload-preview" id="p-image"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-images" class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<div class="form-inline">
|
||||||
|
<input id="c-images" data-rule="required" class="form-control" size="50" name="row[images]" type="text" value="">
|
||||||
|
<span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/*" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
<ul class="row list-inline plupload-preview" id="p-images"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-attachfile" class="control-label col-xs-12 col-sm-2">{:__('Attachfile')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<div class="form-inline">
|
||||||
|
<input id="c-attachfile" data-rule="required" class="form-control" size="50" name="row[attachfile]" type="text" value="">
|
||||||
|
<span><button type="button" id="plupload-attachfile" class="btn btn-danger plupload" data-input-id="c-attachfile" data-multiple="false"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-attachfile" class="btn btn-primary fachoose" data-input-id="c-attachfile" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-keywords" class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-keywords" data-rule="required" class="form-control" name="row[keywords]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-description" class="control-label col-xs-12 col-sm-2">{:__('Description')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-description" data-rule="required" class="form-control" name="row[description]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-price" class="control-label col-xs-12 col-sm-2">{:__('Price')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-price" class="form-control" step="0.01" name="row[price]" type="number" value="0.00">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-views" class="control-label col-xs-12 col-sm-2">{:__('Views')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-views" class="form-control" name="row[views]" type="number" value="0">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-startdate" class="control-label col-xs-12 col-sm-2">{:__('Startdate')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-startdate" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[startdate]" type="text" value="{:date('Y-m-d')}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-activitytime" class="control-label col-xs-12 col-sm-2">{:__('Activitytime')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-activitytime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[activitytime]" type="text" value="{:date('Y-m-d H:i:s')}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-year" class="control-label col-xs-12 col-sm-2">{:__('Year')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-year" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY" data-use-current="true" name="row[year]" type="text" value="{:date('Y')}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-times" class="control-label col-xs-12 col-sm-2">{:__('Times')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-times" data-rule="required" class="form-control datetimepicker" data-date-format="HH:mm:ss" data-use-current="true" name="row[times]" type="text" value="{:date('H:i:s')}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-refreshtime" class="control-label col-xs-12 col-sm-2">{:__('Refreshtime')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-refreshtime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[refreshtime]" type="text" value="{:date('Y-m-d H:i:s')}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-weigh" class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="0">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="statusList" item="vo"}
|
||||||
|
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="normal"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-state" class="control-label col-xs-12 col-sm-2">{:__('State')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="stateList" item="vo"}
|
||||||
|
<label for="row[state]-{$key}"><input id="row[state]-{$key}" name="row[state]" type="radio" value="{$key}" {in name="key" value="1"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group layer-footer">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
|
||||||
|
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
<!-- Logo -->
|
<!-- Logo -->
|
||||||
<a href="javascript:;" class="logo">
|
<a href="javascript:;" class="logo">
|
||||||
<!-- 迷你模式下Logo的大小为50X50 -->
|
<!-- 迷你模式下Logo的大小为50X50 -->
|
||||||
<span class="logo-mini">{$site.name|mb_substr=0,4|strtoupper}</span>
|
<span class="logo-mini">{$site.name|mb_substr=0,4,'utf-8'|strtoupper}</span>
|
||||||
<!-- 普通模式下Logo -->
|
<!-- 普通模式下Logo -->
|
||||||
<span class="logo-lg"><b>{$site.name|mb_substr=0,4}</b>{$site.name|mb_substr=4}</span>
|
<span class="logo-lg"><b>{$site.name|mb_substr=0,4,'utf-8'}</b>{$site.name|mb_substr=4,null,'utf-8'}</span>
|
||||||
</a>
|
</a>
|
||||||
<!-- 顶部通栏样式 -->
|
<!-- 顶部通栏样式 -->
|
||||||
<nav class="navbar navbar-static-top">
|
<nav class="navbar navbar-static-top">
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,18 @@
|
||||||
<i class="fa fa-circle text-success"></i> {:__('Online')}
|
<i class="fa fa-circle text-success"></i> {:__('Online')}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- search form -->
|
<!-- search form -->
|
||||||
<form action="#" method="get" class="sidebar-form hidden-xs" style="overflow:visible;border:none;">
|
<form action="" method="get" class="sidebar-form" onsubmit="return false;">
|
||||||
<select class="form-control fastmenujump btn">
|
<div class="input-group">
|
||||||
<option value="">{:__('Shortcut')}</option>
|
<input type="text" name="q" class="form-control" placeholder="{:__('Search menu')}">
|
||||||
</select>
|
<span class="input-group-btn">
|
||||||
|
<button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i>
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
<div class="menuresult list-group sidebar-form hide">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<!-- /.search form -->
|
<!-- /.search form -->
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -295,8 +295,8 @@
|
||||||
<h5>文章统计</h5>
|
<h5>文章统计</h5>
|
||||||
</div>
|
</div>
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<h1 class="no-margins">1234</h1>
|
<h1 class="no-margins">1043</h1>
|
||||||
<div class="stat-percent font-bold text-gray"><i class="fa fa-modx"></i> 1234</div>
|
<div class="stat-percent font-bold text-gray"><i class="fa fa-modx"></i> 2592</div>
|
||||||
<small>总文章数</small>
|
<small>总文章数</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -318,8 +318,8 @@
|
||||||
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>总评论数</small></div>
|
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>总评论数</small></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h1 class="no-margins">1234</h1>
|
<h1 class="no-margins">6754</h1>
|
||||||
<div class="font-bold text-navy"><i class="fa fa-heart"></i> <small>总动态评论点赞数</small></div>
|
<div class="font-bold text-navy"><i class="fa fa-heart"></i> <small>总评论点赞数</small></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -337,11 +337,11 @@
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h1 class="no-margins">1234</h1>
|
<h1 class="no-margins">5302</h1>
|
||||||
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>总评论数</small></div>
|
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>总评论数</small></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h1 class="no-margins">1234</h1>
|
<h1 class="no-margins">8205</h1>
|
||||||
<div class="font-bold text-navy"><i class="fa fa-user"></i> <small>总参与人数</small></div>
|
<div class="font-bold text-navy"><i class="fa fa-user"></i> <small>总参与人数</small></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,203 @@
|
||||||
|
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-category_id" data-rule="required" data-source="category/selectpage" data-params='{"custom[type]":""}' class="form-control selectpage" name="row[category_id]" type="text" value="{$row.category_id}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-category_ids" class="control-label col-xs-12 col-sm-2">{:__('Category_ids')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-category_ids" data-rule="required" data-source="category/selectpage" data-params='{"custom[type]":""}' data-multiple="true" class="form-control selectpage" name="row[category_ids]" type="text" value="{$row.category_ids}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-user_id" data-rule="required" data-source="user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="{$row.user_id}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-user_ids" class="control-label col-xs-12 col-sm-2">{:__('User_ids')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-user_ids" data-rule="required" data-source="user/index" data-multiple="true" data-field="nickname" class="form-control selectpage" name="row[user_ids]" type="text" value="{$row.user_ids}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-week" class="control-label col-xs-12 col-sm-2">{:__('Week')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
<select id="c-week" data-rule="required" class="form-control selectpicker" name="row[week]">
|
||||||
|
{foreach name="weekList" item="vo"}
|
||||||
|
<option value="{$key}" {in name="key" value="$row.week"}selected{/in}>{$vo}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-flag" class="control-label col-xs-12 col-sm-2">{:__('Flag')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
<select id="c-flag" data-rule="required" class="form-control selectpicker" multiple="" name="row[flag][]">
|
||||||
|
{foreach name="flagList" item="vo"}
|
||||||
|
<option value="{$key}" {in name="key" value="$row.flag"}selected{/in}>{$vo}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-genderdata" class="control-label col-xs-12 col-sm-2">{:__('Genderdata')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="genderdataList" item="vo"}
|
||||||
|
<label for="row[genderdata]-{$key}"><input id="row[genderdata]-{$key}" name="row[genderdata]" type="radio" value="{$key}" {in name="key" value="$row.genderdata"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-hobbydata" class="control-label col-xs-12 col-sm-2">{:__('Hobbydata')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="hobbydataList" item="vo"}
|
||||||
|
<label for="row[hobbydata][]-{$key}"><input id="row[hobbydata][]-{$key}" name="row[hobbydata][]" type="checkbox" value="{$key}" {in name="key" value="$row.hobbydata"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text" value="{$row.title}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-content" class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<textarea id="c-content" data-rule="required" class="form-control summernote" rows="5" name="row[content]" cols="50">{$row.content}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-image" class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<div class="form-inline">
|
||||||
|
<input id="c-image" data-rule="required" class="form-control" size="50" name="row[image]" type="text" value="{$row.image}">
|
||||||
|
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/*" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
<ul class="row list-inline plupload-preview" id="p-image"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-images" class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<div class="form-inline">
|
||||||
|
<input id="c-images" data-rule="required" class="form-control" size="50" name="row[images]" type="text" value="{$row.images}">
|
||||||
|
<span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/*" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
<ul class="row list-inline plupload-preview" id="p-images"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-attachfile" class="control-label col-xs-12 col-sm-2">{:__('Attachfile')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<div class="form-inline">
|
||||||
|
<input id="c-attachfile" data-rule="required" class="form-control" size="50" name="row[attachfile]" type="text" value="{$row.attachfile}">
|
||||||
|
<span><button type="button" id="plupload-attachfile" class="btn btn-danger plupload" data-input-id="c-attachfile" data-multiple="false"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-attachfile" class="btn btn-primary fachoose" data-input-id="c-attachfile" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-keywords" class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-keywords" data-rule="required" class="form-control" name="row[keywords]" type="text" value="{$row.keywords}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-description" class="control-label col-xs-12 col-sm-2">{:__('Description')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-description" data-rule="required" class="form-control" name="row[description]" type="text" value="{$row.description}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-price" class="control-label col-xs-12 col-sm-2">{:__('Price')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-price" class="form-control" step="0.01" name="row[price]" type="number" value="{$row.price}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-views" class="control-label col-xs-12 col-sm-2">{:__('Views')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-views" class="form-control" name="row[views]" type="number" value="{$row.views}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-startdate" class="control-label col-xs-12 col-sm-2">{:__('Startdate')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-startdate" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[startdate]" type="text" value="{$row.startdate}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-activitytime" class="control-label col-xs-12 col-sm-2">{:__('Activitytime')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-activitytime" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[activitytime]" type="text" value="{$row.activitytime}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-year" class="control-label col-xs-12 col-sm-2">{:__('Year')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-year" data-rule="required" class="form-control datetimepicker" data-date-format="YYYY" data-use-current="true" name="row[year]" type="text" value="{$row.year}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-times" class="control-label col-xs-12 col-sm-2">{:__('Times')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-times" data-rule="required" class="form-control datetimepicker" data-date-format="HH:mm:ss" data-use-current="true" name="row[times]" type="text" value="{$row.times}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-refreshtime" class="control-label col-xs-12 col-sm-2">{:__('Refreshtime')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-refreshtime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[refreshtime]" type="text" value="{$row.refreshtime|datetime}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-weigh" class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="{$row.weigh}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="statusList" item="vo"}
|
||||||
|
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="$row.status"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="c-state" class="control-label col-xs-12 col-sm-2">{:__('State')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
{foreach name="stateList" item="vo"}
|
||||||
|
<label for="row[state]-{$key}"><input id="row[state]-{$key}" name="row[state]" type="radio" value="{$key}" {in name="key" value="$row.state"}checked{/in} /> {$vo}</label>
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group layer-footer">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
|
||||||
|
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
@ -126,7 +126,7 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>
|
<td>
|
||||||
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
|
<button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
|
||||||
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
||||||
</td>
|
</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
|
@ -205,7 +205,7 @@ key2|value2</textarea>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
<div class="col-xs-12 col-sm-4">
|
<div class="col-xs-12 col-sm-4">
|
||||||
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
|
<button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
|
||||||
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
<div class="panel panel-default panel-intro">
|
||||||
|
{:build_heading()}
|
||||||
|
|
||||||
|
<div class="panel-body">
|
||||||
|
<div id="myTabContent" class="tab-content">
|
||||||
|
<div class="tab-pane fade active in" id="one">
|
||||||
|
<div class="widget-body no-padding">
|
||||||
|
<div id="toolbar" class="toolbar">
|
||||||
|
{:build_toolbar()}
|
||||||
|
<div class="dropdown btn-group">
|
||||||
|
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
|
||||||
|
<ul class="dropdown-menu text-left" role="menu">
|
||||||
|
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
|
||||||
|
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table id="table" class="table table-striped table-bordered table-hover" width="100%">
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
<form id="add-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
|
<form id="add-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
|
<label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-category_id" class="form-control selectpage" data-db-table="category" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="" data-rule="required">
|
<input id="c-category_id" class="form-control selectpage" data-source="category/selectpage" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="" data-rule="required">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
<form id="edit-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
|
<form id="edit-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
|
<label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<input id="c-category_id" class="form-control selectpage" data-db-table="category" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="{$row.category_id}" data-rule="required">
|
<input id="c-category_id" class="form-control selectpage" data-source="category/selectpage" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="{$row.category_id}" data-rule="required">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use app\common\model\Configvalue;
|
|
||||||
use think\Lang;
|
use think\Lang;
|
||||||
|
|
||||||
// 公共助手函数
|
// 公共助手函数
|
||||||
|
|
@ -65,19 +64,3 @@ if (!function_exists('datetime'))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!function_exists('configvalue'))
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取后台动态定义的配置
|
|
||||||
* @param string $id ID
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
function configvalue($id)
|
|
||||||
{
|
|
||||||
$data = Configvalue::get($id);
|
|
||||||
return $data ? $data->content : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
namespace app\common\controller;
|
namespace app\common\controller;
|
||||||
|
|
||||||
use app\admin\library\Auth;
|
use app\admin\library\Auth;
|
||||||
use app\common\model\Configvalue;
|
|
||||||
use think\Config;
|
use think\Config;
|
||||||
use think\Controller;
|
use think\Controller;
|
||||||
use think\Lang;
|
use think\Lang;
|
||||||
|
|
@ -78,7 +77,7 @@ class Backend extends Controller
|
||||||
* 是否开启模型场景验证
|
* 是否开启模型场景验证
|
||||||
*/
|
*/
|
||||||
protected $modelSceneValidate = false;
|
protected $modelSceneValidate = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multi方法可批量修改的字段
|
* Multi方法可批量修改的字段
|
||||||
*/
|
*/
|
||||||
|
|
@ -160,7 +159,7 @@ class Backend extends Controller
|
||||||
// 配置信息
|
// 配置信息
|
||||||
$config = [
|
$config = [
|
||||||
'site' => array_intersect_key($site, array_flip(['name', 'cdnurl', 'version', 'timezone', 'languages'])),
|
'site' => array_intersect_key($site, array_flip(['name', 'cdnurl', 'version', 'timezone', 'languages'])),
|
||||||
'upload' => Configvalue::upload(),
|
'upload' => \app\common\model\Config::upload(),
|
||||||
'modulename' => $modulename,
|
'modulename' => $modulename,
|
||||||
'controllername' => $controllername,
|
'controllername' => $controllername,
|
||||||
'actionname' => $actionname,
|
'actionname' => $actionname,
|
||||||
|
|
@ -177,7 +176,7 @@ class Backend extends Controller
|
||||||
|
|
||||||
$this->assign('admin', Session::get('admin'));
|
$this->assign('admin', Session::get('admin'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载语言文件
|
* 加载语言文件
|
||||||
* @param string $name
|
* @param string $name
|
||||||
|
|
@ -290,6 +289,85 @@ class Backend extends Controller
|
||||||
return [$where, $sort, $order, $offset, $limit];
|
return [$where, $sort, $order, $offset, $limit];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selectpage的实现方法
|
||||||
|
*
|
||||||
|
* 当前方法只是一个比较通用的搜索匹配,请按需重载此方法来编写自己的搜索逻辑,$where按自己的需求写即可
|
||||||
|
* 这里示例了所有的参数,所以比较复杂,实现上自己实现只需简单的几行即可
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected function selectpage()
|
||||||
|
{
|
||||||
|
//设置过滤方法
|
||||||
|
$this->request->filter(['strip_tags', 'htmlspecialchars']);
|
||||||
|
|
||||||
|
//搜索关键词,客户端输入以空格分开,这里接收为数组
|
||||||
|
$word = (array) $this->request->request("q_word/a");
|
||||||
|
//当前页
|
||||||
|
$page = $this->request->request("page");
|
||||||
|
//分页大小
|
||||||
|
$pagesize = $this->request->request("page_size");
|
||||||
|
//搜索条件
|
||||||
|
$andor = $this->request->request("and_or");
|
||||||
|
//排序方式
|
||||||
|
$orderby = (array) $this->request->request("order_by/a");
|
||||||
|
//显示的字段
|
||||||
|
$field = $this->request->request("field");
|
||||||
|
//主键
|
||||||
|
$primarykey = $this->request->request("pkey_name");
|
||||||
|
//主键值
|
||||||
|
$primaryvalue = $this->request->request("pkey_value");
|
||||||
|
//搜索字段
|
||||||
|
$searchfield = (array) $this->request->request("search_field/a");
|
||||||
|
//自定义搜索条件
|
||||||
|
$custom = (array) $this->request->request("custom/a");
|
||||||
|
$order = [];
|
||||||
|
foreach ($orderby as $k => $v)
|
||||||
|
{
|
||||||
|
$order[$v[0]] = $v[1];
|
||||||
|
}
|
||||||
|
$field = $field ? $field : 'name';
|
||||||
|
|
||||||
|
//如果有primaryvalue,说明当前是初始化传值
|
||||||
|
if ($primaryvalue)
|
||||||
|
{
|
||||||
|
$where = [$primarykey => ['in', $primaryvalue]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$where = function($query) use($word, $andor, $field, $searchfield, $custom) {
|
||||||
|
foreach ($word as $k => $v)
|
||||||
|
{
|
||||||
|
foreach ($searchfield as $m => $n)
|
||||||
|
{
|
||||||
|
$query->where($n, "like", "%{$v}%", $andor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($custom && is_array($custom))
|
||||||
|
{
|
||||||
|
foreach ($custom as $k => $v)
|
||||||
|
{
|
||||||
|
$query->where($k, '=', $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
$list = [];
|
||||||
|
$total = $this->model->where($where)->count();
|
||||||
|
if ($total > 0)
|
||||||
|
{
|
||||||
|
$list = $this->model->where($where)
|
||||||
|
->order($order)
|
||||||
|
->page($page, $pagesize)
|
||||||
|
->field("{$primarykey},{$field}")
|
||||||
|
->field("password,salt", true)
|
||||||
|
->select();
|
||||||
|
}
|
||||||
|
|
||||||
|
//这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮
|
||||||
|
return json(['list' => $list, 'total' => $total]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 析构方法
|
* 析构方法
|
||||||
*
|
*
|
||||||
|
|
@ -299,7 +377,13 @@ class Backend extends Controller
|
||||||
//判断是否设置code值,如果有则变动response对象的正文
|
//判断是否设置code值,如果有则变动response对象的正文
|
||||||
if (!is_null($this->code))
|
if (!is_null($this->code))
|
||||||
{
|
{
|
||||||
$this->result($this->data, $this->code, $this->msg, 'json');
|
$result = [
|
||||||
|
'code' => $this->code,
|
||||||
|
'msg' => $this->msg,
|
||||||
|
'time' => $_SERVER['REQUEST_TIME'],
|
||||||
|
'data' => $this->data,
|
||||||
|
];
|
||||||
|
echo json_encode($result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
namespace app\common\controller;
|
namespace app\common\controller;
|
||||||
|
|
||||||
use app\common\library\Auth;
|
use app\common\library\Auth;
|
||||||
use app\common\model\Configvalue;
|
|
||||||
use think\Config;
|
use think\Config;
|
||||||
use think\Controller;
|
use think\Controller;
|
||||||
use think\Lang;
|
use think\Lang;
|
||||||
|
|
@ -50,6 +49,8 @@ class Frontend extends Controller
|
||||||
|
|
||||||
public function _initialize()
|
public function _initialize()
|
||||||
{
|
{
|
||||||
|
//移除HTML标签
|
||||||
|
$this->request->filter('strip_tags');
|
||||||
$modulename = $this->request->module();
|
$modulename = $this->request->module();
|
||||||
$controllername = strtolower($this->request->controller());
|
$controllername = strtolower($this->request->controller());
|
||||||
$actionname = strtolower($this->request->action());
|
$actionname = strtolower($this->request->action());
|
||||||
|
|
@ -67,13 +68,7 @@ class Frontend extends Controller
|
||||||
// 检测是否需要验证登录
|
// 检测是否需要验证登录
|
||||||
if (!$this->user->match($this->noNeedLogin))
|
if (!$this->user->match($this->noNeedLogin))
|
||||||
{
|
{
|
||||||
//检测是否登录
|
$this->checkLogin();
|
||||||
if (!$this->user->isLogin())
|
|
||||||
{
|
|
||||||
$url = Session::get('referer');
|
|
||||||
$url = $url ? $url : $this->request->url();
|
|
||||||
$this->error(__('Please login first'), url('/user/login', ['url' => $url]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将auth对象渲染至视图
|
// 将auth对象渲染至视图
|
||||||
|
|
@ -92,12 +87,12 @@ class Frontend extends Controller
|
||||||
// 配置信息
|
// 配置信息
|
||||||
$config = [
|
$config = [
|
||||||
'site' => array_intersect_key($site, array_flip(['name', 'cdnurl', 'version', 'timezone', 'languages'])),
|
'site' => array_intersect_key($site, array_flip(['name', 'cdnurl', 'version', 'timezone', 'languages'])),
|
||||||
'upload' => Configvalue::upload(),
|
'upload' => \app\common\model\Config::upload(),
|
||||||
'modulename' => $modulename,
|
'modulename' => $modulename,
|
||||||
'controllername' => $controllername,
|
'controllername' => $controllername,
|
||||||
'actionname' => $actionname,
|
'actionname' => $actionname,
|
||||||
'jsname' => 'frontend/' . str_replace('.', '/', $controllername),
|
'jsname' => 'frontend/' . str_replace('.', '/', $controllername),
|
||||||
'moduleurl' => url("/{$modulename}", '', false),
|
'moduleurl' => rtrim(url("/{$modulename}", '', false), '/'),
|
||||||
'language' => $lang
|
'language' => $lang
|
||||||
];
|
];
|
||||||
$this->loadlang($controllername);
|
$this->loadlang($controllername);
|
||||||
|
|
@ -105,6 +100,17 @@ class Frontend extends Controller
|
||||||
$this->assign('config', $config);
|
$this->assign('config', $config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function checkLogin()
|
||||||
|
{
|
||||||
|
//检测是否登录
|
||||||
|
if (!$this->user->isLogin())
|
||||||
|
{
|
||||||
|
$url = Session::get('referer');
|
||||||
|
$url = $url ? $url : $this->request->url();
|
||||||
|
$this->error(__('Please login first'), url('/user/login', ['url' => $url]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载语言文件
|
* 加载语言文件
|
||||||
* @param string $name
|
* @param string $name
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ abstract class Uc extends Controller
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$timestamp = time();
|
$timestamp = time();
|
||||||
if ($timestamp - $get['time'] > 36001111)
|
if ($timestamp - $get['time'] > 3600)
|
||||||
{
|
{
|
||||||
$this->error = '请求有效期已过';
|
$this->error = '请求有效期已过';
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\common\model;
|
||||||
|
|
||||||
|
use think\Model;
|
||||||
|
|
||||||
|
class Config extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
// 表名,不含前缀
|
||||||
|
protected $name = 'config';
|
||||||
|
// 自动写入时间戳字段
|
||||||
|
protected $autoWriteTimestamp = false;
|
||||||
|
// 定义时间戳字段名
|
||||||
|
protected $createTime = false;
|
||||||
|
protected $updateTime = false;
|
||||||
|
// 追加属性
|
||||||
|
protected $append = [
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取配置类型
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getTypeList()
|
||||||
|
{
|
||||||
|
$typeList = [
|
||||||
|
'string' => __('String'),
|
||||||
|
'text' => __('Text'),
|
||||||
|
'number' => __('Number'),
|
||||||
|
'datetime' => __('Datetime'),
|
||||||
|
'select' => __('Select'),
|
||||||
|
'selects' => __('Selects'),
|
||||||
|
'image' => __('Image'),
|
||||||
|
'images' => __('Images'),
|
||||||
|
'file' => __('File'),
|
||||||
|
'files' => __('Files'),
|
||||||
|
'checkbox' => __('Checkbox'),
|
||||||
|
'radio' => __('Radio'),
|
||||||
|
'array' => __('Array'),
|
||||||
|
];
|
||||||
|
return $typeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取分类分组列表
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function getGroupList()
|
||||||
|
{
|
||||||
|
$groupList = config('site.configgroup');
|
||||||
|
return $groupList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载上传配置
|
||||||
|
*
|
||||||
|
* @param array $params 扩展参数,常用字段savekey,mimetype,maxsize,ext-param,notify-url,return-url<br>
|
||||||
|
* 更多字段可参考http://docs.upyun.com/api/form_api/#_2
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function upload($params = [])
|
||||||
|
{
|
||||||
|
$uploadcfg = config('upload');
|
||||||
|
$uploadcfg = $uploadcfg ? $uploadcfg : [];
|
||||||
|
$uploadcfg = array_merge($uploadcfg, $params);
|
||||||
|
$uploadcfg['bucket'] = isset($uploadcfg['bucket']) ? $uploadcfg['bucket'] : '';
|
||||||
|
$multiple = isset($uploadcfg['multiple']) ? $uploadcfg['multiple'] : false;
|
||||||
|
$savekey = isset($uploadcfg['savekey']) ? $uploadcfg['savekey'] : '';
|
||||||
|
$uploadcfg['save-key'] = isset($uploadcfg['save-key']) ? $uploadcfg['save-key'] : $savekey;
|
||||||
|
$expiration = time() + (isset($uploadcfg['expire']) ? $uploadcfg['expire'] : 600);
|
||||||
|
$uploadcfg['expiration'] = isset($uploadcfg['expiration']) ? $uploadcfg['expiration'] : $expiration;
|
||||||
|
$notifyurl = isset($uploadcfg['notifyurl']) ? $uploadcfg['notifyurl'] : '';
|
||||||
|
$returnurl = isset($uploadcfg['returnurl']) ? $uploadcfg['returnurl'] : '';
|
||||||
|
if ($notifyurl)
|
||||||
|
$uploadcfg['notify-url'] = $notifyurl;
|
||||||
|
else
|
||||||
|
unset($uploadcfg['notify-url']);
|
||||||
|
if ($returnurl)
|
||||||
|
$uploadcfg['return-url'] = $returnurl;
|
||||||
|
else
|
||||||
|
unset($uploadcfg['return-url']);
|
||||||
|
|
||||||
|
//设置允许的附加字段
|
||||||
|
$allowfields = [
|
||||||
|
'bucket', 'save-key', 'expiration', 'date', 'content-md5', 'notify-url', 'return-url', 'content-secret', 'content-type', 'allow-file-type', 'content-length-range',
|
||||||
|
'image-width-range', 'image-height-range', 'x-gmkerl-thumb', 'x-gmkerl-type', 'apps', 'b64encoded', 'ext-param'
|
||||||
|
];
|
||||||
|
$params = array_intersect_key($uploadcfg, array_flip($allowfields));
|
||||||
|
$policy = base64_encode(json_encode($params));
|
||||||
|
$signature = md5($policy . '&' . (isset($uploadcfg['formkey']) ? $uploadcfg['formkey'] : ''));
|
||||||
|
$multipart = [
|
||||||
|
'policy' => $policy,
|
||||||
|
'signature' => $signature,
|
||||||
|
];
|
||||||
|
|
||||||
|
$multipart = array_merge($multipart, $params);
|
||||||
|
return [
|
||||||
|
'cdnurl' => isset($uploadcfg['cdnurl']) ? $uploadcfg['cdnurl'] : '',
|
||||||
|
'uploadurl' => isset($uploadcfg['uploadurl']) ? $uploadcfg['uploadurl'] : url('ajax/upload'),
|
||||||
|
'bucket' => $uploadcfg['bucket'],
|
||||||
|
'maxsize' => isset($uploadcfg['maxsize']) ? $uploadcfg['maxsize'] : '',
|
||||||
|
'mimetype' => isset($uploadcfg['mimetype']) ? $uploadcfg['mimetype'] : '',
|
||||||
|
'multipart' => $multipart,
|
||||||
|
'multiple' => $multiple,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -13,4 +13,8 @@ class Page extends Model
|
||||||
protected $createTime = 'createtime';
|
protected $createTime = 'createtime';
|
||||||
protected $updateTime = 'updatetime';
|
protected $updateTime = 'updatetime';
|
||||||
|
|
||||||
|
public function category()
|
||||||
|
{
|
||||||
|
return $this->belongsTo('Category', 'category_id')->setEagerlyType(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ class Ajax extends Frontend
|
||||||
*/
|
*/
|
||||||
public function upload()
|
public function upload()
|
||||||
{
|
{
|
||||||
|
$this->checkLogin();
|
||||||
$this->code = -1;
|
$this->code = -1;
|
||||||
$file = $this->request->file('file');
|
$file = $this->request->file('file');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,168 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\index\controller;
|
||||||
|
|
||||||
|
use app\common\controller\Frontend;
|
||||||
|
use app\common\library\Email;
|
||||||
|
use app\common\library\Sms as Smslib;
|
||||||
|
use app\common\model\User;
|
||||||
|
use think\Session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信控制器
|
||||||
|
*/
|
||||||
|
class Sms extends Frontend
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送验证码
|
||||||
|
*
|
||||||
|
* 必选参数:mobile,type<br>
|
||||||
|
* 可选参数:无
|
||||||
|
*/
|
||||||
|
public function send()
|
||||||
|
{
|
||||||
|
$this->code = -1;
|
||||||
|
$mobile = $this->request->post("mobile");
|
||||||
|
$type = $this->request->post("type");
|
||||||
|
$type = $type ? $type : 'register';
|
||||||
|
|
||||||
|
$last = Smslib::get($mobile, $type);
|
||||||
|
if ($last && time() - $last['createtime'] < 60)
|
||||||
|
{
|
||||||
|
//发送频繁
|
||||||
|
$this->msg = __('SMS sent frequently');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($type)
|
||||||
|
{
|
||||||
|
$userinfo = User::getByMobile($mobile);
|
||||||
|
if ($type == 'register' && $userinfo)
|
||||||
|
{
|
||||||
|
//注册账号
|
||||||
|
$this->msg = __('The phone number already exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ($type == 'changepwd' && !$userinfo)
|
||||||
|
{
|
||||||
|
//修改密码
|
||||||
|
$this->msg = __('The phone number not exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (in_array($type, ['changemobile', 'bindmobile']) && $userinfo)
|
||||||
|
{
|
||||||
|
//修改手机号
|
||||||
|
$this->msg = __('The phone number already exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$ret = Smslib::send($mobile, '', $type);
|
||||||
|
if ($ret)
|
||||||
|
{
|
||||||
|
$this->code = 1;
|
||||||
|
$this->msg = "发送成功";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->msg = __('Send failed, please try again later');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测验证码
|
||||||
|
*
|
||||||
|
* 必选参数:mobile,type,captchacode<br>
|
||||||
|
* 可选参数:无
|
||||||
|
*/
|
||||||
|
public function check()
|
||||||
|
{
|
||||||
|
$this->code = -1;
|
||||||
|
$mobile = $this->request->post("mobile");
|
||||||
|
$type = $this->request->post("type");
|
||||||
|
$type = $type ? $type : 'register';
|
||||||
|
$captchacode = $this->request->post("captchacode");
|
||||||
|
|
||||||
|
if ($type)
|
||||||
|
{
|
||||||
|
$userinfo = User::getByMobile($mobile);
|
||||||
|
if ($type == 'register' && $userinfo)
|
||||||
|
{
|
||||||
|
//注册账号
|
||||||
|
$this->msg = __('The phone number already exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if ($type == 'changepwd' && !$userinfo)
|
||||||
|
{
|
||||||
|
//修改密码
|
||||||
|
$this->msg = __('The phone number note exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (in_array($type, ['changemobile', 'bindmobile']) && $userinfo)
|
||||||
|
{
|
||||||
|
//修改手机号
|
||||||
|
$this->msg = __('The phone number already exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$ret = Smslib::check($mobile, $captchacode, $type);
|
||||||
|
if ($ret)
|
||||||
|
{
|
||||||
|
$this->code = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->msg = __('The captcha code not correct');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendemail()
|
||||||
|
{
|
||||||
|
$this->code = -1;
|
||||||
|
$email = $this->request->post("email");
|
||||||
|
$type = $this->request->post("type");
|
||||||
|
$type = $type ? $type : 'register';
|
||||||
|
|
||||||
|
$name = "email{$type}";
|
||||||
|
$session = session($name);
|
||||||
|
|
||||||
|
if (!$session)
|
||||||
|
{
|
||||||
|
if (time() - $session['time'] < 120)
|
||||||
|
{
|
||||||
|
$this->msg = "发送邮箱验证码过于频繁";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Smslib::sendemail($email, '', $type))
|
||||||
|
{
|
||||||
|
$this->code = 1;
|
||||||
|
$this->msg = "发送成功";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->msg = "发送邮件失败!请稍后重试!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function checkemail()
|
||||||
|
{
|
||||||
|
$this->code = -1;
|
||||||
|
$email = $this->request->post("email");
|
||||||
|
$type = $this->request->post("type");
|
||||||
|
$type = $type ? $type : 'register';
|
||||||
|
|
||||||
|
$ret = Smslib::checkemail($email, $captchacode, $type);
|
||||||
|
if ($ret)
|
||||||
|
{
|
||||||
|
$this->code = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->msg = __('The captcha code not correct');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -40,7 +40,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 删除用户
|
* 删除用户
|
||||||
*/
|
*/
|
||||||
function deleteuser()
|
protected function deleteuser()
|
||||||
{
|
{
|
||||||
$uids = $this->get['ids'];
|
$uids = $this->get['ids'];
|
||||||
$uids = is_array($uids) ? $uids : explode(',', $uids);
|
$uids = is_array($uids) ? $uids : explode(',', $uids);
|
||||||
|
|
@ -54,7 +54,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 获取标签
|
* 获取标签
|
||||||
*/
|
*/
|
||||||
function gettag()
|
protected function gettag()
|
||||||
{
|
{
|
||||||
$name = $this->get['id'];
|
$name = $this->get['id'];
|
||||||
if (!API_GETTAG)
|
if (!API_GETTAG)
|
||||||
|
|
@ -82,7 +82,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 同步注册
|
* 同步注册
|
||||||
*/
|
*/
|
||||||
function synregister()
|
protected function synregister()
|
||||||
{
|
{
|
||||||
$uid = $this->get['uid'];
|
$uid = $this->get['uid'];
|
||||||
$username = $this->get['username'];
|
$username = $this->get['username'];
|
||||||
|
|
@ -102,7 +102,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 同步登录
|
* 同步登录
|
||||||
*/
|
*/
|
||||||
function synlogin()
|
protected function synlogin()
|
||||||
{
|
{
|
||||||
$uid = $this->get['uid'];
|
$uid = $this->get['uid'];
|
||||||
$username = $this->get['username'];
|
$username = $this->get['username'];
|
||||||
|
|
@ -119,7 +119,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 同步退出
|
* 同步退出
|
||||||
*/
|
*/
|
||||||
function synlogout()
|
protected function synlogout()
|
||||||
{
|
{
|
||||||
if (!API_SYNLOGOUT)
|
if (!API_SYNLOGOUT)
|
||||||
{
|
{
|
||||||
|
|
@ -135,7 +135,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 添加用户
|
* 添加用户
|
||||||
*/
|
*/
|
||||||
function adduser()
|
protected function adduser()
|
||||||
{
|
{
|
||||||
$uid = $this->get['uid'];
|
$uid = $this->get['uid'];
|
||||||
$username = $this->get['username'];
|
$username = $this->get['username'];
|
||||||
|
|
@ -167,7 +167,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新用户信息,包含用户名,密码,邮箱,手机号和其它扩展信息
|
* 更新用户信息,包含用户名,密码,邮箱,手机号和其它扩展信息
|
||||||
*/
|
*/
|
||||||
function updateinfo()
|
protected function updateinfo()
|
||||||
{
|
{
|
||||||
if (!API_UPDATEINFO)
|
if (!API_UPDATEINFO)
|
||||||
{
|
{
|
||||||
|
|
@ -211,7 +211,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新禁言文字
|
* 更新禁言文字
|
||||||
*/
|
*/
|
||||||
function updatebadwords()
|
protected function updatebadwords()
|
||||||
{
|
{
|
||||||
if (!API_UPDATEBADWORDS)
|
if (!API_UPDATEBADWORDS)
|
||||||
{
|
{
|
||||||
|
|
@ -238,7 +238,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新HOSTS
|
* 更新HOSTS
|
||||||
*/
|
*/
|
||||||
function updatehosts()
|
protected function updatehosts()
|
||||||
{
|
{
|
||||||
if (!API_UPDATEHOSTS)
|
if (!API_UPDATEHOSTS)
|
||||||
{
|
{
|
||||||
|
|
@ -256,7 +256,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新App信息
|
* 更新App信息
|
||||||
*/
|
*/
|
||||||
function updateapps()
|
protected function updateapps()
|
||||||
{
|
{
|
||||||
if (!API_UPDATEAPPS)
|
if (!API_UPDATEAPPS)
|
||||||
{
|
{
|
||||||
|
|
@ -291,7 +291,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新客户端配置文件
|
* 更新客户端配置文件
|
||||||
*/
|
*/
|
||||||
function updateclient()
|
protected function updateclient()
|
||||||
{
|
{
|
||||||
if (!API_UPDATECLIENT)
|
if (!API_UPDATECLIENT)
|
||||||
{
|
{
|
||||||
|
|
@ -309,7 +309,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新积分
|
* 更新积分
|
||||||
*/
|
*/
|
||||||
function updatecredit()
|
protected function updatecredit()
|
||||||
{
|
{
|
||||||
if (!API_UPDATECREDIT)
|
if (!API_UPDATECREDIT)
|
||||||
{
|
{
|
||||||
|
|
@ -324,7 +324,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 获取积分
|
* 获取积分
|
||||||
*/
|
*/
|
||||||
function getcredit()
|
protected function getcredit()
|
||||||
{
|
{
|
||||||
if (!API_GETCREDIT)
|
if (!API_GETCREDIT)
|
||||||
{
|
{
|
||||||
|
|
@ -335,7 +335,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 获取积分配置
|
* 获取积分配置
|
||||||
*/
|
*/
|
||||||
function getcreditsettings()
|
protected function getcreditsettings()
|
||||||
{
|
{
|
||||||
if (!API_GETCREDITSETTINGS)
|
if (!API_GETCREDITSETTINGS)
|
||||||
{
|
{
|
||||||
|
|
@ -351,7 +351,7 @@ class Ucenter extends Uc
|
||||||
/**
|
/**
|
||||||
* 更新积分配置
|
* 更新积分配置
|
||||||
*/
|
*/
|
||||||
function updatecreditsettings()
|
protected function updatecreditsettings()
|
||||||
{
|
{
|
||||||
if (!API_UPDATECREDITSETTINGS)
|
if (!API_UPDATECREDITSETTINGS)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'SMS sent frequently' => '短信发送频繁',
|
||||||
|
'The phone number already exists' => '手机号已经存在',
|
||||||
|
'The phone number note exists' => '手机号不存在',
|
||||||
|
'The captcha code not correct' => '验证码不正确',
|
||||||
|
'Send failed, please try again later' => '发送失败,请稍后重试',
|
||||||
|
];
|
||||||
|
|
@ -10,6 +10,10 @@
|
||||||
// | Author: liu21st <liu21st@gmail.com>
|
// | Author: liu21st <liu21st@gmail.com>
|
||||||
// +----------------------------------------------------------------------
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
|
//如果有定义绑定后台模块则禁用路由规则
|
||||||
|
if (defined('BIND_MODULE') && BIND_MODULE == 'admin')
|
||||||
|
return [];
|
||||||
|
|
||||||
return [
|
return [
|
||||||
//别名配置,别名只能是映射到控制器且访问时必须加上请求的方法
|
//别名配置,别名只能是映射到控制器且访问时必须加上请求的方法
|
||||||
// '__alias__' => [
|
// '__alias__' => [
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,12 @@ class Pinyin
|
||||||
/**
|
/**
|
||||||
* 获取文字的拼音
|
* 获取文字的拼音
|
||||||
* @param string $chinese 中文汉字
|
* @param string $chinese 中文汉字
|
||||||
* @param boolean $ucfirst 是否首字母大写
|
* @param boolean $onlyfirst 是否只返回拼音首字母
|
||||||
|
* @param string $delimiter 分隔符
|
||||||
* @param string $charset 文字编码
|
* @param string $charset 文字编码
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function get($chinese, $ucfirst = false, $charset = 'utf-8')
|
public static function get($chinese, $onlyfirst = false, $delimiter = '', $ucfirst = false, $charset = 'utf-8')
|
||||||
{
|
{
|
||||||
$keys_a = explode('|', self::$keys);
|
$keys_a = explode('|', self::$keys);
|
||||||
$values_a = explode('|', self::$values);
|
$values_a = explode('|', self::$values);
|
||||||
|
|
@ -36,7 +37,12 @@ class Pinyin
|
||||||
$_Q = ord(substr($chinese, ++$i, 1));
|
$_Q = ord(substr($chinese, ++$i, 1));
|
||||||
$_P = $_P * 256 + $_Q - 65536;
|
$_P = $_P * 256 + $_Q - 65536;
|
||||||
}
|
}
|
||||||
$result .= ($ucfirst ? ucfirst(self::_pinyin($_P, $data)) : self::_pinyin($_P, $data));
|
$result .= ($onlyfirst ? substr(self::_pinyin($_P, $data), 0, 1) : self::_pinyin($_P, $data));
|
||||||
|
$result .= $delimiter;
|
||||||
|
}
|
||||||
|
if ($delimiter)
|
||||||
|
{
|
||||||
|
$result = rtrim($result, $delimiter);
|
||||||
}
|
}
|
||||||
|
|
||||||
return preg_replace("/[^a-z0-9_\-]*/i", '', $result);
|
return preg_replace("/[^a-z0-9_\-]*/i", '', $result);
|
||||||
|
|
|
||||||
|
|
@ -50,12 +50,6 @@ body.is-dialog {
|
||||||
/*width: 70%;*/
|
/*width: 70%;*/
|
||||||
max-width: 885px;
|
max-width: 885px;
|
||||||
}
|
}
|
||||||
.form-group .bootstrap-tagsinput {
|
|
||||||
display: inherit;
|
|
||||||
}
|
|
||||||
.form-group .bootstrap-tagsinput span.twitter-typeahead {
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
.content {
|
.content {
|
||||||
min-height: 500px;
|
min-height: 500px;
|
||||||
}
|
}
|
||||||
|
|
@ -135,6 +129,11 @@ table.table-template {
|
||||||
margin-bottom: -5px;
|
margin-bottom: -5px;
|
||||||
padding: 10px 20px;
|
padding: 10px 20px;
|
||||||
}
|
}
|
||||||
|
.img-center {
|
||||||
|
margin: 0 auto;
|
||||||
|
display: inline;
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* RIBBON
|
* RIBBON
|
||||||
*/
|
*/
|
||||||
|
|
@ -331,6 +330,37 @@ table.table-template {
|
||||||
.nav-addtabs li:hover > .close-tab {
|
.nav-addtabs li:hover > .close-tab {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
.main-sidebar .sidebar-form {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
.main-sidebar .sidebar-form .menuresult {
|
||||||
|
z-index: 999;
|
||||||
|
position: absolute;
|
||||||
|
top: 34px;
|
||||||
|
left: -1px;
|
||||||
|
width: 100%;
|
||||||
|
max-height: 250px;
|
||||||
|
overflow: auto;
|
||||||
|
margin: 0;
|
||||||
|
border-top: none;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
}
|
||||||
|
.main-sidebar .sidebar-form .menuresult a {
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
background-color: #fff;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
display: block;
|
||||||
|
padding: 10px 15px;
|
||||||
|
color: #222d32;
|
||||||
|
}
|
||||||
|
.main-sidebar .sidebar-form .menuresult a:hover {
|
||||||
|
background: #eee;
|
||||||
|
}
|
||||||
|
.input-group .sp_result_area {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
.sidebar-menu.show-submenu .treeview-menu {
|
.sidebar-menu.show-submenu .treeview-menu {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=mixins.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=alerts.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=background-variant.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=border-radius.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=buttons.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=center-block.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=clearfix.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=forms.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=gradients.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=grid-framework.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=grid.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=hide-text.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=image.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=labels.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=list-group.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=nav-divider.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=nav-vertical-align.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=opacity.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=pagination.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=panels.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=progress-bar.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=reset-filter.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=reset-text.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=resize.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=responsive-visibility.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=size.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=tab-focus.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=table-row.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=text-emphasis.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=text-overflow.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=vendor-prefixes.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=variables.css.map */
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,49 +0,0 @@
|
||||||
.media {
|
|
||||||
margin-top: 15px;
|
|
||||||
}
|
|
||||||
.media:first-child {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
.media,
|
|
||||||
.media-body {
|
|
||||||
zoom: 1;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.media-body {
|
|
||||||
width: 10000px;
|
|
||||||
}
|
|
||||||
.media-object {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.media-object.img-thumbnail {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
.media-right,
|
|
||||||
.media > .pull-right {
|
|
||||||
padding-left: 10px;
|
|
||||||
}
|
|
||||||
.media-left,
|
|
||||||
.media > .pull-left {
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
.media-left,
|
|
||||||
.media-right,
|
|
||||||
.media-body {
|
|
||||||
display: table-cell;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.media-middle {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.media-bottom {
|
|
||||||
vertical-align: bottom;
|
|
||||||
}
|
|
||||||
.media-heading {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
.media-list {
|
|
||||||
padding-left: 0;
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
/*# sourceMappingURL=media.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=mixins.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=alerts.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=background-variant.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=border-radius.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=buttons.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=center-block.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=clearfix.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=forms.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=gradients.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=grid-framework.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=grid.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=hide-text.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=image.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=labels.css.map */
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/*# sourceMappingURL=list-group.css.map */
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue