mirror of https://gitee.com/karson/fastadmin.git
多站点CMS
parent
91915bcff8
commit
d8fb4f1884
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use app\common\model\Counter;
|
||||
use think\Model;
|
||||
use think\Session;
|
||||
|
||||
class Archives extends Model
|
||||
{
|
||||
// 表名
|
||||
protected $name = 'archives';
|
||||
|
||||
// 自动写入时间戳字段
|
||||
protected $autoWriteTimestamp = 'int';
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = 'createtime';
|
||||
protected $updateTime = 'updatetime';
|
||||
|
||||
// 追加属性
|
||||
protected $append = [
|
||||
'views',
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* 根据后台入口和管理员等级来自动读取
|
||||
* 1, 如果是从站点后台登录,所有管理员只能读取本站点信息
|
||||
* 2, 如果是从总后台登录,管理员读取属于自己的站点的信息,超级管理员无限制
|
||||
*/
|
||||
protected function base($query)
|
||||
{
|
||||
if (Session::has("user_site_id")) {
|
||||
$query->where('site_id', Session::get("user_site_id"));
|
||||
}
|
||||
//$query->alias('a')->join('counter c', 'c.item_id=a.id')->where('c.item_type','archive')->field('c.views, c.good, c.bad, c.comments');
|
||||
}
|
||||
|
||||
public function Sites()
|
||||
{
|
||||
return $this->belongsTo('Sites', 'site_id')->field('id,name,domain');
|
||||
}
|
||||
public function Channel()
|
||||
{
|
||||
return $this->belongsTo('Channel', 'channel_id')->field('id,name');
|
||||
}
|
||||
|
||||
protected static function init()
|
||||
{
|
||||
self::afterInsert(function ($row) {
|
||||
$pk = $row->getPk();
|
||||
$row->getQuery()->where($pk, $row[$pk])
|
||||
->update(['weigh' => $row[$pk]]);
|
||||
});
|
||||
|
||||
self::beforeDelete(function($row){
|
||||
if (intval($row->isDelete)==0) {
|
||||
$row->isDelete = time();
|
||||
$row->save();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function restore()
|
||||
{
|
||||
return $this->update(['isDelete'=>0]);
|
||||
}
|
||||
|
||||
public function getViewsAttr($value,$data)
|
||||
{
|
||||
if(!isset($data['id'])) return 0;
|
||||
$result = Counter::get(['item_id'=>$data['id']]);
|
||||
return $result?$result['views']:0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\Session;
|
||||
|
||||
class Channel extends Model
|
||||
{
|
||||
// 表名
|
||||
protected $name = 'channel';
|
||||
|
||||
// 自动写入时间戳字段
|
||||
protected $autoWriteTimestamp = 'int';
|
||||
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = 'createtime';
|
||||
protected $updateTime = 'updatetime';
|
||||
|
||||
// 追加属性
|
||||
protected $append = [
|
||||
|
||||
];
|
||||
|
||||
/**
|
||||
* 根据后台入口和管理员等级来自动读取
|
||||
* 1, 如果是从站点后台登录,所有管理员只能读取本站点信息
|
||||
* 2, 如果是从总后台登录,管理员读取属于自己的站点的信息,超级管理员无限制
|
||||
*/
|
||||
protected function base($query)
|
||||
{
|
||||
if (Session::has("user_site_id")) {
|
||||
$query->where(['site_id'=> Session::get("user_site_id")]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function Sites()
|
||||
{
|
||||
return $this->belongsTo('Sites', 'site_id')->field('id,name');
|
||||
}
|
||||
|
||||
public function Archives()
|
||||
{
|
||||
//return $this->belongsTo('Archives', 'id', 'channel_id')->field('channel_id,count(1) as items');
|
||||
return $this->hasOne('Archives','channel_id','id')->field('channel_id,count(1) as items');
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取分类类型
|
||||
* @return array
|
||||
*/
|
||||
public static function getTypeList()
|
||||
{
|
||||
//$typelist = config('site.categorytype');
|
||||
return ['channel'=>__('Channel'), 'list'=>__('List'), 'redirect'=>__('Redirect')];
|
||||
}
|
||||
|
||||
|
||||
public static function getFlagList()
|
||||
{
|
||||
return ['hot' => __('Hot'), 'recommend' => __('Recommend')];
|
||||
}
|
||||
|
||||
public function getFlagTextAttr($value, $data)
|
||||
{
|
||||
if(!isset($data['flag'])) return '';
|
||||
$value = $value ? $value : $data['flag'];
|
||||
$valueArr = explode(',', $value);
|
||||
$list = $this->getFlagList();
|
||||
return implode(',', array_intersect_key($list, array_flip($valueArr)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取分类列表
|
||||
* @param string $type 指定类型
|
||||
* @param string $status 指定状态
|
||||
* @return array
|
||||
*/
|
||||
public static function getChannelArray($type = NULL, $status = NULL)
|
||||
{
|
||||
$list = collection(self::where(function($query) use($type, $status) {
|
||||
if (!is_null($type))
|
||||
{
|
||||
$query->where('type', '=', $type);
|
||||
}
|
||||
if (!is_null($status))
|
||||
{
|
||||
$query->where('status', '=', $status);
|
||||
}
|
||||
})->order('weigh', 'desc')->select())->toArray();
|
||||
return $list;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
protected static function init()
|
||||
{
|
||||
self::afterInsert(function ($row) {
|
||||
$pk = $row->getPk();
|
||||
$row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
|
||||
});
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
use think\Session;
|
||||
|
||||
class Page extends Model
|
||||
{
|
||||
// 表名
|
||||
protected $name = 'page';
|
||||
|
||||
// 自动写入时间戳字段
|
||||
protected $autoWriteTimestamp = 'int';
|
||||
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = 'createtime';
|
||||
protected $updateTime = 'updatetime';
|
||||
|
||||
|
||||
/**
|
||||
* 根据后台入口和管理员等级来自动读取
|
||||
* 1, 如果是从站点后台登录,所有管理员只能读取本站点信息
|
||||
* 2, 如果是从总后台登录,管理员读取属于自己的站点的信息,超级管理员无限制
|
||||
*/
|
||||
protected function base($query)
|
||||
{
|
||||
if (Session::has("user_site_id")) {
|
||||
$query->where('site_id', Session::get("user_site_id"));
|
||||
}
|
||||
}
|
||||
|
||||
public function Sites()
|
||||
{
|
||||
return $this->belongsTo('Sites', 'site_id')->field('id,name');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,302 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Db;
|
||||
use think\Model;
|
||||
|
||||
class PostsModelx extends Model
|
||||
{
|
||||
// 表名
|
||||
protected $name = 'PostsModelx';
|
||||
|
||||
// 自动写入时间戳字段
|
||||
protected $autoWriteTimestamp = false;
|
||||
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = false;
|
||||
protected $updateTime = false;
|
||||
|
||||
// 追加属性
|
||||
protected $append = [
|
||||
|
||||
];
|
||||
|
||||
public static function getTypeList()
|
||||
{
|
||||
$typeList = [
|
||||
'string' => __('String'),
|
||||
'text' => __('Text'),
|
||||
'richtext' => __('Richtext'),
|
||||
'number' => __('Number'),
|
||||
'datetime' => __('Datetime'),
|
||||
'select' => __('Select'),
|
||||
'selects' => __('Selects'),
|
||||
'image' => __('Image'),
|
||||
'images' => __('Images'),
|
||||
'file' => __('File'),
|
||||
'files' => __('Files'),
|
||||
'checkbox' => __('Checkbox'),
|
||||
'radio' => __('Radio'),
|
||||
];
|
||||
return $typeList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验规则名称
|
||||
*/
|
||||
public static function getRules(){
|
||||
return [
|
||||
"required" => __('Required'),
|
||||
"digits"=>"数字",
|
||||
"letters"=>"字母",
|
||||
"date"=>"日期",
|
||||
"time"=>"时间",
|
||||
"email"=>"邮箱",
|
||||
"url"=>"网址",
|
||||
"qq"=>"QQ号",
|
||||
"IDcard"=>"身份证",
|
||||
"tel"=>"座机电话",
|
||||
"mobile"=>"手机号",
|
||||
"zipcode"=>"邮编",
|
||||
"chinese"=>"中文",
|
||||
"username"=>"用户名",
|
||||
"password"=>"密码"
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存模型数据
|
||||
* @param string $modelname 模型
|
||||
* @param int $archiveid 文章ID
|
||||
* @param array $params 表单数据
|
||||
* @return bool
|
||||
*/
|
||||
public static function saveExtraForm($modelname='', $archiveid=0, $params=[])
|
||||
{
|
||||
if (empty($modelname) || $archiveid==0 || empty($params)) return false;
|
||||
|
||||
$mod = self::get(['name' => $modelname]);
|
||||
if (!$mod) return false;
|
||||
|
||||
$fields = json_decode($mod['extra'],true);
|
||||
|
||||
//格式化模型数据
|
||||
foreach ($fields as $k => $v) {
|
||||
if ($v['type']=='file' || $v['type']=='files'){
|
||||
foreach($params[$v['field']] as $item=>&$val){
|
||||
if($val['url']==''){
|
||||
unset($params[$v['field']][$item]);
|
||||
}
|
||||
}
|
||||
$params[$v['field']] = empty($params[$v['field']])? ''
|
||||
: json_encode($params[$v['field']], JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($params as $k => &$v)
|
||||
{
|
||||
$v = is_array($v) ? implode(',', $v) : $v;
|
||||
}
|
||||
$params['item_id'] = $archiveid ;
|
||||
|
||||
$row = model('extra'.$modelname)->get(['item_id'=>$archiveid]);
|
||||
if($row) {
|
||||
$row->allowField(true)->save($params);
|
||||
}else {
|
||||
model('extra'.$modelname)->allowField(true)->save($params);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成模型表单
|
||||
* @param $modelname 模型名称
|
||||
* @param $archiveid 文章ID
|
||||
* @return string
|
||||
*/
|
||||
public static function getExtraForm($modelname, $archiveid=null)
|
||||
{
|
||||
$mod = self::get(['name'=>$modelname]);
|
||||
if(!$mod) return '';
|
||||
if(!isset($mod['extra']) || empty($mod['extra'])) return '';
|
||||
|
||||
$row = empty($archiveid)? null :
|
||||
model('extra'.$mod['name'])->get(['item_id'=> $archiveid]);
|
||||
|
||||
$params = json_decode($mod['extra'], true);
|
||||
|
||||
$controls = $controlid = $cssname = '';
|
||||
$controlPrefix = 'row';
|
||||
$btnUpload = __('Upload'); $btnChoose = __('Choose'); $btnAppend = __('Append');
|
||||
$input = '<input type="%s" id="c-%s" name="'. $controlPrefix . '[%s]" value="%s" class="form-control %s" data-rule="%s" data-tip="%s" %s>';
|
||||
$textarea = '<textarea name="'. $controlPrefix . '[%s]" id="c-%s" class="form-control %s" data-rule="%s" data-tip="%s" %s>%s</textarea>';
|
||||
$checkbox = '<label for="c-%s"><input type="checkbox" id="c-%s" name="'. $controlPrefix . '[%s][]" value="%s" %s>%s</label>';
|
||||
$radio = '<label for="c-%s"><input type="radio" id="c-%s" name="'. $controlPrefix . '[%s]" value="%s" %s>%s</label>';
|
||||
|
||||
$html = [];
|
||||
foreach ($params as $k => $v){
|
||||
if(isset($v['status']) && $v['status']=='hidden') continue;
|
||||
$defaultValue = !isset($row[$v['field']]) ? $v['value']
|
||||
: empty($row[$v['field']]) ? $v['value'] : $row[$v['field']] ;
|
||||
|
||||
$controlid = $v['field'] . substr(md5($v['field'].microtime()),0,6);
|
||||
|
||||
switch(strtolower($v['type'])){
|
||||
case 'string':
|
||||
case 'number':
|
||||
case 'datetime':
|
||||
$cssname = $v['type']=='datetime'?'datetimepicker':'';
|
||||
$controls = sprintf($input, ($v['type']=='number'?'number':'text'), $controlid, $v['field'], $defaultValue, $cssname, $v['rule'], $v['tip'], $v['extend']);
|
||||
break;
|
||||
case 'text':
|
||||
case 'richtext':
|
||||
$cssname = $v['type']=='richtext'?'editor':'';
|
||||
$controls = sprintf($textarea, $v['field'], $controlid, $cssname, $v['rule'], $v['tip'], $v['extend'], $defaultValue);
|
||||
break;
|
||||
case 'checkbox':
|
||||
case 'radio':
|
||||
$items = explode('||', $v['vars']);
|
||||
$controls='';
|
||||
$defaultValue=explode(',',$defaultValue);
|
||||
for($i=0;$i<count($items);$i++) {
|
||||
if(empty($items[$i])) continue;
|
||||
if(!strpos($items[$i], "=")) $items[$i].="=";
|
||||
$item = explode('=',$items[$i]);
|
||||
$item[1]= empty($item[1])?$item[0]:$item[1];
|
||||
if(is_array($defaultValue)) {
|
||||
$isChecked = in_array($item[1], $defaultValue) ? ' checked' : '';
|
||||
}else{
|
||||
$isChecked = $item[1]==$defaultValue ? ' checked' : '';
|
||||
}
|
||||
$controlid = $v['field'].'-'.substr(md5($item[1]),0,6);
|
||||
$controls .= sprintf(${$v['type']}, $controlid, $controlid, $v['field'], $item[1], $v['extend'].$isChecked, $item[0]);
|
||||
}
|
||||
$controlid = 'none';
|
||||
$controls = sprintf('<div class="%s">%s</div>', $v['type'], $controls);
|
||||
break;
|
||||
case 'select':
|
||||
case 'selects':
|
||||
$items = explode('||', $v['vars']);
|
||||
$options = '';
|
||||
$defaultValue=explode(',',$defaultValue);
|
||||
for($i=0;$i<count($items);$i++) {
|
||||
if(empty($items[$i])) continue;
|
||||
if(!strpos($items[$i], "=")) $items[$i].="=";
|
||||
$item = explode('=',$items[$i]);
|
||||
$item[1]= empty($item[1])?$item[0]:$item[1];
|
||||
if(is_array($defaultValue)) {
|
||||
$isChecked = in_array($item[1], $defaultValue) ? ' selected' : '';
|
||||
}else{
|
||||
$isChecked = $item[1]==$defaultValue ? ' selected' : '';
|
||||
}
|
||||
$options .= sprintf('<option value="%s" %s>%s</option>', $item[1], $isChecked, $item[0]);
|
||||
}
|
||||
|
||||
$extend = $v['type']=='selects'?'multiple ':' ';
|
||||
$extend .= $v['extend'];
|
||||
$controls = <<<EOF
|
||||
<select id="c-{$controlid}" name="{$controlPrefix}[{$v['field']}]" class="form-control selectpicker" data-tip="{$v['tip']}" {$extend}>
|
||||
{$options}
|
||||
</select>
|
||||
EOF;
|
||||
break;
|
||||
case 'image':
|
||||
case 'images':
|
||||
$multi = $v['type']=='image'? 'false' : 'true';
|
||||
$controls = <<<EOF
|
||||
<div class="form-inline">
|
||||
<input id="c-{$controlid}" class="form-control" size="45" name="{$controlPrefix}[{$v['field']}]" type="text" value="{$defaultValue}" data-tip="{$v['tip']}">
|
||||
<span><button type="button" id="plupload-{$controlid}" class="btn btn-danger plupload" data-input-id="c-{$controlid}" data-multiple="{$multi}" data-mimetype="image/*" data-preview-id="{$controlid}-preview"><i class="fa fa-upload"></i> {$btnUpload}</button></span>
|
||||
<span><button type="button" id="fachoose-{$controlid}" class="btn btn-primary fachoose" data-input-id="c-{$controlid}" data-multiple="{$multi}" data-mimetype="image/*"><i class="fa fa-list"></i> {$btnChoose}</button></span>
|
||||
<ul class="row list-inline plupload-preview" id="{$controlid}-preview"></ul>
|
||||
</div>
|
||||
EOF;
|
||||
|
||||
break;
|
||||
case 'file':
|
||||
case 'files':
|
||||
$mimetype = '*/*';
|
||||
$lab1 = __('Title'); $lab2 = __('File');
|
||||
|
||||
$edit = '';
|
||||
$index=0;
|
||||
if (!empty($defaultValue)){
|
||||
$defaultValue=json_decode($defaultValue, true);
|
||||
foreach($defaultValue as $key => $file)
|
||||
{
|
||||
$controlid = substr($v['type'],0,1).substr(md5($file['id'].microtime()),0,6);
|
||||
|
||||
if ($v['type']=='file'){
|
||||
$btns = <<<EOF
|
||||
<span><button type="button" id="plupload-pa-{$controlid}0" class="btn btn-danger plupload" data-input-id="pa-{$controlid}-0" data-attach-id="pa-{$controlid}-i-0" data-title-id="pa-{$controlid}-t-0" data-mimetype="{$mimetype}" data-multiple="false" data-upload-success="productattachcallback"><i class="fa fa-upload"></i> {$btnUpload}</button></span>
|
||||
<span><button type="button" id="fachoose-pa-{$controlid}0" class="btn btn-primary fachoose" data-input-id="pa-{$controlid}-0" data-attach-id="pa-{$controlid}-i-0" data-title-id="pa-{$controlid}-t-0" data-mimetype="{$mimetype}" data-multiple="false"><i class="fa fa-list"></i> {$btnChoose}</button></span>
|
||||
EOF;
|
||||
}else {
|
||||
$btns = <<<EOF
|
||||
<span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
|
||||
EOF;
|
||||
}
|
||||
|
||||
$edit .= <<<EOF
|
||||
<dd class="form-inline">
|
||||
<input type="hidden" name="{$controlPrefix}[{$v['field']}][{$index}][id]" id="pa-{$controlid}-i-0" value="{$file['id']}" />
|
||||
<input type="text" name="{$controlPrefix}[{$v['field']}][{$index}][title]" id="pa-{$controlid}-t-0" class="form-control" value="{$file['title']}" size="23" />
|
||||
<input type="text" name="{$controlPrefix}[{$v['field']}][{$index}][url]" id="pa-{$controlid}-0" class="form-control" value="{$file['url']}" size="10" />
|
||||
{$btns}
|
||||
</dd>
|
||||
EOF;
|
||||
$index++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$controlid = substr($v['type'],0,1).substr(md5(microtime()),0,5);
|
||||
$edit = <<<EOF
|
||||
<dd class="form-inline">
|
||||
<input type="hidden" name="{$controlPrefix}[{$v['field']}][{$index}][id]" id="pa-{$controlid}-i-0" value="" />
|
||||
<input type="text" name="{$controlPrefix}[{$v['field']}][{$index}][title]" id="pa-{$controlid}-t-0" class="form-control" value="" size="23" />
|
||||
<input type="text" name="{$controlPrefix}[{$v['field']}][{$index}][url]" id="pa-{$controlid}-0" class="form-control" size="10" />
|
||||
<span><button type="button" id="plupload-pa-{$controlid}0" class="btn btn-danger plupload" data-input-id="pa-{$controlid}-0" data-attach-id="pa-{$controlid}-i-0" data-title-id="pa-{$controlid}-t-0" data-mimetype="{$mimetype}" data-multiple="false" data-upload-success="productattachcallback"><i class="fa fa-upload"></i> {$btnUpload}</button></span>
|
||||
<span><button type="button" id="fachoose-pa-{$controlid}0" class="btn btn-primary fachoose" data-input-id="pa-{$controlid}-0" data-attach-id="pa-{$controlid}-i-0" data-title-id="pa-{$controlid}-t-0" data-mimetype="{$mimetype}" data-multiple="false"><i class="fa fa-list"></i> {$btnChoose}</button></span>
|
||||
</dd>
|
||||
EOF;
|
||||
}
|
||||
|
||||
$append = $v['type']=='files'?'<dd><a href="javascript:;" class="btn-append btn btn-sm btn-success"><i class="fa fa-plus"></i>'.$btnAppend.'</a></dd>':'';
|
||||
|
||||
$controls = <<<EOF
|
||||
<div class="form-inline">
|
||||
<dl class="fieldlist" rel="{$index}" data-name="{$controlPrefix}[{$v['field']}]">
|
||||
<dd>
|
||||
<ins>{$lab1}</ins>
|
||||
<ins>{$lab2}</ins>
|
||||
</dd>
|
||||
{$edit}
|
||||
{$append}
|
||||
</dl>
|
||||
</div>
|
||||
EOF;
|
||||
|
||||
$controlid = 'none';
|
||||
break;
|
||||
}
|
||||
|
||||
$html[] = <<<EOF
|
||||
<div class="form-group">
|
||||
<label for="c-{$controlid}" class="control-label col-xs-12 col-sm-2">{$v['fieldname']}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
{$controls}
|
||||
</div>
|
||||
</div>
|
||||
EOF;
|
||||
}
|
||||
return sprintf('<div class="blockmodel" id="model_%s">%s</div>', $mod['name'], implode('',$html));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* @desc: Created by PhpStorm.
|
||||
* @Author: Dr.Xing <ezfwork@foxmail.com>
|
||||
* @Since: 2018/2/5 15:37
|
||||
*/
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
|
||||
use think\Model;
|
||||
|
||||
class Sites extends Model
|
||||
{
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue