first commit

This commit is contained in:
yanwenwu
2019-12-22 09:37:52 +08:00
parent cf1dedabd4
commit b27ef2570a
359 changed files with 34726 additions and 758 deletions

View File

@@ -0,0 +1,59 @@
<?php
namespace catchAdmin\index\controller;
use catchAdmin\permissions\model\Permissions;
use catchAdmin\user\Auth;
use catcher\base\CatchController;
use catcher\Tree;
use think\facade\Db;
class Index extends CatchController
{
/**
*
* @time 2019年12月11日
* @return string
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\db\exception\DataNotFoundException
*/
public function index(): string
{
$permissionIds = Auth::user()->getPermissionsBy();
$menus = Permissions::whereIn('id', $permissionIds)
->where('type', Permissions::MENU_TYPE)
->field(['id', 'parent_id', 'permission_name', 'route'])
->select()->toArray();
return $this->fetch([
'menus' => Tree::done($menus),
'username' => Auth::user()->username,
]);
}
/**
*
* @time 2019年12月11日
* @throws \Exception
* @return string
*/
public function theme(): string
{
return $this->fetch();
}
/**
*
* @time 2019年12月12日
* @throws \Exception
* @return string
*/
public function dashboard(): string
{
$mysqlVersion = Db::query('select version() as version');
return $this->fetch([
'mysql_version' => $mysqlVersion['0']['version'],
]);
}
}

13
catch/index/module.json Normal file
View File

@@ -0,0 +1,13 @@
{
"name": "首页管理",
"alias": "index",
"description": "",
"keywords": [],
"order": 0,
"services": [
"catchAdmin\\index\\IndexService"
],
"aliases": {},
"files": [],
"requires": []
}

5
catch/index/route.php Normal file
View File

@@ -0,0 +1,5 @@
<?php
$router->get('/', '\catchAdmin\index\controller\Index@index');
$router->get('theme', '\catchAdmin\index\controller\Index@theme');
$router->get('dashboard', '\catchAdmin\index\controller\Index@dashboard');

View File

