初始化
commit
1536e49dfe
|
@ -0,0 +1,19 @@
|
|||
APP_DEBUG = true
|
||||
APP_TRACE = true
|
||||
|
||||
[APP]
|
||||
DEFAULT_TIMEZONE = Asia/Shanghai
|
||||
|
||||
[DATABASE]
|
||||
TYPE = mysql
|
||||
HOSTNAME = 211.149.245.223
|
||||
DATABASE = dev_bee_cms
|
||||
USERNAME = dev_bee_cms
|
||||
PASSWORD = dT7yH5fmd28JG6ER
|
||||
HOSTPORT = 3306
|
||||
CHARSET = utf8mb4
|
||||
DEBUG = true
|
||||
PREFIX = bee_
|
||||
|
||||
[LANG]
|
||||
default_lang = zh-cn
|
|
@ -0,0 +1,12 @@
|
|||
.env
|
||||
/.idea
|
||||
/.vscode
|
||||
backup/data/*
|
||||
*.log
|
||||
runtime/*
|
||||
storage/*
|
||||
public/storage/*
|
||||
.DS_Store
|
||||
Test.php
|
||||
nginx.htaccess
|
||||
dump.rdb
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
|
||||
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
|
||||
All rights reserved。
|
||||
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
|
||||
|
||||
Apache Licence是著名的非盈利开源组织Apache采用的协议。
|
||||
该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,
|
||||
允许代码修改,再作为开源或商业软件发布。需要满足
|
||||
的条件:
|
||||
1. 需要给代码的用户一份Apache Licence ;
|
||||
2. 如果你修改了代码,需要在被修改的文件中说明;
|
||||
3. 在延伸的代码中(修改和有源代码衍生的代码中)需要
|
||||
带有原来代码中的协议,商标,专利声明和其他原来作者规
|
||||
定需要包含的说明;
|
||||
4. 如果再发布的产品中包含一个Notice文件,则在Notice文
|
||||
件中需要带有本协议内容。你可以在Notice中增加自己的
|
||||
许可,但不可以表现为对Apache Licence构成更改。
|
||||
具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,7 @@
|
|||
本CMS基于ThinkPHP 6.0.3开发
|
||||
|
||||
> 运行环境要求PHP7.1+。
|
||||
> MySql版本使用的是5.7.21
|
||||
> 富文本编辑器选择wangEditorv3.1.1 https://github.com/wangfupeng1988/wangEditor
|
||||
> 上传插件选择filepond4.7.1 https://github.com/pqina/filepond
|
||||
> 上传插件修改为使用layui组件库自带的
|
|
@ -0,0 +1 @@
|
|||
deny from all
|
|
@ -0,0 +1,426 @@
|
|||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: 流年 <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
use think\exception\ClassNotFoundException;
|
||||
|
||||
// 应用公共文件
|
||||
|
||||
if (!function_exists('widget')) {
|
||||
/**
|
||||
* 渲染输出Widget
|
||||
* @param string $name Widget名称
|
||||
* @param array $data 传入的参数
|
||||
* @return mixed
|
||||
* milo 2019-05-08 从TP5.1代码中拿来修改的
|
||||
*/
|
||||
function widget($name, $data = [])
|
||||
{
|
||||
return action($name, $data, 'widget');
|
||||
}
|
||||
}
|
||||
if (!function_exists('action')) {
|
||||
/**
|
||||
* 调用模块的操作方法 参数格式 [模块/控制器/]操作
|
||||
* @param string $url 调用地址
|
||||
* @param string|array $vars 调用参数 支持字符串和数组
|
||||
* @param string $layer 要调用的控制层名称
|
||||
* @param bool $appendSuffix 是否添加类名后缀
|
||||
* @return mixed
|
||||
* milo 2019-05-08 从TP5.1代码中拿来修改的
|
||||
*/
|
||||
function action($url, $vars = [], $layer = 'controller', $appendSuffix = false)
|
||||
{
|
||||
$info = pathinfo($url);
|
||||
$action = $info['basename'];
|
||||
$module = '.' != $info['dirname'] ? $info['dirname'] : request()->controller();
|
||||
$class = controller($module, $layer);
|
||||
if (is_scalar($vars)) {
|
||||
if (strpos($vars, '=')) {
|
||||
parse_str($vars, $vars);
|
||||
} else {
|
||||
$vars = [$vars];
|
||||
}
|
||||
}
|
||||
return app()->invokeMethod([$class, $action . config('route.action_suffix')], $vars);
|
||||
}
|
||||
}
|
||||
if (!function_exists('controller')) {
|
||||
/**
|
||||
* 实例化(分层)控制器 格式:[模块名/]控制器名
|
||||
* @access public
|
||||
* @param string $name 资源地址
|
||||
* @param string $layer 控制层名称
|
||||
* @param bool $appendSuffix 是否添加类名后缀
|
||||
* @param string $empty 空控制器名称
|
||||
* @return object
|
||||
* @throws ClassNotFoundException
|
||||
*
|
||||
* milo 2019-05-08 从TP5.1代码中拿来修改的
|
||||
*/
|
||||
function controller($name, $layer = 'controller', $empty = '')
|
||||
{
|
||||
$class = parseClass($name, $layer);
|
||||
if (class_exists($class)) {
|
||||
return app()->make($class);
|
||||
} elseif ($empty && class_exists($emptyClass = app()->parseClass($layer, $empty))) {
|
||||
return app()->make($emptyClass);
|
||||
}
|
||||
|
||||
throw new ClassNotFoundException('class not exists:' . $class, $class);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('parseClass')) {
|
||||
/**
|
||||
* 解析模块和类名
|
||||
* @access protected
|
||||
* @param string $name 资源地址
|
||||
* @param string $layer 验证层名称
|
||||
* @param bool $appendSuffix 是否添加类名后缀
|
||||
* @return array
|
||||
*
|
||||
* milo 2019-05-08 从TP5.1代码中拿来修改的
|
||||
*/
|
||||
function parseClass($name, $layer)
|
||||
{
|
||||
if (false !== strpos($name, '\\')) {
|
||||
$class = $name;
|
||||
} else {
|
||||
if (strpos($name, '/')) {
|
||||
$names = explode('/', $name, 2);
|
||||
$name = $names[1];
|
||||
}
|
||||
$class = app()->parseClass($layer, $name);
|
||||
}
|
||||
return $class;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!function_exists('randomStr')) {
|
||||
/**
|
||||
* 获取随机字符串
|
||||
* @param int $type 0:数字(默认);1:全部;2:小写字母;3:大写字母;4:字母;
|
||||
* @param int $len 字符串长度
|
||||
* @return string
|
||||
*/
|
||||
function randomStr($type = 0, $len = 5)
|
||||
{
|
||||
$strPol = "0123456789";
|
||||
if ($type == 1) {
|
||||
$strPol = "ABCDEFGHIJKLMOPQRSTUVWYZ0123456789abcdefghijklmopqrstuvwyz";
|
||||
} elseif ($type == 2) {
|
||||
$strPol = "abcdefghijklmopqrstuvwyz";
|
||||
} elseif ($type == 3) {
|
||||
$strPol = "ABCDEFGHIJKLMOPQRSTUVWYZ";
|
||||
} elseif ($type == 4) {
|
||||
$strPol = "ABCDEFGHIJKLMOPQRSTUVWYZabcdefghijklmopqrstuvwyz";
|
||||
}
|
||||
$max = strlen($strPol) - 1;
|
||||
$str = '';
|
||||
for ($i = 0; $i < $len; $i++) {
|
||||
$str .= $strPol[rand(0, $max)];
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('isMobile')) {
|
||||
//判断访问终端是否为移动端
|
||||
function isMobile()
|
||||
{
|
||||
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
|
||||
if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
|
||||
return true;
|
||||
}
|
||||
// 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
|
||||
if (isset($_SERVER['HTTP_VIA'])) {
|
||||
// 找不到为flase,否则为true
|
||||
return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
|
||||
}
|
||||
// 脑残法,判断手机发送的客户端标志,兼容性有待提高。其中'MicroMessenger'是电脑微信
|
||||
if (isset($_SERVER['HTTP_USER_AGENT'])) {
|
||||
$clientkeywords = ['nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile', 'MicroMessenger'];
|
||||
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
|
||||
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// 协议法,因为有可能不准确,放到最后判断
|
||||
if (isset ($_SERVER['HTTP_ACCEPT'])) {
|
||||
// 如果只支持wml并且不支持html那一定是移动设备
|
||||
// 如果支持wml和html但是wml在html之前则是移动设备
|
||||
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
//根据栏目获取路径
|
||||
if (!function_exists('getUri')) {
|
||||
function getUri($cate)
|
||||
{
|
||||
$url = '';
|
||||
if (!empty($cate)) {
|
||||
if ($cate['is_index']) {
|
||||
$url = '/';
|
||||
} elseif (!empty($cate['url'])) {
|
||||
$url = $cate['url'];
|
||||
} else {
|
||||
$url = url($cate['template'] . '/index', ['category_id' => $cate['id']]);
|
||||
}
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
}
|
||||
|
||||
//根据文件大小转换为文字
|
||||
if (!function_exists('sizeToStr')) {
|
||||
function sizeToStr($size)
|
||||
{
|
||||
if (!is_numeric($size) || $size <= 0) {
|
||||
return '';
|
||||
}
|
||||
$size = $size / 1024;
|
||||
if ($size < 1024) {
|
||||
return sprintf("%.2fK", $size);
|
||||
}
|
||||
$size = $size / 1024;
|
||||
if ($size < 1024) {
|
||||
return sprintf("%.2fM", $size);
|
||||
}
|
||||
$size = $size / 1024;
|
||||
return sprintf("%.2fG", $size);
|
||||
}
|
||||
}
|
||||
|
||||
//根据路径获取文件名
|
||||
if (!function_exists('getKeyByPath')) {
|
||||
function getKeyByPath($path)
|
||||
{
|
||||
return substr($path, strrpos($path, '/') + 1);
|
||||
}
|
||||
}
|
||||
|
||||
//富文本中提取图片路径
|
||||
if (!function_exists('getImageUrlFromText')) {
|
||||
function getImageUrlFromText($content)
|
||||
{
|
||||
preg_match_all('/<img.*?src="(.*?)".*?>/is', $content, $imgs);
|
||||
$data = [];
|
||||
if (!empty($imgs) && !empty($imgs[1])) {
|
||||
foreach ($imgs[1] as $img) {
|
||||
if (substr($img, 0, 4) != 'http') {
|
||||
$key = getKeyByPath($img);
|
||||
$data[$key] = $img;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
//富文本中提取视频路径
|
||||
if (!function_exists('getVideoUrlFromText')) {
|
||||
function getVideoUrlFromText($content)
|
||||
{
|
||||
preg_match_all('/<video.*?src="(.*?)".*?>/is', $content, $videos);
|
||||
$data = [];
|
||||
if (!empty($videos) && !empty($videos[1])) {
|
||||
foreach ($videos[1] as $video) {
|
||||
if (substr($video, 0, 4) != 'http') {
|
||||
$key = getKeyByPath($video);
|
||||
$data[$key] = $video;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
//获取目录下的所有文件
|
||||
if (!function_exists('getAllFilesByPath')) {
|
||||
function getAllFilesByPath($path, $rootPath)
|
||||
{
|
||||
if (is_dir($path) && file_exists($path)) {
|
||||
$items = scandir($path);
|
||||
$files = [];
|
||||
foreach ($items as $item) {
|
||||
if (substr($item, 0, 1) != '.' && strpos($item, '_') == false) {
|
||||
$itemPath = $path . '/' . $item;
|
||||
if (is_file($itemPath)) {
|
||||
$size = filesize($itemPath);
|
||||
$files[$item] = [
|
||||
'path' => str_replace($rootPath, '/', $itemPath),
|
||||
'realPath' => $itemPath,
|
||||
'size' => $size,
|
||||
'sizeStr' => sizeToStr($size),
|
||||
'suffix' => strtolower(substr($item, strrpos($item, '.') + 1)) //后缀
|
||||
];
|
||||
} elseif (is_dir($itemPath)) {
|
||||
$childFiles = getAllFilesByPath($itemPath, $rootPath);
|
||||
if (!empty($childFiles)) {
|
||||
$files = array_merge($files, $childFiles);
|
||||
} else {
|
||||
rmdir($itemPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
//过滤get输入
|
||||
if (!function_exists('getFilter')) {
|
||||
function getFilter($value)
|
||||
{
|
||||
$getFilter = "'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
|
||||
$forArray = false;
|
||||
if (is_array($value)) {
|
||||
$forFilter = implode($value);
|
||||
$forArray = true;
|
||||
} else {
|
||||
$forFilter = $value;
|
||||
}
|
||||
if (preg_match("/" . $getFilter . "/is", $forFilter) == 1) {
|
||||
$value = $forArray ? [] : '';
|
||||
}
|
||||
return filterExp($value);
|
||||
}
|
||||
}
|
||||
|
||||
//过滤post录入
|
||||
if (!function_exists($postFilter)) {
|
||||
function postFilter($value)
|
||||
{
|
||||
$postFilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
|
||||
$forArray = false;
|
||||
if (is_array($value)) {
|
||||
$forFilter = implode($value);
|
||||
$forArray = true;
|
||||
} else {
|
||||
$forFilter = $value;
|
||||
}
|
||||
if (preg_match("/" . $postFilter . "/is", $forFilter) == 1) {
|
||||
$value = $forArray ? [] : '';
|
||||
}
|
||||
return filterExp($value);
|
||||
}
|
||||
}
|
||||
|
||||
//过滤cookie数据
|
||||
if (!function_exists('cookieFilter')) {
|
||||
function cookieFilter($value)
|
||||
{
|
||||
$cookieFilter = "\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
|
||||
$forArray = false;
|
||||
if (is_array($value)) {
|
||||
$forFilter = implode($value);
|
||||
$forArray = true;
|
||||
} else {
|
||||
$forFilter = $value;
|
||||
}
|
||||
if (preg_match("/" . $cookieFilter . "/is", $forFilter) == 1) {
|
||||
$value = $forArray ? [] : '';
|
||||
}
|
||||
return filterExp($value);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('filterExp')) {
|
||||
function filterExp($value)
|
||||
{
|
||||
$filter = '/^EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN$/i';
|
||||
$forArray = false;
|
||||
if (is_array($value)) {
|
||||
$forFilter = implode($value);
|
||||
$forArray = true;
|
||||
} else {
|
||||
$forFilter = $value;
|
||||
}
|
||||
if (preg_match($filter, $forFilter) == 1) {
|
||||
$value = $forArray ? [] : '';
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
if (!function_exists('arrayHtmlFilter')) {
|
||||
function arrayHtmlFilter($arr)
|
||||
{
|
||||
foreach ($arr as $k => $one) {
|
||||
if (is_array($one)) {
|
||||
$arr[$k] = arrayHtmlFilter($one);
|
||||
} else {
|
||||
$one = trim($one);
|
||||
$arr[$k] = strip_tags($one);
|
||||
}
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('getTextareaText')) {
|
||||
function getTextareaText($content)
|
||||
{
|
||||
$content = trim($content);
|
||||
if (!empty($content)) {
|
||||
$content = str_replace("\r\n", "\n", $content);
|
||||
$content = str_replace("\r", "\n", $content);
|
||||
}
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('getTextNlToList')) {
|
||||
function getTextNlToList($content)
|
||||
{
|
||||
$list = [];
|
||||
$content = getTextareaText($content);
|
||||
if (!empty($content)) {
|
||||
$list = explode("\n", $content);
|
||||
}
|
||||
return $list;
|
||||
}
|
||||
}
|
||||
//验证手机
|
||||
if (!function_exists('is_tel')) {
|
||||
function is_tel($mobile)
|
||||
{
|
||||
if (preg_match("/^1[3456789]\d{9}$/", $mobile)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!function_exists('tel_protect')) {
|
||||
function tel_protect($mobile)
|
||||
{
|
||||
if (is_tel($mobile)) {
|
||||
return substr($mobile, 0, 3) . "****" . substr($mobile, 7);
|
||||
}
|
||||
return $mobile;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('getExt')) {
|
||||
function getExt($file)
|
||||
{
|
||||
if (strlen($file) > 0) {
|
||||
$array = explode(".", $file);
|
||||
return end($array);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\service\Page;
|
||||
use app\model\{Article as MArticle, Category, Slide};
|
||||
use think\facade\Config;
|
||||
use think\facade\View;
|
||||
use think\Paginator;
|
||||
|
||||
class Article extends Base
|
||||
{
|
||||
//详情
|
||||
public function detail($id = 0)
|
||||
{
|
||||
|
||||
if ($id <= 0) {
|
||||
return $this->error('错误页面');
|
||||
}
|
||||
$article = MArticle::getById($id);
|
||||
if (empty($article)) {
|
||||
return $this->error('无此文章');
|
||||
}
|
||||
MArticle::updateById($id, ['views' => $article['views'] + 1]);
|
||||
$category = Category::getById($article['category_id']);
|
||||
$prev = MArticle::getPrevArticleByIdAndCategoryId($id, $article['category_id']);
|
||||
$next = MArticle::getNextArticleByIdAndCategoryId($id, $article['category_id']);
|
||||
|
||||
$keywords = $article['seo_keywords'] ? $article['seo_keywords'] : $article['title'];
|
||||
$description = $article['seo_description'] ? $article['seo_description'] : $article['title'];
|
||||
//$this->setSeo($category['title'], $category['title'], $category['title']);
|
||||
$this->setSeo($article['title'] . "|" . $this->system['company_name'], $keywords, $description);
|
||||
|
||||
$this->data['article'] = $article;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['categoryId'] = $category['id'];
|
||||
$this->data['prev'] = $prev;
|
||||
$this->data['next'] = $next;
|
||||
|
||||
|
||||
$banner = Slide::getList();
|
||||
View::assign("banner", $banner);
|
||||
|
||||
return $this->view($category['template_detail'] ?? '');
|
||||
}
|
||||
|
||||
//列表页
|
||||
public function index()
|
||||
{
|
||||
//动态设置当前分页驱动
|
||||
app('think\App')->bind(Paginator::class, Page::class);
|
||||
|
||||
$categoryId = input('category_id/d', 0);
|
||||
if ($categoryId <= 0) {
|
||||
return $this->error('错误页面');
|
||||
}
|
||||
$category = Category::getById($categoryId);
|
||||
$page_size = 20;
|
||||
if ($category['number']) $page_size = $category['number'];
|
||||
|
||||
if ($this->request->param("page_size/d")) {
|
||||
$page_size = $this->request->param("page_size/d");
|
||||
cookie("article_page_size", $this->request->param("page_size/d"));
|
||||
} else {
|
||||
if (cookie("?article_page_size")) $page_size = cookie("article_page_size");
|
||||
}
|
||||
|
||||
if (empty($category)) {
|
||||
return $this->error('错误页面');
|
||||
}
|
||||
|
||||
$description = $category['description'] ? $category['description'] : $category['title'];
|
||||
$keywords = $category['seo_keywords'] ? $category['seo_keywords'] : $category['title'];
|
||||
//$this->setSeo($category['title'], $category['title'], $category['title']);
|
||||
$this->setSeo($category['title'] . "-" . $this->system['company_name'], $keywords, $description);
|
||||
|
||||
$this->data['items'] = MArticle::getListPageByCategory($categoryId, $page_size);
|
||||
$this->data['category'] = $category;
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->data['page_size'] = $page_size;
|
||||
$this->data['article_count'] = MArticle::getListCount($categoryId);
|
||||
|
||||
|
||||
$banner = Slide::getList();
|
||||
View::assign("banner", $banner);
|
||||
|
||||
return $this->view($category['template_list'] ?? '');
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
namespace app\controller;
|
||||
|
||||
use app\controller\BaseController;
|
||||
use app\model\System;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
class Base extends BaseController
|
||||
{
|
||||
//需要向模板传递的值
|
||||
protected $data = [];
|
||||
//系统配置信息
|
||||
protected $system = [];
|
||||
|
||||
// 初始化
|
||||
protected function initialize()
|
||||
{
|
||||
$this->system = System::getSystem();
|
||||
$this->data['system'] = $this->system;
|
||||
}
|
||||
|
||||
//设置SEO信息
|
||||
protected function setSeo($title, $keywords, $description)
|
||||
{
|
||||
$this->data['seoTitle'] = $title;
|
||||
$this->data['seoKeywords'] = $keywords;
|
||||
$this->data['seoDescription'] = $description;
|
||||
}
|
||||
|
||||
//模板
|
||||
protected function view($template = '')
|
||||
{
|
||||
return view($template)->assign($this->data);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,193 @@
|
|||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use think\{App, Validate};
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
abstract class BaseController
|
||||
{
|
||||
/**
|
||||
* Request实例
|
||||
* @var \think\Request
|
||||
*/
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* 应用实例
|
||||
* @var \think\App
|
||||
*/
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* 是否批量验证
|
||||
* @var bool
|
||||
*/
|
||||
protected $batchValidate = false;
|
||||
|
||||
/**
|
||||
* 控制器中间件
|
||||
* @var array
|
||||
*/
|
||||
protected $middleware = [];
|
||||
|
||||
/**
|
||||
* 构造方法
|
||||
* @access public
|
||||
* @param App $app 应用对象
|
||||
*/
|
||||
public function __construct(App $app)
|
||||
{
|
||||
$this->app = $app;
|
||||
$this->request = $this->app->request;
|
||||
|
||||
// 控制器初始化
|
||||
$this->initialize();
|
||||
}
|
||||
|
||||
// 初始化
|
||||
protected function initialize()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证数据
|
||||
* @access protected
|
||||
* @param array $data 数据
|
||||
* @param string|array $validate 验证器名或者验证规则数组
|
||||
* @param array $message 提示信息
|
||||
* @param bool $batch 是否批量验证
|
||||
* @return array|string|true
|
||||
* @throws ValidateException
|
||||
*/
|
||||
protected function validate(array $data, $validate, array $message = [], bool $batch = false)
|
||||
{
|
||||
if (is_array($validate)) {
|
||||
$v = new Validate();
|
||||
$v->rule($validate);
|
||||
} else {
|
||||
if (strpos($validate, '.')) {
|
||||
// 支持场景
|
||||
list($validate, $scene) = explode('.', $validate);
|
||||
}
|
||||
$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
|
||||
$v = new $class();
|
||||
if (!empty($scene)) {
|
||||
$v->scene($scene);
|
||||
}
|
||||
}
|
||||
|
||||
$v->message($message);
|
||||
|
||||
// 是否批量验证
|
||||
if ($batch || $this->batchValidate) {
|
||||
$v->batch(true);
|
||||
}
|
||||
|
||||
return $v->failException(true)->check($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作成功跳转的快捷方法
|
||||
* @access protected
|
||||
* @param mixed $msg 提示信息
|
||||
* @param string $url 跳转的URL地址
|
||||
* @param mixed $data 返回的数据
|
||||
* @param integer $wait 跳转等待时间
|
||||
* @param array $header 发送的Header信息
|
||||
* @return void
|
||||
*/
|
||||
protected function success($msg = '', string $url = null, $data = '', int $wait = 3, array $header = [])
|
||||
{
|
||||
if (is_null($url) && isset($_SERVER["HTTP_REFERER"])) {
|
||||
$url = $_SERVER["HTTP_REFERER"];
|
||||
} elseif ($url) {
|
||||
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : $this->app->route->buildUrl($url);
|
||||
}
|
||||
|
||||
$result = [
|
||||
'code' => 1,
|
||||
'msg' => $msg,
|
||||
'data' => $data,
|
||||
'url' => $url,
|
||||
'wait' => $wait,
|
||||
];
|
||||
return $this->redirect(url('error/jump',$result));
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作错误跳转的快捷方法
|
||||
* @access protected
|
||||
* @param mixed $msg 提示信息
|
||||
* @param string $url 跳转的URL地址
|
||||
* @param mixed $data 返回的数据
|
||||
* @param integer $wait 跳转等待时间
|
||||
* @param array $header 发送的Header信息
|
||||
* @return void
|
||||
*/
|
||||
protected function error($msg = '', string $url = null, $data = '', int $wait = 3)
|
||||
{
|
||||
if (is_null($url)) {
|
||||
$referer = $_SERVER['HTTP_REFERER'] ?? null;
|
||||
if (empty($referer)) {
|
||||
$url = $this->request->isAjax() ? '' : '/';
|
||||
} else {
|
||||
$url = $this->request->isAjax() ? '' : 'javascript:history.back(-1);';
|
||||
}
|
||||
} elseif ($url) {
|
||||
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : $this->app->route->buildUrl($url);
|
||||
}
|
||||
$result = [
|
||||
'code' => 0,
|
||||
'msg' => $msg,
|
||||
'data' => $data,
|
||||
'url' => $url,
|
||||
'wait' => $wait,
|
||||
];
|
||||
|
||||
return $this->redirect(url('error/jump', $result));
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回封装后的API数据到客户端
|
||||
* 以json格式抛出异常
|
||||
* @access protected
|
||||
* @param mixed $data 要返回的数据
|
||||
* @param integer $code 返回的code
|
||||
* @param mixed $msg 提示信息
|
||||
* @param string $type 返回数据格式
|
||||
* @param array $header 发送的Header信息
|
||||
* @return void
|
||||
*/
|
||||
protected function json($code = 0, $msg = 'ok', $data= [])
|
||||
{
|
||||
$result = [
|
||||
'code' => $code,
|
||||
'msg' => $msg,
|
||||
'time' => time(),
|
||||
'data' => $data
|
||||
];
|
||||
return json($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* URL重定向
|
||||
* @access protected
|
||||
* @param string $url 跳转的URL表达式
|
||||
* @param array|integer $params 其它URL参数
|
||||
* @param integer $code http code
|
||||
* @param array $with 隐式传参
|
||||
* @return void
|
||||
*/
|
||||
protected function redirect($url)
|
||||
{
|
||||
if(!is_string($url)){
|
||||
$url = $url->__toString();
|
||||
}
|
||||
return redirect($url);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
|
||||
class Error extends BaseController
|
||||
{
|
||||
public function __call($method, $args)
|
||||
{
|
||||
|
||||
if(request()->isAjax()) {
|
||||
return $this->json(404, 'error request!');
|
||||
} else {
|
||||
$referer = $_SERVER['HTTP_REFERER'] ?? null;
|
||||
if (empty($referer)) {
|
||||
$url = '/';
|
||||
} else {
|
||||
$domain = $this->request->domain();
|
||||
$urlInfo = parse_url($referer);
|
||||
$scheme = $urlInfo['scheme'] ?? '';
|
||||
$requestSrc = '';
|
||||
if (!empty($scheme)) {
|
||||
$requestSrc = $scheme.'://'.($urlInfo['host'] ?? '');
|
||||
}
|
||||
if($domain != $requestSrc) {
|
||||
$url = '/';
|
||||
} else {
|
||||
$url = 'javascript:history.back(-1);';
|
||||
}
|
||||
}
|
||||
$result = [
|
||||
'code' => 404,
|
||||
'msg' => '无效请求! 没有找到相关资源',
|
||||
'data' => [],
|
||||
'url' => $url,
|
||||
'wait' => 5,
|
||||
];
|
||||
return view('error/400')->assign($result);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function jump()
|
||||
{
|
||||
$param = request()->param();
|
||||
return view()->assign($param);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
namespace app\controller;
|
||||
|
||||
use app\model\{Category, Block};
|
||||
use think\facade\View;
|
||||
|
||||
|
||||
class Home extends Base
|
||||
{
|
||||
protected $category_id;
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize(); // TODO: Change the autogenerated stub
|
||||
$category = Category::getIndex();
|
||||
$categoryId = $category['id'] ?? 0;
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->setSeo($this->system['seo_title'], $this->system['seo_keywords'], $this->system['seo_description']);
|
||||
$this->data['blocks'] = Block::getByCategoryId($categoryId);
|
||||
$this->category_id=$this->request->param("category_id/d");
|
||||
}
|
||||
//关于我们
|
||||
public function aboutUs(){
|
||||
$Block=["key1"=>"","key2"=>""];
|
||||
$Block["key1"]=Block::getByKeyword(1,$this->category_id);
|
||||
$Block["key2"]=Block::getByKeyword(2,$this->category_id);
|
||||
dump($Block);
|
||||
View::assign($Block);
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\service\Pdf;
|
||||
use app\model\{Category, Block, Slide};
|
||||
use think\facade\View;
|
||||
|
||||
class Index extends Base
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$category = Category::getIndex();
|
||||
$categoryId = $category['id'] ?? 0;
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->setSeo($this->system['seo_title'], $this->system['seo_keywords'], $this->system['seo_description']);
|
||||
$this->data['blocks'] = Block::getByCategoryId($categoryId);
|
||||
View::assign("category", $category);
|
||||
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\service\Layui;
|
||||
use app\model\{Category, Block};
|
||||
use think\Paginator;
|
||||
|
||||
class Page extends Base
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
//动态设置当前分页驱动
|
||||
app('think\App')->bind(Paginator::class, Layui::class);
|
||||
|
||||
$categoryId = $this->request->param("category_id");
|
||||
$category = Category::getById($this->request->param("category_id"));
|
||||
|
||||
if ($category) {
|
||||
//$description = $category['description'] ? $category['description'] : $this->system['seo_description'];
|
||||
$description = $category['description'] ? $category['description'] : $category['title'];
|
||||
$keywords = $category['seo_keywords'] ? $category['seo_keywords'] : $category['title'];
|
||||
//$this->setSeo($category['title'], $this->system['seo_keywords'], $description);
|
||||
$this->setSeo($category['title'] . "-" . $this->system['company_name'], $keywords, $description);
|
||||
} else {
|
||||
return $this->error('错误页面');
|
||||
}
|
||||
$childCategory = Category::getChildrenByParentId($categoryId);
|
||||
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['childCategory'] = $childCategory;
|
||||
$this->data['blocks'] = Block::getByCategoryId($categoryId);
|
||||
return $this->view($category['template_detail']);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api;
|
||||
|
||||
use app\controller\BaseController;
|
||||
use app\model\User;
|
||||
use app\model\WeixinAccountMini;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
class Base extends BaseController
|
||||
{
|
||||
protected $data = [];
|
||||
protected $token;//小程序token
|
||||
protected $openid;//主用户token
|
||||
protected $user;//小程序用户id
|
||||
|
||||
protected function initialize()
|
||||
{
|
||||
$allHeader = $this->request->header();
|
||||
$this->token = isset($allHeader["wechattoken"]) ? $allHeader["wechattoken"] : "";
|
||||
$this->openid = isset($allHeader["openid"]) ? $allHeader["openid"] : "";
|
||||
$this->user = User::userTokenVerification($this->token, $this->openid);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\api;
|
||||
|
||||
use app\service\{Tool};
|
||||
use app\validate\{User as Vuser};
|
||||
use think\facade\Db;
|
||||
use think\exception\ValidateException;
|
||||
use app\model\{User};
|
||||
use think\Exception;
|
||||
use think\facade\Config;
|
||||
|
||||
//登录
|
||||
class Login extends Base
|
||||
{
|
||||
protected function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取openid
|
||||
*/
|
||||
public function getOpenId()
|
||||
{
|
||||
Config::load('extra/wechat', 'wechat');
|
||||
$config = config('wechat');
|
||||
$code = $this->request->param('code/s');
|
||||
$appId = $config["appId"];//appid
|
||||
$appSecret = $config["appSecret"];//appsecret
|
||||
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appId . '&secret=' . $appSecret . '&js_code=' . $code . '&grant_type=authorization_code';
|
||||
$datas = json_decode(Tool::httpRequest($url, "get"), true);
|
||||
//返回状态
|
||||
if (isset($datas["openid"])) {
|
||||
return $this->json(0, "ok", $datas);
|
||||
}
|
||||
return $this->json(1, "null");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 小程序用户登录 创建用户或更新用户信息
|
||||
*/
|
||||
public function wechatMiniLogin()
|
||||
{
|
||||
$data = [];
|
||||
$data['openid'] = $this->request->post('openid/s');//微信用户openid
|
||||
$data['headimgurl'] = $this->request->post('avatarUrl/s');//微信头像
|
||||
$data['nickname'] = $this->request->post('nickName/s');//用户昵称
|
||||
|
||||
try {
|
||||
validate(Vuser::class)->check($data);
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(1, "异常请求");
|
||||
}
|
||||
|
||||
$user = User::getByOpenid($data['openid']);
|
||||
$time = time();
|
||||
$token_close_time = $time + User::TokenCloseTime;
|
||||
$data["login_ip"] = $this->request->ip();
|
||||
$data["last_login"] = $time;
|
||||
$data["token_close_time"] = $token_close_time;
|
||||
$data["token"] = md5($data["openid"] . $time . randomStr(1, 16));
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
//如果没有注册过 就添加
|
||||
if (!empty($user)) {
|
||||
User::create($data);
|
||||
} else {
|
||||
User::updateById($user['id'], $data);
|
||||
}
|
||||
//提交事务
|
||||
Db::commit();
|
||||
return $this->json(0, "ok", [
|
||||
"token" => $data["token"],
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->json(2, $e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,244 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Article as MArticle, Category, System, Log};
|
||||
use app\validate\Article as VArticle;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 内容管理 - 文章管理
|
||||
*/
|
||||
class Article extends Base
|
||||
{
|
||||
//批量修改属性
|
||||
public function attribute()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$ids = input('post.id/a');
|
||||
if(empty($ids) || !is_array($ids)) {
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
$data = [];
|
||||
foreach(['top', 'hot', 'recommend'] as $key){
|
||||
$val = input('post.'.$key, 0);
|
||||
if(in_array($val, [1, 2])){
|
||||
if($val == 1){
|
||||
$data[$key] = 1;
|
||||
}else{
|
||||
$data[$key] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!empty($data)){
|
||||
MArticle::whereIn('id', $ids)->update($data);
|
||||
Log::write('article', 'attribute', '批量修改了文章属性,涉及到的文章ID为:' . implode(',', $ids));
|
||||
}
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
//批量删除
|
||||
public function batchDel()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$ids = input('post.ids/a');
|
||||
if(empty($ids) || !is_array($ids)) {
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
$items = MArticle::getListByIds($ids);
|
||||
if(!empty($items)){
|
||||
$delIds = [];
|
||||
foreach($items as $item){
|
||||
$delIds[] = $item['id'];
|
||||
}
|
||||
MArticle::destroy($delIds);
|
||||
Log::write('article', 'betchDel', '批量删除了文章,涉及到的文章ID为:' . implode(',', $delIds));
|
||||
return $this->json();
|
||||
}else{
|
||||
return $this->json(3, '待删除文章列表为空');
|
||||
}
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MArticle::getById($id);
|
||||
if(!empty($item)){
|
||||
MArticle::destroy($id);
|
||||
Log::write('article', 'del', '删除文章,ID:' . $id . ',标题:' . $item['title']);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3,'待删除文章不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MArticle::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该文章信息不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "category_id='{$item['category_id']}' and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}else{
|
||||
$where = "category_id='{$item['category_id']}' and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}
|
||||
$forSortItems = MArticle::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MArticle();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('article', 'sort', "文章排序,ID:{$id} ,标题:{$item['title']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
$imgimgs = input('post.imgimgs');
|
||||
|
||||
$id = input('post.id/d');
|
||||
$article = MArticle::getById($id);
|
||||
if (empty($article)) {
|
||||
return $this->json(1, '该文章不存在!');
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
if(!empty($imgimgs)){
|
||||
$item['imgs'] = json_encode($imgimgs);
|
||||
}
|
||||
|
||||
try {
|
||||
validate(VArticle::class)->check($item);
|
||||
$auth = session('auth');
|
||||
$item['update_time'] = time();
|
||||
$item['updated'] = $auth['userName'];
|
||||
$content=$item['content'];
|
||||
//替换图片alt
|
||||
$preg = "/<img.*?src=[\"|\'](.*?)[\"|\'].*?>/";
|
||||
$preg_replace_img = '<img src="$1" alt="'.$item['title'].'">';
|
||||
$content = preg_replace($preg,$preg_replace_img,$content);
|
||||
$item['content'] = $content;
|
||||
|
||||
MArticle::updateById($id, $item);
|
||||
Log::write('article', 'edit', "文章编辑,ID:{$id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id');
|
||||
$article = MArticle::getById($id);
|
||||
$category = Category::getById($article['category_id']);
|
||||
if($category['img_width'] && $category['img_height']){
|
||||
$imgSize = $category['img_width'] . '像素 X ' . $category['img_height'] . '像素';
|
||||
}else{
|
||||
$imgSize = System::getArticleImageSize();
|
||||
}
|
||||
|
||||
|
||||
$this->data['item'] = $article;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
|
||||
$imgimgs = input('post.imgimgs');
|
||||
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
if(!empty($imgimgs)){
|
||||
$item['imgs'] = $imgimgs;
|
||||
}
|
||||
try {
|
||||
validate(VArticle::class)->check($item);
|
||||
$content = $item['content'] ?? '';
|
||||
if(isset($item['content'])){
|
||||
unset($item['content']);
|
||||
}
|
||||
//替换图片alt
|
||||
$preg = "/<img.*?src=[\"|\'](.*?)[\"|\'].*?>/";
|
||||
$preg_replace_img = '<img src="$1" alt="'.$item['title'].'">';
|
||||
$content = preg_replace($preg,$preg_replace_img,$content);
|
||||
|
||||
$item['content'] = $content;
|
||||
$article = MArticle::create($item);
|
||||
Log::write('article', 'add', "文章新增,ID:{$article->id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$categoryId = input('param.category_id');
|
||||
$category = Category::getById($categoryId);
|
||||
if(count($category) > 0 && $category['img_width'] && $category['img_height']){
|
||||
$imgSize = $category['img_width'] . '像素 X ' . $category['img_height'] . '像素';
|
||||
}else{
|
||||
$imgSize = System::getArticleImageSize();
|
||||
}
|
||||
|
||||
$this->data['category'] = $category;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use think\facade\{Db, Config, Env};
|
||||
use app\model\{Log as MLog};
|
||||
use app\service\Tool;
|
||||
|
||||
class Backup extends Base
|
||||
{
|
||||
/**
|
||||
* 因受mysql 配置参数net_buffer_length和max_allowed_packet大小的限制,因此insert语句改为单条插入
|
||||
* show VARIABLES like "%net_buffer_length%" 默认单条sql语句长度16k
|
||||
* show VARIABLES like "%max_allowed_packet%" 默认单个sql文件最大容量
|
||||
* sql 文件注释 -- + 空格之后填写注释内容
|
||||
* 因根目录文件夹权限限制,因此需要手动创建backup/data目录并赋予权限(www用户组)
|
||||
*/
|
||||
public function back()
|
||||
{
|
||||
ini_set('max_execution_time', 0);
|
||||
ini_set("memory_limit",-1);
|
||||
set_time_limit(0);
|
||||
|
||||
$path = Config::get('filesystem.disks.backup.root') . '/';
|
||||
$dataBase = Env::get('database.database');
|
||||
// 不要使用单引号,双引号中的变量可以解析,单引号就是绝对的字符串
|
||||
$eol = "\r\n";
|
||||
$eolB = "\r\n\r\n";
|
||||
$info = '-- ------------------------------'.$eol;
|
||||
$info .= '-- 日期: '.date('Y-m-d H:i:s',time()).$eol;
|
||||
$info .= '-- MySQL --Database - '.$dataBase.$eol;
|
||||
$info .= '-- ------------------------------'.$eol;
|
||||
|
||||
$info .= 'CREATE DATABASE IF NOT EXISTS `'.$dataBase.'` DEFAULT CHARACTER SET "utf8mb4" COLLATE "utf8mb4_general_ci";'.$eolB;
|
||||
$info .= 'USE `'.$dataBase.'`;'.$eol;
|
||||
|
||||
if(is_dir($path)) {
|
||||
if(!is_writable($path)) {
|
||||
chmod($path, 0755);
|
||||
}
|
||||
} else {
|
||||
mkdir($path, 0755, true);
|
||||
}
|
||||
$fileName = $path.$dataBase.'_'.date('YmdHis',time()).'.sql';
|
||||
if(file_exists($fileName)) {
|
||||
@unlink($fileName);
|
||||
}
|
||||
// 以追加的方式写入
|
||||
file_put_contents($fileName, $info, FILE_APPEND);
|
||||
$tables = Db::query('show tables');
|
||||
foreach ($tables as $table) {
|
||||
// 表结构
|
||||
$tableName = $table['Tables_in_'.$dataBase];
|
||||
$sqlTable = 'SHOW CREATE TABLE '.$tableName;
|
||||
$res = Db::query($sqlTable);
|
||||
$infoTable = '-- ------------------------------'.$eol;
|
||||
$infoTable .= '-- Table structure for `'.$tableName.'`'.$eol;
|
||||
$infoTable .= '-- ------------------------------'.$eolB;
|
||||
$infoTable .= 'DROP TABLE IF EXISTS `'.$tableName.'`;'.$eolB;
|
||||
$infoTable .= $res[0]['Create Table'].';'.$eolB;
|
||||
// 表数据
|
||||
$infoTable .= '-- ------------------------------'.$eol;
|
||||
$infoTable .= '-- Data for the table `'.$tableName.'`'.$eol;
|
||||
$infoTable .= '-- ------------------------------'.$eolB;
|
||||
file_put_contents($fileName, $infoTable, FILE_APPEND);
|
||||
|
||||
$sqlData = 'select * from '.$tableName;
|
||||
$data = Db::query($sqlData);
|
||||
$count = count($data);
|
||||
if ($count > 0) {
|
||||
$dataStr = 'INSERT INTO `'.$tableName.'` VALUE ';
|
||||
foreach ($data as $k => $item) {
|
||||
$valStr = '(';
|
||||
foreach ($item as $val) {
|
||||
// 字符串转义
|
||||
$val = addslashes($val);
|
||||
$valStr .= '"'.$val.'", ';
|
||||
}
|
||||
// 去除最后的逗号和空格
|
||||
$valStr = substr($valStr,0,strlen($valStr)-2);
|
||||
// 限制单条sql语句在16K以内(可根据mysql配置条件进行调整)
|
||||
$sqlLength = strlen($dataStr) + strlen($valStr);
|
||||
if($sqlLength >= (1024 * 16 - 10)) {
|
||||
$dataStr .= $valStr.');'.$eol;
|
||||
file_put_contents($fileName, $dataStr, FILE_APPEND);
|
||||
// 提前分段写入后需重置数据语句
|
||||
if ($k <= ($count-1)) {
|
||||
$dataStr = 'INSERT INTO `'.$tableName.'` VALUE ';
|
||||
} else {
|
||||
$dataStr = '';
|
||||
}
|
||||
} else {
|
||||
if ($k < ($count-1)) {
|
||||
$dataStr .= $valStr.'),'.$eol;
|
||||
} else {
|
||||
$dataStr .= $valStr.');'.$eolB;
|
||||
}
|
||||
}
|
||||
}
|
||||
file_put_contents($fileName, $dataStr, FILE_APPEND);
|
||||
}
|
||||
}
|
||||
clearstatcache();
|
||||
|
||||
$backups = explode('/', $fileName);
|
||||
$backupName = $backups[count($backups)-1];
|
||||
$src = Config::get('filesystem.disks.backup.url') . '/';
|
||||
return $this->json(0, '备份成功:' . $src . $backupName);
|
||||
}
|
||||
|
||||
|
||||
public function index()
|
||||
{
|
||||
$path = Config::get('filesystem.disks.backup.root') . '/';
|
||||
$src = Config::get('filesystem.disks.backup.url') . '/';
|
||||
$items = [];
|
||||
if(is_dir($path)) {
|
||||
if(!is_readable($path)) {
|
||||
chmod($path,0755);
|
||||
}
|
||||
$files = scandir($path);
|
||||
foreach ($files as $file) {
|
||||
if($file != '.' && $file != '..') {
|
||||
$ext = substr($file, -4);
|
||||
if ($ext == '.sql') {
|
||||
$creatTime = substr($file, -18, 14);
|
||||
$items[] = [
|
||||
'file' => $file,
|
||||
'path' => $src . $file,
|
||||
'time' =>is_numeric($creatTime) ? date('Y-m-d H:i:s', strtotime($creatTime)) : '',
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
clearstatcache();
|
||||
|
||||
$this->data['items'] = $items;
|
||||
$this->data['backupPath'] = str_replace('\\','/', $path);
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
public function del()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$filePath = input('post.id');
|
||||
Tool::delFile($filePath);
|
||||
MLog::write('backup', 'del', '删除了备份数据文件,文件路径为:' . $filePath);
|
||||
return $this->json();
|
||||
} else {
|
||||
return $this->json(1, '非法请求');
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\controller\BaseController;
|
||||
|
||||
/**
|
||||
* 控制器基础类
|
||||
*/
|
||||
class Base extends BaseController
|
||||
{
|
||||
protected $data = [];
|
||||
protected function initialize()
|
||||
{
|
||||
$this->middleware = [
|
||||
// 'csrf',
|
||||
'auth' => [
|
||||
'except' => ['manager.login/index']
|
||||
]
|
||||
];
|
||||
$auth = session('auth');
|
||||
$this->data['member'] = $auth;
|
||||
if(session('?__token__')){
|
||||
$this->data['_token'] = session('__token__');
|
||||
}else{
|
||||
$this->data['_token'] = $this->request->buildToken();
|
||||
}
|
||||
$this->data['groupId'] = $auth['groupId'] ?? 0;
|
||||
}
|
||||
|
||||
//变量赋值到模板
|
||||
protected function view()
|
||||
{
|
||||
return view()->assign($this->data);
|
||||
}
|
||||
|
||||
protected function error($msg = '', string $url = null, $data = '', int $wait = 3)
|
||||
{
|
||||
if (is_null($url)) {
|
||||
$url = $this->request->isAjax() ? '' : 'javascript:history.back(-1);';
|
||||
} elseif ($url) {
|
||||
$url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : $this->app->route->buildUrl($url);
|
||||
}
|
||||
$result = [
|
||||
'code' => 0,
|
||||
'msg' => $msg,
|
||||
'data' => $data,
|
||||
'url' => $url,
|
||||
'wait' => $wait,
|
||||
];
|
||||
|
||||
return $this->redirect(url('manager.error/jump', $result));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,314 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Block, Category as MCategory, Model as MCModel, Log};
|
||||
use app\validate\Category as VCategory;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Cache;
|
||||
|
||||
class Category extends Base
|
||||
{
|
||||
//栏目列表
|
||||
public function index()
|
||||
{
|
||||
$auth = session('auth');
|
||||
$authCates = array_filter(explode(',', $auth['cates']));
|
||||
if ($auth['groupId'] == 1) {
|
||||
$cates = MCategory::getList();
|
||||
} else {
|
||||
$cates = MCategory::getList(true, $authCates);
|
||||
}
|
||||
$items = MCategory::getCates($cates);
|
||||
|
||||
$powerAdd = false;
|
||||
$ruleNames = Cache::get('rule_names_'.$auth['groupId']);
|
||||
if (is_array($ruleNames) && in_array('category/add', $ruleNames, true)) {
|
||||
$powerAdd = true;
|
||||
}
|
||||
|
||||
$this->data['items'] = $items;
|
||||
$this->data['power_add'] = $powerAdd;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
//批量删除
|
||||
public function batchDel()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$ids = input('post.ids/a');
|
||||
if(is_array($ids)) {
|
||||
$idsArr = $ids;
|
||||
} else {
|
||||
$idsArr = array_filter(explode(',', $ids));
|
||||
}
|
||||
if(count($idsArr) == 0) {
|
||||
return $this->json(1, '无效请求,参数错误!');
|
||||
}
|
||||
if (MCategory::hasChildren($idsArr)) {
|
||||
return $this->json(2, '需删除的栏目下存在下级栏目,不可删除。请检查核实后再操作!');
|
||||
}
|
||||
$categories = MCategory::getListByIds($idsArr);
|
||||
if(!empty($categories)){
|
||||
$hasIds = [];
|
||||
foreach($categories as $cate){
|
||||
$hasIds[] = $cate['id'];
|
||||
}
|
||||
MCategory::destroy($hasIds);
|
||||
Log::write('category', 'betchDel', '批量删除了栏目,涉及到的ID为:' . implode(',', $hasIds));
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '删除失败!栏目不存在,请刷新页面后再试!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
if(MCategory::hasChildren($id)){
|
||||
return $this->json(4, '此栏目有下级栏目,不可删除。请检查核实后再操作!');
|
||||
}
|
||||
$cate = MCategory::getById($id);
|
||||
if(!empty($cate)){
|
||||
MCategory::destroy($id);
|
||||
Log::write('category', 'del', '删除栏目,ID:' . $id . ',标题:' . $cate['title']);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '删除失败!栏目不存在,请刷新页面后再试!');
|
||||
} else {
|
||||
return $this->json(2, '无效请求,参数错误!');
|
||||
}
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MCategory::getById($id);
|
||||
if(empty($item)) {
|
||||
return $this->json(3, '无此栏目!');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "parent_id='{$item['parent_id']}' and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "parent_id='{$item['parent_id']}' and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MCategory::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MCategory();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('category', 'sort', "栏目排序,ID:{$id} ,标题:{$item['title']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新栏目数据
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$id = input('post.id');
|
||||
$img = input('post.img');
|
||||
if (count($item) > 0 && (is_numeric($id) === true && $id > 0)) {
|
||||
try {
|
||||
validate(VCategory::class)->check($item);
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
MCategory::updateById($id, $item);
|
||||
Log::write('category', 'edit', "栏目编辑,ID:{$id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1,'传入参数错误,请核对之后再操作!');
|
||||
} else {
|
||||
$id = input('param.id');
|
||||
if (is_numeric($id) === true && $id > 0) {
|
||||
$item = MCategory::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(1,'参数错误,无此栏目!');
|
||||
}
|
||||
|
||||
$this->data['item'] = $item;
|
||||
$this->data['parent'] = MCategory::getById($item['parent_id']);
|
||||
$this->data['models'] = MCModel::getList();
|
||||
return $this->view();
|
||||
}
|
||||
return $this->json(1,'参数错误,请核对之后再操作!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 栏目添加
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
if (is_array($item) === true && count($item) > 0) {
|
||||
if (!empty($img)) {
|
||||
$item['src'] = $img;
|
||||
}
|
||||
try {
|
||||
validate(VCategory::class)->check($item);
|
||||
if(!isset($item['number']) || $item['number'] <= 0){
|
||||
$item['number'] = 20;
|
||||
}
|
||||
if($item['parent_id'] == 0){
|
||||
$item['path'] = ',0,';
|
||||
}else{
|
||||
$parent = MCategory::getById($item['parent_id']);
|
||||
if(empty($parent)){
|
||||
$item['path'] = ',0,';
|
||||
}else{
|
||||
$item['path'] = $parent['path'] . $parent['id'] . ',';
|
||||
}
|
||||
}
|
||||
$category = MCategory::create($item);
|
||||
|
||||
|
||||
//如果是关于市场 就添加写入blocks内容
|
||||
if($item['parent_id']==MCategory::AboutMarketId){
|
||||
$blocks = [
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::BLOCK,
|
||||
"keyword"=>'title',
|
||||
"title"=>$category['title'],
|
||||
"value"=>'让每一位养殖户依靠优质水产苗种走上致富的快车道,愿伟大事业,继往开来!(请修改)',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::TEXT,
|
||||
"keyword"=>'content',
|
||||
"title"=>'简介内容(无需修改)',
|
||||
"value"=>'这里是内容 (请修改)',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::TEXT,
|
||||
"keyword"=>'Marketpurpose',
|
||||
"title"=>'内容1(请修改)',
|
||||
"value"=>'这里是内容 (请修改)',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::TEXT,
|
||||
"keyword"=>'Businessobjectives',
|
||||
"title"=>'内容2(请修改)',
|
||||
"value"=>'这里是内容 (请修改)',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::TEXT,
|
||||
"keyword"=>'Marketvision',
|
||||
"title"=>'内容3(请修改)',
|
||||
"value"=>'这里是内容 (请修改)',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::IMG,
|
||||
"keyword"=>'leftimg',
|
||||
"title"=>'左图',
|
||||
"width"=>'413',
|
||||
"height"=>'246',
|
||||
"value"=>'/storage/20210726/60fe7cdf7f0f8.jpg',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::IMG,
|
||||
"keyword"=>'centerimg',
|
||||
"title"=>'中图',
|
||||
"width"=>'413',
|
||||
"height"=>'246',
|
||||
"value"=>'/storage/20210726/60fe7d0484182.jpg',
|
||||
],
|
||||
[
|
||||
"category_id"=>$category['id'],
|
||||
"type"=>Block::IMG,
|
||||
"keyword"=>'rightimg',
|
||||
"title"=>'右图',
|
||||
"width"=>'413',
|
||||
"height"=>'246',
|
||||
"value"=>'/storage/20210726/60fe7d21aaa19.jpg',
|
||||
],
|
||||
];
|
||||
Block::create($blocks[0]);
|
||||
Block::create($blocks[1]);
|
||||
Block::create($blocks[2]);
|
||||
Block::create($blocks[3]);
|
||||
Block::create($blocks[4]);
|
||||
Block::create($blocks[5]);
|
||||
Block::create($blocks[6]);
|
||||
Block::create($blocks[7]);
|
||||
}
|
||||
|
||||
|
||||
Log::write('category', 'add', "栏目新增,ID:{$category->id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2,$e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1, '传入值错误,请核对之后再操作!');
|
||||
} else {
|
||||
$parentId = input('param.id')??input('param.parent_id');
|
||||
if(empty($parentId)){
|
||||
$parent = [];
|
||||
}else{
|
||||
$parent = MCategory::getById($parentId);
|
||||
}
|
||||
$this->data['parent'] = $parent;
|
||||
$this->data['models'] = MCModel::getList();
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,179 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Article as MArticle, Category, Article, Block, Log, History};
|
||||
|
||||
class Content extends Base
|
||||
{
|
||||
//文章
|
||||
public function article()
|
||||
{
|
||||
$categoryId = input('param.category_id');
|
||||
$keyword = input('param.keyword');
|
||||
$recommend_flag = input('param.recommend_flag');
|
||||
$param = input('param.param/a', []);
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
return $this->error('无此栏目');
|
||||
}
|
||||
$list = Article::getList($categoryId, 20, $keyword, $param,$recommend_flag);
|
||||
$this->data['list'] = $list;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['keyword'] = $keyword;
|
||||
$this->data['recommend_flag'] = $recommend_flag;
|
||||
$this->data['param'] = $param;
|
||||
|
||||
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
//做页面跳转
|
||||
public function index()
|
||||
{
|
||||
$items = Category::getList();
|
||||
if(!empty($items)){
|
||||
$items = Category::getCates($items);
|
||||
}
|
||||
|
||||
if(!empty($items)){
|
||||
$first = array_shift($items);
|
||||
if(isset($first['children'])){
|
||||
$childrenFirst = array_shift($first['children']);
|
||||
$url = url('manager.content/'.$childrenFirst['manager'],['category_id' => $childrenFirst['id']]);
|
||||
}else{
|
||||
$url = url('manager.content/'.$first['manager'],['category_id' => $first['id']]);
|
||||
}
|
||||
if(!empty($url)){
|
||||
return $this->redirect($url);
|
||||
}
|
||||
}else{
|
||||
return $this->redirect(url('manager.category/add'));
|
||||
}
|
||||
}
|
||||
//单页
|
||||
public function page()
|
||||
{
|
||||
if($this->request->isAjax()){
|
||||
$blocks = input('post.block/a'); //所有文本信息
|
||||
$texts = input('post.text/a'); //所有富文本信息
|
||||
$codes = input('post.code/a'); //所有代码信息
|
||||
$categoryId = input('post.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
unset($_POST['block']);
|
||||
unset($_POST['text']);
|
||||
unset($_POST['file']);
|
||||
unset($_POST['code']);
|
||||
$imgs = []; //图片信息
|
||||
$videos = []; //视频信息
|
||||
$groups = []; //组图信息
|
||||
$groupIds = input('post.groupIds/a', []);
|
||||
foreach($_POST as $key => $val){
|
||||
if(strpos($key, '_') !== FALSE){
|
||||
$keys = explode('_',$key);
|
||||
if($keys[1] == 'img'){ //图片
|
||||
$imgs[$keys[2]] = $val;
|
||||
}elseif($keys[1] == 'video'){ //视频
|
||||
$videos[$keys[2]][$keys[0]] = $val;
|
||||
}elseif($keys[1] == 'group'){ //组图
|
||||
$groups[$keys[2]] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
$data = [];
|
||||
if(!empty($blocks)){
|
||||
foreach($blocks as $key => $block){
|
||||
$data[] = [
|
||||
'id' => $key,
|
||||
'value' => $block
|
||||
];
|
||||
}
|
||||
}
|
||||
if(!empty($texts)){
|
||||
foreach($texts as $key => $text){
|
||||
$data[] = [
|
||||
'id' => $key,
|
||||
'value' => $text
|
||||
];
|
||||
}
|
||||
}
|
||||
if(!empty($codes)){
|
||||
foreach($codes as $key => $code){
|
||||
$data[] = [
|
||||
'id' => $key,
|
||||
'value' => $code
|
||||
];
|
||||
}
|
||||
}
|
||||
if(!empty($imgs)){
|
||||
foreach($imgs as $key => $img){
|
||||
$data[] = [
|
||||
'id' => $key,
|
||||
'value' => $img
|
||||
];
|
||||
}
|
||||
}
|
||||
if(!empty($videos)){
|
||||
foreach($videos as $key => $video){
|
||||
$data[] = [
|
||||
'id' => $key,
|
||||
'img' => $video['img'],
|
||||
'value' => $video['video']
|
||||
];
|
||||
}
|
||||
}
|
||||
if(!empty($groupIds)){
|
||||
foreach($groupIds as $key => $groupId){
|
||||
$group = $groups[$groupId] ?? [];
|
||||
$data[] = [
|
||||
'id' => $groupId,
|
||||
'value' => json_encode($group)
|
||||
];
|
||||
}
|
||||
}
|
||||
$block = new Block;
|
||||
$block->saveAll($data);
|
||||
Log::write('content', 'page', "单页编辑,栏目ID:{$category['id']} ,标题:{$category['title']}");
|
||||
return $this->json();
|
||||
}else{
|
||||
$categoryId = input('param.category_id');
|
||||
$children = Category::getChildrenByParentId($categoryId);
|
||||
if(empty($children)){
|
||||
$category = Category::getById($categoryId);
|
||||
}else{
|
||||
$child = Category::getChildrenByParentId($children[0]['id']);
|
||||
if(empty($child)){
|
||||
$category = $children[0];
|
||||
}else{
|
||||
$category = $child[0];
|
||||
}
|
||||
}
|
||||
if(empty($category)){
|
||||
return $this->redirect(url('manager.content/index'));
|
||||
}
|
||||
|
||||
$blocks = Block::getByCategoryId($categoryId);
|
||||
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['blocks'] = $blocks;
|
||||
$this->data['groupId'] = session('auth.groupId');
|
||||
$this->data['types'] = Block::getTypes();
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
// 发展历程
|
||||
public function history()
|
||||
{
|
||||
$categoryId = input('param.category_id/d', 0);
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
return $this->redirect(url('manager.content/index'));
|
||||
}
|
||||
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['items'] = History::getPaginateList($categoryId, 20, false);
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Desk as MDesk, Hall, System, Log};
|
||||
use app\validate\Desk as VDesk;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 坐桌子管理
|
||||
*/
|
||||
class Desk extends Base
|
||||
{
|
||||
|
||||
//列表
|
||||
public function index()
|
||||
{
|
||||
$hallId = input('hall_id/d', 0);
|
||||
$hall = Hall::getById($hallId);
|
||||
if (empty($hall)) {
|
||||
return $this->error("大厅不存在");
|
||||
}
|
||||
$keyword = input('param.keyword');
|
||||
$list = MDesk::getList(20, $keyword);
|
||||
$this->data['hall'] = $hall;
|
||||
$this->data['hall_id'] = $hallId;
|
||||
$this->data['list'] = $list;
|
||||
$this->data['keyword'] = $keyword;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if (is_numeric($id) && $id > 0) {
|
||||
$item = MDesk::getById($id);
|
||||
if (!empty($item)) {
|
||||
MDesk::destroy($id);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '待删除信息不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$item = input('post.item/a');
|
||||
$id = input('post.id/d');
|
||||
$desk = MDesk::getById($id);
|
||||
if (empty($desk)) {
|
||||
return $this->json(1, '该信息不存在!');
|
||||
}
|
||||
$repeat = MDesk::editRepeat($desk['id'], $desk['hall_id'], $item['number']);
|
||||
if (!empty($repeat)) {
|
||||
return $this->json(1, '桌号不可重复!');
|
||||
}
|
||||
try {
|
||||
validate(VDesk::class)->check($item);
|
||||
MDesk::updateById($id, $item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
} else {
|
||||
$id = input('param.id');
|
||||
$desk = MDesk::getById($id);
|
||||
$this->data['desk_type'] = MDesk::$desk_type;
|
||||
$this->data['item'] = $desk;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$item = input('post.item/a');
|
||||
$repeat = MDesk::addRepeat($item['hall_id'], $item['number']);
|
||||
if (!empty($repeat)) {
|
||||
return $this->json(1, '桌号不可重复!');
|
||||
}
|
||||
try {
|
||||
validate(VDesk::class)->check($item);
|
||||
MDesk::create($item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
} else {
|
||||
$this->data['hall_id'] = input('hall_id/d', 0);
|
||||
$this->data['desk_type'] = MDesk::$desk_type;
|
||||
$this->data['default_type'] = MDesk::$default_type;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
class Error
|
||||
{
|
||||
public function jump()
|
||||
{
|
||||
$param = request()->param();
|
||||
return view()->assign($param);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{File as MFile, Article, Block, Category, Link, Slide, Log};
|
||||
use app\service\Tool;
|
||||
|
||||
class File extends Base
|
||||
{
|
||||
//删除磁盘上的文件
|
||||
public function delPath()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$paths = input('post.paths/a');
|
||||
if(!empty($paths)){
|
||||
foreach($paths as $path){
|
||||
Tool::delFile($path);
|
||||
}
|
||||
Log::write('file', 'delPath', '批量删除了磁盘文件,涉及到的文件路径为:' . implode(',', $paths));
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(2, '待删除文件列表为空');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
//删除文件记录
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$ids = input('post.ids/a');
|
||||
if(empty($ids) || !is_array($ids)) {
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
$items = MFile::getListByIds($ids);
|
||||
if(!empty($items)){
|
||||
$delIds = [];
|
||||
foreach($items as $item){
|
||||
$delIds[] = $item['id'];
|
||||
if($item['type'] == MFile::IMG){
|
||||
Tool::delFile($item['src'], 1);
|
||||
}else{
|
||||
Tool::delFile($item['src']);
|
||||
}
|
||||
}
|
||||
MFile::destroy($delIds);
|
||||
Log::write('file', 'del', '批量删除了文件,涉及到的文件ID为:' . implode(',', $delIds));
|
||||
return $this->json();
|
||||
}else{
|
||||
return $this->json(3, '待删除文件列表为空');
|
||||
}
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
/**
|
||||
* 未使用文件列表,
|
||||
* 1. 遍历数据库中使用的图片视频及文件路径
|
||||
* 2. 遍历上传目录中的文件
|
||||
* 3. 数据对比,找出存在目录中的文件&不在数据库中的文件
|
||||
* 4. 页面上显示查找出来的文件
|
||||
*/
|
||||
public function unuse()
|
||||
{
|
||||
$filesInUse = $this->getAllFilesInUse(); //数据库中在使用的文件
|
||||
$rootPath = app()->getRootPath();
|
||||
$uploadPath = $rootPath . 'storage';
|
||||
$uploadedFiles = getAllFilesByPath($uploadPath, $rootPath); //磁盘上上传的文件
|
||||
$files = MFile::getAll();
|
||||
$dbUploadedFiles = []; //数据库中上传的文件
|
||||
foreach($files as $file){
|
||||
$src = trim($file['src']);
|
||||
if(!empty($src)){
|
||||
$key = getKeyByPath($src);
|
||||
$dbUploadedFiles[$key] = $file;
|
||||
}
|
||||
}
|
||||
|
||||
$uploadedNotInUseFiles = array_diff_key($uploadedFiles, $filesInUse); //磁盘上上传未使用的文件
|
||||
$dbUploadedNotInUseFiles = array_diff_key($dbUploadedFiles, $filesInUse); //数据库中上传未使用的文件
|
||||
$bothNotInUseFiles = array_intersect_key($uploadedNotInUseFiles, $dbUploadedNotInUseFiles); //磁盘和数据库中,两边都未使用
|
||||
$this->data['uploadedNotInUseFiles'] = $uploadedNotInUseFiles;
|
||||
$this->data['dbUploadedNotInUseFiles'] = $dbUploadedNotInUseFiles;
|
||||
$this->data['bothNotInUseFilesKey'] = array_keys($bothNotInUseFiles);
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
//获取所有在使用的文件
|
||||
private function getAllFilesInUse()
|
||||
{
|
||||
$files = [];
|
||||
$blockFiles = Block::getFilesInUse();
|
||||
if(!empty($blockFiles)){
|
||||
$files = array_merge($files, $blockFiles);
|
||||
}
|
||||
$slideFiles = Slide::getFilesInUse();
|
||||
if(!empty($slideFiles)){
|
||||
$files = array_merge($files, $slideFiles);
|
||||
}
|
||||
$linkFiles = Link::getFilesInUse();
|
||||
if(!empty($linkFiles)){
|
||||
$files = array_merge($files, $linkFiles);
|
||||
}
|
||||
$categoryFiles = Category::getFilesInUse();
|
||||
if(!empty($categoryFiles)){
|
||||
$files = array_merge($files, $categoryFiles);
|
||||
}
|
||||
$articleFiles = Article::getFilesInUse();
|
||||
if(!empty($articleFiles)){
|
||||
$files = array_merge($files, $articleFiles);
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
||||
|
||||
//ajax获取文件列表
|
||||
public function ajaxList()
|
||||
{
|
||||
if($this->request->isAjax()){
|
||||
$page = input('param.page/d', 1);
|
||||
$size = input('param.size/d', 20);
|
||||
if(!is_integer($page) || $page < 1){
|
||||
$page = 1;
|
||||
}
|
||||
if (!is_integer($size) || $size < 1) {
|
||||
$size = 20;
|
||||
}
|
||||
$type = input('param.type', '');
|
||||
if(!in_array($type, array_keys(MFile::getTypes()))){
|
||||
$type = '';
|
||||
}
|
||||
$items = MFile::getList($type, $page, $size);
|
||||
return $this->json(0, 'ok', $items);
|
||||
}
|
||||
return $this->json(1, '无此操作');
|
||||
}
|
||||
//列表
|
||||
public function index()
|
||||
{
|
||||
$items = MFile::getListPage();
|
||||
$this->data['items'] = $items;
|
||||
$this->data['types'] = MFile::getTypes();
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,150 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Gift as MGift, Category, System, Log};
|
||||
use app\validate\Gift as VGift;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 礼物管理
|
||||
*/
|
||||
class Gift extends Base
|
||||
{
|
||||
|
||||
//列表
|
||||
public function index()
|
||||
{
|
||||
$keyword = input('param.keyword');
|
||||
$list = MGift::getList( 20, $keyword);
|
||||
$this->data['list'] = $list;
|
||||
$this->data['keyword'] = $keyword;
|
||||
return $this->view();
|
||||
}
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MGift::getById($id);
|
||||
if(!empty($item)){
|
||||
MGift::destroy($id);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3,'待删除信息不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MGift::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该文章信息不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = " sort > {$item['sort']} ";
|
||||
$order = "sort asc";
|
||||
}else{
|
||||
$where = " sort < {$item['sort']} ";
|
||||
$order = "sort desc";
|
||||
}
|
||||
$forSortItems = MGift::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MGift();
|
||||
$model->saveAll($updateData);
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
|
||||
$id = input('post.id/d');
|
||||
$gift = MGift::getById($id);
|
||||
if (empty($gift)) {
|
||||
return $this->json(1, '该信息不存在!');
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['img'] = $img;
|
||||
}
|
||||
try {
|
||||
validate(VGift::class)->check($item);
|
||||
$item['update_time'] = time();
|
||||
MGift::updateById($id, $item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id');
|
||||
$gift = MGift::getById($id);
|
||||
$this->data['item'] = $gift;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
|
||||
if(!empty($img)){
|
||||
$item['img'] = $img;
|
||||
}
|
||||
|
||||
try {
|
||||
validate(VGift::class)->check($item);
|
||||
MGift::create($item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{AuthGroup, AuthRule, Log};
|
||||
use app\validate\AuthGroup as VAuthGroup;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 角色管理控制器
|
||||
*/
|
||||
class Group extends Base
|
||||
{
|
||||
/**
|
||||
* 角色、分组删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if (is_numeric($id) === true && $id > 0) {
|
||||
$item = AuthGroup::getById($id);
|
||||
if(!empty($item)){
|
||||
AuthGroup::destroy($id);
|
||||
Log::write('group', 'del', '删除角色,ID:' . $id . ',名称:' . $item['title']);
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(2, '传入参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
/**
|
||||
* 角色、分组权限分配
|
||||
*/
|
||||
public function rule()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$rules = input('post.rules/a');
|
||||
$groupId = input('post.group_id/d');
|
||||
if (is_array($rules) && (is_numeric($groupId) === true && $groupId > 0)) {
|
||||
$group = AuthGroup::getById($groupId);
|
||||
if(empty($group)){
|
||||
return $this->json(2, '无此角色信息,请核对之后再操作!');
|
||||
}
|
||||
AuthGroup::updateRules($groupId, $rules);
|
||||
// 重置该角色对应的权限缓存
|
||||
AuthGroup::resetGroupRulesCache($groupId);
|
||||
Log::write('group', 'rule', '角色分配权限,ID:' . $groupId . ',名称:' . $group['title']);
|
||||
return $this->json();
|
||||
}else{
|
||||
return $this->json(3, '传入参数错误,请核对之后再操作!');
|
||||
}
|
||||
} else {
|
||||
$groupId = input('param.group_id/d');
|
||||
$group = AuthGroup::getById($groupId);
|
||||
if(!empty($group)){
|
||||
$rules = AuthRule::getListTree();
|
||||
$this->data['group_id'] = $groupId;
|
||||
$this->data['group'] = $group;
|
||||
$this->data['rules'] = $rules;
|
||||
return $this->view();
|
||||
}else{
|
||||
return $this->json(1, '无此角色信息,请核对之后再操作!');
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 角色、分组添加
|
||||
* @param int $status 1:正常;0:禁止
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$title = trim(input('post.title'));
|
||||
$status = input('post.status/d');
|
||||
if (!empty($title) && (is_numeric($status) === true) && ($status == 1 || $status == 0)) {
|
||||
$item = [
|
||||
'title' => $title,
|
||||
'status' => $status
|
||||
];
|
||||
try {
|
||||
validate(VAuthGroup::class)->check($item);
|
||||
$group = AuthGroup::create($item);
|
||||
Log::write('group', 'add', "角色新增,ID:{$group->id} ,标题:{$group->title}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1, '传入参数错误,请核对之后再操作!');
|
||||
}else{
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色、分组编辑
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$title = trim(input('post.title'));
|
||||
$status = input('post.status/d');
|
||||
$id = input('post.id/d');
|
||||
if (!empty($title) && ($status == 1 || $status == 0) && (is_numeric($id) === true && $id > 0)) {
|
||||
$item = [
|
||||
'title' => $title,
|
||||
'status' => $status
|
||||
];
|
||||
try {
|
||||
validate(VAuthGroup::class)->check($item);
|
||||
AuthGroup::updateById($id, $item);
|
||||
Log::write('group', 'edit', "角色编辑,ID:{$id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1, '传入参数错误,请核对之后再操作!');
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if (is_numeric($id) === true && $id > 0) {
|
||||
$item = AuthGroup::getById($id);
|
||||
$this->data['item'] = $item;
|
||||
return $this->view();
|
||||
}
|
||||
return $this->json(1, '传入参数错误,请核对之后再操作!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有角色分组信息
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$list = AuthGroup::select()->toArray();
|
||||
$this->data['list'] = $list;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Hall as MHall,HallLayout};
|
||||
use app\validate\Hall as VHall;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 大厅管理
|
||||
*/
|
||||
class Hall extends Base
|
||||
{
|
||||
|
||||
//列表
|
||||
public function index()
|
||||
{
|
||||
$keyword = input('param.keyword');
|
||||
$list = MHall::getList( 20, $keyword);
|
||||
$this->data['list'] = $list;
|
||||
$this->data['keyword'] = $keyword;
|
||||
return $this->view();
|
||||
}
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MHall::getById($id);
|
||||
if(!empty($item)){
|
||||
MHall::destroy($id);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3,'待删除信息不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MHall::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该文章信息不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = " sort > {$item['sort']} ";
|
||||
$order = "sort asc";
|
||||
}else{
|
||||
$where = " sort < {$item['sort']} ";
|
||||
$order = "sort desc";
|
||||
}
|
||||
$forSortItems = MHall::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MHall();
|
||||
$model->saveAll($updateData);
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
|
||||
$item = input('post.item/a');
|
||||
|
||||
$img = input('post.img');
|
||||
$imgs = input('post.imgs/a');
|
||||
|
||||
|
||||
if(!empty($img)){
|
||||
$item['img'] = $img;
|
||||
}
|
||||
|
||||
if(!empty($imgs)){
|
||||
$item['imgs'] = json_encode($imgs);
|
||||
}
|
||||
|
||||
$id = input('post.id/d');
|
||||
$gift = MHall::getById($id);
|
||||
if (empty($gift)) {
|
||||
return $this->json(1, '该信息不存在!');
|
||||
}
|
||||
|
||||
try {
|
||||
validate(VHall::class)->check($item);
|
||||
$item['update_time'] = time();
|
||||
MHall::updateById($id, $item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id');
|
||||
$gift = MHall::getById($id);
|
||||
$this->data['item'] = $gift;
|
||||
$this->data['hall_layout'] = HallLayout::getAll();
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
$imgs = input('post.imgs/a');
|
||||
|
||||
|
||||
|
||||
if(!empty($img)){
|
||||
$item['img'] = $img;
|
||||
}
|
||||
if(!empty($imgs)){
|
||||
$item['imgs'] = $imgs;
|
||||
}
|
||||
try {
|
||||
validate(VHall::class)->check($item);
|
||||
MHall::create($item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$this->data['hall_layout'] = HallLayout::getAll();
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{HallLayout as MHallLayout};
|
||||
use app\validate\HallLayout as VHallLayout;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 大厅布局管理
|
||||
*/
|
||||
class HallLayout extends Base
|
||||
{
|
||||
|
||||
//列表
|
||||
public function index()
|
||||
{
|
||||
$keyword = input('param.keyword');
|
||||
$list = MHallLayout::getList( 20, $keyword);
|
||||
$this->data['list'] = $list;
|
||||
$this->data['keyword'] = $keyword;
|
||||
return $this->view();
|
||||
}
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MHallLayout::getById($id);
|
||||
if(!empty($item)){
|
||||
MHallLayout::destroy($id);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3,'待删除信息不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MHallLayout::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该文章信息不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = " sort > {$item['sort']} ";
|
||||
$order = "sort asc";
|
||||
}else{
|
||||
$where = " sort < {$item['sort']} ";
|
||||
$order = "sort desc";
|
||||
}
|
||||
$forSortItems = MHallLayout::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MHallLayout();
|
||||
$model->saveAll($updateData);
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
|
||||
$item = input('post.item/a');
|
||||
$imglayout = input('post.img');
|
||||
|
||||
if(!empty($imglayout)){
|
||||
$item['layout_img'] = $imglayout;
|
||||
}
|
||||
|
||||
$id = input('post.id/d');
|
||||
$gift = MHallLayout::getById($id);
|
||||
if (empty($gift)) {
|
||||
return $this->json(1, '该信息不存在!');
|
||||
}
|
||||
|
||||
try {
|
||||
validate(VHallLayout::class)->check($item);
|
||||
$item['update_time'] = time();
|
||||
MHallLayout::updateById($id, $item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id');
|
||||
$gift = MHallLayout::getById($id);
|
||||
$this->data['item'] = $gift;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
|
||||
$imglayout = input('post.img');
|
||||
|
||||
if(!empty($imglayout)){
|
||||
$item['layout_img'] = $imglayout;
|
||||
}
|
||||
try {
|
||||
validate(VHallLayout::class)->check($item);
|
||||
MHallLayout::create($item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else{
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,345 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{HistoryInfo as MHistoryInfo, History as MHistory, Category as MCategory, Log as MLog, System};
|
||||
use think\exception\ValidateException;
|
||||
use app\validate\{History as VHistory, HistoryInfo as VHistoryInfo};
|
||||
use think\facade\Db;
|
||||
|
||||
/**
|
||||
* 发展历程
|
||||
* Class History
|
||||
* @package app\controller\manager
|
||||
*/
|
||||
class History extends Base
|
||||
{
|
||||
public function add()
|
||||
{
|
||||
if(request()->isPost()) {
|
||||
$params = input('post.item/a', []);
|
||||
$params = arrayHtmlFilter($params);
|
||||
try {
|
||||
validate(VHistory::class)->check($params);
|
||||
$data = [
|
||||
'title' => $params['title'],
|
||||
'visible' => $params['visible'],
|
||||
'category_id' => $params['category_id'],
|
||||
];
|
||||
$newItem = MHistory::create($data);
|
||||
MLog::write('history', 'add', '新增发展历程,ID:'.$newItem->id);
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
return $this->json();
|
||||
} else {
|
||||
$categoryId = input('param.category_id/d', 0);
|
||||
$category = MCategory::getById($categoryId);
|
||||
$this->data['category'] = $category;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
public function edit()
|
||||
{
|
||||
$id = input('param.id/d', 0);
|
||||
$item = MHistory::getById($id);
|
||||
if(count($item) == 0) {
|
||||
return $this->json(1, '该历程信息不存在');
|
||||
}
|
||||
if(request()->isPost()) {
|
||||
$params = input('post.item/a', []);
|
||||
$params = arrayHtmlFilter($params);
|
||||
try {
|
||||
validate(VHistory::class)->check($params);
|
||||
$data = [
|
||||
'title' => $params['title'],
|
||||
'visible' => $params['visible'],
|
||||
];
|
||||
MHistory::updateById($id, $data);
|
||||
MLog::write('history', 'edit', '修改发展历程,ID:'.$id);
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
return $this->json();
|
||||
} else {
|
||||
$this->data['item'] = $item;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
public function sort()
|
||||
{
|
||||
if(request()->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MHistory::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该历程信息不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "category_id='{$item['category_id']}' and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "category_id='{$item['category_id']}' and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MHistory::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MHistory();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
MLog::write('history', 'sort', "发展历程排序,ID:{$id} ,{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '无此操作');
|
||||
}
|
||||
|
||||
// 删除历程和历程相关的事例
|
||||
public function del()
|
||||
{
|
||||
if(request()->isPost()) {
|
||||
$historyId = input('param.id/d', 0);
|
||||
$item = MHistory::getById($historyId);
|
||||
if(count($item) == 0) {
|
||||
return $this->json(2, '该历程信息不存在');
|
||||
}
|
||||
Db::startTrans();
|
||||
try {
|
||||
MHistory::destroy($historyId);
|
||||
$hasInfo = MHistoryInfo::countByHistoryId($historyId);
|
||||
if($hasInfo > 0) {
|
||||
MHistoryInfo::delByHistoryId($historyId);
|
||||
}
|
||||
MLog::write('history','del', '删除历程,ID:'.$historyId);
|
||||
Db::commit();
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->json(3, '删除失败,'.$e->getMessage());
|
||||
}
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(1, '无此操作');
|
||||
}
|
||||
|
||||
|
||||
public function info()
|
||||
{
|
||||
$historyId = input('param.history_id/d', 0);
|
||||
$history = MHistory::getById($historyId);
|
||||
$infoItems = [];
|
||||
$categoryId = $history['category_id'] ?? 0;
|
||||
if(count($history) > 0) {
|
||||
$infoItems = MHistoryInfo::getByHistoryId($historyId);
|
||||
}
|
||||
$this->data['history'] = $history;
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->data['items'] = $infoItems;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
// 新增发展历程详情
|
||||
public function addInfo()
|
||||
{
|
||||
$historyId = input('param.history_id/d', 0);
|
||||
$history = MHistory::getById($historyId);
|
||||
if(count($history) == 0) {
|
||||
return $this->json(1, '该历程信息不存在');
|
||||
}
|
||||
if(request()->isPost()) {
|
||||
$params = input('post.item/a', []);
|
||||
$params = arrayHtmlFilter($params);
|
||||
$imgs = input('post.img/a');
|
||||
if (!empty($imgs) && is_array($imgs)) {
|
||||
$imgs = json_encode($imgs);
|
||||
} else {
|
||||
$imgs = '';
|
||||
}
|
||||
try {
|
||||
validate(VHistoryInfo::class)->check($params);
|
||||
$data = [
|
||||
'title' => $params['title'],
|
||||
'visible' => $params['visible'],
|
||||
'history_id' => $historyId,
|
||||
'imgs' => $imgs,
|
||||
];
|
||||
$newItem = MHistoryInfo::create($data);
|
||||
MLog::write('history', 'addInfo', '新增发展历程事例,ID:'.$newItem->id);
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
return $this->json();
|
||||
} else {
|
||||
$imgSize = '';
|
||||
$category = MCategory::getById($history['category_id']);
|
||||
if(count($category) > 0 && $category['img_width'] && $category['img_height']){
|
||||
$imgSize = $category['img_width'] . '像素 X ' . $category['img_height'] . '像素';
|
||||
}
|
||||
|
||||
$this->data['historyId'] = $historyId;
|
||||
$this->data['history'] = $history;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
// 编辑发展历程详情
|
||||
public function editInfo()
|
||||
{
|
||||
$id = input('param.id/d', 0);
|
||||
$item = MHistoryInfo::getById($id);
|
||||
if(count($item) == 0) {
|
||||
return $this->json(1, '该历程事例信息不存在');
|
||||
}
|
||||
|
||||
if(request()->isPost()) {
|
||||
$params = input('post.item/a', []);
|
||||
$params = arrayHtmlFilter($params);
|
||||
$imgs = input('post.img/a');
|
||||
if (!empty($imgs) && is_array($imgs)) {
|
||||
$imgs = json_encode($imgs);
|
||||
} else {
|
||||
$imgs = '';
|
||||
}
|
||||
try {
|
||||
validate(VHistoryInfo::class)->check($params);
|
||||
$data = [
|
||||
'title' => $params['title'],
|
||||
'visible' => $params['visible'],
|
||||
'imgs' => $imgs,
|
||||
];
|
||||
MHistoryInfo::updateById($id, $data);
|
||||
MLog::write('history', 'editInfo', '修改发展历程事例,ID:'.$id);
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
return $this->json();
|
||||
} else {
|
||||
$history = MHistory::getById($item['history_id']);
|
||||
$imgSize = '';
|
||||
if(count($history) > 0) {
|
||||
$category = MCategory::getById($history['category_id']);
|
||||
if(count($category) > 0 && $category['img_width'] && $category['img_height']){
|
||||
$imgSize = $category['img_width'] . '像素 X ' . $category['img_height'] . '像素';
|
||||
}
|
||||
}
|
||||
|
||||
$this->data['item'] = $item;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
public function sortInfo()
|
||||
{
|
||||
if(request()->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MHistoryInfo::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该历程事例信息不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "history_id='{$item['history_id']}' and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "history_id='{$item['history_id']}' and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MHistoryInfo::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MHistoryInfo();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
MLog::write('history', 'sortInfo', "发展历程事例排序,ID:{$id} ,{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '无此操作');
|
||||
}
|
||||
|
||||
public function delInfo()
|
||||
{
|
||||
if(request()->isPost()) {
|
||||
$infoIds = [];
|
||||
$ids = input('post.ids', []);
|
||||
$id = input('post.id', 0);
|
||||
if(!empty($ids)) {
|
||||
if(is_array($ids)) {
|
||||
$infoIds = $ids;
|
||||
} else {
|
||||
$infoIds = explode(',', $ids);
|
||||
}
|
||||
} elseif($id > 0) {
|
||||
$infoIds[] = $id;
|
||||
}
|
||||
if(count($infoIds) > 0) {
|
||||
MHistoryInfo::destroy($infoIds);
|
||||
MLog::write('history','delInfo', '删除历程事例,IDs:'.implode(',', $infoIds));
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
return $this->json(1, '无此操作');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
class Index extends Base
|
||||
{
|
||||
//后台首页
|
||||
public function index()
|
||||
{
|
||||
return $this->redirect(url('manager.safe/index'));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{InvitationTemplateClass as MInvitationTemplateClass, Log};
|
||||
use think\exception\ValidateException;
|
||||
use app\validate\InvitationTemplateClass as VMInvitationTemplateClass;
|
||||
class InvitationTemplateClass extends Base
|
||||
{
|
||||
/**
|
||||
* 排序
|
||||
* 暂不允许父级变更
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function sort()
|
||||
{
|
||||
if ($this->request->isAjax()) {
|
||||
$id = input('post.id');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MInvitationTemplateClass::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '权限不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "parent_id = {$item['parent_id']} and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "parent_id = {$item['parent_id']} and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MInvitationTemplateClass::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MInvitationTemplateClass();
|
||||
$model->saveAll($updateData);
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isAjax()) {
|
||||
$id = input('post.id/d');
|
||||
$item = MInvitationTemplateClass::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(1, '信息不存在');
|
||||
}
|
||||
$children = MInvitationTemplateClass::getListByParentId($id);
|
||||
if(!empty($children)){
|
||||
return $this->json(2, '当前权限有下级权限,不可删除');
|
||||
}
|
||||
MInvitationTemplateClass::destroy($id);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$id = input('post.id');
|
||||
$InvitationTemplateClass = MInvitationTemplateClass::getById($id);
|
||||
if(empty($InvitationTemplateClass)){
|
||||
return $this->json(1, '信息不存在');
|
||||
}
|
||||
try {
|
||||
validate(VMInvitationTemplateClass::class)->check($item);
|
||||
MInvitationTemplateClass::updateById($id, $item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(3, $e->getError());
|
||||
}
|
||||
}
|
||||
$id = input('param.id/d');
|
||||
$InvitationTemplateClass = MInvitationTemplateClass::getById($id);
|
||||
if(empty($InvitationTemplateClass)){
|
||||
return $this->json(1,'无此信息,请核对之后再操作!');
|
||||
}else{
|
||||
$this->data['item'] = $InvitationTemplateClass;
|
||||
if($InvitationTemplateClass['parent_id'] > 0){
|
||||
$parent = MInvitationTemplateClass::getById($InvitationTemplateClass['parent_id']);
|
||||
$this->data['parent'] = $parent;
|
||||
}
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
try {
|
||||
validate(VMInvitationTemplateClass::class)->check($item);
|
||||
|
||||
MInvitationTemplateClass::create($item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}
|
||||
$parentId = input('param.parent_id/d',0);
|
||||
if($parentId > 0){
|
||||
$parent = MInvitationTemplateClass::getById($parentId);
|
||||
$this->data['parent'] = $parent;
|
||||
}
|
||||
$this->data['parentId'] = $parentId;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
/**
|
||||
* 列表(全部)
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$list = MInvitationTemplateClass::getListTree();
|
||||
$this->data['items'] = $list;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,177 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Link as MLink, System, Log};
|
||||
use app\validate\Link as VLink;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
class Link extends Base
|
||||
{
|
||||
//批量删除
|
||||
public function batchDel()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$ids = input('post.ids/a');
|
||||
if(empty($ids) || !is_array($ids)) {
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
$items = MLink::getListByIds($ids);
|
||||
if(!empty($items)){
|
||||
$delIds = [];
|
||||
foreach($items as $item){
|
||||
$delIds[] = $item['id'];
|
||||
}
|
||||
MLink::destroy($delIds);
|
||||
Log::write('link', 'betchDel', '批量删除了友情链接,涉及到的ID为:' . implode(',', $delIds));
|
||||
return $this->json();
|
||||
}else{
|
||||
return $this->json(3, '待删除友情链接为空');
|
||||
}
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MLink::getById($id);
|
||||
if(!empty($item)){
|
||||
MLink::destroy($id);
|
||||
Log::write('link', 'del', '删除友情链接,ID:' . $id . ',标题:' . $item['title']);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '待删除友情链接不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MLink::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '该友情链接信息不存在!');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MLink::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MLink();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('link', 'sort', "友情链接排序,ID:{$id} ,标题:{$item['title']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$id = input('post.id/d');
|
||||
$img = input('post.img');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$link = MLink::getById($id);
|
||||
if(empty($link)) {
|
||||
return $this->json(2, '该友情链接信息不存在!');
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
try {
|
||||
validate(VLink::class)->check($item);
|
||||
MLink::updateById($id, $item);
|
||||
Log::write('link', 'edit', "友情链接编辑,ID:{$id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(3, $e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1, '参数错误,请核对之后再操作!');
|
||||
} else {
|
||||
$id = input('param.id/d');
|
||||
$item = MLink::getById($id);
|
||||
$imgSize = System::getLinkImageSize();
|
||||
|
||||
$this->data['item'] = $item;
|
||||
$this->data['img_size'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
try {
|
||||
validate(VLink::class)->check($item);
|
||||
$link = MLink::create($item);
|
||||
Log::write('link', 'add', "友情链接新增,ID:{$link->id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
} else {
|
||||
$imgSize = System::getLinkImageSize();
|
||||
$this->data['img_size'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$items = MLink::getList();
|
||||
$this->data['items'] = $items;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Member, AuthRule, LoginLog};
|
||||
use app\controller\BaseController;
|
||||
|
||||
class Login extends BaseController
|
||||
{
|
||||
/**
|
||||
* user lgoin
|
||||
* use ajax post push
|
||||
*
|
||||
* @return void | JSON
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
if(request()->isPost()){
|
||||
$username = trim(input('param.username'));
|
||||
$password = trim(input('param.password'));
|
||||
$loginUrl = url('manager.login/index');
|
||||
if(empty($username) || empty($password)){
|
||||
session('loginError','用户名和密码不能为空');
|
||||
return $this->redirect($loginUrl);
|
||||
}
|
||||
|
||||
$member = Member::getByUserName($username);
|
||||
if(empty($member)){
|
||||
session('loginError','用户名错误');
|
||||
return $this->redirect($loginUrl);
|
||||
}
|
||||
if($member['password'] != md5($password)){
|
||||
session('loginError','用户密码错误');
|
||||
return $this->redirect($loginUrl);
|
||||
|
||||
}
|
||||
$rulesList = AuthRule::userRolesList($member['group_id']);
|
||||
$rulesIdStr = '';
|
||||
if (!empty($rulesList)) {
|
||||
$rulesId = $rulesList['allRulesId'];
|
||||
$rulesIdStr = implode(',', $rulesId);
|
||||
}
|
||||
|
||||
$authSession = [
|
||||
'userId' => $member['id'],
|
||||
'userName' => $member['username'],
|
||||
'groupId' => $member['group_id'],
|
||||
'rules' => $rulesIdStr,
|
||||
'cates' => $member['cates']
|
||||
];
|
||||
|
||||
//记录最后登陆时间
|
||||
$ip = request()->ip();
|
||||
$time = time();
|
||||
Member::updateById($member['id'], [
|
||||
'login_time' => $time,
|
||||
'login_ip' => $ip
|
||||
]);
|
||||
LoginLog::create([
|
||||
'member_id' => $member['id'],
|
||||
'name' => $member['username'],
|
||||
'ip' => $ip,
|
||||
'create_time' => $time
|
||||
]);
|
||||
session('auth', $authSession);
|
||||
return redirect(url('manager.index/index'));
|
||||
}
|
||||
|
||||
$viewData = [];
|
||||
if(session('?loginError')) {
|
||||
$viewData['error'] = session('loginError');
|
||||
}
|
||||
session('loginError', null);
|
||||
return view()->assign($viewData);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\controller\BaseController;
|
||||
|
||||
class Logout extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
session(null);
|
||||
return redirect(url('manager.login/index'));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,181 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Category, AuthGroup, Member as MMember, Log};
|
||||
use Exception;
|
||||
use think\facade\Db;
|
||||
|
||||
class Member extends Base
|
||||
{
|
||||
/**
|
||||
* 删除管理用户
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if (is_numeric($id) === true && $id > 0) {
|
||||
$item = MMember::getByID($id);
|
||||
if(!empty($item)){
|
||||
MMember::destroy($id);
|
||||
Log::write('member', 'del', "管理员删除,ID:{$id}, 管理员:{$item['username']}");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改管理用户信息
|
||||
* 由于try语法中抛出的异常类型与$this->json()抛出的异常类型不一致,因此需要利用$errorMsg 来判断返回情况
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$username = trim(input('post.username'));
|
||||
$password = trim(input('post.password'));
|
||||
$groupId = input('post.group_id/d');
|
||||
if ((is_numeric($id) === true && $id > 0) && ((is_numeric($groupId) === true && $groupId > 0) && !empty($username))) {
|
||||
$member = MMember::getByUserName($username);
|
||||
if(!empty($member) && $member['id'] != $id){
|
||||
return $this->json(2, '该用户名已被使用!');
|
||||
}
|
||||
$errorMsg = '';
|
||||
Db::startTrans();
|
||||
try {
|
||||
$member = MMember::getById($id);
|
||||
$item = [
|
||||
'username' => $username,
|
||||
'group_id' => $groupId
|
||||
];
|
||||
//角色权限重新赋值
|
||||
$group = AuthGroup::getById($groupId);
|
||||
$item['rules'] = $group['rules'];
|
||||
|
||||
if(!empty($password)){
|
||||
$item['password'] = md5($password);
|
||||
}
|
||||
MMember::updateById($id, $item);
|
||||
Log::write('member', 'edit', "管理员编辑,ID:{$id}, 管理员:{$item['username']}");
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
$errorMsg = '用户信息修改失败!'.$e->getMessage();
|
||||
}
|
||||
if (empty($errorMsg)) {
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, $errorMsg);
|
||||
}
|
||||
return $this->json(1, '参数错误,请核对之后再操作!');
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if (is_numeric($id) === true && $id > 0) {
|
||||
$member = MMember::getByID($id);
|
||||
$item = [
|
||||
'id' => $member['id'],
|
||||
'username' => $member['username'],
|
||||
'group_id' => $member['group_id']
|
||||
];
|
||||
$auth = session('auth');
|
||||
$groups = AuthGroup::getListById($auth['groupId']);
|
||||
$this->data['groups'] = $groups;
|
||||
$this->data['item'] = $item;
|
||||
return $this->view();
|
||||
}
|
||||
return $this->json(1, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增管理用户
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$groupId = input('post.group_id/d');
|
||||
$username = trim(input('post.username'));
|
||||
$password = trim(input('post.password'));
|
||||
if ((is_numeric($groupId) === true && $groupId > 0) && ($username != "" && $password != "")) {
|
||||
$member = MMember::getByUserName($username);
|
||||
if(!empty($member)){
|
||||
return $this->json(2, '该用户名已被使用!');
|
||||
}
|
||||
$group = AuthGroup::getById($groupId);
|
||||
$newMember = MMember::create([
|
||||
'username' => $username,
|
||||
'group_id' => $groupId,
|
||||
'password' => md5($password),
|
||||
'rules' => $group['rules'],
|
||||
'cates' => '',
|
||||
'login_time' => 0,
|
||||
]);
|
||||
Log::write('member', 'add', "管理员新增,ID:{$newMember->id}, 管理员:{$newMember['username']}");
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(1, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
|
||||
$auth = session('auth');
|
||||
$groups = AuthGroup::getListById($auth['groupId']);
|
||||
$this->data['groups'] = $groups;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
/**
|
||||
* 栏目菜单分配
|
||||
*/
|
||||
public function menuAlloter()
|
||||
{
|
||||
if(request()->isPost()) {
|
||||
$cates = input('post.cates/a');
|
||||
$id = input('post.id/d');
|
||||
if (is_array($cates) && (is_numeric($id) === true && $id > 0)) {
|
||||
$member = MMember::getById($id);
|
||||
if(empty($member)){
|
||||
return $this->json(2, '无此用户信息,请核对之后再操作!');
|
||||
}
|
||||
MMember::updateCates($id, $cates);
|
||||
Log::write('member', 'menuAlloter', "管理员栏目分配,ID:{$id}, 管理员:{$member['username']}");
|
||||
return $this->json();
|
||||
}else{
|
||||
return $this->json(3, '传入参数错误,请核对之后再操作!');
|
||||
}
|
||||
} else {
|
||||
$id = input('param.id/d');
|
||||
if (is_numeric($id) && $id > 0) {
|
||||
$member = MMember::getById($id);
|
||||
if (empty($member)) {
|
||||
return $this->json(2, '该管理员信息不存在,请核对之后再操作!');
|
||||
}
|
||||
$cates = Category::getListTree(false);
|
||||
$memberCates = array_filter(explode(',', $member['cates']));
|
||||
|
||||
$this->data['id'] = $id;
|
||||
$this->data['member'] = $member;
|
||||
$this->data['memberCates'] = $memberCates;
|
||||
$this->data['cates'] = $cates;
|
||||
return $this->view();
|
||||
}
|
||||
return $this->json(1, '参数错误,请核对之后再操作!',$id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有用户列表
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$auth = session('auth');
|
||||
if ($auth['groupId'] == 1) {
|
||||
$items = MMember::getList(40);
|
||||
} else {
|
||||
$items = MMember::getListByGroup($auth['groupId'], 40);
|
||||
}
|
||||
$this->data['items'] = $items;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,184 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Model as MModel, Log};
|
||||
use app\validate\Model as VModel;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
class Model extends Base
|
||||
{
|
||||
//批量删除模型
|
||||
public function batchDel()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$ids = input('post.ids/a');
|
||||
if(is_array($ids)) {
|
||||
$idsArr = $ids;
|
||||
} else {
|
||||
$idsArr = array_filter(explode(',', $ids));
|
||||
}
|
||||
if(count($idsArr) == 0) {
|
||||
return $this->json(1, '无效请求,参数错误!');
|
||||
}
|
||||
$items = MModel::getListByIds($idsArr);
|
||||
if(!empty($items)){
|
||||
$delIds = [];
|
||||
foreach($items as $item){
|
||||
$delIds[] = $item['id'];
|
||||
}
|
||||
MModel::destroy($delIds);
|
||||
Log::write('model', 'batchDel', "模型批量删除,ID:" . implode(',', $ids));
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(2, '无效请求,参数错误!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//删除单个模型
|
||||
public function del()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MModel::getById($id);
|
||||
if(!empty($item)) {
|
||||
MModel::destroy($id);
|
||||
Log::write('model', 'del', "模型删除,ID:{$id}, 标题:{$item['name']}");
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '删除失败!该模型不存在,请刷新页面后再试!');
|
||||
}
|
||||
return $this->json(2, '无效请求,参数错误!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑模型
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = [];
|
||||
$item['name'] = input('post.name');
|
||||
$item['template'] = input('post.template');
|
||||
$item['manager'] = input('post.manager');
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$model = MModel::getById($id);
|
||||
if(empty($model)){
|
||||
return $this->json(2, '无此模型数据!');
|
||||
}
|
||||
try {
|
||||
validate(VModel::class)->check($item);
|
||||
MModel::updateById($id, $item);
|
||||
Log::write('model', 'edit', "模型编辑,ID:{$id}, 标题:{$item['name']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(3, $e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1, '无效请求,参数错误!');
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if (is_numeric($id) && $id > 0) {
|
||||
$item = MModel::getById($id);
|
||||
$this->data['item'] = $item;
|
||||
return $this->view();
|
||||
}
|
||||
return $this->json(1,'传入参数错误,请核对之后再操作!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加模型
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = [];
|
||||
$item['name'] = input('post.name');
|
||||
$item['template'] = input('post.template');
|
||||
$item['manager'] = input('post.manager');
|
||||
try {
|
||||
validate(VModel::class)->check($item);
|
||||
$model = MModel::create($item);
|
||||
Log::write('model', 'add', "模型新增,ID:{$model->id}, 标题:{$item['name']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}else {
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 模型列表
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$items = MModel::getList();
|
||||
$this->data['items'] = $items;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
/**
|
||||
* 排序
|
||||
*/
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MModel::getById($id);
|
||||
if(empty($item)) {
|
||||
return $this->json(3, '无此模型!');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MModel::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MModel();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('model', 'sort', "模型排序,ID:{$id} ,标题:{$item['name']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,471 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Category, Block, Log};
|
||||
use app\validate\Block as VBlock;
|
||||
use think\exception\ValidateException;
|
||||
use app\service\Tool;
|
||||
|
||||
class Page extends Base
|
||||
{
|
||||
//源码,代码
|
||||
public function code()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$categoryId = input('post.category_id/d');
|
||||
$id = input('post.id/d');
|
||||
$item['keyword'] = Tool::trimSpace($item['keyword']);
|
||||
try{
|
||||
validate(VBlock::class)->check($item);
|
||||
if(empty($item['value'])){
|
||||
return $this->json(2, '内容不可为空!');
|
||||
}
|
||||
$block = Block::getByKeyword($item['keyword'], $categoryId);
|
||||
if($id){
|
||||
if(!empty($block) && $block['id'] != $id){
|
||||
return $this->json(3, '键值已存在,请更改键值');
|
||||
}
|
||||
Block::updateById($id, $item);
|
||||
Log::write('page', 'code', "单页代码编辑,ID:{$id}, 键值:{$item['keyword']}");
|
||||
}else{
|
||||
if($categoryId <= 0){
|
||||
return $this->json(4, '栏目参数错误!');
|
||||
}
|
||||
if(!empty($block)){
|
||||
return $this->json(3, '键值已存在,请更改键值');
|
||||
}
|
||||
$item['category_id'] = $categoryId;
|
||||
$item['type'] = Block::CODE;
|
||||
$block = Block::create($item);
|
||||
Log::write('page', 'code', "单页代码新增,ID:{$block->id}, 键值:{$item['keyword']}");
|
||||
}
|
||||
return $this->json();
|
||||
} catch (ValidateException $e){
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if($id <= 0){ //添加
|
||||
$categoryId = input('param.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
$url = url('manager.content/index')->__toString();
|
||||
return $this->error('无此栏目', $url);
|
||||
}
|
||||
}else{ //修改
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->error('无此代码块!');
|
||||
}
|
||||
$categoryId = $item['category_id'];
|
||||
$this->data['item'] = $item;
|
||||
}
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '无此块信息');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "category_id='{$item['category_id']}' and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "category_id='{$item['category_id']}' and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = Block::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new Block();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('page', 'sort', "单页区块排序,ID:{$id} ,键值:{$item['keyword']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->error('无此操作');
|
||||
}
|
||||
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isAjax()) {
|
||||
$id = input('post.id/d');
|
||||
$item = Block::getById($id);
|
||||
if(!empty($item)){
|
||||
Block::destroy($id);
|
||||
Log::write('page', 'del', "单页区块删除,ID:{$id} ,键值:{$item['keyword']}");
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(1, 'fail');
|
||||
}
|
||||
return $this->error('无此操作');
|
||||
}
|
||||
//图片
|
||||
public function img()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = trim(input('post.img'));
|
||||
$categoryId = input('post.category_id/d');
|
||||
if (!empty($img) && $img == 'null') {
|
||||
$img = '';
|
||||
}
|
||||
$id = input('post.id/d');
|
||||
$item['keyword'] = Tool::trimSpace($item['keyword']);
|
||||
try{
|
||||
validate(VBlock::class)->check($item);
|
||||
$block = Block::getByKeyword($item['keyword'], $categoryId);
|
||||
if($id){
|
||||
if(!empty($block) && $block['id'] != $id){
|
||||
return $this->json(4, '键值已存在,请更改键值');
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['value'] = $img;
|
||||
}
|
||||
Block::updateById($id, $item);
|
||||
Log::write('page', 'img', "单页图片编辑,ID:{$id} ,键值:{$item['keyword']}");
|
||||
}else{
|
||||
if(!empty($block)){
|
||||
return $this->json(4, '键值已存在,请更改键值');
|
||||
}
|
||||
if($categoryId <= 0){
|
||||
return $this->json(2, '栏目参数错误!!');
|
||||
}
|
||||
if(empty($img)){
|
||||
return $this->json(3, '图片不可为空');
|
||||
}
|
||||
$item['value'] = $img;
|
||||
$item['type'] = Block::IMG;
|
||||
$item['category_id'] = $categoryId;
|
||||
$block = Block::create($item);
|
||||
Log::write('page', 'img', "单页图片新增,ID:{$block->id} ,键值:{$item['keyword']}");
|
||||
}
|
||||
return $this->json();
|
||||
} catch (ValidateException $e){
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if($id <= 0){ //添加
|
||||
$categoryId = input('param.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
$url = url('manager.content/index')->__toString();
|
||||
return $this->error('无此栏目', $url);
|
||||
}
|
||||
}else{ //修改
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->error('无此图片!');
|
||||
}
|
||||
$categoryId = $item['category_id'];
|
||||
$this->data['item'] = $item;
|
||||
}
|
||||
if(isset($item) && $item['width'] && $item['height']){
|
||||
$imgSize = $item['width'].'px X '.$item['height'].'px';
|
||||
}else{
|
||||
$imgSize = '';
|
||||
}
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
$this->data['groupId'] = session('auth.groupId');
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
//文字块
|
||||
public function block()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$categoryId = input('post.category_id/d');
|
||||
$id = input('post.id/d');
|
||||
if(isset($item['keyword'])){
|
||||
$item['keyword'] = Tool::trimSpace($item['keyword']);
|
||||
}
|
||||
try{
|
||||
validate(VBlock::class)->check($item);
|
||||
if(empty($item['value'])){
|
||||
return $this->json(1, '内容不可为空!');
|
||||
}
|
||||
$block = Block::getByKeyword($item['keyword'], $categoryId);
|
||||
if($id){
|
||||
if(!empty($block) && $block['id'] != $id){
|
||||
return $this->json(4, '键值已存在,请更改键值');
|
||||
}
|
||||
Block::updateById($id, $item);
|
||||
Log::write('page', 'block', "单页文字块编辑,ID:{$id} ,键值:{$item['keyword']}");
|
||||
}else{
|
||||
if($categoryId <= 0){
|
||||
return $this->json(2, '栏目参数错误!');
|
||||
}
|
||||
if(!empty($block)){
|
||||
return $this->json(4, '键值已存在,请更改键值');
|
||||
}
|
||||
$item['category_id'] = $categoryId;
|
||||
$block = Block::create($item);
|
||||
Log::write('page', 'block', "单页文字块新增,ID:{$block->id} ,键值:{$item['keyword']}");
|
||||
}
|
||||
return $this->json();
|
||||
} catch (ValidateException $e){
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if($id <= 0){ //添加
|
||||
$categoryId = input('param.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
$url = url('manager.content/index')->__toString();
|
||||
return $this->error('无此栏目', $url);
|
||||
}
|
||||
}else{ //修改
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->error('无此文字块!');
|
||||
}
|
||||
$categoryId = $item['category_id'];
|
||||
$this->data['item'] = $item;
|
||||
}
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
//富文本内容
|
||||
public function text()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$categoryId = input('post.category_id/d');
|
||||
$item['keyword'] = Tool::trimSpace($item['keyword']);
|
||||
try{
|
||||
validate(VBlock::class)->check($item);
|
||||
if(empty($item['value'])){
|
||||
return $this->json(1, '内容不可为空!');
|
||||
}
|
||||
$block = Block::getByKeyword($item['keyword'], $categoryId);
|
||||
$id = input('post.id/d');
|
||||
if($id){
|
||||
if(!empty($block) && $block['id'] != $id){
|
||||
return $this->json(4, '键值已存在,请更改');
|
||||
}
|
||||
Block::updateById($id, $item);
|
||||
Log::write('page', 'text', "单页富文本编辑,ID:{$id} ,键值:{$item['keyword']}");
|
||||
}else{
|
||||
if($categoryId <= 0){
|
||||
return $this->json(2, '栏目参数错误!');
|
||||
}
|
||||
if(!empty($block)){
|
||||
return $this->json(4, '键值已存在,请更改键值');
|
||||
}
|
||||
$item['category_id'] = $categoryId;
|
||||
$item['type'] = Block::TEXT;
|
||||
$block = Block::create($item);
|
||||
Log::write('page', 'text', "单页富文本新增,ID:{$block->id} ,键值:{$item['keyword']}");
|
||||
}
|
||||
return $this->json();
|
||||
} catch (ValidateException $e){
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if($id <= 0){ //添加
|
||||
$categoryId = input('param.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
$url = url('manager.content/index')->__toString();
|
||||
return $this->error('无此栏目', $url);
|
||||
}
|
||||
}else{ //修改
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->error('无此富文本!');
|
||||
}
|
||||
$categoryId = $item['category_id'];
|
||||
$this->data['item'] = $item;
|
||||
}
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
//组图
|
||||
public function group()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
|
||||
$imgs = input('post.img/a');
|
||||
//halt($item);
|
||||
$categoryId = input('post.category_id/d');
|
||||
if (!empty($imgs) && is_array($imgs)) {
|
||||
$item['value'] = json_encode($imgs);
|
||||
} else {
|
||||
$item['value'] = '';
|
||||
}
|
||||
$item['keyword'] = Tool::trimSpace($item['keyword']);
|
||||
try{
|
||||
validate(VBlock::class)->check($item);
|
||||
$block = Block::getByKeyword($item['keyword'], $categoryId);
|
||||
$id = input('post.id/d');
|
||||
if($id){
|
||||
if(!empty($block) && $block['id'] != $id){
|
||||
return $this->json(4, '键值已存在,请更改');
|
||||
}
|
||||
Block::updateById($id, $item);
|
||||
Log::write('page', 'group', "单页组图编辑,ID:{$id} ,键值:{$item['keyword']}");
|
||||
}else{
|
||||
if($categoryId <= 0){
|
||||
return $this->json(2, '栏目参数错误!');
|
||||
}
|
||||
if(!empty($block)){
|
||||
return $this->json(4, '键值已存在,请更改键值');
|
||||
}
|
||||
$item['category_id'] = $categoryId;
|
||||
$item['type'] = Block::GROUP;
|
||||
$block = Block::create($item);
|
||||
Log::write('page', 'group', "单页组图新增,ID:{$block->id} ,键值:{$item['keyword']}");
|
||||
}
|
||||
return $this->json();
|
||||
} catch (ValidateException $e){
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if($id <= 0){ //添加
|
||||
$categoryId = input('param.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
$url = url('manager.content/index')->__toString();
|
||||
return $this->error('无此栏目', $url);
|
||||
}
|
||||
}else{ //修改
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->error('无此组图!');
|
||||
}
|
||||
$categoryId = $item['category_id'];
|
||||
$this->data['item'] = $item;
|
||||
}
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
if(isset($item) && $item['width'] && $item['height']){
|
||||
$imgSize = $item['width'].'px X '.$item['height'].'px';
|
||||
}else{
|
||||
$imgSize = '';
|
||||
}
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
$this->data['groupId'] = session('auth.groupId');
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
//视频
|
||||
public function video()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$img = trim(input('post.img'));
|
||||
$video = trim(input('post.video'));
|
||||
$categoryId = input('post.category_id/d');
|
||||
$item['keyword'] = Tool::trimSpace($item['keyword']);
|
||||
try{
|
||||
validate(VBlock::class)->check($item);
|
||||
$block = Block::getByKeyword($item['keyword'], $categoryId);
|
||||
$id = input('post.id/d');
|
||||
if($id){
|
||||
if(!empty($block) && $block['id'] != $id){
|
||||
return $this->json(4, '键值已存在,请更改');
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['img'] = $img;
|
||||
}
|
||||
if(!empty($video)){
|
||||
$item['value'] = $video;
|
||||
}
|
||||
Block::updateById($id, $item);
|
||||
Log::write('page', 'video', "单页视频编辑,ID:{$id} ,键值:{$item['keyword']}");
|
||||
}else{
|
||||
if($categoryId <= 0){
|
||||
return $this->json(2, '栏目参数错误!');
|
||||
}
|
||||
if(!empty($block)){
|
||||
return $this->json(3, '键值已存在,请更改键值');
|
||||
}
|
||||
if(empty($video)){
|
||||
return $this->json(3, '视频不可为空');
|
||||
}
|
||||
$item['category_id'] = $categoryId;
|
||||
$item['type'] = Block::VIDEO;
|
||||
$item['value'] = $video;
|
||||
$item['img'] = $img;
|
||||
$block = Block::create($item);
|
||||
Log::write('page', 'video', "单页视频新增,ID:{$block->id} ,键值:{$item['keyword']}");
|
||||
}
|
||||
return $this->json();
|
||||
} catch (ValidateException $e){
|
||||
return $this->json(1, $e->getError());
|
||||
}
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
if($id <= 0){ //添加
|
||||
$categoryId = input('param.category_id/d');
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
$url = url('manager.content/index')->__toString();
|
||||
return $this->error('无此栏目', $url);
|
||||
}
|
||||
}else{ //修改
|
||||
$item = Block::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->error('无此视频!');
|
||||
}
|
||||
$categoryId = $item['category_id'];
|
||||
$this->data['item'] = $item;
|
||||
}
|
||||
$this->data['categoryId'] = $categoryId;
|
||||
if(isset($item) && $item['width'] && $item['height']){
|
||||
$imgSize = $item['width'].'px X '.$item['height'].'px';
|
||||
}else{
|
||||
$imgSize = '';
|
||||
}
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
$this->data['groupId'] = session('auth.groupId');
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,180 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{AuthRule, AuthGroup, Log};
|
||||
use app\validate\AuthRule as VAuthRule;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
class Rule extends Base
|
||||
{
|
||||
/**
|
||||
* 权限排序
|
||||
* 暂不允许父级变更
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function sort()
|
||||
{
|
||||
if ($this->request->isAjax()) {
|
||||
$id = input('post.id');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = AuthRule::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '权限不存在');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "parent_id = {$item['parent_id']} and sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "parent_id = {$item['parent_id']} and sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = AuthRule::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new AuthRule();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('rule', 'sort', "权限排序,ID:{$id} ,标题:{$item['title']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isAjax()) {
|
||||
$id = input('post.id/d');
|
||||
$item = AuthRule::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(1, '无此权限');
|
||||
}
|
||||
$children = AuthRule::getListByParentId($id);
|
||||
if(!empty($children)){
|
||||
return $this->json(2, '当前权限有下级权限,不可删除');
|
||||
}
|
||||
AuthRule::destroy($id);
|
||||
AuthGroup::resetGroupRulesCache();
|
||||
Log::write('rule', 'del', "权限删除,ID:{$id}, 标题:{$item['title']}");
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限修改
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
$id = input('post.id');
|
||||
$rule = AuthRule::getById($id);
|
||||
if(empty($rule)){
|
||||
return $this->json(1, '请选择正确的权限');
|
||||
}
|
||||
$rule2 = AuthRule::getByName($item['name']);
|
||||
if(!empty($rule2) && $rule2['id'] != $id){
|
||||
return $this->json(2, '已存在相同权限['.$item['name'].']');
|
||||
}
|
||||
try {
|
||||
validate(VAuthRule::class)->check($item);
|
||||
AuthRule::updateById($id, $item);
|
||||
AuthGroup::resetGroupRulesCache();
|
||||
Log::write('rule', 'edit', "权限编辑,ID:{$id}, 标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(3, $e->getError());
|
||||
}
|
||||
}
|
||||
$id = input('param.id/d');
|
||||
$rule = AuthRule::getById($id);
|
||||
if(empty($rule)){
|
||||
return $this->json(1,'无此权限信息,请核对之后再操作!');
|
||||
}else{
|
||||
$this->data['item'] = $rule;
|
||||
if($rule['parent_id'] > 0){
|
||||
$parent = AuthRule::getById($rule['parent_id']);
|
||||
$this->data['parent'] = $parent;
|
||||
}
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限添加
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item/a');
|
||||
try {
|
||||
validate(VAuthRule::class)->check($item);
|
||||
$rule = AuthRule::getByName($item['name']);
|
||||
if(!empty($rule)){
|
||||
return $this->json(1, '已存在相同权限');
|
||||
}
|
||||
$rule = AuthRule::create($item);
|
||||
//基本权限的话需要重置所有已有角色权限缓存
|
||||
if ($item['is_base'] > 0) {
|
||||
AuthGroup::resetGroupRulesCache();
|
||||
} else {
|
||||
AuthGroup::resetGroupRulesCache(1);
|
||||
}
|
||||
Log::write('rule', 'add', "权限新增,ID:{$rule->id}, 标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
}
|
||||
$parentId = input('param.parent_id/d',0);
|
||||
if($parentId > 0){
|
||||
$parent = AuthRule::getById($parentId);
|
||||
$this->data['parent'] = $parent;
|
||||
}
|
||||
$this->data['parentId'] = $parentId;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限列表(全部)
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$list = AuthRule::getListTree();
|
||||
$this->data['items'] = $list;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Member, Log};
|
||||
|
||||
class Safe extends Base
|
||||
{
|
||||
/**
|
||||
* 安全设置
|
||||
* @return Safe
|
||||
*/
|
||||
|
||||
public function index()
|
||||
{
|
||||
$auth = session('auth');
|
||||
if($this->request->isPost()){
|
||||
if ($auth) {
|
||||
$authId = $auth['userId'];
|
||||
$oldPassword = trim(input('post.password_old'));
|
||||
$password = trim(input('post.password'));
|
||||
$passwordAgain = trim(input('post.password_again'));
|
||||
$name = trim(input('post.name'));
|
||||
|
||||
$user = Member::getByID($authId);
|
||||
if (empty($user)) {
|
||||
return $this->json(1, '登录失效,请重新登录后再试!');
|
||||
}
|
||||
if (empty($name)) {
|
||||
return $this->json(2, '用户名不能为空!');
|
||||
}
|
||||
$hasUser = Member::getByUserName($name);
|
||||
if (!empty($hasUser) && $hasUser['id'] != $authId) {
|
||||
return $this->json(3, '该用户名已被其他用户使用,请更换!');
|
||||
}
|
||||
if (empty($password) || empty($oldPassword)) {
|
||||
return $this->json(4, '用户密码不能为空!');
|
||||
}
|
||||
if ($password != $passwordAgain) {
|
||||
return $this->json(5, '新密码两次输入不一致!');
|
||||
}
|
||||
if (mb_strlen($password) < 6 || mb_strlen($password) > 30) {
|
||||
return $this->json(6, '新密码长度格式不正确,请输入6~30位密码!');
|
||||
}
|
||||
if ($user['password'] != md5($oldPassword)) {
|
||||
return $this->json(7,'原密码不正确');
|
||||
}
|
||||
$data['password'] = md5($password);
|
||||
Member::updateById($authId, $data);
|
||||
Log::write('safe', 'index', "安全设置,ID:{$authId}, 管理员:{$name}");
|
||||
session('auth', null);
|
||||
//cache('rules_'.$authId, null); //当前看代码,这个是无用代码;先注释掉,如果在使用过程中不会用到,再删除。
|
||||
cache('group_rules_'.$authId, null);
|
||||
cache('rule_names_'.$authId, null);
|
||||
return $this->json(0, '修改成功,请重新登录!');
|
||||
} else {
|
||||
return $this->json(1, '登录失效,请重新登录后再试!');
|
||||
}
|
||||
}else{
|
||||
$this->data['item'] = $auth;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,191 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Slide as MSlide, System, Log};
|
||||
use app\validate\Slide as VSlide;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
class Slide extends Base
|
||||
{
|
||||
//批量删除
|
||||
public function batchDel()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$ids = input('post.ids/a');
|
||||
if(empty($ids) || !is_array($ids)) {
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
$items = MSlide::getListByIds($ids);
|
||||
if(!empty($items)){
|
||||
$delIds = [];
|
||||
foreach($items as $item){
|
||||
$delIds[] = $item['id'];
|
||||
}
|
||||
MSlide::destroy($delIds);
|
||||
Log::write('link', 'betchDel', '批量删除了友情链接,涉及到的ID为:' . implode(',', $delIds));
|
||||
return $this->json();
|
||||
}else{
|
||||
return $this->json(3, '待删除友情链接为空');
|
||||
}
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
//可以删除一个,可以批量删除,TODO 需要调整
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$item = MSlide::getById($id);
|
||||
if(!empty($item)){
|
||||
MSlide::destroy($id);
|
||||
Log::write('link', 'del', '删除轮播图,ID:' . $id . ',标题:' . $item['title']);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '待删除轮播图不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if($num <= 0){
|
||||
$num = 1;
|
||||
}
|
||||
if(!in_array($sort, ['up', 'down'], true)){
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MSlide::getById($id);
|
||||
if(empty($item)){
|
||||
return $this->json(3, '无此轮播图');
|
||||
}
|
||||
if($sort == 'up'){
|
||||
$where = "sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}else{
|
||||
$where = "sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
}
|
||||
$forSortItems = MSlide::getListByWhereAndOrder($where, $order, $num);
|
||||
if(!empty($forSortItems)){
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for($i = 0; $i < $forSortCount; $i++){
|
||||
if($i == 0){
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
}else{
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if(!empty($updateData)){
|
||||
$model = new MSlide();
|
||||
$model->saveAll($updateData);
|
||||
$sortStr = $sort == 'up' ? '上移' : '下调';
|
||||
Log::write('slide', 'sort', "轮播图排序,ID:{$id} ,标题:{$item['title']},{$sortStr}了{$num}位");
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item');
|
||||
$img = input('post.img_pc');
|
||||
$imgMobile = input('post.img_mobile');
|
||||
$id = input('post.id/d');
|
||||
|
||||
if(is_numeric($id) && $id > 0) {
|
||||
$slide = MSlide::getById($id);
|
||||
if(empty($slide)) {
|
||||
return $this->json(2, 'id参数错误,没有相关轮播图信息记录!');
|
||||
}
|
||||
if(!empty($imgMobile)){
|
||||
$item['src_mobile'] = $imgMobile;
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
try {
|
||||
validate(VSlide::class)->check($item);
|
||||
MSlide::updateById($id, $item);
|
||||
Log::write('slide', 'edit', "轮播图编辑,ID:{$id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(3, $e->getError());
|
||||
}
|
||||
}
|
||||
return $this->json(1, '参数错误,请核对之后再操作!');
|
||||
}else{
|
||||
$id = input('param.id/d');
|
||||
$item = MSlide::getById($id);
|
||||
$imgSize = System::getSlideImageSize();
|
||||
$this->data['item'] = $item;
|
||||
$this->data['img_size'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if($this->request->isPost()){
|
||||
$item = input('post.item');
|
||||
$img = input('post.img_pc');
|
||||
$imgMobile = input('post.img_mobile');
|
||||
|
||||
if (empty($item)) {
|
||||
return $this->json(1, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
if(!empty($img)){
|
||||
$item['src'] = $img;
|
||||
}
|
||||
if(!empty($imgMobile)){
|
||||
$item['src_mobile'] = $imgMobile;
|
||||
}
|
||||
try {
|
||||
validate(VSlide::class)->check($item);
|
||||
$slide = MSlide::create($item);
|
||||
Log::write('slide', 'add', "轮播图新增,ID:{$slide->id} ,标题:{$item['title']}");
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2,$e->getError());
|
||||
}
|
||||
}else{
|
||||
$this->data['img_size'] = System::getSlideImageSize();
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 列表
|
||||
* 暂定只有首页轮播图,后期可以根据需求进行分组管理
|
||||
* @return Slide
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$items = MSlide::getList();
|
||||
$this->data['items'] = $items;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,178 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\model\{Article as MArticle ,Store as MStore, Category, System, Log};
|
||||
use app\validate\Store as VStore;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 内容管理 - 文章管理
|
||||
*/
|
||||
class Store extends Base
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$keyword = input('param.keyword');
|
||||
$param = input('param.param/a', []);
|
||||
$list = MStore::getList(20, $keyword);
|
||||
$this->data['list'] = $list;
|
||||
$this->data['keyword'] = $keyword;
|
||||
$this->data['param'] = $param;
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
if (is_numeric($id) && $id > 0) {
|
||||
$item = MArticle::getById($id);
|
||||
if (!empty($item)) {
|
||||
MArticle::destroy($id);
|
||||
Log::write('article', 'del', '删除文章,ID:' . $id . ',标题:' . $item['title']);
|
||||
return $this->json();
|
||||
}
|
||||
return $this->json(3, '待删除文章不存在');
|
||||
}
|
||||
return $this->json(2, '参数错误,请核对之后再操作!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//排序
|
||||
public function sort()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = input('post.id/d');
|
||||
$sort = input('post.sort');
|
||||
$num = input('post.num/d', 1);
|
||||
if ($num <= 0) {
|
||||
$num = 1;
|
||||
}
|
||||
if (!in_array($sort, ['up', 'down'], true)) {
|
||||
return $this->json(2, '参数错误');
|
||||
}
|
||||
$item = MStore::getById($id);
|
||||
if (empty($item)) {
|
||||
return $this->json(3, '该信息不存在');
|
||||
}
|
||||
if ($sort == 'up') {
|
||||
$where = "sort > {$item['sort']}";
|
||||
$order = "sort asc";
|
||||
} else {
|
||||
$where = "sort < {$item['sort']}";
|
||||
$order = "sort desc";
|
||||
}
|
||||
$forSortItems = MStore::getListByWhereAndOrder($where, $order, $num);
|
||||
if (!empty($forSortItems)) {
|
||||
$updateData = [];
|
||||
$forSortCount = count($forSortItems);
|
||||
for ($i = 0; $i < $forSortCount; $i++) {
|
||||
if ($i == 0) {
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $item['sort']
|
||||
];
|
||||
} else {
|
||||
$updateData[] = [
|
||||
'id' => $forSortItems[$i]['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
}
|
||||
}
|
||||
$updateData[] = [
|
||||
'id' => $item['id'],
|
||||
'sort' => $forSortItems[$i - 1]['sort']
|
||||
];
|
||||
if (!empty($updateData)) {
|
||||
$model = new MStore();
|
||||
$model->saveAll($updateData);
|
||||
return $this->json();
|
||||
}
|
||||
}
|
||||
return $this->json(4, '无须调整排序!');
|
||||
}
|
||||
return $this->json(1, '非法请求!');
|
||||
}
|
||||
|
||||
//编辑
|
||||
public function edit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
$imgimgs = input('post.imgimgs');
|
||||
|
||||
$id = input('post.id/d');
|
||||
$article = MStore::getById($id);
|
||||
if (empty($article)) {
|
||||
return $this->json(1, '该门店不存在!');
|
||||
}
|
||||
if (!empty($img)) {
|
||||
$item['src'] = $img;
|
||||
}
|
||||
if (!empty($imgimgs)) {
|
||||
$item['imgs'] = json_encode($imgimgs);
|
||||
}
|
||||
|
||||
try {
|
||||
MStore::updateById($id, $item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
} else {
|
||||
$id = input('param.id');
|
||||
$article = MStore::getById($id);
|
||||
$category = Category::getById(MArticle::storeId);
|
||||
if ($category['img_width'] && $category['img_height']) {
|
||||
$imgSize = $category['img_width'] . '像素 X ' . $category['img_height'] . '像素';
|
||||
} else {
|
||||
$imgSize = System::getArticleImageSize();
|
||||
}
|
||||
|
||||
$this->data['item'] = $article;
|
||||
$this->data['category'] = $category;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
|
||||
$imgimgs = input('post.imgimgs');
|
||||
if (!empty($img)) {
|
||||
$item['src'] = $img;
|
||||
}
|
||||
if (!empty($imgimgs)) {
|
||||
$item['imgs'] = json_encode($imgimgs);
|
||||
}
|
||||
try {
|
||||
validate(VStore::class)->check($item);
|
||||
MStore::create($item);
|
||||
return $this->json();
|
||||
} catch (ValidateException $e) {
|
||||
return $this->json(2, $e->getError());
|
||||
}
|
||||
} else {
|
||||
$categoryId = input('param.category_id');
|
||||
$category = Category::getById($categoryId);
|
||||
if (count($category) > 0 && $category['img_width'] && $category['img_height']) {
|
||||
$imgSize = $category['img_width'] . '像素 X ' . $category['img_height'] . '像素';
|
||||
} else {
|
||||
$imgSize = System::getArticleImageSize();
|
||||
}
|
||||
|
||||
$this->data['category'] = $category;
|
||||
$this->data['imgSize'] = $imgSize;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
<?php
|
||||
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\service\Tool;
|
||||
use app\model\{System as MSystem, Log};
|
||||
use app\service\Image;
|
||||
use think\facade\Cache;
|
||||
|
||||
class System extends Base
|
||||
{
|
||||
/**
|
||||
* 获取当前系统设置
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$item = input('post.item/a');
|
||||
$img = input('post.img');
|
||||
$imgwechat_img = input('post.imgwechat_img');
|
||||
$resume = input('post.fileresume');
|
||||
$clause = input('post.fileclause');
|
||||
$system = MSystem::getSystem();
|
||||
if (empty($system)) {
|
||||
if (!empty($img)) {
|
||||
$item['mark_img'] = $img;
|
||||
}
|
||||
if (!empty($imgwechat_img)) {
|
||||
$item['wechat_img'] = $imgwechat_img;
|
||||
}
|
||||
$system = MSystem::create($item);
|
||||
Log::write('system', 'index', "系统设置,ID:{$system->id}");
|
||||
} else {
|
||||
if (!empty($img)) {
|
||||
Image::delImg($system['mark_img']);
|
||||
$item['mark_img'] = $img;
|
||||
}
|
||||
if (!empty($resume)){
|
||||
$item['resume'] = $resume;
|
||||
}
|
||||
if (!empty($clause)){
|
||||
$item['clause'] = $clause;
|
||||
}
|
||||
if (!empty($imgwechat_img)) {
|
||||
$item['wechat_img'] = $imgwechat_img;
|
||||
}
|
||||
MSystem::update($item, ['id' => $system['id']]);
|
||||
Log::write('system', 'index', "系统设置,ID:{$system['id']}");
|
||||
}
|
||||
return $this->json();
|
||||
} else {
|
||||
$item = MSystem::getSystem();
|
||||
$positions = Image::getMarkPosition();
|
||||
|
||||
$this->data['item'] = $item;
|
||||
$this->data['positions'] = $positions;
|
||||
return $this->view();
|
||||
}
|
||||
}
|
||||
|
||||
public function other()
|
||||
{
|
||||
return $this->view();
|
||||
}
|
||||
|
||||
public function clearCache()
|
||||
{
|
||||
Cache::clear();
|
||||
$cachePath = app()->getRuntimePath() . 'cache';
|
||||
$tempPath = app()->getRuntimePath() . 'temp';
|
||||
Tool::removeByPath($cachePath);
|
||||
Tool::removeByPath($tempPath);
|
||||
clearstatcache();
|
||||
return $this->json();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
<?php
|
||||
namespace app\controller\manager;
|
||||
|
||||
use app\service\Image;
|
||||
use app\model\{System, File};
|
||||
use app\validate\Upload as VUpload;
|
||||
use think\facade\{Filesystem, Config, Lang};
|
||||
use think\Image as TImage;
|
||||
use app\controller\BaseController;
|
||||
|
||||
class Upload extends BaseController
|
||||
{
|
||||
private $isCompress = true;
|
||||
private $validate;
|
||||
private $uploadPath;
|
||||
private $uploadPathIsWritable = 0;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$system = System::getSystem();
|
||||
if (!empty($system)) {
|
||||
$this->isCompress = $system['compress']??true;
|
||||
}
|
||||
$this->validate = new VUpload();
|
||||
$this->uploadPath = Config::get('filesystem.disks.local.url');
|
||||
if(is_writable(app()->getRootPath() . 'public' . $this->uploadPath)){
|
||||
$this->uploadPathIsWritable = 1;
|
||||
}
|
||||
}
|
||||
|
||||
//视频上传
|
||||
public function video()
|
||||
{
|
||||
if(!$this->uploadPathIsWritable){
|
||||
return $this->json(1, '上传文件夹需要写入权限');
|
||||
}
|
||||
$video = request()->file('video');
|
||||
if($this->validate->checkVideo($video)){
|
||||
$src = Filesystem::disk('video')->putFile(date('Ymd'), $video, 'uniqid');
|
||||
$src = $this->uploadPath . '/' . $src;
|
||||
$return['src'] = $src;
|
||||
File::add($video, $src, 'video'); //加入上传文件表
|
||||
return $this->json(0, 'ok', $return);
|
||||
}else{
|
||||
$errorMsg = Lang::get($this->validate->getError());
|
||||
return $this->json(1, $errorMsg);
|
||||
}
|
||||
}
|
||||
|
||||
//文件上传(通用)
|
||||
public function file()
|
||||
{
|
||||
$file = request()->file('file');
|
||||
if($this->validate->checkFile($file)){
|
||||
try{
|
||||
if(!$this->uploadPathIsWritable){
|
||||
throw new \Exception('上传文件夹需要写入权限');
|
||||
}
|
||||
$src = Filesystem::putFile(date('Ymd'), $file, 'uniqid');
|
||||
$src = $this->uploadPath . '/' . $src;
|
||||
$return['src'] = $src;
|
||||
$return['name'] = $file->getOriginalName();
|
||||
File::add($file, $src, 'file'); //加入上传文件表
|
||||
} catch (\Exception $e) {
|
||||
return $this->json(1, $e->getMessage());
|
||||
}
|
||||
return $this->json(0,'ok',$return);
|
||||
}else{
|
||||
$errorMsg = Lang::get($this->validate->getError());
|
||||
return $this->json(1, $errorMsg);
|
||||
}
|
||||
}
|
||||
|
||||
//图片上传(通用)
|
||||
public function image()
|
||||
{
|
||||
$image = request()->file('image');
|
||||
if($this->validate->checkImage($image)){
|
||||
try{
|
||||
if(!$this->uploadPathIsWritable){
|
||||
throw new \Exception('上传文件夹需要写入权限');
|
||||
}
|
||||
$src = Filesystem::putFile(date('Ymd'), $image, 'uniqid');
|
||||
$src = $this->uploadPath . '/' . $src;
|
||||
$suffix = strtolower($image->getOriginalExtension());
|
||||
if($suffix == 'gif'){
|
||||
$return['thumb_src'] = $src; //TODO获取GIF缩略图
|
||||
}else{
|
||||
$return['thumb_src'] = Image::getThumb($src, 100, 100, TImage::THUMB_SCALING); //上传返回缩略图宽度为100
|
||||
}
|
||||
$return['src'] = $src;
|
||||
if($this->isCompress){
|
||||
Image::resize($src);
|
||||
}
|
||||
File::add($image, $src); //加入上传文件表
|
||||
} catch (\Exception $e) {
|
||||
return $this->json(1, $e->getMessage());
|
||||
}
|
||||
return $this->json(0, 'ok', $return);
|
||||
}else{
|
||||
$errorMsg = Lang::get($this->validate->getError());
|
||||
return $this->json(1, $errorMsg);
|
||||
}
|
||||
}
|
||||
|
||||
//富文本编辑器商城图片
|
||||
public function wangImage()
|
||||
{
|
||||
|
||||
$imageArr = request()->file('wang_img'); // 该方式,前端js上传方法中字段名称必须以数组形式传参 如 wang_img[] = 值
|
||||
$errno = 0;
|
||||
$data = [];
|
||||
if(!$this->uploadPathIsWritable){
|
||||
$errno = 1;
|
||||
$data[] = '上传文件夹需要写入权限';
|
||||
}else{
|
||||
foreach ($imageArr as $image) {
|
||||
if($this->validate->checkImage($image)){
|
||||
$src = Filesystem::putFile(date('Ymd'), $image, 'uniqid');
|
||||
$src = $this->uploadPath . '/' . $src;
|
||||
$data[] = $src;
|
||||
if($this->isCompress){
|
||||
Image::resize($src);
|
||||
}
|
||||
File::add($image, $src); //加入上传文件表
|
||||
}else{
|
||||
$errno = 1;
|
||||
$data = [];
|
||||
$data[] = Lang::get($this->validate->getError());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$return['errno'] = $errno;
|
||||
$return['data'] = $data;
|
||||
return json($return);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace app\controller\manager;
|
||||
|
||||
|
||||
/**
|
||||
* 微信公众号配置
|
||||
* Class Wechat
|
||||
* @package app\controller\manager
|
||||
*/
|
||||
class Wechat extends Base
|
||||
{
|
||||
// 公众号设置
|
||||
public function base()
|
||||
{
|
||||
// TODO
|
||||
return 'TODO ...';
|
||||
}
|
||||
|
||||
// 公众号设置
|
||||
public function menu()
|
||||
{
|
||||
// TODO
|
||||
return 'TODO ...';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
// 事件定义文件
|
||||
return [
|
||||
'bind' => [
|
||||
],
|
||||
|
||||
'listen' => [
|
||||
'AppInit' => [],
|
||||
'HttpRun' => [],
|
||||
'HttpEnd' => [],
|
||||
'LogLevel' => [],
|
||||
'LogWrite' => [],
|
||||
],
|
||||
|
||||
'subscribe' => [
|
||||
],
|
||||
];
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
// 全局中间件定义文件
|
||||
return [
|
||||
// 全局请求缓存
|
||||
// \think\middleware\CheckRequestCache::class,
|
||||
// 多语言加载
|
||||
//\think\middleware\LoadLangPack::class,
|
||||
// Session初始化
|
||||
\think\middleware\SessionInit::class,
|
||||
];
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
namespace app\middleware;
|
||||
|
||||
use Closure;
|
||||
use app\model\AuthRule;
|
||||
use think\facade\Cache;
|
||||
|
||||
class Auth
|
||||
{
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
$auth = session('auth');
|
||||
if(!$auth){
|
||||
return redirect(url('manager.login/index'));
|
||||
}
|
||||
// 角色权限
|
||||
$rules = Cache::get('group_rules_'.$auth['groupId']);
|
||||
$ruleNames = Cache::get('rule_names_'.$auth['groupId']);
|
||||
//如果是超级管理员,不用验证权限,给予所有权限
|
||||
if(empty($rules)){
|
||||
$ruleNames = [];
|
||||
if($auth['groupId'] == 1){
|
||||
$rules = AuthRule::getListTree(0);
|
||||
}else{
|
||||
// 角色权限 + 基本权限
|
||||
$rules = AuthRule::getAuthListByRuleIDs($auth['groupId']);
|
||||
}
|
||||
foreach($rules as &$rule){
|
||||
if(!stripos($rule['name'],'/')){
|
||||
$rule['name'] = $rule['name'].'/index';
|
||||
}
|
||||
$ruleNames[] = strtolower($rule['name']);
|
||||
if(isset($rule['children']) && !empty($rule['children'])){
|
||||
foreach($rule['children'] as &$child){
|
||||
if(!stripos($child['name'],'/')){
|
||||
$child['name'] = $child['name'].'/index';
|
||||
}
|
||||
$ruleNames[] = strtolower($child['name']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// 对角色赋予权限缓存,角色权限更新时需要同步更新缓存
|
||||
Cache::set('group_rules_'.$auth['groupId'], $rules);
|
||||
Cache::set('rule_names_'.$auth['groupId'], $ruleNames);
|
||||
}
|
||||
if($auth['groupId'] == 1){
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
$controller = strtolower(request()->controller());
|
||||
$controller = str_replace('manager.', '', $controller);
|
||||
$action = request()->action();
|
||||
$name = strtolower($controller.'/'.$action);
|
||||
if(!empty($ruleNames) && in_array($name, $ruleNames, true)){
|
||||
return $next($request);
|
||||
}
|
||||
if(request()->isAjax()){
|
||||
return json(['code' => 1,'msg' => '没有权限']);
|
||||
}else{
|
||||
exit('无操作权限') ;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
namespace app\middleware;
|
||||
|
||||
use Closure;
|
||||
|
||||
/**
|
||||
* CSRF校验
|
||||
*/
|
||||
class Csrf
|
||||
{
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if($request->isPost()){
|
||||
$check = $request->checkToken('__token__');
|
||||
if(false === $check) {
|
||||
return $this->csrfError($request);
|
||||
}
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
protected function csrfError($request, $msg = '非法请求, 用户身份认证失败!')
|
||||
{
|
||||
if($request->isAjax()) {
|
||||
return json(['code' => 401, 'msg' => $msg], 200);
|
||||
} else {
|
||||
$referer = $_SERVER['HTTP_REFERER'] ?? null;
|
||||
if (empty($referer)) {
|
||||
$url = '/';
|
||||
} else {
|
||||
$domain = $request->domain();
|
||||
$urlInfo = parse_url($referer);
|
||||
$scheme = $urlInfo['scheme'] ?? '';
|
||||
$requestSrc = '';
|
||||
if (!empty($scheme)) {
|
||||
$requestSrc = $scheme.'://'.($urlInfo['host'] ?? '');
|
||||
}
|
||||
if($domain != $requestSrc) {
|
||||
$url = '/';
|
||||
} else {
|
||||
$url = 'javascript:history.back(-1);';
|
||||
}
|
||||
}
|
||||
$errorData = [
|
||||
'code'=> 401,
|
||||
'msg' => $msg,
|
||||
'data' => [],
|
||||
'wait' => 5,
|
||||
'url' => $url
|
||||
];
|
||||
return view('error/400', $errorData);
|
||||
// 返回401视图 response type has html、json、jsonp、xml、file、view、redirect
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
namespace app\middleware;
|
||||
|
||||
use app\model\User;
|
||||
use app\model\WeixinAccountMini;
|
||||
use Closure;
|
||||
|
||||
class Token
|
||||
{
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
$result = [
|
||||
'code' => -1,
|
||||
'msg' => "未登录或登录过期",
|
||||
'time' => time(),
|
||||
];
|
||||
$allHeader = request()->header();
|
||||
$token = isset($allHeader["token"]) ? $allHeader["token"] : "";
|
||||
$userId = isset($allHeader["userid"]) ? (int)$allHeader["userid"] : 0;
|
||||
$wechatToken = isset($allHeader["wechattoken"]) ? $allHeader["wechattoken"] : "";
|
||||
$openid = isset($allHeader["openid"]) ? $allHeader["openid"] : "";
|
||||
//先验证是否有小程序登录信息
|
||||
if ($wechatToken != "" && $openid != "") {
|
||||
$wechatUserId = WeixinAccountMini::userTokenVerification($wechatToken, $openid);
|
||||
//微信小程序登录过期或未登录
|
||||
if ($wechatUserId <= 0) {
|
||||
$result["msg"] = "小程序登录已过期或未登录";
|
||||
return json($result);
|
||||
}
|
||||
}
|
||||
|
||||
//验证平台账号是否登录
|
||||
if ($token != "" || $userId > 0) {
|
||||
$IndexUserId = User::userTokenVerification($token, $userId);
|
||||
if ($IndexUserId <= 0) {
|
||||
$result["msg"] = "原账号登录已过期或未登录" /*. $token . "_" . $userId*/
|
||||
;
|
||||
return json($result);
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
return json($result);
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,243 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
class Article extends Base
|
||||
{
|
||||
|
||||
|
||||
//获取最高访问的文章列表
|
||||
public static function getMostVisited($limit = 5)
|
||||
{
|
||||
if ($limit <= 0) {
|
||||
$limit = 5;
|
||||
}
|
||||
return self::order('views', 'desc')
|
||||
->limit($limit)
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//获取栏目下最新记录
|
||||
public static function getLatestByCategory($categoryId, $limit = 5)
|
||||
{
|
||||
if (empty($categoryId)) {
|
||||
return [];
|
||||
}
|
||||
if ($limit <= 0) {
|
||||
$limit = 5;
|
||||
}
|
||||
return self::where('category_id', $categoryId)
|
||||
->order('create_time', 'desc')
|
||||
->limit($limit)
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据文章ID和栏目ID获取下一篇文章
|
||||
public static function getNextArticleByIdAndCategoryId($id, $categoryId)
|
||||
{
|
||||
return self::where('id', '<', $id)
|
||||
->where('category_id', $categoryId)
|
||||
->where('status', 1)
|
||||
->order('sort desc')
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据文章ID和栏目ID获取上一篇文章
|
||||
public static function getPrevArticleByIdAndCategoryId($id, $categoryId)
|
||||
{
|
||||
return self::where('id', '>', $id)
|
||||
->where('category_id', $categoryId)
|
||||
->where('status', 1)
|
||||
->order('sort asc')
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据栏目ID获取文章列表
|
||||
public static function getListByCategory($categoryId, $limit = 10)
|
||||
{
|
||||
return self::where('category_id', $categoryId)
|
||||
->where('status', 1)
|
||||
->order("sort desc")
|
||||
->limit($limit)
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据栏目ID获取文章列表
|
||||
public static function getListByCategoryTop($categoryId, $limit = 10)
|
||||
{
|
||||
$where = [
|
||||
["category_id", "=", $categoryId],
|
||||
["status", "=", 1],
|
||||
["top", "=", 1],
|
||||
];
|
||||
return self::where($where)
|
||||
->order("sort desc")
|
||||
->limit($limit)
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public static function getNewsAllList($pageSize)
|
||||
{
|
||||
$where = [
|
||||
["category_id", "in", self::newsChildrenIds]
|
||||
];
|
||||
return self::where($where)
|
||||
->order("sort desc")
|
||||
->paginate($pageSize, false);
|
||||
}
|
||||
|
||||
//根据栏目ID获取文章分页列表
|
||||
public static function getListPageByCategory($categoryId, $per = 20, $keyword = '')
|
||||
{
|
||||
$where = [
|
||||
['category_id', '=', $categoryId],
|
||||
['status', '=', 1],
|
||||
];
|
||||
$param['category_id'] = $categoryId;
|
||||
if ($keyword != '') {
|
||||
$where[] = ['title', 'like', '%' . $keyword . '%'];
|
||||
$param['keyword'] = $keyword;
|
||||
}
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $param
|
||||
];
|
||||
return self::where($where)
|
||||
->order("sort desc")
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
|
||||
//根据栏目ID获取文章分页列表
|
||||
public static function getListCount($categoryId)
|
||||
{
|
||||
$where = [
|
||||
['category_id', '=', $categoryId],
|
||||
['status', '=', 1],
|
||||
];
|
||||
$param['category_id'] = $categoryId;
|
||||
|
||||
return self::where($where)
|
||||
->order("sort desc")
|
||||
->count();
|
||||
}
|
||||
|
||||
public static function onAfterInsert($article)
|
||||
{
|
||||
$article->sort = $article->id;
|
||||
$article->create_time = $article->update_time = time();
|
||||
$auth = session('auth');
|
||||
$article->created = $article->updated = $auth['userName'];
|
||||
$article->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文章列表
|
||||
* @param $categoryId 分类ID
|
||||
* @param int $per 每页数量
|
||||
* @param string $keyword 关键词
|
||||
* @param array $param 文章类型:置顶、热门、推荐 ['top','hot','recommend']
|
||||
* @param int $status 文章状态,-1表示不限制
|
||||
* @return \think\Paginator
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public static function getList($categoryId, $per = 20, $keyword = '', $param = [], $recommend_flag = '')
|
||||
{
|
||||
$whereMap = [];
|
||||
$pageParam = [];
|
||||
if (is_numeric($categoryId) && $categoryId > 0) {
|
||||
$whereMap[] = ['category_id', '=', $categoryId];
|
||||
$pageParam['category_id'] = $categoryId;
|
||||
}
|
||||
if (!empty($keyword)) {
|
||||
$whereMap[] = ['title', 'like', '%' . $keyword . '%'];
|
||||
$pageParam['keyword'] = $keyword;
|
||||
}
|
||||
if (!empty($recommend_flag)) {
|
||||
$whereMap[] = ['recommend_flag', '=', $recommend_flag];
|
||||
$pageParam['recommend_flag'] = $recommend_flag;
|
||||
}
|
||||
if (is_array($param) && count($param) > 0) {
|
||||
$pageParam['param'] = $param;
|
||||
foreach ($param as $vo) {
|
||||
if (in_array($vo, ['top', 'hot', 'recommend'], true)) {
|
||||
$whereMap[] = ["{$vo}", '=', 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $pageParam
|
||||
];
|
||||
return self::when(count($whereMap) > 0, function ($query) use ($whereMap) {
|
||||
$query->where($whereMap);
|
||||
})
|
||||
->order("sort desc")
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
|
||||
//获取文章涉及到的图片
|
||||
public static function getFilesInUse()
|
||||
{
|
||||
$items = self::select()->toArray();
|
||||
$data = [];
|
||||
foreach ($items as $item) {
|
||||
$src = trim($item['src']);
|
||||
if (!empty($src)) {
|
||||
$key = getKeyByPath($src);
|
||||
$data[$key] = $src;
|
||||
}
|
||||
$imgs = getImageUrlFromText($item['content']);
|
||||
if (!empty($imgs)) {
|
||||
$data = array_merge($data, $imgs);
|
||||
}
|
||||
$videos = getVideoUrlFromText($item['content']);
|
||||
if (!empty($videos)) {
|
||||
$data = array_merge($data, $videos);
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
//获取文章
|
||||
public static function getFinancingArticle($category_id = 0, $recommend_flag = '', $limit = 2)
|
||||
{
|
||||
$where = [
|
||||
["category_id", "=", $category_id],
|
||||
["hot", "=", 1],
|
||||
["status", "=", "1"],
|
||||
];
|
||||
if (!empty($recommend_flag)) {
|
||||
$where[] = ["recommend_flag", "=", $recommend_flag];
|
||||
}
|
||||
return self::where($where)->limit($limit)->order("sort desc")->select()->toArray();
|
||||
}
|
||||
|
||||
public static function getTopArticle($categoryId, $limit = 1)
|
||||
{
|
||||
$where = [
|
||||
["top", "=", 1],
|
||||
["status", "=", "1"],
|
||||
];
|
||||
if (is_array($categoryId)) {
|
||||
$where[] = ["category_id", "in", $categoryId];
|
||||
} else {
|
||||
$where[] = ["category_id", "=", $categoryId];
|
||||
}
|
||||
return self::where($where)->limit($limit)->order("sort desc")->select()->toArray();
|
||||
}
|
||||
|
||||
public function setImgsAttr($value)
|
||||
{
|
||||
return json_encode($value);
|
||||
}
|
||||
|
||||
// ----------页面函数
|
||||
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
use think\facade\Cache;
|
||||
|
||||
class AuthGroup extends Base
|
||||
{
|
||||
public static function updateRules($groupId, $rules)
|
||||
{
|
||||
$rules = implode(',', $rules);
|
||||
$data = ['rules' => $rules];
|
||||
self::updateById($groupId, $data);
|
||||
Member::where('group_id', $groupId)
|
||||
->update($data);
|
||||
}
|
||||
|
||||
//根据ID获取角色列表,ID为1是超级管理员
|
||||
public static function getListById($groupId = 1)
|
||||
{
|
||||
if($groupId < 1){
|
||||
return [];
|
||||
}
|
||||
$group = self::getById($groupId);
|
||||
if(empty($group)){
|
||||
return [];
|
||||
}
|
||||
if($groupId == 1){
|
||||
return self::select()
|
||||
->toArray();
|
||||
}else{
|
||||
return self::where('id','<>','1')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置角色权限缓存
|
||||
* @param int $groupId 指定重置的角色ID,若不指定则重置所有角色
|
||||
*/
|
||||
public static function resetGroupRulesCache($groupId = 0)
|
||||
{
|
||||
if(is_numeric($groupId) && $groupId > 0) {
|
||||
Cache::set('group_rules_'.$groupId, null);
|
||||
Cache::set('rule_names_'.$groupId, null);
|
||||
} else {
|
||||
$groupIds = self::column('id');
|
||||
foreach ($groupIds as $id){
|
||||
Cache::set('group_rules_'.$id, null);
|
||||
Cache::set('rule_names_'.$id, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,271 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class AuthRule extends Base
|
||||
{
|
||||
//根据权限IDs获取权限列表
|
||||
public static function getListByRuleIDs($ruleIds)
|
||||
{
|
||||
$items = self::wherein('id',$ruleIds)
|
||||
//->where('status', 1)
|
||||
->order('sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
return self::getChildren($items);
|
||||
}
|
||||
|
||||
//角色权限 + 基本权限
|
||||
public static function getAuthListByRuleIDs($groupId)
|
||||
{
|
||||
$order = ['sort'=>'asc'];
|
||||
if ($groupId == 1) {
|
||||
$items = self::order($order)->select()->toArray();
|
||||
} else {
|
||||
$group = AuthGroup::getById($groupId);
|
||||
$rulesArr = [];
|
||||
if ($group && !empty($group['rules'])) {
|
||||
$rulesArr = array_filter(explode(',', $group['rules']));
|
||||
}
|
||||
if (count($rulesArr) >0) {
|
||||
$items = self::wherein('id', $rulesArr)->whereOr('is_base', 1)->order($order)->select()->toArray();
|
||||
} else {
|
||||
$items = self::where('is_base', 1)->order($order)->select()->toArray();
|
||||
}
|
||||
}
|
||||
$levelItems = self::getChildren($items);
|
||||
$levelIds = self::getChildrenIds($items);
|
||||
// 独立写入不在连续分层中的权限,连续分层权限可用于菜单显示
|
||||
foreach ($items as $item) {
|
||||
if(!in_array($item['id'], $levelIds)) {
|
||||
$levelItems[] = $item;
|
||||
}
|
||||
}
|
||||
return $levelItems;
|
||||
}
|
||||
|
||||
//根据上级ID获取下级权限列表
|
||||
public static function getListTree($forMenu = 0)
|
||||
{
|
||||
$items = self::getList($forMenu);
|
||||
return self::getChildren($items);
|
||||
}
|
||||
|
||||
//根据上级ID获取下级权限列表
|
||||
public static function getListByParentId($parentId)
|
||||
{
|
||||
return self::where('parent_id', $parentId)
|
||||
->order('sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $items
|
||||
* @param integer $parent_id
|
||||
* @return array
|
||||
*/
|
||||
public static function getChildren($items, $parentId = 0)
|
||||
{
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
if($item['parent_id'] == $parentId){
|
||||
$childern = self::getChildren($items, $item['id']);
|
||||
if(!empty($childern)){
|
||||
$item['hasChildren'] = true;
|
||||
$item['children'] = $childern;
|
||||
}
|
||||
$data[] = $item;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public static function getChildrenIds($items, $parentId = 0)
|
||||
{
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
if($item['parent_id'] == $parentId){
|
||||
$childrenIds = self::getChildrenIds($items, $item['id']);
|
||||
if(!empty($childrenIds)){
|
||||
$data = array_merge($data, $childrenIds);
|
||||
}
|
||||
$data[] = $item['id'];
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $forMenu 大于0表示获取可显示的权限
|
||||
* @return void
|
||||
*/
|
||||
private static function getList($forMenu = 0)
|
||||
{
|
||||
if($forMenu){
|
||||
return self::where('status', 1)->order('sort', 'asc')->select()->toArray();
|
||||
}else{
|
||||
return self::order('sort', 'asc')->select()->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
//获取可显示权限
|
||||
public static function getTopListForDisplay()
|
||||
{
|
||||
return self::where('status', 1)
|
||||
->where('parent_id', 0)
|
||||
->order('sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据两个名字获取权限
|
||||
public static function getByTwoName($name, $otherName)
|
||||
{
|
||||
return self::whereOr('name',$name)
|
||||
->whereOr('name',$otherName)
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据name获取权限
|
||||
public static function getByName($name)
|
||||
{
|
||||
return self::where('name', $name)
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public static function onAfterInsert($rule)
|
||||
{
|
||||
$rule->sort = $rule->id;
|
||||
$rule->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 该情况适合无限级菜单分组显示 (当前系统仅支持2级权限,因此推荐使用getListTree 方法)
|
||||
* @param int $forMenu 是否只获取可显示菜单权限
|
||||
*/
|
||||
public static function getListTreeSort($forMenu = 0)
|
||||
{
|
||||
$items = self::getList($forMenu);
|
||||
return self::groupSort($items, 0, 1, true, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分组排序(不拆分为子集)
|
||||
*
|
||||
* @param $items 数据源
|
||||
* @param integer $pid
|
||||
* @param integer $level
|
||||
* @param bool $clear 是否释放局部变量(外部调用时必须先释放,避免数据被累加;内部不用,需要累加)
|
||||
* @param bool $isArr 传入的$items是否为数组,默认否(数据集)
|
||||
* @param string $levelSpare 分层符
|
||||
* @return void
|
||||
*/
|
||||
public static function groupSort($items,$pid = 0, $level = 1, $clear = true, $isArr = false, $levelSpare = '_')
|
||||
{
|
||||
static $data = [];
|
||||
if ($clear) {
|
||||
$data = [];
|
||||
static $data = [];
|
||||
}
|
||||
if(!empty($levelSpare) && $level > 1) {
|
||||
$levelSpare = str_repeat($levelSpare, $level-1);
|
||||
}
|
||||
if (count($items) > 0) {
|
||||
if ($isArr) {
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item['parent_id'] == $pid) {
|
||||
$item['level'] = $level;
|
||||
$item['title'] = $levelSpare.$item['title'];
|
||||
$data[] = $item;
|
||||
self::groupSort($items, $item['id'], $level+1, false, $isArr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item->parent_id == $pid) {
|
||||
$item->level = $level;
|
||||
$item->title = $levelSpare.$item->title;
|
||||
$data[] = $item;
|
||||
self::groupSort($items, $item->id, $level+1, false, $isArr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 树形排序 (拆分子集)
|
||||
*
|
||||
* @param Collection $items 数据集(非数组)
|
||||
* @param integer $pid
|
||||
* @param integer $level
|
||||
* @return void
|
||||
*/
|
||||
public static function treeSort($items,$pid = 0, $level = 1)
|
||||
{
|
||||
$data = [];
|
||||
if (count($items) > 0) {
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item->parent_id == $pid) {
|
||||
$item->level = $level;
|
||||
$children = self::treeSort($items, $item->id, $level+1);
|
||||
$item->children = $children;
|
||||
$data[] = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询用户权限(登陆时更具角色更新为最新权限)
|
||||
* 可显示权限和所有权限 角色权限 + 基本权限
|
||||
*
|
||||
* @param boolean $groupId 角色ID,超级管理员(对应group_id = 1)
|
||||
* @return void
|
||||
*/
|
||||
public static function userRolesList($groupId = 1)
|
||||
{
|
||||
$userRoles = [];
|
||||
$items = null;
|
||||
$order = ['sort'=>'asc'];
|
||||
if ($groupId == 1) {
|
||||
$items = self::order($order)->select();
|
||||
} else {
|
||||
$group = AuthGroup::getById($groupId);
|
||||
$rulesArr = [];
|
||||
if ($group && !empty($group['rules'])) {
|
||||
$rulesArr = array_filter(explode(',', $group['rules']));
|
||||
}
|
||||
if (count($rulesArr) >0) {
|
||||
$items = self::wherein('id', $rulesArr)->whereOr('is_base', 1)->order($order)->select();
|
||||
} else {
|
||||
$items = self::where('is_base', 1)->order($order)->select();
|
||||
}
|
||||
}
|
||||
if (empty($items) || $items->isEmpty()) {
|
||||
return $userRoles;
|
||||
}
|
||||
|
||||
$allRulesId = [];
|
||||
$displayRules = [];
|
||||
$displayRulesId = [];
|
||||
foreach ($items as $key => $item) {
|
||||
$allRulesId[] = $item->id;
|
||||
if ($item->status > 0) {
|
||||
$displayRules[] = $item;
|
||||
$displayRulesId[] = $item->id;
|
||||
}
|
||||
}
|
||||
|
||||
$userRoles['allRules'] = $items;
|
||||
$userRoles['allRulesId'] = $allRulesId;
|
||||
$userRoles['displayRules'] = $displayRules;
|
||||
$userRoles['displayRulesId'] = $displayRulesId;
|
||||
return $userRoles;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class Base extends Model
|
||||
{
|
||||
protected $autoWriteTimestamp = false;
|
||||
//根据Id列表获取列表
|
||||
public static function getListByIds($ids)
|
||||
{
|
||||
if(count($ids) == 0 || empty($ids)) {
|
||||
return [];
|
||||
}
|
||||
return self::where('id', 'in', $ids)->select()->toArray();
|
||||
}
|
||||
//根据ID获取单条数据
|
||||
public static function getById($id)
|
||||
{
|
||||
if($id <= 0){
|
||||
return [];
|
||||
}
|
||||
return self::where('id', $id)->findOrEmpty()->toArray();
|
||||
}
|
||||
|
||||
//根据ID更新数据
|
||||
public static function updateById($id, $data)
|
||||
{
|
||||
return self::where('id', $id)->update($data);
|
||||
}
|
||||
|
||||
//根据where条件和排序获取记录
|
||||
public static function getListByWhereAndOrder($where, $order, $limit = 1)
|
||||
{
|
||||
return self::where($where)
|
||||
->order($order)
|
||||
->limit($limit)
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class Block extends Base
|
||||
{
|
||||
const BLOCK = 1;
|
||||
const IMG = 2;
|
||||
const TEXT = 3;
|
||||
const GROUP = 4;
|
||||
const VIDEO = 5;
|
||||
const CODE = 6;
|
||||
|
||||
//获取类型键值对
|
||||
public static function getTypes()
|
||||
{
|
||||
return [
|
||||
'1' => 'block',
|
||||
'2' => 'img',
|
||||
'3' => 'text',
|
||||
'4' => 'group',
|
||||
'5' => 'video',
|
||||
'6' => 'code'
|
||||
];
|
||||
}
|
||||
|
||||
//根据键值和类目获取数据
|
||||
public static function getByKeyword($keyword, $categoryId)
|
||||
{
|
||||
return self::where('keyword', $keyword)->where('category_id', $categoryId)->findOrEmpty()->toArray();
|
||||
}
|
||||
|
||||
//根据栏目ID获取块列表
|
||||
public static function getByCategoryId($categoryId)
|
||||
{
|
||||
|
||||
if($categoryId <= 0){
|
||||
return [];
|
||||
}
|
||||
$category = Category::getById($categoryId);
|
||||
if(empty($category)){
|
||||
return [];
|
||||
}
|
||||
$items = self::where('category_id', $categoryId)
|
||||
->order('sort asc')
|
||||
->select()
|
||||
->toArray();
|
||||
if(empty($items)){
|
||||
return [];
|
||||
}
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
$data[$item['keyword']] = $item;
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
//获取在使用中的文件
|
||||
public static function getFilesInUse()
|
||||
{
|
||||
$items = self::whereIn('type', [self::IMG, self::GROUP, self::VIDEO, self::TEXT])
|
||||
->select()
|
||||
->toArray();
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
if($item['type'] == self::IMG){
|
||||
$file = trim($item['value']);
|
||||
if(!empty($file)){
|
||||
$key = getKeyByPath($file);
|
||||
$data[$key] = $file;
|
||||
}
|
||||
}elseif($item['type'] == self::GROUP){
|
||||
$val = trim($item['value']);
|
||||
if (!empty($val) && $val != '[]' && $val != 'null') {
|
||||
$files = json_decode($val, true);
|
||||
foreach($files as $file){
|
||||
$src = trim($file['src']);
|
||||
if(!empty($src)){
|
||||
$key = getKeyByPath($src);
|
||||
$data[$key] = $src;
|
||||
}
|
||||
}
|
||||
}
|
||||
}elseif($item['type'] == self::VIDEO){
|
||||
$video = trim($item['value']);
|
||||
if(!empty($video)){
|
||||
$key = getKeyByPath($video);
|
||||
$data[$key] = $video;
|
||||
}
|
||||
$img = trim($item['img']);
|
||||
if(!empty($img)){
|
||||
$key = getKeyByPath($img);
|
||||
$data[$key] = $img;
|
||||
}
|
||||
}elseif($item['type'] == self::TEXT){
|
||||
$imgs = getImageUrlFromText($item['value']);
|
||||
if(!empty($imgs)){
|
||||
$data = array_merge($data, $imgs);
|
||||
}
|
||||
$videos = getVideoUrlFromText($item['value']);
|
||||
if(!empty($videos)){
|
||||
$data = array_merge($data, $videos);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,306 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
class Category extends Base
|
||||
{
|
||||
const AboutMarketId = 56;//关于市场顶级id
|
||||
const ProductCategoryId = 57;//产品顶级id
|
||||
const AquaticSupplyAndDemandId = 62;//水产供求顶级id
|
||||
const NewsId = 58;//新闻顶级id
|
||||
|
||||
const indexAquaticSupplyDemandId = 74;//首页水产供求id(不是顶级栏目)
|
||||
const indexAquacultureInformationId = 76;//首页水产养殖资讯id(不是顶级栏目)
|
||||
|
||||
const indexAquaticSeedlingId = 66;//首页水产鱼苗id(不是顶级栏目)
|
||||
const indexFisheryFeedId = 67;//首页渔用饲料id(不是顶级栏目)
|
||||
const indexDomesticFishWholesaleId = 68;//首页家鱼批发id(不是顶级栏目)
|
||||
const indexSeafoodWholesaleId = 69;//首页海鲜批发id(不是顶级栏目)
|
||||
const indexFisherySuppliesId = 70;//首页渔需物资id(不是顶级栏目)
|
||||
|
||||
|
||||
//获取首页栏目ID
|
||||
public static function getIndex()
|
||||
{
|
||||
return self::where('is_index', 1)->findOrEmpty()->toArray();
|
||||
}
|
||||
|
||||
//根据上级ID和语言获取下级栏目
|
||||
public static function getChildrenByParentId($parentId)
|
||||
{
|
||||
if ($parentId <= 0) {
|
||||
return [];
|
||||
}
|
||||
$category = self::getById($parentId);
|
||||
if (empty($category)) {
|
||||
return [];
|
||||
}
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template, m.name as modelName')
|
||||
->where('c.parent_id', $parentId)
|
||||
->order('c.sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//重写方法
|
||||
public static function getById($categoryId)
|
||||
{
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id = m.id')
|
||||
->where('c.id', $categoryId)
|
||||
->field('c.*, m.template')
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//查看是否有下级栏目
|
||||
public static function hasChildren($categoryId)
|
||||
{
|
||||
if (is_array($categoryId)) {
|
||||
$count = self::where('parent_id', 'in', $categoryId)->count();
|
||||
} else {
|
||||
$count = self::where(['parent_id' => $categoryId])->count();
|
||||
}
|
||||
return $count ? true : false;
|
||||
}
|
||||
|
||||
//获取前台菜单
|
||||
public static function getListForFrontMenu()
|
||||
{
|
||||
$items = self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template')
|
||||
->where('c.state', 1)
|
||||
->order('is_index desc, sort asc')
|
||||
->select()
|
||||
->toArray();
|
||||
return self::getCates($items);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取栏目
|
||||
* @param bool $limit 是否限制查询
|
||||
* @param array $cates 需要限制查询的栏目IDs
|
||||
*/
|
||||
public static function getList($limit = false, $cates = [])
|
||||
{
|
||||
if ($limit && empty($cates)) {
|
||||
return [];
|
||||
}
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.name as modelName')
|
||||
->when($limit, function ($query) use ($cates) {
|
||||
$query->whereIn('c.id', $cates);
|
||||
})
|
||||
->order('sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//获取栏目分级列表
|
||||
public static function getListTree($isMenu = false)
|
||||
{
|
||||
if ($isMenu) {
|
||||
$items = self::where('c.state', 1)->order('sort', 'asc')->select()->toArray();
|
||||
} else {
|
||||
$items = self::order('sort', 'asc')->select()->toArray();
|
||||
}
|
||||
return self::getCates($items);
|
||||
}
|
||||
|
||||
//获取递归栏目
|
||||
public static function getCates($cates, $parentId = 0)
|
||||
{
|
||||
$menus = [];
|
||||
foreach ($cates as $cate) {
|
||||
if ($cate['parent_id'] == $parentId) {
|
||||
$children = self::getCates($cates, $cate['id']);
|
||||
if (!empty($children)) {
|
||||
$cate['children'] = $children;
|
||||
}
|
||||
$menus[] = $cate;
|
||||
}
|
||||
}
|
||||
return $menus;
|
||||
}
|
||||
|
||||
public static function onAfterInsert($category)
|
||||
{
|
||||
$category->sort = $category->id;
|
||||
$category->save();
|
||||
}
|
||||
|
||||
//递归获取栏目名称面包屑
|
||||
public static function getCatesCrumbs($currentId = 0)
|
||||
{
|
||||
$crumbs = [];
|
||||
$category = self::getById($currentId);
|
||||
if ($category) {
|
||||
if ($category['parent_id'] != 0) {
|
||||
$categoryIds = explode(',', trim($category['path'], ','));
|
||||
$categories = self::where('id', 'in', $categoryIds)->column('*', 'id');
|
||||
foreach ($categoryIds as $id) {
|
||||
if (isset($categories[$id])) {
|
||||
$crumbs[] = $categories[$id]['title'];
|
||||
}
|
||||
}
|
||||
}
|
||||
$crumbs[] = $category['title'];
|
||||
}
|
||||
return $crumbs;
|
||||
}
|
||||
|
||||
//获取栏目中涉及到的文件
|
||||
public static function getFilesInUse()
|
||||
{
|
||||
$items = self::select()->toArray();
|
||||
$data = [];
|
||||
foreach ($items as $item) {
|
||||
$src = trim($item['src']);
|
||||
if (!empty($src)) {
|
||||
$key = getKeyByPath($src);
|
||||
$data[$key] = $src;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
//当前分类的最高级分类Id
|
||||
public static function firstGradeById($id)
|
||||
{
|
||||
$res = 0;
|
||||
$item = self::getById($id);
|
||||
if ($item) {
|
||||
$res = $id;
|
||||
if ($item['parent_id'] > 0) {
|
||||
$items = self::select()->toArray();
|
||||
$first = self::getFirstGrade($items, $item['parent_id']);
|
||||
if (!empty($first)) {
|
||||
$res = $first['id'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
public static function getFirstGrade($items, $parentId)
|
||||
{
|
||||
$data = [];
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item['id'] == $parentId) {
|
||||
if ($item['parent_id'] > 0) {
|
||||
unset($items[$key]);
|
||||
$parent = self::getFirstGrade($items, $item['parent_id']);
|
||||
if (!empty($parent)) {
|
||||
$data = $parent;
|
||||
} else {
|
||||
$data = $item;
|
||||
}
|
||||
} else {
|
||||
$data = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public static function getFooterMenu()
|
||||
{
|
||||
$items = self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template')
|
||||
->where('c.state', 1)
|
||||
->where('c.id', "in", self::footer_menu_ids)
|
||||
->whereOr('c.parent_id', "in", self::footer_menu_ids)
|
||||
->order('is_index desc, sort asc')
|
||||
->select()
|
||||
->toArray();
|
||||
return self::getCates($items);
|
||||
}
|
||||
|
||||
public static function getChildrenIds($parentId)
|
||||
{
|
||||
return self::where("parent_id", $parentId)->column("id");
|
||||
}
|
||||
|
||||
//获取当前位置
|
||||
public static function getPosition($categoryId, $isIndex = true)
|
||||
{
|
||||
$position = "";
|
||||
$getFirstGrade = self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template, m.name as modelName')
|
||||
->where("c.id", $categoryId)
|
||||
->find()
|
||||
->toArray();
|
||||
|
||||
if (!$getFirstGrade) return $position;
|
||||
|
||||
$position = '<a href="' . getUri($getFirstGrade) . '">' . $getFirstGrade["title"] . "</a> " . $position;
|
||||
if (!in_array($getFirstGrade["parent_id"], [0, 1])) {
|
||||
$position = (self::getPosition($getFirstGrade["parent_id"], false) . $position);
|
||||
}
|
||||
return ($isIndex ? "<a href='/'>首页</a>" : "") . $position;
|
||||
|
||||
}
|
||||
|
||||
public static function getProductNewsChildrenIds()
|
||||
{
|
||||
return self::where("parent_id","in",[
|
||||
self::NewsId,
|
||||
self::ProductCategoryId,
|
||||
])->column("id");
|
||||
}
|
||||
// ----------web -------
|
||||
//关于市场
|
||||
public static function getAboutMarket()
|
||||
{
|
||||
$ids = self::where("parent_id", self::AboutMarketId)->column("id");
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template, m.name as modelName')
|
||||
->where('c.id', "in", $ids)
|
||||
->order('c.sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//产品展示
|
||||
public static function getProduct()
|
||||
{
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template, m.name as modelName')
|
||||
->where('c.parent_id', "=", self::ProductCategoryId)
|
||||
->order('c.sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//水产供求
|
||||
public static function getAquaticSupplyAndDemand()
|
||||
{
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template, m.name as modelName')
|
||||
->where('c.parent_id', "=", self::AquaticSupplyAndDemandId)
|
||||
->order('c.sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//新闻 市场动态
|
||||
public static function getNews()
|
||||
{
|
||||
return self::alias('c')
|
||||
->leftJoin('model m', 'c.model_id=m.id')
|
||||
->field('c.*, m.manager, m.template, m.name as modelName')
|
||||
->where('c.parent_id', "=", self::NewsId)
|
||||
->order('c.sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
//桌号管理
|
||||
class Desk extends Base
|
||||
{
|
||||
protected $autoWriteTimestamp = true;
|
||||
|
||||
//桌号类型 1 - 12人
|
||||
static $desk_type = [
|
||||
"1"=>"单人",
|
||||
"2"=>"双人",
|
||||
"3"=>"3人",
|
||||
"4"=>"4人",
|
||||
"5"=>"5人",
|
||||
"6"=>"6人",
|
||||
"7"=>"7人",
|
||||
"8"=>"8人",
|
||||
"9"=>"9人",
|
||||
"10"=>"10人",
|
||||
"12"=>"12人",
|
||||
];
|
||||
static $default_type = "12";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取文章列表
|
||||
* @param int $per 每页数量
|
||||
* @param string $keyword 关键词
|
||||
* @return \think\Paginator
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public static function getList( $per = 20, $keyword = '')
|
||||
{
|
||||
$whereMap = [];
|
||||
$pageParam = [];
|
||||
|
||||
if (!empty($keyword)) {
|
||||
$whereMap[] = ['title', 'like', '%' . $keyword . '%'];
|
||||
$pageParam['keyword'] = $keyword;
|
||||
}
|
||||
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $pageParam
|
||||
];
|
||||
return self::when(count($whereMap) > 0, function ($query) use ($whereMap) {
|
||||
$query->where($whereMap);
|
||||
})
|
||||
->order("number asc")
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
|
||||
|
||||
public static function editRepeat($desk_id,$hall_id,$number)
|
||||
{
|
||||
$where=[
|
||||
["id","<>",$desk_id],
|
||||
["hall_id","=",$hall_id],
|
||||
["number","=",$number],
|
||||
];
|
||||
return self::where($where)
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
public static function addRepeat($hall_id,$number)
|
||||
{
|
||||
$where=[
|
||||
["hall_id","=",$hall_id],
|
||||
["number","=",$number],
|
||||
];
|
||||
return self::where($where)
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
use think\Image;
|
||||
|
||||
class File extends Base
|
||||
{
|
||||
const IMG = 'img';
|
||||
const VIDEO = 'video';
|
||||
const FILE = 'file';
|
||||
|
||||
//获取文件类型
|
||||
public static function getTypes()
|
||||
{
|
||||
return [
|
||||
'img' => '图片',
|
||||
'video' => '视频',
|
||||
'file' => '文件'
|
||||
];
|
||||
}
|
||||
|
||||
//获取文件列表
|
||||
public static function getList($type = '', $page = 1, $per = 20)
|
||||
{
|
||||
$limit = ($page - 1) * $per;
|
||||
if($type != ''){
|
||||
if(!in_array($type, array_keys(self::getTypes()))){
|
||||
return [];
|
||||
}
|
||||
$items = self::where('type', $type)
|
||||
->order('id desc');
|
||||
}else{
|
||||
$items = self::order('id desc');
|
||||
}
|
||||
$items = $items->limit($limit, $per)->select()->toArray();
|
||||
foreach($items as &$item){
|
||||
$item['sizeStr'] = sizeToStr($item['size']);
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
//获取分页列表
|
||||
public static function getListPage($type = '', $per = 20)
|
||||
{
|
||||
if($type != ''){
|
||||
if(!in_array($type, array_keys(self::getTypes()))){
|
||||
return [];
|
||||
}
|
||||
return self::where('type', $type)
|
||||
->order('id desc')
|
||||
->paginate([
|
||||
'list_rows' => $per,
|
||||
'query' => [
|
||||
'type' => $type
|
||||
]
|
||||
], false);
|
||||
}else{
|
||||
return self::order('id desc')
|
||||
->paginate([
|
||||
'list_rows' => $per
|
||||
], false);
|
||||
}
|
||||
}
|
||||
|
||||
//添加,$w_h图片尺寸大小,单位像素,只对type=img时有效
|
||||
public static function add($file, $src, $type = 'img')
|
||||
{
|
||||
$realPath = app()->getRootPath() . ltrim($src,'/');
|
||||
if(is_file($realPath) && $type == 'img'){
|
||||
$img = Image::open($realPath);
|
||||
list($w,$h) = $img->size();
|
||||
$w_h = $w . 'px * ' . $h . 'px';
|
||||
}else{
|
||||
$w_h = '';
|
||||
}
|
||||
return self::create([
|
||||
'type' => $type,
|
||||
'name' => $file->getOriginalName(),
|
||||
'src' => $src,
|
||||
'size' => $file->getSize(),
|
||||
'suffix' => $file->getOriginalExtension(),
|
||||
'mime_type' => $file->getOriginalMime(),
|
||||
'create_time' => time(),
|
||||
'w_h' => $w_h
|
||||
]);
|
||||
}
|
||||
|
||||
//获取所有记录
|
||||
public static function getAll()
|
||||
{
|
||||
return self::select()->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
//礼物
|
||||
class Gift extends Base
|
||||
{
|
||||
protected $autoWriteTimestamp = true;
|
||||
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文章列表
|
||||
* @param $categoryId 分类ID
|
||||
* @param int $per 每页数量
|
||||
* @param string $keyword 关键词
|
||||
* @param array $param 文章类型:置顶、热门、推荐 ['top','hot','recommend']
|
||||
* @param int $status 文章状态,-1表示不限制
|
||||
* @return \think\Paginator
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public static function getList( $per = 20, $keyword = '')
|
||||
{
|
||||
$whereMap = [];
|
||||
$pageParam = [];
|
||||
|
||||
if (!empty($keyword)) {
|
||||
$whereMap[] = ['title', 'like', '%' . $keyword . '%'];
|
||||
$pageParam['keyword'] = $keyword;
|
||||
}
|
||||
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $pageParam
|
||||
];
|
||||
return self::when(count($whereMap) > 0, function ($query) use ($whereMap) {
|
||||
$query->where($whereMap);
|
||||
})
|
||||
->order("sort desc")
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
// ----------页面函数
|
||||
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
//大厅
|
||||
class Hall extends Base
|
||||
{
|
||||
protected $autoWriteTimestamp = true;
|
||||
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取列表
|
||||
* @param int $per 每页数量
|
||||
* @param string $keyword 关键词
|
||||
* @return \think\Paginator
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public static function getList( $per = 20, $keyword = '')
|
||||
{
|
||||
$whereMap = [];
|
||||
$pageParam = [];
|
||||
|
||||
if (!empty($keyword)) {
|
||||
$whereMap[] = ['a.title', 'like', '%' . $keyword . '%'];
|
||||
$pageParam['keyword'] = $keyword;
|
||||
}
|
||||
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $pageParam
|
||||
];
|
||||
return self::alias("a")->join("hall_layout b","a.layout_id = b.id")->when(count($whereMap) > 0, function ($query) use ($whereMap) {
|
||||
$query->where($whereMap);
|
||||
})
|
||||
->order("a.sort desc")
|
||||
->field('a.*,b.layout_img,b.title as layout_title')
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
|
||||
public function setImgsAttr($name){
|
||||
return json_encode($name);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
//大厅布局
|
||||
class HallLayout extends Base
|
||||
{
|
||||
protected $autoWriteTimestamp = true;
|
||||
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取列表
|
||||
* @param int $per 每页数量
|
||||
* @param string $keyword 关键词
|
||||
* @return \think\Paginator
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public static function getList( $per = 20, $keyword = '')
|
||||
{
|
||||
$whereMap = [];
|
||||
$pageParam = [];
|
||||
|
||||
if (!empty($keyword)) {
|
||||
$whereMap[] = ['title', 'like', '%' . $keyword . '%'];
|
||||
$pageParam['keyword'] = $keyword;
|
||||
}
|
||||
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $pageParam
|
||||
];
|
||||
return self::when(count($whereMap) > 0, function ($query) use ($whereMap) {
|
||||
$query->where($whereMap);
|
||||
})
|
||||
->order("sort desc")
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
|
||||
public static function getAll(){
|
||||
return self::select()->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class History extends Base
|
||||
{
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
public static function getPaginateList($categoryId, $per = 20, $isSample = false)
|
||||
{
|
||||
$paginate = [
|
||||
'list_rows' => $per
|
||||
];
|
||||
$items = self::where('category_id', $categoryId)->order('sort', 'asc')->paginate($paginate, $isSample);
|
||||
if(!$items->isEmpty()) {
|
||||
$ids = $items->column('id');
|
||||
$infoList = HistoryInfo::getByHistoryIds($ids);
|
||||
foreach ($items as $k => $item) {
|
||||
$items[$k]['info'] = $infoList[$item['id']] ?? [];
|
||||
}
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
public static function getByCategoryId($categoryId, $onlyVisible = false)
|
||||
{
|
||||
$items = self::where('category_id', $categoryId)
|
||||
->when($onlyVisible, function($query){
|
||||
$query->where('visible', 1);
|
||||
})
|
||||
->order('sort', 'asc')
|
||||
->select();
|
||||
if(!$items->isEmpty()) {
|
||||
$ids = $items->column('id');
|
||||
$infoList = HistoryInfo::getByHistoryIds($ids, $onlyVisible);
|
||||
foreach ($items as $k => $item) {
|
||||
$items[$k]['info'] = $infoList[$item['id']] ?? [];
|
||||
}
|
||||
}
|
||||
return $items->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class HistoryInfo extends Base
|
||||
{
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
public static function getByHistoryIds($historyIds = [], $onlyVisible = false)
|
||||
{
|
||||
if(!is_array($historyIds) || count($historyIds) == 0) {
|
||||
return [];
|
||||
}
|
||||
$list = self::whereIn('history_id', $historyIds)
|
||||
->when($onlyVisible, function ($query) {
|
||||
$query->where('visible', 1);
|
||||
})
|
||||
->order(['history_id'=>'asc','sort'=>'asc'])
|
||||
->select()
|
||||
->toArray();
|
||||
$data = [];
|
||||
foreach ($list as $item) {
|
||||
$item['img_list'] = [];
|
||||
if(!empty($item['imgs'])) {
|
||||
$item['img_list'] = array_filter(explode(',', $item['imgs']));
|
||||
}
|
||||
$data[$item['history_id']][] = $item;
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public static function countByHistoryId($historyId)
|
||||
{
|
||||
return self::where('history_id', $historyId)->count();
|
||||
}
|
||||
|
||||
public static function delByHistoryId($historyId)
|
||||
{
|
||||
return self::where('history_id', $historyId)->delete();
|
||||
}
|
||||
|
||||
public static function getByHistoryId($historyId)
|
||||
{
|
||||
if($historyId <= 0) {
|
||||
return [];
|
||||
}
|
||||
return self::where('history_id', $historyId)->order(['sort'=>'asc'])->select()->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class InvitationTemplateClass extends Base
|
||||
{
|
||||
|
||||
|
||||
|
||||
//根据上级ID获取下级列表
|
||||
public static function getListTree($forMenu = 0)
|
||||
{
|
||||
$items = self::getList($forMenu);
|
||||
return self::getChildren($items);
|
||||
}
|
||||
/**
|
||||
* @param integer $forMenu 大于0表示获取可显示的权限
|
||||
* @return void
|
||||
*/
|
||||
private static function getList($forMenu = 0)
|
||||
{
|
||||
if($forMenu){
|
||||
return self::where('show', 'yes')->order('sort', 'asc')->select()->toArray();
|
||||
}else{
|
||||
return self::order('sort', 'asc')->select()->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @param array $items
|
||||
* @param integer $parent_id
|
||||
* @return array
|
||||
*/
|
||||
public static function getChildren($items, $parentId = 0)
|
||||
{
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
if($item['parent_id'] == $parentId){
|
||||
$childern = self::getChildren($items, $item['id']);
|
||||
if(!empty($childern)){
|
||||
$item['hasChildren'] = true;
|
||||
$item['children'] = $childern;
|
||||
}
|
||||
$data[] = $item;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static function onAfterInsert($rule)
|
||||
{
|
||||
$rule->sort = $rule->id;
|
||||
$rule->save();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 分组排序(不拆分为子集)
|
||||
*
|
||||
* @param $items 数据源
|
||||
* @param integer $pid
|
||||
* @param integer $level
|
||||
* @param bool $clear 是否释放局部变量(外部调用时必须先释放,避免数据被累加;内部不用,需要累加)
|
||||
* @param bool $isArr 传入的$items是否为数组,默认否(数据集)
|
||||
* @param string $levelSpare 分层符
|
||||
* @return void
|
||||
*/
|
||||
public static function groupSort($items,$pid = 0, $level = 1, $clear = true, $isArr = false, $levelSpare = '_')
|
||||
{
|
||||
static $data = [];
|
||||
if ($clear) {
|
||||
$data = [];
|
||||
static $data = [];
|
||||
}
|
||||
if(!empty($levelSpare) && $level > 1) {
|
||||
$levelSpare = str_repeat($levelSpare, $level-1);
|
||||
}
|
||||
if (count($items) > 0) {
|
||||
if ($isArr) {
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item['parent_id'] == $pid) {
|
||||
$item['level'] = $level;
|
||||
$item['title'] = $levelSpare.$item['title'];
|
||||
$data[] = $item;
|
||||
self::groupSort($items, $item['id'], $level+1, false, $isArr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item->parent_id == $pid) {
|
||||
$item->level = $level;
|
||||
$item->title = $levelSpare.$item->title;
|
||||
$data[] = $item;
|
||||
self::groupSort($items, $item->id, $level+1, false, $isArr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 树形排序 (拆分子集)
|
||||
*
|
||||
* @param Collection $items 数据集(非数组)
|
||||
* @param integer $pid
|
||||
* @param integer $level
|
||||
* @return void
|
||||
*/
|
||||
public static function treeSort($items,$pid = 0, $level = 1)
|
||||
{
|
||||
$data = [];
|
||||
if (count($items) > 0) {
|
||||
foreach ($items as $key => $item) {
|
||||
if ($item->parent_id == $pid) {
|
||||
$item->level = $level;
|
||||
$children = self::treeSort($items, $item->id, $level+1);
|
||||
$item->children = $children;
|
||||
$data[] = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
//根据上级ID获取下级列表
|
||||
public static function getListByParentId($parentId)
|
||||
{
|
||||
return self::where('parent_id', $parentId)
|
||||
->order('sort', 'asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class Link extends Base
|
||||
{
|
||||
public static function delByIds($ids)
|
||||
{
|
||||
return self::whereIn('id', $ids)->delete();
|
||||
}
|
||||
|
||||
//获取友情链接
|
||||
public static function getList()
|
||||
{
|
||||
return self::order('sort desc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public static function onAfterInsert($item)
|
||||
{
|
||||
$item->sort = $item->id;
|
||||
$item->save();
|
||||
}
|
||||
|
||||
//获取友情链接涉及到的文件
|
||||
public static function getFilesInUse()
|
||||
{
|
||||
$items = self::select()->toArray();
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
$src = trim($item['src']);
|
||||
if(!empty($src)){
|
||||
$key = getKeyByPath($src);
|
||||
$data[$key] = $src;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
public static function getListNew($limit = 5){
|
||||
return self::order('sort desc')
|
||||
->limit($limit)
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
public static function getListPage($limit = 5){
|
||||
return self::order("sort desc")
|
||||
->paginate($limit, false);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class Log extends Base
|
||||
{
|
||||
//记录操作日志
|
||||
public static function write($controller, $action, $content)
|
||||
{
|
||||
$auth = session('auth');
|
||||
return self::create([
|
||||
'member_id' => $auth['userId'],
|
||||
'name' => $auth['userName'],
|
||||
'ip' => request()->ip(),
|
||||
'create_time' => time(),
|
||||
'controller' => $controller,
|
||||
'action' => $action,
|
||||
'content' => $content
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class LoginLog extends Base
|
||||
{
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class Member extends Base
|
||||
{
|
||||
public static function getList($limit = 40)
|
||||
{
|
||||
$items = self::alias('m')
|
||||
->leftjoin('auth_group g','g.id=m.group_id')
|
||||
->field('m.id,m.username,m.login_time,m.group_id,g.title')
|
||||
->order('m.id', 'asc')
|
||||
->paginate($limit);
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色分组返回用户
|
||||
* @param int $groupId 角色分组ID
|
||||
* @param int $limit 每页数量
|
||||
*/
|
||||
public static function getListByGroup($groupId, $limit = 40)
|
||||
{
|
||||
$items = self::alias('m')
|
||||
->leftjoin('auth_group g','g.id=m.group_id')
|
||||
->field('m.id,m.username,m.login_time,m.group_id,g.title')
|
||||
->where('m.group_id', '=', $groupId)
|
||||
->order('m.id', 'asc')
|
||||
->paginate($limit);
|
||||
return $items;
|
||||
}
|
||||
|
||||
//根据用户名获取管理账号
|
||||
public static function getByUserName($username)
|
||||
{
|
||||
return self::where('username', trim($username))
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
//根据ID获取管理账户和相关权限
|
||||
public static function getMemberAndRulesByID($memberId)
|
||||
{
|
||||
return self::alias('m')
|
||||
->join('auth_group g', 'm.group_id = g.id', 'LEFT')
|
||||
->field('m.group_id,g.rules')
|
||||
->where('m.id', $memberId)
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public static function updateCates($id, $cates)
|
||||
{
|
||||
$cates = implode(',', $cates);
|
||||
$data = ['cates' => $cates];
|
||||
self::updateById($id, $data);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class Model extends Base
|
||||
{
|
||||
//获取模型列表
|
||||
public static function getList()
|
||||
{
|
||||
return self::order('sort asc')
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
public static function onAfterInsert($model)
|
||||
{
|
||||
$model->sort = $model->id;
|
||||
$model->save();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class Slide extends Base
|
||||
{
|
||||
public static function delByIds($ids)
|
||||
{
|
||||
return self::whereIn('id', $ids)->delete();
|
||||
}
|
||||
|
||||
//获取幻灯片列表
|
||||
public static function getList()
|
||||
{
|
||||
return self::order("sort asc")
|
||||
->select()
|
||||
->toArray();
|
||||
}
|
||||
public static function onAfterInsert($slide)
|
||||
{
|
||||
$slide->sort = $slide->id;
|
||||
$slide->save();
|
||||
}
|
||||
|
||||
//获取轮播图涉及到的文件
|
||||
public static function getFilesInUse()
|
||||
{
|
||||
$items = self::select()->toArray();
|
||||
$data = [];
|
||||
foreach($items as $item){
|
||||
$src = trim($item['src']);
|
||||
if(!empty($src)){
|
||||
$key = getKeyByPath($src);
|
||||
$data[$key] = $src;
|
||||
}
|
||||
$mobileSrc = trim($item['src_mobile']);
|
||||
if(!empty($mobileSrc)){
|
||||
$key = getKeyByPath($mobileSrc);
|
||||
$data[$key] = $mobileSrc;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
class Store extends Base
|
||||
{
|
||||
/**
|
||||
* 获取文章列表
|
||||
* @param int $per 每页数量
|
||||
* @param string $keyword 关键词
|
||||
* @return \think\Paginator
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public static function getList($per = 20, $keyword = '')
|
||||
{
|
||||
$whereMap = [];
|
||||
$pageParam = [];
|
||||
|
||||
if (!empty($keyword)) {
|
||||
$whereMap[] = ['title', 'like', '%' . $keyword . '%'];
|
||||
$pageParam['keyword'] = $keyword;
|
||||
}
|
||||
|
||||
$paginate = [
|
||||
'list_rows' => $per,
|
||||
'query' => $pageParam
|
||||
];
|
||||
return self::when(count($whereMap) > 0, function ($query) use ($whereMap) {
|
||||
$query->where($whereMap);
|
||||
})
|
||||
->order("sort desc")
|
||||
->paginate($paginate, false);
|
||||
}
|
||||
|
||||
public static function onAfterInsert($article)
|
||||
{
|
||||
$article->sort = $article->id;
|
||||
$article->create_time = time();
|
||||
$article->save();
|
||||
}
|
||||
|
||||
|
||||
public static function getWebList()
|
||||
{
|
||||
$keyword = input("keyword/s");
|
||||
return self::when(!empty($keyword), function ($query) use ($keyword) {
|
||||
$query->where("title|address", "like", "%" . $keyword . "%");
|
||||
})
|
||||
->order("sort desc")
|
||||
->select()
|
||||
->withAttr("imgs", function ($name) {
|
||||
$imgs = json_decode($name, true);
|
||||
if (!empty($imgs)) {
|
||||
$imgs = array_values($imgs);
|
||||
return $imgs;
|
||||
}
|
||||
return [];
|
||||
})
|
||||
->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
namespace app\model;
|
||||
|
||||
class System extends Base
|
||||
{
|
||||
//获取友情链接上传图片尺寸
|
||||
public static function getLinkImageSize()
|
||||
{
|
||||
$system = self::getSystem();
|
||||
if(!empty($system['link_w']) && !empty($system['link_h'])){
|
||||
$linkSize = $system['link_w'] . '像素 X ' . $system['link_h'] . '像素';
|
||||
}else{
|
||||
$linkSize = '';
|
||||
}
|
||||
return $linkSize;
|
||||
}
|
||||
//获取幻灯片上传尺寸
|
||||
public static function getSlideImageSize()
|
||||
{
|
||||
$system = self::getSystem();
|
||||
if(!empty($system['slide_w']) && !empty($system['slide_h'])){
|
||||
$slideSize = $system['slide_w'] . '像素 X ' . $system['slide_h'] . '像素';
|
||||
}else{
|
||||
$slideSize = '';
|
||||
}
|
||||
if(!empty($system['slide_mobile_w']) && !empty($system['slide_mobile_h'])){
|
||||
$slideMobileSize = $system['slide_mobile_w'] . '像素 X ' . $system['slide_mobile_h'] . '像素';
|
||||
}else{
|
||||
$slideMobileSize = '';
|
||||
}
|
||||
return [
|
||||
'slide_size' => $slideSize,
|
||||
'slide_mobile_size' => $slideMobileSize
|
||||
];
|
||||
}
|
||||
//获取文章图片尺寸
|
||||
public static function getArticleImageSize()
|
||||
{
|
||||
$system = self::getSystem();
|
||||
if(!empty($system['article_w']) && !empty($system['article_h'])){
|
||||
$articleSize = $system['article_w'] . '像素 X ' . $system['article_h'] . '像素';
|
||||
}else{
|
||||
$articleSize = '';
|
||||
}
|
||||
return $articleSize;
|
||||
}
|
||||
//获取系统配置信息
|
||||
public static function getSystem()
|
||||
{
|
||||
return self::order('id asc')
|
||||
->findOrEmpty()
|
||||
->toArray();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
|
||||
namespace app\model;
|
||||
|
||||
use think\Exception;
|
||||
|
||||
class User extends Base
|
||||
{
|
||||
const TokenCloseTime = 86400;
|
||||
//根据用户ID获取用户信息
|
||||
public static function getByOpenid($openid)
|
||||
{
|
||||
return self::where('openid', $openid)->findOrEmpty()->toArray();
|
||||
}
|
||||
|
||||
//更新用户信息 或添加用户信息
|
||||
public static function userLogin($data)
|
||||
{
|
||||
if (!empty($data['openid'])) {
|
||||
$wechatUser = self::getByOpenid($data['openid']);
|
||||
self::startTrans();
|
||||
try {
|
||||
$time = time();
|
||||
if ($wechatUser) {
|
||||
//更新用户微信信息
|
||||
$wechatUserId = $wechatUser['id'];
|
||||
$data["token"] = md5($data["openid"] . $time . randomStr(1, 16));
|
||||
$data["token_close_time"] = $time + 86400 * 3;
|
||||
$data["created_at"] = date('Y-m-d H:i:s', $time);
|
||||
$data["login_ip"] =request()->ip();
|
||||
$data["last_login"] = date('Y-m-d H:i:s', $time);
|
||||
self::where(["id" => ["=", $wechatUserId]])->update($data);
|
||||
} else {
|
||||
//新增用户信息
|
||||
$data["token"] = md5($data["openid"] . $time . randomStr(1, 16));
|
||||
$data["token_close_time"] = $time + (86400 * 3);
|
||||
$data["created_at"] = date('Y-m-d H:i:s', $time);
|
||||
$data["login_ip"] = request()->ip();
|
||||
$data["last_login"] = date('Y-m-d H:i:s', $time);
|
||||
$data["username"] = "";//所属用户
|
||||
|
||||
self::insertGetId($data);
|
||||
}
|
||||
//提交事务
|
||||
self::commit();
|
||||
return json(["state" => "ok", "message" => "登录成功", "token" => $data["token"]]);
|
||||
} catch (Exception $e) {
|
||||
self::rollback();
|
||||
return json(["state" => "fail", "message" => "登录失败500"]);
|
||||
}
|
||||
} else {
|
||||
return json(["state" => "fail"]);
|
||||
}
|
||||
}
|
||||
|
||||
//验证当前用户登录状态
|
||||
static function userTokenVerification(string $token, string $openid)
|
||||
{
|
||||
$user = self::where([["openid", "=", $openid], ["token", "=", $token]])->field("id,token,token_close_time")->findOrEmpty();
|
||||
if ($user->isEmpty()) {
|
||||
return [];
|
||||
}
|
||||
if (!$user["token"] || !($user["token_close_time"]) || $user["token_close_time"] < time()) {
|
||||
return [];
|
||||
}
|
||||
return $user;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace app\service;
|
||||
|
||||
use think\file\UploadedFile;
|
||||
|
||||
class File
|
||||
{
|
||||
//上传文件移动到上传文件夹
|
||||
public static function move(UploadedFile $file)
|
||||
{
|
||||
$upload_path = 'uploads/' . date('Ymd');
|
||||
$path = app()->getRootPath() . $upload_path;
|
||||
$filename = uniqid() . '.' . $file->extension();
|
||||
$upload_filename = '/' . $upload_path . '/' . $filename;
|
||||
return [$file->move($path, $filename), $file, $upload_filename];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
<?php
|
||||
|
||||
namespace app\service;
|
||||
|
||||
use think\Image as TImage;
|
||||
use app\model\System;
|
||||
|
||||
class Image extends File
|
||||
{
|
||||
/**
|
||||
* 对图片进行重置大小,并对宽度大于max宽度的等比缩放为宽度为1920
|
||||
* milo
|
||||
* 2019-10-24修改
|
||||
*/
|
||||
public static function resize($src)
|
||||
{
|
||||
$max = 1920;
|
||||
$realPath = app()->getRootPath() . 'public/' . ltrim($src, '/');
|
||||
if (is_file($realPath)) {
|
||||
$img = TImage::open($realPath);
|
||||
list($img_w, $img_h) = $img->size();
|
||||
if ($max > 0 && $img_w > $max) {
|
||||
$img->thumb($max, $max * ($img_h / $img_w))->save($realPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// public static function webResize($src, $width = 1920, $height = 500)
|
||||
// {
|
||||
//
|
||||
// $realPath = app()->getRootPath() . 'public/' . ltrim($src, '/');
|
||||
// if (is_file($realPath)) {
|
||||
// $img = TImage::open($realPath);
|
||||
// list($img_w, $img_h) = $img->size();
|
||||
// if ($width > 0 && $img_w > $width) {
|
||||
// $img->thumb($width, $width * ($img_h / $img_w))->save($realPath);
|
||||
// }
|
||||
// $ext = explode(".", $src);
|
||||
// return $ext[0] . "_" . $width . "_" . $height . ".".$ext[1];
|
||||
// }
|
||||
// return $src;
|
||||
// }
|
||||
|
||||
|
||||
/**
|
||||
* 添加水印
|
||||
* milo
|
||||
* 2018-01-17
|
||||
*/
|
||||
public static function mark($src)
|
||||
{
|
||||
$rootPath = app()->getRootPath();
|
||||
if (!empty($src)) {
|
||||
$system = System::getSystem();
|
||||
$realPath = $rootPath . 'public/' . ltrim($src, '/');
|
||||
if (is_file($realPath)) {
|
||||
if ($system['is_mark']) {
|
||||
$mark = $rootPath . ltrim($system['mark_img'], '/');
|
||||
if (is_file($mark)) {
|
||||
$mark_position = $system['mark_position'] ?? 5;
|
||||
$mark_opacity = $system['mark_opacity'] ?? 50;
|
||||
$img = TImage::Open($realPath);
|
||||
$img->water($mark, $mark_position, $mark_opacity)->save($realPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//获取水印位置键值对
|
||||
public static function getMarkPosition()
|
||||
{
|
||||
return [
|
||||
"1" => '上左',
|
||||
"2" => '上中',
|
||||
"3" => '上右',
|
||||
"4" => '中左',
|
||||
"5" => '正中',
|
||||
"6" => '中右',
|
||||
"7" => '下左',
|
||||
"8" => '下中',
|
||||
"9" => '下右'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除图片
|
||||
* milo
|
||||
* 2018-01-15
|
||||
*/
|
||||
public static function delImg($src)
|
||||
{
|
||||
if (!empty(trim($src))) {
|
||||
$realPath = app()->getRootPath() . 'public/' . ltrim($src, '/');
|
||||
if (file_exists($realPath)) {
|
||||
$info = pathinfo($realPath);
|
||||
$source = $info['dirname'] . DIRECTORY_SEPARATOR . $info['filename'] . '*.' . $info['extension'];
|
||||
foreach (glob($source) as $filename) {
|
||||
if (is_file($filename)) {
|
||||
unlink($filename);
|
||||
}
|
||||
}
|
||||
clearstatcache();// 清除缓存
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取缩略图
|
||||
* milo
|
||||
* 2019-10-24修改
|
||||
* 避免跨平台出错,目录分隔符全部转换为'/'
|
||||
* app()->getRuntimePath() = app()->getRootPath().'runtime/当前应用模块(api)/'
|
||||
*/
|
||||
public static function getThumb($src, $width = 0, $height = 0, $type = TImage::THUMB_CENTER)
|
||||
{
|
||||
if (empty($src)) {
|
||||
return '';
|
||||
}
|
||||
$rootPath = app()->getRootPath();
|
||||
$realPath = $rootPath . 'public/' . ltrim($src, '/');
|
||||
$realPath = str_replace('\\', '/', $realPath);
|
||||
if (!file_exists($realPath)) {
|
||||
return '';
|
||||
}
|
||||
$info = pathinfo($src);
|
||||
if ($width <= 0 && $height <= 0) { //高宽都小于或等于0,则返回原图片
|
||||
return $src;
|
||||
}
|
||||
|
||||
$image = TImage::open($realPath);
|
||||
list($imageWidth, $imageHeight) = $image->size();
|
||||
if ($width <= 0) {
|
||||
$width = floor($height * ($imageWidth / $imageHeight));
|
||||
} elseif ($height <= 0) {
|
||||
$height = floor($width * ($imageHeight / $imageWidth));
|
||||
}
|
||||
// if ($width >= $imageWidth || $height >= $imageHeight) {
|
||||
// return $src;
|
||||
// }
|
||||
|
||||
$thumbName = $info['dirname'] . DIRECTORY_SEPARATOR . $info['filename'] . '_' . $width . '_' . $height . '.' . $info['extension'];
|
||||
$realThumbName = $rootPath . 'public/' . ltrim($thumbName, '/');
|
||||
$realThumbName = str_replace('\\', '/', $realThumbName);
|
||||
if (!file_exists($realThumbName)) {
|
||||
$image = TImage::open($realPath);
|
||||
$image->thumb($width, $height, $type)->save($realThumbName);
|
||||
}
|
||||
|
||||
return str_replace('\\', '/', $thumbName);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
<?php
|
||||
namespace app\service;
|
||||
|
||||
use think\Paginator;
|
||||
|
||||
class Layui extends Paginator
|
||||
{
|
||||
|
||||
protected $linkStr;
|
||||
/**
|
||||
* 上一页按钮
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getPreviousButton(string $text = "<"): string
|
||||
{
|
||||
|
||||
if ($this->currentPage() <= 1) {
|
||||
// return ('<li class="disabled"><a >上一页</a></li>'.$this->getDisabledTextWrapper($text,"prev"));
|
||||
return (' <div class="li"><a href="javascript:;" class="prev"></a></div> ');
|
||||
}
|
||||
|
||||
$url = $this->url(
|
||||
$this->currentPage() - 1
|
||||
);
|
||||
|
||||
// return ($this->getPageLinkWrapper($url, "上一页" ,"") .$this->getPageLinkWrapper($url, $text ,"prev"));
|
||||
return ($this->getPageLinkWrapper($url, "" ,"prev"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 下一页按钮
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getNextButton(string $text = '>'): string
|
||||
{
|
||||
if (!$this->hasMore) {
|
||||
// return ($this->getDisabledTextWrapper($text,"next").'<li class="disabled"><a >下一页</a></li>');
|
||||
return ('<div class="li"><a href="javascript:;" class="next"></a></div>');
|
||||
}
|
||||
|
||||
$url = $this->url($this->currentPage() + 1);
|
||||
|
||||
return ($this->getPageLinkWrapper($url, "",'next')) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* 页码按钮
|
||||
* @return string
|
||||
*/
|
||||
protected function getLinks(): string
|
||||
{
|
||||
if ($this->simple) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$block = [
|
||||
'first' => null,
|
||||
'slider' => null,
|
||||
'last' => null,
|
||||
];
|
||||
|
||||
$side = 3;
|
||||
$window = $side * 2;
|
||||
|
||||
if ($this->lastPage < $window + 6) {
|
||||
$block['first'] = $this->getUrlRange(1, $this->lastPage);
|
||||
} elseif ($this->currentPage <= $window) {
|
||||
$block['first'] = $this->getUrlRange(1, $window + 2);
|
||||
$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
|
||||
} elseif ($this->currentPage > ($this->lastPage - $window)) {
|
||||
$block['first'] = $this->getUrlRange(1, 2);
|
||||
$block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
|
||||
} else {
|
||||
$block['first'] = $this->getUrlRange(1, 2);
|
||||
$block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
|
||||
$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
|
||||
}
|
||||
|
||||
$html = '';
|
||||
|
||||
if (is_array($block['first'])) {
|
||||
$html .= $this->getUrlLinks($block['first']);
|
||||
}
|
||||
|
||||
if (is_array($block['slider'])) {
|
||||
$html .= $this->getDots();
|
||||
$html .= $this->getUrlLinks($block['slider']);
|
||||
}
|
||||
|
||||
if (is_array($block['last'])) {
|
||||
$html .= $this->getDots();
|
||||
$html .= $this->getUrlLinks($block['last']);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染分页html
|
||||
* @return mixed
|
||||
*/
|
||||
public function render($linkStr='')
|
||||
{
|
||||
$this->linkStr=$linkStr;
|
||||
if ($this->hasPages()) {
|
||||
if ($this->simple) {
|
||||
return sprintf(
|
||||
'<ul class="pager">%s %s</ul>',
|
||||
$this->getPreviousButton(),
|
||||
$this->getNextButton()
|
||||
);
|
||||
} else {
|
||||
return sprintf(
|
||||
'<ul class="padeing wow fadeInUp" data-wow-duration="0.5s" data-wow-delay="0" >%s %s %s</ul>',
|
||||
$this->getPreviousButton(),
|
||||
$this->getLinks(),
|
||||
$this->getNextButton()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个可点击的按钮
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $page
|
||||
* @return string
|
||||
*/
|
||||
protected function getAvailablePageWrapper(string $url, string $page,$class=""): string
|
||||
{
|
||||
return '<li class="li" ><a href="' . htmlentities($url) . $this->linkStr.'" class="'.$class.'">' . $page . '</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个禁用的按钮
|
||||
*
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getDisabledTextWrapper(string $text,$class=""): string
|
||||
{
|
||||
return '<li class="li disabled" ><a class="'.$class.'">' . $text . '</a></li> ';
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个激活的按钮
|
||||
*
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getActivePageWrapper(string $text,$class=""): string
|
||||
{
|
||||
// return '<li class="active"><span class="'.$class.'">' . $text . '</span></li>';
|
||||
return '<li class="li"><a class="'.$class.'">' . $text . '</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成省略号按钮
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getDots(): string
|
||||
{
|
||||
return $this->getDisabledTextWrapper('...');
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量生成页码按钮.
|
||||
*
|
||||
* @param array $urls
|
||||
* @return string
|
||||
*/
|
||||
protected function getUrlLinks(array $urls): string
|
||||
{
|
||||
$html = '';
|
||||
|
||||
foreach ($urls as $page => $url) {
|
||||
$html .= $this->getPageLinkWrapper($url, $page);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成普通页码按钮
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $page
|
||||
* @return string
|
||||
*/
|
||||
protected function getPageLinkWrapper(string $url, string $page ,$class=""): string
|
||||
{
|
||||
if ($this->currentPage() == $page) {
|
||||
return $this->getActivePageWrapper($page,'cur');
|
||||
}
|
||||
|
||||
return $this->getAvailablePageWrapper($url, $page,$class);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
<?php
|
||||
namespace app\service;
|
||||
|
||||
use think\Paginator;
|
||||
|
||||
class Page extends Paginator
|
||||
{
|
||||
|
||||
protected $linkStr;
|
||||
/**
|
||||
* 上一页按钮
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getPreviousButton(string $text = "<"): string
|
||||
{
|
||||
|
||||
if ($this->currentPage() <= 1) {
|
||||
// return ('<li class="disabled"><a >上一页</a></li>'.$this->getDisabledTextWrapper($text,"prev"));
|
||||
return (' <div class="li"><a href="javascript:;" class="prve"></a></div> ');
|
||||
}
|
||||
|
||||
$url = $this->url(
|
||||
$this->currentPage() - 1
|
||||
);
|
||||
|
||||
// return ($this->getPageLinkWrapper($url, "上一页" ,"") .$this->getPageLinkWrapper($url, $text ,"prev"));
|
||||
return ($this->getPageLinkWrapper($url, "" ,"prve"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 下一页按钮
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getNextButton(string $text = '>'): string
|
||||
{
|
||||
if (!$this->hasMore) {
|
||||
// return ($this->getDisabledTextWrapper($text,"next").'<li class="disabled"><a >下一页</a></li>');
|
||||
return ('<div class="li"><a href="javascript:;" class="next"></a></div>');
|
||||
}
|
||||
|
||||
$url = $this->url($this->currentPage() + 1);
|
||||
|
||||
return ($this->getPageLinkWrapper($url, "",'next')) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* 页码按钮
|
||||
* @return string
|
||||
*/
|
||||
protected function getLinks(): string
|
||||
{
|
||||
if ($this->simple) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$block = [
|
||||
'first' => null,
|
||||
'slider' => null,
|
||||
'last' => null,
|
||||
];
|
||||
|
||||
$side = 3;
|
||||
$window = $side * 2;
|
||||
|
||||
if ($this->lastPage < $window + 6) {
|
||||
$block['first'] = $this->getUrlRange(1, $this->lastPage);
|
||||
} elseif ($this->currentPage <= $window) {
|
||||
$block['first'] = $this->getUrlRange(1, $window + 2);
|
||||
$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
|
||||
} elseif ($this->currentPage > ($this->lastPage - $window)) {
|
||||
$block['first'] = $this->getUrlRange(1, 2);
|
||||
$block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
|
||||
} else {
|
||||
$block['first'] = $this->getUrlRange(1, 2);
|
||||
$block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
|
||||
$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
|
||||
}
|
||||
|
||||
$html = '';
|
||||
|
||||
if (is_array($block['first'])) {
|
||||
$html .= $this->getUrlLinks($block['first']);
|
||||
}
|
||||
|
||||
if (is_array($block['slider'])) {
|
||||
$html .= $this->getDots();
|
||||
$html .= $this->getUrlLinks($block['slider']);
|
||||
}
|
||||
|
||||
if (is_array($block['last'])) {
|
||||
$html .= $this->getDots();
|
||||
$html .= $this->getUrlLinks($block['last']);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染分页html
|
||||
* @return mixed
|
||||
*/
|
||||
public function render($linkStr='')
|
||||
{
|
||||
$this->linkStr=$linkStr;
|
||||
if ($this->hasPages()) {
|
||||
if ($this->simple) {
|
||||
return sprintf(
|
||||
'<div class="pade">%s %s</div>',
|
||||
$this->getPreviousButton(),
|
||||
$this->getNextButton()
|
||||
);
|
||||
} else {
|
||||
return sprintf(
|
||||
'<div class="pade">%s %s %s</div>',
|
||||
$this->getPreviousButton(),
|
||||
$this->getLinks(),
|
||||
$this->getNextButton()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个可点击的按钮
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $page
|
||||
* @return string
|
||||
*/
|
||||
protected function getAvailablePageWrapper(string $url, string $page,$class=""): string
|
||||
{
|
||||
return '<li class="li" ><a href="' . htmlentities($url) . $this->linkStr.'" class="'.$class.'">' . $page . '</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个禁用的按钮
|
||||
*
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getDisabledTextWrapper(string $text,$class=""): string
|
||||
{
|
||||
return '<li class="li disabled" ><a class="'.$class.'">' . $text . '</a></li> ';
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个激活的按钮
|
||||
*
|
||||
* @param string $text
|
||||
* @return string
|
||||
*/
|
||||
protected function getActivePageWrapper(string $text,$class=""): string
|
||||
{
|
||||
// return '<li class="active"><span class="'.$class.'">' . $text . '</span></li>';
|
||||
return '<li class="li"><a class="'.$class.'">' . $text . '</a></li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成省略号按钮
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getDots(): string
|
||||
{
|
||||
return $this->getDisabledTextWrapper('...');
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量生成页码按钮.
|
||||
*
|
||||
* @param array $urls
|
||||
* @return string
|
||||
*/
|
||||
protected function getUrlLinks(array $urls): string
|
||||
{
|
||||
$html = '';
|
||||
|
||||
foreach ($urls as $page => $url) {
|
||||
$html .= $this->getPageLinkWrapper($url, $page);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成普通页码按钮
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $page
|
||||
* @return string
|
||||
*/
|
||||
protected function getPageLinkWrapper(string $url, string $page ,$class=""): string
|
||||
{
|
||||
if ($this->currentPage() == $page) {
|
||||
return $this->getActivePageWrapper($page,'cur');
|
||||
}
|
||||
|
||||
return $this->getAvailablePageWrapper($url, $page,$class);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
namespace app\service;
|
||||
|
||||
class Tool
|
||||
{
|
||||
//删除文件
|
||||
public static function delFile($path)
|
||||
{
|
||||
if(!empty(trim($path))){
|
||||
$realPath = app()->getRootPath() . ltrim($path, '/');
|
||||
if (file_exists($realPath)) {
|
||||
$info = pathinfo($realPath);
|
||||
$source = $info['dirname'] . DIRECTORY_SEPARATOR . $info['filename'] . '*.' . $info['extension'];
|
||||
foreach(glob($source) as $filename){
|
||||
if(is_file($filename)){
|
||||
unlink($filename);
|
||||
}
|
||||
}
|
||||
clearstatcache();// 清除缓存
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除目录下的所有文件和子目录
|
||||
* 调用完毕后请用clearstatcache()清理缓存
|
||||
*/
|
||||
public static function removeByPath($path)
|
||||
{
|
||||
if(is_dir($path)) {
|
||||
if($handle = @opendir($path)) {
|
||||
while (($file = readdir($handle)) !== false){
|
||||
if($file != '.' && $file != '..') {
|
||||
$child = $path.'/'.$file;
|
||||
is_dir($child) ? self::removeByPath($child) : @unlink($child);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
} elseif (is_file($path)) {
|
||||
@unlink($path);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//去除字符串空格
|
||||
public static function trimSpace($str)
|
||||
{
|
||||
return str_replace(' ', '', trim($str));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
|
||||
namespace app\service;
|
||||
|
||||
|
||||
use think\facade\Config;
|
||||
|
||||
class WechatMiniPay
|
||||
{
|
||||
protected $WechatMiniPayConfig = [];//微信设置
|
||||
|
||||
// 初始化
|
||||
public function __construct()
|
||||
{
|
||||
Config::load('extra/wechat', 'wechat');
|
||||
$this->WechatMiniPayConfig = config('wechat');
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信小程序支付
|
||||
* @static
|
||||
* @access public
|
||||
* @param $order_number 订单号
|
||||
* @param $open_id 用户openid
|
||||
* @param $total_fee 支付金额
|
||||
* @param $body 支付抬头
|
||||
* @param $attach 附加数据
|
||||
*/
|
||||
public function dopay(string $order_number = "",
|
||||
string $open_id = "",
|
||||
float $total_fee = 0,
|
||||
string $body = "充值",
|
||||
string $attach = "充值" ,
|
||||
string $notify_url = ""
|
||||
)
|
||||
{
|
||||
if (!$order_number || !$open_id || !$total_fee || !$body || !$attach) {
|
||||
return ["state" => "fail"];
|
||||
}
|
||||
// 开始组建支付数据数组
|
||||
$data['param'] = [];
|
||||
$data['param']['appid'] = $this->WechatMiniPayConfig["appId"];
|
||||
$data['param']['mch_id'] = $this->WechatMiniPayConfig["mchId"];
|
||||
$data['param']['nonce_str'] = randomStr(0, 16);
|
||||
$data['param']['body'] = $body;
|
||||
$data['param']['out_trade_no'] = $order_number;//商户下的唯一订单号
|
||||
// $data['param']['total_fee'] = $total_fee * 100; // 单位:分
|
||||
$data['param']['total_fee'] = 1; // 单位:分
|
||||
$data['param']['spbill_create_ip'] = request()->ip();
|
||||
$data['param']['notify_url'] = $notify_url;
|
||||
$data['param']['trade_type'] = 'JSAPI';//支付方式 NATIVE表示二维码支付
|
||||
// $data['param']['product_id'] = $order["commodity_id"];//商品id 非必填
|
||||
$data['param']['attach'] = $attach;//附加数据 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
|
||||
$data['param']['openid'] = $open_id;//用户openid
|
||||
$data['param']['sign'] = wechatSign($data['param'], $this->WechatMiniPayConfig["mchKey"]); //key为商户平台设置的密钥key
|
||||
|
||||
$pay_data = array_to_xml($data['param']);
|
||||
|
||||
//请求支付 JSAPI 不会直接吊起支付请求 返回prepay_id是微信生成的预支付会话标识,用于后续接口调用中使用
|
||||
$result_data2 = Tool::httpRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "post", $pay_data);
|
||||
|
||||
$result_data = xmlToArray($result_data2);
|
||||
|
||||
|
||||
//如果返回数据验证成功
|
||||
if (isset($result_data["prepay_id"]) && isset($result_data["result_code"]) && $result_data["return_code"] == "SUCCESS" && $result_data["result_code"] == "SUCCESS") {
|
||||
$js_data = [];
|
||||
$js_data["appId"] = $this->WechatMiniPayConfig["appId"];
|
||||
$js_data["timeStamp"] = (string)time();
|
||||
$js_data["nonceStr"] = $data['param']['nonce_str'];
|
||||
$js_data["package"] = "prepay_id=" . $result_data["prepay_id"];
|
||||
$js_data["signType"] = "MD5";
|
||||
$js_data["paySign"] = wechatSign($js_data, $this->WechatMiniPayConfig["mchKey"]);;
|
||||
return ["state" => "ok", "data" => $js_data];
|
||||
} else {
|
||||
return (["state" => "fail",
|
||||
"message" => "fail:" .
|
||||
(isset($result_data["err_code_des"])
|
||||
?
|
||||
$result_data["err_code_des"]
|
||||
:
|
||||
'错误'
|
||||
)]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信支付查询
|
||||
* @param $order_number 订单号
|
||||
*/
|
||||
public function wechatQueryOrder($order_number = "")
|
||||
{
|
||||
if (empty($order_number)) {
|
||||
return ["state" => "fail", "message" => "fail"];
|
||||
}
|
||||
$data['param'] = [];
|
||||
$data['param']['appid'] = $this->WechatMiniPayConfig["appId"];
|
||||
$data['param']['mch_id'] = $this->WechatMiniPayConfig["mchId"];
|
||||
$data['param']['nonce_str'] = randomStr(0, 16);
|
||||
$data['param']['out_trade_no'] = $order_number;//商户下的唯一订单号
|
||||
$data['param']['sign'] = wechatSign($data['param'], $this->WechatMiniPayConfig["mchKey"]); //key为商户平台设置的密钥key
|
||||
$xml = array_to_xml($data['param']);
|
||||
$wechat_data = Tool::httpRequest("https://api.mch.weixin.qq.com/pay/orderquery", "post", $xml);
|
||||
|
||||
$wechat_data = xmlToArray($wechat_data);
|
||||
|
||||
if ($wechat_data["return_code"] == "SUCCESS") {// 通信标识
|
||||
|
||||
if ($wechat_data["result_code"] == "SUCCESS") {//业务标识 订单不存在或者微信服务器错误
|
||||
|
||||
if ($wechat_data["trade_state"] == "SUCCESS") {//如果支付成功
|
||||
|
||||
return array("state" => "ok", "queryData" => $wechat_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
return array("state" => "fail");
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Article extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'link' => 'url'
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题必须',
|
||||
'link.url' => '请填写有效的网址'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class AuthGroup extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'status' => 'require|number',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '角色名称不能为空',
|
||||
'status.require' => '角色状态必须设置',
|
||||
'status.number' => '角色状态参数值只能为数字类型',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class AuthRule extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'name' => 'require',
|
||||
'status' =>'require|number',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '名称必须',
|
||||
'name.require'=> '标识必须',
|
||||
'status.require'=> '显示状态必须传值',
|
||||
'status.number'=> '显示状态传值只能为数字表示',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Block extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'keyword' => 'require',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '名称必须',
|
||||
'keyword.require' => '键值必须'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Category extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'model_id' => 'require|number|min:1',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '栏目名称必须',
|
||||
'model_id.require' => '栏目模型必须',
|
||||
'model_id.number' => '栏目模型格式要正确',
|
||||
'model_id.min' => '请选择正确的栏目模型'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Desk extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'hall_id|所属大厅' => 'require|integer|>:0',
|
||||
'number|乘坐人数' => 'require|integer|>:0',
|
||||
'type|类型' => 'require|integer|>:0',
|
||||
];
|
||||
protected $message = [
|
||||
];
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Gift extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title|名称' => 'require',
|
||||
'img|图片' => 'require',
|
||||
'price|价格' => 'require|float|>:0',
|
||||
'inventory|库存' => 'require|integer|>:0'
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题必须',
|
||||
'img.require' => '图片必填'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Hall extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title|名称' => 'require|length:1,255',
|
||||
'img|封面图片' => 'require',
|
||||
'imgs|组图' => 'require',
|
||||
'layout_id|布局' => 'require|integer|>:0',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题必须',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class HallLayout extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title|名称' => 'require|length:1,255',
|
||||
'layout_img|布局图片' => 'require',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题必须',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class History extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|length:1,60',
|
||||
'visible' => 'require|in:0,1',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题不能为空',
|
||||
'name.length' => '标题长度限制为60个字符以内',
|
||||
'visible.require' => '历程状态必须设置',
|
||||
'visible.in' => '状态参数错误',
|
||||
];
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class HistoryInfo extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|length:1,200',
|
||||
'visible' => 'require|in:0,1',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题不能为空',
|
||||
'name.length' => '标题长度限制为200个字符以内',
|
||||
'visible.require' => '历程事例状态必须设置',
|
||||
'visible.in' => '状态参数错误',
|
||||
];
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class InvitationTemplateClass extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '名称必须',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Link extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'url' => 'url',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '名称必须',
|
||||
'url.url' => '请填写有效的网址,以http://或https://开头'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Member extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'group_id' => 'require|number',
|
||||
'username' => 'require',
|
||||
];
|
||||
protected $message = [
|
||||
'group_id.require' => '所属角色不能为空!',
|
||||
'group_id.number' => '用户角色信息数据格式不正确!',
|
||||
'username.require' => '用户姓名不能为空!',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Message extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'username|联系人' => 'require|length:1,64',
|
||||
'tel|联系电话' => 'require|checkTel',
|
||||
'email|邮箱' => 'email',
|
||||
'content|留言内容' => 'length:1,120'
|
||||
];
|
||||
protected $message = [
|
||||
'username.require' => '联系人不能为空',
|
||||
'tel' => '联系方式错误',
|
||||
'content.require' => '问题描述不能为空',
|
||||
|
||||
];
|
||||
// 自定义验证规则
|
||||
protected function checkTel($value, $rule, $data=[])
|
||||
{
|
||||
if(preg_match("/^1[345789]\d{9}$/", $value)){
|
||||
return true ;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Model extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'name' => 'require',
|
||||
'manager' => 'require',
|
||||
];
|
||||
protected $message = [
|
||||
'name.require' => '名称必须',
|
||||
'manager.require' => '后台管理必须'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Slide extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'url' => 'url',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题必须',
|
||||
'url.url' => '请填写有效的网址,以http://或https://开头'
|
||||
];
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Store extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
];
|
||||
protected $message = [
|
||||
'title.require' => '标题必须',
|
||||
];
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
use app\model\System;
|
||||
use think\Lang;
|
||||
|
||||
class Upload extends Validate
|
||||
{
|
||||
protected $rule = [];
|
||||
protected $message = [];
|
||||
protected $system;
|
||||
public function __construct()
|
||||
{
|
||||
$this->system = System::getSystem();
|
||||
$this->lang = new Lang;
|
||||
}
|
||||
|
||||
//验证图片上传
|
||||
public function checkImage($image)
|
||||
{
|
||||
$ext = str_replace(',', ',', $this->system['img_type']);
|
||||
$size = $this->system['img_size'] * 1024 * 1024;
|
||||
$this->rule = [
|
||||
'image' => [
|
||||
'fileExt' => $ext,
|
||||
'fileSize' => (int)$size
|
||||
]
|
||||
];
|
||||
return $this->check(['image' => $image]);
|
||||
}
|
||||
|
||||
//pdf上传
|
||||
public function checkPdf($pdf)
|
||||
{
|
||||
|
||||
$size = 3 * 1024 * 1024;//3M
|
||||
$this->rule = [
|
||||
'pdf' => [
|
||||
'fileExt' => "pdf",
|
||||
'fileSize' => (int)$size
|
||||
]
|
||||
];
|
||||
return $this->check(['pdf' => $pdf]);
|
||||
}
|
||||
|
||||
//验证视频上传
|
||||
public function checkVideo($video)
|
||||
{
|
||||
$ext = str_replace(',', ',', $this->system['video_type']);
|
||||
$size = $this->system['video_size'] * 1024 * 1024;
|
||||
$this->rule = [
|
||||
'video' => [
|
||||
'fileExt' => $ext,
|
||||
'fileSize' => (int)$size
|
||||
]
|
||||
];
|
||||
return $this->check(['video' => $video]);
|
||||
}
|
||||
|
||||
//验证文件上传
|
||||
public function checkFile($file)
|
||||
{
|
||||
$ext = str_replace(',', ',', $this->system['file_type']);
|
||||
$size = $this->system['file_size'] * 1024 * 1024;
|
||||
$this->rule = [
|
||||
'file' => [
|
||||
'fileExt' => $ext,
|
||||
'fileSize' => (int)$size
|
||||
]
|
||||
];
|
||||
return $this->check(['file' => $file]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class User extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'openid' => 'require',
|
||||
'headimgurl' => 'require',
|
||||
'nickname' => 'require',
|
||||
];
|
||||
protected $message = [];
|
||||
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
namespace app\widget;
|
||||
|
||||
use app\model\Article;
|
||||
use app\model\Category;
|
||||
use think\facade\View;
|
||||
|
||||
class Common
|
||||
{
|
||||
protected $data = [];
|
||||
|
||||
private function showPage($template='')
|
||||
{
|
||||
return View::assign($this->data)->fetch('widget/common/'.$template);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
namespace app\widget;
|
||||
|
||||
use app\model\Category;
|
||||
use think\facade\View;
|
||||
|
||||
class Crumbs
|
||||
{
|
||||
public function index($categoryId)
|
||||
{
|
||||
$data = [
|
||||
'crumbs' => Category::getCatesCrumbs($categoryId)
|
||||
];
|
||||
return View::assign($data)->fetch('public/crumbs');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
namespace app\widget;
|
||||
|
||||
|
||||
use app\model\Category;
|
||||
use think\facade\{Db,View, Cache};
|
||||
|
||||
class Menu
|
||||
{
|
||||
public function index($categoryId)
|
||||
{
|
||||
$menus = Cache::get('rules');
|
||||
if(empty($menus)){
|
||||
$menus = Category::getListForFrontMenu();
|
||||
}
|
||||
$data = [
|
||||
'categoryId' => $categoryId,
|
||||
'menus' => $menus,
|
||||
];
|
||||
return View::assign($data)->fetch('public/menu');
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue