2024-11-04 10:49:10 +08:00
< ? php
namespace app\admin\controller\general ;
use app\common\controller\Backend ;
use app\common\library\Email ;
use app\common\model\Config as ConfigModel ;
use think\Cache ;
use think\Db ;
use think\Exception ;
use think\Validate ;
/**
* 系统配置
*
* @ icon fa fa - cogs
* @ remark 可以在此增改系统的变量和分组 , 也可以自定义分组和变量 , 如果需要删除请从数据库中删除
*/
class Config extends Backend
{
/**
* @ var \app\common\model\Config
*/
protected $model = null ;
protected $noNeedRight = [ 'check' , 'rulelist' , 'selectpage' , 'get_fields_list' ];
public function _initialize ()
{
parent :: _initialize ();
// $this->model = model('Config');
$this -> model = new ConfigModel ;
ConfigModel :: event ( 'before_write' , function ( $row ) {
if ( isset ( $row [ 'name' ]) && $row [ 'name' ] == 'name' && preg_match ( " /fast " . " admin/i " , $row [ 'value' ])) {
throw new Exception ( __ ( " Site name incorrect " ));
}
});
}
/**
* 查看
*/
2024-11-16 18:01:16 +08:00
public function index ( $group = null )
2024-11-04 10:49:10 +08:00
{
$siteList = [];
2024-11-16 18:01:16 +08:00
$groupList = ConfigModel :: getGroupList ( $group );
2024-11-04 10:49:10 +08:00
foreach ( $groupList as $k => $v ) {
2024-11-16 18:01:16 +08:00
if ( $group && $group != $k ) continue ;
2024-11-04 10:49:10 +08:00
$siteList [ $k ][ 'name' ] = $k ;
$siteList [ $k ][ 'title' ] = $v ;
$siteList [ $k ][ 'list' ] = [];
}
foreach ( $this -> model -> all () as $k => $v ) {
if ( ! isset ( $siteList [ $v [ 'group' ]])) {
continue ;
}
$value = $v -> toArray ();
$value [ 'title' ] = __ ( $value [ 'title' ]);
if ( in_array ( $value [ 'type' ], [ 'select' , 'selects' , 'checkbox' , 'radio' ])) {
$value [ 'value' ] = explode ( ',' , $value [ 'value' ]);
}
$value [ 'content' ] = json_decode ( $value [ 'content' ], true );
if ( in_array ( $value [ 'name' ], [ 'categorytype' , 'configgroup' , 'attachmentcategory' ])) {
$dictValue = ( array ) json_decode ( $value [ 'value' ], true );
foreach ( $dictValue as $index => & $item ) {
$item = __ ( $item );
}
unset ( $item );
$value [ 'value' ] = json_encode ( $dictValue , JSON_UNESCAPED_UNICODE );
}
$value [ 'tip' ] = htmlspecialchars ( $value [ 'tip' ]);
if ( $value [ 'name' ] == 'cdnurl' ) {
//cdnurl不支持在线修改
continue ;
}
$siteList [ $v [ 'group' ]][ 'list' ][] = $value ;
}
$index = 0 ;
foreach ( $siteList as $k => & $v ) {
$v [ 'active' ] = ! $index ? true : false ;
$index ++ ;
}
$this -> view -> assign ( 'siteList' , $siteList );
$this -> view -> assign ( 'typeList' , ConfigModel :: getTypeList ());
$this -> view -> assign ( 'ruleList' , ConfigModel :: getRegexList ());
$this -> view -> assign ( 'groupList' , ConfigModel :: getGroupList ());
return $this -> view -> fetch ();
}
/**
* 添加
*/
public function add ()
{
if ( ! config ( 'app_debug' )) {
$this -> error ( __ ( 'Only work at development environment' ));
}
if ( $this -> request -> isPost ()) {
$this -> token ();
$params = $this -> request -> post ( " row/a " , [], 'trim' );
if ( $params ) {
foreach ( $params as $k => & $v ) {
$v = is_array ( $v ) && $k !== 'setting' ? implode ( ',' , $v ) : $v ;
}
if ( in_array ( $params [ 'type' ], [ 'select' , 'selects' , 'checkbox' , 'radio' , 'array' ])) {
$params [ 'content' ] = json_encode ( ConfigModel :: decode ( $params [ 'content' ]), JSON_UNESCAPED_UNICODE );
} else {
$params [ 'content' ] = '' ;
}
try {
$result = $this -> model -> create ( $params );
} catch ( Exception $e ) {
$this -> error ( $e -> getMessage ());
}
if ( $result !== false ) {
try {
ConfigModel :: refreshFile ();
} catch ( Exception $e ) {
$this -> error ( $e -> getMessage ());
}
$this -> success ();
} else {
$this -> error ( $this -> model -> getError ());
}
}
$this -> error ( __ ( 'Parameter %s can not be empty' , '' ));
}
return $this -> view -> fetch ();
}
/**
* 编辑
* @ param null $ids
*/
public function edit ( $ids = null )
{
if ( $this -> request -> isPost ()) {
$this -> token ();
$row = $this -> request -> post ( " row/a " , [], 'trim' );
if ( $row ) {
$configList = [];
foreach ( $this -> model -> all () as $v ) {
if ( isset ( $row [ $v [ 'name' ]])) {
$value = $row [ $v [ 'name' ]];
if ( is_array ( $value ) && isset ( $value [ 'field' ])) {
$value = json_encode ( ConfigModel :: getArrayData ( $value ), JSON_UNESCAPED_UNICODE );
} else {
$value = is_array ( $value ) ? implode ( ',' , $value ) : $value ;
}
2024-11-16 18:01:16 +08:00
//$value去掉两端空格
$value = trim ( $value );
$v [ 'value' ] = $value ;
2024-11-04 10:49:10 +08:00
$configList [] = $v -> toArray ();
}
}
try {
$this -> model -> allowField ( true ) -> saveAll ( $configList );
} catch ( Exception $e ) {
$this -> error ( $e -> getMessage ());
}
try {
ConfigModel :: refreshFile ();
} catch ( Exception $e ) {
$this -> error ( $e -> getMessage ());
}
$this -> success ();
}
$this -> error ( __ ( 'Parameter %s can not be empty' , '' ));
}
}
/**
* 删除
* @ param string $ids
*/
public function del ( $ids = " " )
{
if ( ! config ( 'app_debug' )) {
$this -> error ( __ ( 'Only work at development environment' ));
}
$name = $this -> request -> post ( 'name' );
$config = ConfigModel :: getByName ( $name );
if ( $name && $config ) {
try {
$config -> delete ();
ConfigModel :: refreshFile ();
} catch ( Exception $e ) {
$this -> error ( $e -> getMessage ());
}
$this -> success ();
} else {
$this -> error ( __ ( 'Invalid parameters' ));
}
}
/**
* 检测配置项是否存在
* @ internal
*/
public function check ()
{
$params = $this -> request -> post ( " row/a " );
if ( $params ) {
$config = $this -> model -> get ( $params );
if ( ! $config ) {
$this -> success ();
} else {
$this -> error ( __ ( 'Name already exist' ));
}
} else {
$this -> error ( __ ( 'Invalid parameters' ));
}
}
/**
* 规则列表
* @ internal
*/
public function rulelist ()
{
//主键
$primarykey = $this -> request -> request ( " keyField " );
//主键值
$keyValue = $this -> request -> request ( " keyValue " , " " );
$keyValueArr = array_filter ( explode ( ',' , $keyValue ));
$regexList = \app\common\model\Config :: getRegexList ();
$list = [];
foreach ( $regexList as $k => $v ) {
if ( $keyValueArr ) {
if ( in_array ( $k , $keyValueArr )) {
$list [] = [ 'id' => $k , 'name' => $v ];
}
} else {
$list [] = [ 'id' => $k , 'name' => $v ];
}
}
return json ([ 'list' => $list ]);
}
/**
* 发送测试邮件
* @ internal
*/
public function emailtest ()
{
$row = $this -> request -> post ( 'row/a' );
$receiver = $this -> request -> post ( " receiver " );
if ( $receiver ) {
if ( ! Validate :: is ( $receiver , " email " )) {
$this -> error ( __ ( 'Please input correct email' ));
}
\think\Config :: set ( 'site' , array_merge ( \think\Config :: get ( 'site' ), $row ));
$email = new Email ;
$result = $email
-> to ( $receiver )
-> subject ( __ ( " This is a test mail " , config ( 'site.name' )))
-> message ( '<div style="min-height:550px; padding: 100px 55px 200px;">' . __ ( 'This is a test mail content' , config ( 'site.name' )) . '</div>' )
-> send ();
if ( $result ) {
$this -> success ();
} else {
$this -> error ( $email -> getError ());
}
} else {
$this -> error ( __ ( 'Invalid parameters' ));
}
}
public function selectpage ()
{
$id = $this -> request -> get ( " id/d " );
$config = \app\common\model\Config :: get ( $id );
if ( ! $config ) {
$this -> error ( __ ( 'Invalid parameters' ));
}
$setting = $config [ 'setting' ];
//自定义条件
$custom = isset ( $setting [ 'conditions' ]) ? ( array ) json_decode ( $setting [ 'conditions' ], true ) : [];
$custom = array_filter ( $custom );
$this -> request -> request ([ 'showField' => $setting [ 'field' ], 'keyField' => $setting [ 'primarykey' ], 'custom' => $custom , 'searchField' => [ $setting [ 'field' ], $setting [ 'primarykey' ]]]);
$this -> model = \think\Db :: connect () -> setTable ( $setting [ 'table' ]);
return parent :: selectpage ();
}
/**
* 获取表列表
* @ internal
*/
public function get_table_list ()
{
$tableList = [];
$dbname = \think\Config :: get ( 'database.database' );
$tableList = \think\Db :: query ( " SELECT `TABLE_NAME` AS `name`,`TABLE_COMMENT` AS `title` FROM `information_schema`.`TABLES` where `TABLE_SCHEMA` = ' { $dbname } '; " );
$this -> success ( '' , null , [ 'tableList' => $tableList ]);
}
/**
* 获取表字段列表
* @ internal
*/
public function get_fields_list ()
{
$table = $this -> request -> request ( 'table' );
$dbname = \think\Config :: get ( 'database.database' );
//从数据库中获取表字段信息
$sql = " SELECT `COLUMN_NAME` AS `name`,`COLUMN_COMMENT` AS `title`,`DATA_TYPE` AS `type` FROM `information_schema`.`columns` WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? ORDER BY ORDINAL_POSITION " ;
//加载主表的列
$fieldList = Db :: query ( $sql , [ $dbname , $table ]);
$this -> success ( " " , null , [ 'fieldList' => $fieldList ]);
}
}