初始化

master
wangxinglong 2021-08-06 18:50:55 +08:00
commit 1536e49dfe
2268 changed files with 361232 additions and 0 deletions

19
.env.bak Normal file
View File

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

12
.gitignore vendored Normal file
View File

@ -0,0 +1,12 @@
.env
/.idea
/.vscode
backup/data/*
*.log
runtime/*
storage/*
public/storage/*
.DS_Store
Test.php
nginx.htaccess
dump.rdb

32
LICENSE.txt Normal file
View File

@ -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.

7
README.md Normal file
View File

@ -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组件库自带的

1
app/.htaccess Normal file
View File

@ -0,0 +1 @@
deny from all

426
app/common.php Normal file
View File

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

View File

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

37
app/controller/Base.php Normal file
View File

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

View File

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

49
app/controller/Error.php Normal file
View File

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

31
app/controller/Home.php Normal file
View File

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

22
app/controller/Index.php Normal file
View File

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

38
app/controller/Page.php Normal file
View File

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

View File

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

View File

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

View File

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

View File

@ -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, '非法请求');
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,11 @@
<?php
namespace app\controller\manager;
class Error
{
public function jump()
{
$param = request()->param();
return view()->assign($param);
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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, '无此操作');
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace app\controller\manager;
class Index extends Base
{
//后台首页
public function index()
{
return $this->redirect(url('manager.safe/index'));
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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, '非法请求!');
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

17
app/event.php Normal file
View File

@ -0,0 +1,17 @@
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
],
];

10
app/middleware.php Normal file
View File

@ -0,0 +1,10 @@
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
//\think\middleware\LoadLangPack::class,
// Session初始化
\think\middleware\SessionInit::class,
];

65
app/middleware/Auth.php Normal file
View File

@ -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('无操作权限') ;
}
}
}

55
app/middleware/Csrf.php Normal file
View File

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

46
app/middleware/Token.php Normal file
View File

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

243
app/model/Article.php Normal file
View File

@ -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);
}
// ----------页面函数
}

54
app/model/AuthGroup.php Normal file
View File

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

271
app/model/AuthRule.php Normal file
View File

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

41
app/model/Base.php Normal file
View File

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

113
app/model/Block.php Normal file
View File

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

306
app/model/Category.php Normal file
View File

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

92
app/model/Desk.php Normal file
View File

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

93
app/model/File.php Normal file
View File

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

48
app/model/Gift.php Normal file
View File

@ -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);
}
// ----------页面函数
}

51
app/model/Hall.php Normal file
View File

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

47
app/model/HallLayout.php Normal file
View File

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

45
app/model/History.php Normal file
View File

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

52
app/model/HistoryInfo.php Normal file
View File

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

View File

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

49
app/model/Link.php Normal file
View File

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

20
app/model/Log.php Normal file
View File

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

6
app/model/LoginLog.php Normal file
View File

@ -0,0 +1,6 @@
<?php
namespace app\model;
class LoginLog extends Base
{
}

57
app/model/Member.php Normal file
View File

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

18
app/model/Model.php Normal file
View File

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

43
app/model/Slide.php Normal file
View File

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

61
app/model/Store.php Normal file
View File

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

54
app/model/System.php Normal file
View File

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

68
app/model/User.php Normal file
View File

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

17
app/service/File.php Normal file
View File

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

153
app/service/Image.php Normal file
View File

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

202
app/service/Layui.php Normal file
View File

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

202
app/service/Page.php Normal file
View File

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

53
app/service/Tool.php Normal file
View File

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

View File

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

16
app/validate/Article.php Normal file
View File

@ -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' => '请填写有效的网址'
];
}

View File

@ -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' => '角色状态参数值只能为数字类型',
];
}

19
app/validate/AuthRule.php Normal file
View File

@ -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'=> '显示状态传值只能为数字表示',
];
}

16
app/validate/Block.php Normal file
View File

@ -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' => '键值必须'
];
}

18
app/validate/Category.php Normal file
View File

@ -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' => '请选择正确的栏目模型'
];
}

15
app/validate/Desk.php Normal file
View File

@ -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 = [
];
}

18
app/validate/Gift.php Normal file
View File

@ -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' => '图片必填'
];
}

17
app/validate/Hall.php Normal file
View File

@ -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' => '标题必须',
];
}

View File

@ -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' => '标题必须',
];
}

19
app/validate/History.php Normal file
View File

@ -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' => '状态参数错误',
];
}

View File

@ -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' => '状态参数错误',
];
}

View File

@ -0,0 +1,14 @@
<?php
namespace app\validate;
use think\Validate;
class InvitationTemplateClass extends Validate
{
protected $rule = [
'title' => 'require',
];
protected $message = [
'title.require' => '名称必须',
];
}

16
app/validate/Link.php Normal file
View File

@ -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://开头'
];
}

17
app/validate/Member.php Normal file
View File

@ -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' => '用户姓名不能为空!',
];
}

29
app/validate/Message.php Normal file
View File

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

16
app/validate/Model.php Normal file
View File

@ -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' => '后台管理必须'
];
}

16
app/validate/Slide.php Normal file
View File

@ -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://开头'
];
}

14
app/validate/Store.php Normal file
View File

@ -0,0 +1,14 @@
<?php
namespace app\validate;
use think\Validate;
class Store extends Validate
{
protected $rule = [
'title' => 'require',
];
protected $message = [
'title.require' => '标题必须',
];
}

74
app/validate/Upload.php Normal file
View File

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

16
app/validate/User.php Normal file
View 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 = [];
}

18
app/widget/Common.php Normal file
View File

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

17
app/widget/Crumbs.php Normal file
View File

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

22
app/widget/Menu.php Normal file
View File

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