多站点CMS

pull/41/head
devlike 2018-02-08 11:10:15 +08:00
parent 91915bcff8
commit d8fb4f1884
5 changed files with 548 additions and 0 deletions

View File

@ -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;
}
}

View File

@ -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]]);
});
}
*/
}

View File

@ -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');
}
}

View File

@ -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));
}
}

View File

@ -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
{
}