@@ -0,0 +1,221 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>CatchAdmin 后台开发框架</title>
<link rel="stylesheet" href="__CATCH_ADMIN_LIBS__/layui/css/layui.css"/>
<link rel="stylesheet" href="__CATCH_ADMIN_MODULE__/admin.css?v=315"/>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<style>
/** 卡片轮播图样式 */
.admin-carousel .layui-carousel-ind {
position: absolute;
top: -41px;
text-align: right;
}
.admin-carousel .layui-carousel-ind ul {
background: 0 0;
}
.admin-carousel .layui-carousel-ind li {
background-color: #e2e2e2;
}
.admin-carousel .layui-carousel-ind li.layui-this {
background-color: #999;
}
/** 广告位轮播图 */
.admin-news .layui-carousel-ind {
height: 45px;
}
.admin-news a {
display: block;
line-height: 60px;
text-align: center;
}
</style>
</head>
<body>
<!-- 加载动画 -->
<div class="page-loading">
<div class="ball-loader">
<span></span><span></span><span></span><span></span>
</div>
</div>
<!-- 正文开始 -->
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
访问量<span class="layui-badge layui-bg-blue pull-right"></span>
</div>
<div class="layui-card-body">
<p class="lay-big-font">99,666</p>
<p>总计访问量<span class="pull-right">88万 <i class="layui-icon layui-icon-flag"></i></span></p>
</div>
</div>
</div>
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
下载<span class="layui-badge layui-bg-black pull-right"></span>
</div>
<div class="layui-card-body">
<p class="lay-big-font">33,555</p>
<p>新下载<span class="pull-right">10% <i class="layui-icon">&#xe601</i></span></p>
</div>
</div>
</div>
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
Start<span class="layui-badge layui-bg-green pull-right"></span>
</div>
<div class="layui-card-body">
<p class="lay-big-font">99,666</p>
<p>总Start数<span class="pull-right">88万 <i class="layui-icon layui-icon-rate"></i></span></p>
</div>
</div>
</div>
<div class="layui-col-xs12 layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
活跃用户<span class="layui-badge layui-bg-orange pull-right"></span>
</div>
<div class="layui-card-body">
<p class="lay-big-font">66,666</p>
<p>最近一个月<span class="pull-right">15% <i class="layui-icon layui-icon-user"></i></span></p>
</div>
</div>
</div>
</div>
<div class="layui-row layui-col-space15">
<div class="layui-col-lg8 layui-col-md7">
<div class="layui-card">
<div class="layui-card-header">更新日志</div>
<div class="layui-card-body">
<ul class="layui-timeline">
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">
V1.0
<small>catchAdmin 后台框架发布</small>&emsp;
<span class="layui-badge-rim">2019-12-15</span>
</h3>
<ul>
<li>基于 Thinkphp6 & layui 开发</li>
<li>完整的权限管理</li>
<li>模块化开发方式</li>
<li>...</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">
CatchAdmin 开发中...&emsp;<span class="layui-badge-rim">更早</span>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="layui-col-lg4 layui-col-md5">
<div class="layui-card">
<div class="layui-card-header">后台框架</div>
<div class="layui-card-body">
<table class="layui-table layui-text">
<colgroup>
<col width="100">
<col>
</colgroup>
<tbody>
<tr>
<td>PHP 版本</td>
<td>{$Think.PHP_VERSION}</td>
</tr>
<tr>
<td>MYSQL 版本</td>
<td>{$mysql_version}</td>
</tr>
<tr>
<td>WEB 服务器</td>
<td>{$_SERVER['SERVER_SOFTWARE']}</td>
</tr>
<tr>
<td>操作系统</td>
<td>{$Think.PHP_OS}</td>
</tr>
<tr>
<td>opcache (建议开启)</td>
{if condition="function_exists('opcache_get_configuration')"}
<td>{:opcache_get_configuration()['directives']['opcache.enable'] ? '开启' : '关闭' }</td>
{else/}
<td>未开启</td>
{/if}
</tr>
<tr>
<td>最大执行时间</td>
<td>{:get_cfg_var("max_execution_time")} s</td>
</tr>
<tr>
<td>上传限制大小(M)</td>
<td>{:get_cfg_var ("upload_max_filesize")}</td>
</tr>
<tr>
<td>当前时间</td>
<td>{:date("Y-m-d H:i:s")}</td>
</tr>
<tr>
<td>核心框架</td>
<td>Thinkphp v6</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- js部分 -->
<script type="text/javascript" src="__CATCH_ADMIN_LIBS__/layui/layui.js"></script>
<script type="text/javascript" src="__CATCH_ADMIN_JS__/common.js?v=315"></script>
<script>
layui.use(['layer', 'carousel'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var carousel = layui.carousel;
var device = layui.device;
// 渲染轮播
carousel.render({
elem: '.layui-carousel',
width: '100%',
height: '60px',
arrow: 'none',
autoplay: true,
trigger: device.ios || device.android ? 'click' : 'hover',
anim: 'fade'
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>403</title>
<link rel="stylesheet" href="__CATCH_ADMIN_LIBS__/layui/css/layui.css"/>
<link rel="stylesheet" href="__CATCH_ADMIN_MODULE__/admin.css?v=315"/>
<link rel="stylesheet" href="__CATCH_ADMIN_CSS__/error-page.css"/>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- 正文开始 -->
<div class="error-page">
<img class="error-page-img" src="__CATCH_ADMIN_IMAGES__/ic_403.png">
<div class="error-page-info">
<h1>403</h1>
<div class="error-page-info-desc">{$msg}</div>
<div>
{if ($code == 10006)}
<a href="{:url('login')}" class="layui-btn">返回登录</a>
{else/}
<button onclick="history(-1)" class="layui-btn">返回上一页</button>
{/if}
</div>
</div>
</div>
<!-- js部分 -->
<script type="text/javascript" src="__CATCH_ADMIN_LIBS__/layui/layui.js"></script>
<script type="text/javascript" src="__CATCH_ADMIN_JS__/common.js?v=315"></script>
</body>
</html>

142
catch/index/view/index.html Normal file
View File

@@ -0,0 +1,142 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link href="__CATCH_ADMIN_IMAGES__/favicon.ico" rel="icon">
<title>CatchAdmin 后台管理系统</title>
<link rel="stylesheet" href="__CATCH_ADMIN_LIBS__/layui/css/layui.css"/>
<link rel="stylesheet" href="__CATCH_ADMIN_MODULE__/admin.css?v=315"/>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<!-- 头部 -->
<div class="layui-header">
<div class="layui-logo">
<img src="__CATCH_ADMIN_IMAGES__/logo.png"/>
<cite>CatchAdmin</cite>
</div>
<ul class="layui-nav layui-layout-left">
<li class="layui-nav-item" lay-unselect>
<a ew-event="flexible" title="侧边伸缩"><i class="layui-icon layui-icon-shrink-right"></i></a>
</li>
<li class="layui-nav-item" lay-unselect>
<a ew-event="refresh" title="刷新"><i class="layui-icon layui-icon-refresh-3"></i></a>
</li>
</ul>
<ul class="layui-nav layui-layout-right">
<!-- <li class="layui-nav-item" lay-unselect>
<a ew-event="message" title="消息">
<i class="layui-icon layui-icon-notice"></i>
<span class="layui-badge-dot"></span>
</a>
</li>
<li class="layui-nav-item" lay-unselect>
<a ew-event="note" title="便签"><i class="layui-icon layui-icon-note"></i></a>
</li>-->
<li class="layui-nav-item layui-hide-xs" lay-unselect>
<a ew-event="fullScreen" title="全屏"><i class="layui-icon layui-icon-screen-full"></i></a>
</li>
<li class="layui-nav-item" lay-unselect>
<a>
<img src="__CATCH_ADMIN_IMAGES__/head.png" class="layui-nav-img">
<cite>{$username}</cite>
</a>
<dl class="layui-nav-child">
<!--<dd lay-unselect>
<a ew-href="javascript:;">个人中心</a>
</dd>
<dd lay-unselect>
<a ew-event="psw">修改密码</a>
</dd>
<hr>-->
<dd lay-unselect>
<a id="logout">退出</a>
</dd>
</dl>
</li>
<li class="layui-nav-item" lay-unselect>
<a ew-event="theme" title="主题"><i class="layui-icon layui-icon-more-vertical"></i></a>
</li>
</ul>
</div>
<!-- 侧边栏 -->
<div class="layui-side">
<div class="layui-side-scroll">
<ul class="layui-nav layui-nav-tree arrow2" lay-filter="admin-side-nav" lay-accordion="true"
style="margin-top: 15px;">
{foreach $menus as $key => $menu }
<li class="layui-nav-item">
{if (!empty($menu['children']))}
<a><i class="layui-icon layui-icon-home"></i>&emsp;<cite>{$menu['permission_name']}</cite></a>
<dl class="layui-nav-child">
{foreach $menu['children'] as $m}
{if (!empty($m['children']))}
<a><i class="layui-icon layui-icon-home"></i>&emsp;<cite>{$m['permission_name']}</cite></a>
<dl class="layui-nav-child">
{foreach $m['children'] as $_m}
<dd><a lay-href="{:url($_m['route'])}">{$_m['permission_name']}</a></dd>
{/foreach}
</dl>
{else/}
<dd><a lay-href="{:url($m['route'])}">{$m['permission_name']}</a></dd>
{/if}
{/foreach}
</dl>
{else/}
<a lay-href="{:url($menu['route'])}"><i class="layui-icon layui-icon-unlink"></i>&emsp;<cite>{$menu['permission_name']}</cite></a>
{/if}
</li>
{/foreach}
</ul>
</div>
</div>
<!-- 主体部分 -->
<div class="layui-body"></div>
<!-- 底部 -->
<div class="layui-footer">
copyright 2017 ~ © {:date('Y', time())} <a href="https://catchadmin.com" target="_blank">catchadmin.com</a> all rights reserved.
<span class="pull-right">Version 2.0</span>
</div>
</div>
<!-- 加载动画 -->
<div class="page-loading">
<div class="ball-loader">
<span></span><span></span><span></span><span></span>
</div>
</div>
<!-- js部分 -->
<script type="text/javascript" src="__CATCH_ADMIN_LIBS__/layui/layui.js"></script>
<script type="text/javascript" src="__CATCH_ADMIN_JS__/common.js?v=315"></script>
<script>
layui.use(['index', 'admin'], function () {
var $ = layui.jquery;
var index = layui.index;
var admin = layui.admin;
// 默认加载主页
index.loadHome({
menuPath: '{:url("dashboard")}',
menuName: '<i class="layui-icon layui-icon-home"></i>'
});
$(document).on('click','#logout',function(){
admin.req('{:url("logout")}', {}, function (response) {
if (response.code === 10000) {
window.location.href = "{:url('login')}";
}
}, 'post')
});
});
</script>
</body>
</html>

259
catch/index/view/theme.html Normal file
View File

@@ -0,0 +1,259 @@
<!DOCTYPE html>
<html lang="en" class="bg-white">
<head>
<title>设置</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="__CATCH_ADMIN_LIBS__/layui/css/layui.css"/>
<link rel="stylesheet" href="__CATCH_ADMIN_MODULE__/admin.css?v=315"/>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<style>
body {
overflow-x: hidden;
}
.layui-card-body {
padding: 0;
}
.theme-div {
padding-left: 15px;
padding-top: 20px;
margin-bottom: 10px;
}
.btnTheme {
display: inline-block;
margin: 0 6px 15px 0;
padding: 4px;
border: 1px solid #fff;
}
.btnTheme img {
width: 80px;
height: 50px;
border: 1px solid #f2f2f2;
background: #F2F2F2;
cursor: pointer;
}
.btnTheme:hover, .btnTheme.active {
border-color: #5FB878;
}
.more-menu-item {
display: block;
height: 50px;
line-height: 50px;
font-size: 16px;
border-bottom: 1px solid #e8e8e8;
color: #333;
padding: 0px 25px;
font-style: normal;
}
.more-menu-item:first-child {
border-top: 1px solid #e8e8e8;
}
.more-menu-item:hover {
background: #F2F2F2;
color: #333;
}
.more-menu-item .layui-icon {
padding-right: 10px;
font-size: 18px;
}
.more-menu-item:after {
content: "\e602";
font-family: layui-icon !important;
position: absolute;
right: 16px;
color: #999;
}
.more-menu-item.no-icon:after {
content: "";
}
/** 设置表单样式 */
.set-item-label {
display: inline-block;
height: 38px;
line-height: 38px;
padding-left: 20px;
color: #333333;
}
.set-item-ctrl {
display: inline-block;
height: 38px;
line-height: 38px;
}
.set-item-ctrl > * {
margin: 0;
}
</style>
</head>
<body>
<!-- 加载动画 -->
<div class="page-loading">
<div class="ball-loader">
<span></span><span></span><span></span><span></span>
</div>
</div>
<div class="layui-card-header">设置主题</div>
<div class="layui-card-body">
<!-- 主题列表 -->
<div class="theme-div"></div>
<!-- 导航 -->
<div class="more-menu">
<a class="more-menu-item" href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
<i class="layui-icon layui-icon-read" style="font-size: 19px;"></i> Git 地址
</a>
<a class="more-menu-item" href="https://catchadmin.com" target="_blank">
<i class="layui-icon layui-icon-tabs" style="font-size: 16px;"></i> &nbsp;官网
</a>
<!--<a class="more-menu-item" href="https://demo.easyweb.vip/theme" target="_blank">
<i class="layui-icon layui-icon-theme"></i> 主题生成器
</a>-->
</div>
<!-- 控制开关 -->
<div class="layui-form" style="margin: 25px 0;">
<div class="layui-form-item">
<label class="set-item-label">&emsp;脚:</label>
<div class="set-item-ctrl">
<input id="setFooter" lay-filter="setFooter" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
</div>
<label class="set-item-label"> Tab&nbsp;记忆:</label>
<div class="set-item-ctrl">
<input id="setTab" lay-filter="setTab" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
<div class="layui-form-item">
<label class="set-item-label">多标签:</label>
<div class="set-item-ctrl">
<input id="setMoreTab" lay-filter="setMoreTab" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
</div>
<label class="set-item-label">切换刷新:</label>
<div class="set-item-ctrl">
<input id="setRefresh" lay-filter="setRefresh" type="checkbox" lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
<div class="layui-form-item">
<label class="set-item-label">导航箭头:</label>
<div class="set-item-ctrl">
<input lay-filter="navArrow" type="radio" value="" title="默认" name="navArrow">
<input lay-filter="navArrow" type="radio" value="arrow2" title="箭头" name="navArrow">
<input lay-filter="navArrow" type="radio" value="arrow3" title="加号" name="navArrow">
</div>
</div>
</div>
</div>
<script type="text/javascript" src="__CATCH_ADMIN_LIBS__/layui/layui.js"></script>
<script type="text/javascript" src="__CATCH_ADMIN_JS__/common.js?v=315"></script>
<script>
layui.use(['layer', 'form', 'admin'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var admin = layui.admin;
var leftNav = '.layui-layout-admin>.layui-side>.layui-side-scroll>.layui-nav';
var mainTab = '.layui-body>.layui-tab[lay-filter="admin-pagetabs"]';
var themes = [
{title: '黑白主题', theme: 'admin'},
{title: '黑色主题', theme: 'black'},
{title: '蓝色主题', theme: 'blue'},
{title: '藏青主题', theme: 'cyan'},
{title: '黄色主题', theme: 'yellow'},
{title: '绿色主题', theme: 'green'},
{title: '粉红主题', theme: 'pink'},
{title: '紫白主题', theme: 'purple-white'},
{title: '紫色主题', theme: 'purple'},
{title: '白色主题', theme: 'white'},
{title: '红白主题', theme: 'red-white'},
{title: '红色主题', theme: 'red'}
];
for (var i = 0; i < themes.length; i++) {
var str = '<div class="btnTheme" theme="theme-' + themes[i].theme + '" title="' + themes[i].title + '">';
str += ' <img src="__CATCH_ADMIN_MODULE__/theme/img/theme-' + themes[i].theme + '.png">';
str += ' </div>';
$('.theme-div').append(str)
}
// 切换主题
var mTheme = layui.data(admin.tableName).theme;
$('.btnTheme[theme=' + (mTheme ? mTheme : admin.defaultTheme) + ']').addClass('active');
$('.btnTheme').click(function () {
$('.btnTheme').removeClass('active');
$(this).addClass('active');
admin.changeTheme($(this).attr('theme'));
});
// 关闭/开启页脚
var openFooter = layui.data(admin.tableName).openFooter;
$('#setFooter').prop('checked', openFooter == undefined ? true : openFooter);
form.on('switch(setFooter)', function (data) {
var checked = data.elem.checked;
layui.data(admin.tableName, {key: 'openFooter', value: checked});
checked ? top.layui.jquery('body.layui-layout-body').removeClass('close-footer') : top.layui.jquery('body.layui-layout-body').addClass('close-footer');
});
// 关闭/开启Tab记忆功能
$('#setTab').prop('checked', top.layui.index.cacheTab);
form.on('switch(setTab)', function (data) {
top.layui.index.setTabCache(data.elem.checked);
});
// 切换Tab自动刷新
var tabAutoRefresh = layui.data(admin.tableName).tabAutoRefresh;
$('#setRefresh').prop('checked', tabAutoRefresh == undefined ? false : tabAutoRefresh);
form.on('switch(setRefresh)', function (data) {
var checked = data.elem.checked;
layui.data(admin.tableName, {key: 'tabAutoRefresh', value: checked});
checked ? top.layui.jquery(mainTab).attr('lay-autoRefresh', 'true') : top.layui.jquery(mainTab).removeAttr('lay-autoRefresh');
});
// 关闭/开启多标签
var openTab = layui.data(admin.tableName).openTab;
$('#setMoreTab').prop('checked', openTab == undefined ? top.layui.index.pageTabs : openTab);
form.on('switch(setMoreTab)', function (data) {
var checked = data.elem.checked;
layui.data(admin.tableName, {key: 'openTab', value: checked});
admin.putTempData('indexTabs', undefined); // 清除缓存的Tab
top.location.reload();
});
// 导航小三角
var navArrow = layui.data(admin.tableName).navArrow;
if (navArrow == undefined) {
var $sideNav = top.layui.jquery('.layui-side .layui-nav-tree');
navArrow = $sideNav.hasClass('arrow2') ? 'arrow2' : $sideNav.hasClass('arrow3') ? 'arrow3' : '';
}
$('[name="navArrow"][value="' + (navArrow ? navArrow : '') + '"]').prop('checked', 'true');
form.on('radio(navArrow)', function (data) {
layui.data(admin.tableName, {key: 'navArrow', value: data.value});
top.layui.jquery(leftNav).removeClass('arrow2 arrow3');
data.value && top.layui.jquery(leftNav).addClass(data.value);
});
form.render('checkbox');
form.render('radio');
});
</script>
</body>
</html>