规范登录账号的格式,新增api请求接口操作日志。

This commit is contained in:
hdm 2021-08-31 23:40:54 +08:00
parent 4e1ecd1718
commit 33b581dcdc
39 changed files with 287 additions and 153 deletions

View File

@ -27,6 +27,7 @@ class Admin extends BaseController
if (!empty($param['keywords'])) {
$where[] = ['id|username|nickname|desc|mobile', 'like', '%' . $param['keywords'] . '%'];
}
$where[] = ['status','>=',0];
$rows = empty($param['limit']) ? get_config(app . page_size) : $param['limit'];
$admin = AdminList::where($where)
->order('create_time asc')
@ -213,10 +214,13 @@ class Admin extends BaseController
{
$id = get_params("id");
if($id == 1){
return to_assign(0, "系统拥有者,无法删除");
return to_assign(1, "超级管理员,不能删除");
}
if (Db::name('Admin')->delete($id) !== false) {
add_log('delete', $id, []);
$data['status'] = '-1';
$data['id'] = $id;
$data['update_time'] = time();
if (Db::name('Admin')->update($data) !== false) {
add_log('delete', $id);
return to_assign(1, "删除管理员成功");
} else {
return to_assign(0, "删除失败");

View File

@ -44,15 +44,17 @@ class Article extends BaseController
if (request()->isAjax()) {
$param = get_params();
if (!empty($param['id']) && $param['id'] > 0) {
$data[$param['field']] = $param['value'];
$data['id'] = $param['id'];
$data['update_time'] = time();
if(!empty($data['title'])){
try {
validate(ArticleCateCheck::class)->scene('edit')->check($param);
validate(ArticleCateCheck::class)->scene('edit')->check($data);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(0, $e->getError());
}
$data[$param['field']] = $param['value'];
$data['id'] = $param['id'];
$data['update_time'] = time();
}
$res = ArticleCate::strict(false)->field(true)->update($data);
if ($res) {
add_log('edit', $data['id'], $data);

View File

@ -45,7 +45,7 @@ class Login
if ($admin['pwd'] !== $param['pwd']) {
return to_assign(0, '用户名或密码错误');
}
if ($admin['status'] == -1) {
if ($admin['status'] == 0) {
return to_assign(0, '该用户禁止登录,请于系统所有者联系');
}
$data = [

View File

@ -41,14 +41,16 @@ class Menu extends BaseController
if (request()->isAjax()) {
$param = get_params();
if ($param['id'] > 0) {
$data[$param['field']] = $param['value'];
$data['id'] = $param['id'];
if(!empty($data['title'])){
try {
validate(MenuCheck::class)->scene('edit')->check($param);
validate(MenuCheck::class)->scene('edit')->check($data);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(0, $e->getError());
}
$data[$param['field']] = $param['value'];
$data['id'] = $param['id'];
}
Db::name('AdminMenu')->strict(false)->field(true)->update($data);
add_log('edit', $param['id'], $data);
} else {

View File

@ -65,14 +65,6 @@ class Role extends BaseController
if ($param['id'] == 1) {
return to_assign(0, '为了系统安全,该管理组不允许修改');
}
/*
if (!empty($param['rules'])) {
$param['rules'] = implode(',', $param['rules']);
}
if (!empty($param['menus'])) {
$param['menus'] = implode(',', $param['menus']);
}
*/
Db::name('AdminGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
add_log('edit', $param['id'], $param);
} else {
@ -82,14 +74,6 @@ class Role extends BaseController
// 验证失败 输出错误信息
return to_assign(0, $e->getError());
}
/*
if (!empty($param['rules'])) {
$param['rules'] = implode(',', $param['rules']);
}
if (!empty($param['menus'])) {
$param['menus'] = implode(',', $param['menus']);
}
*/
$gid = Db::name('AdminGroup')->strict(false)->field(true)->insertGetId($param);
add_log('add', $gid, $param);
}

View File

@ -39,14 +39,24 @@ class Rule extends BaseController
if (request()->isAjax()) {
$param = get_params();
if ($param['id'] > 0) {
$data[$param['field']] = $param['value'];
$data['id'] = $param['id'];
if(!empty($data['title'])){
try {
validate(RuleCheck::class)->scene('edit')->check($param);
validate(RuleCheck::class)->scene('edit_title')->check($data);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(0, $e->getError());
}
$data[$param['field']] = $param['value'];
$data['id'] = $param['id'];
}
if(!empty($data['src'])){
try {
validate(RuleCheck::class)->scene('edit_src')->check($data);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(0, $e->getError());
}
}
Db::name('AdminRule')->strict(false)->field(true)->update($data);
add_log('edit', $param['id'], $data);
} else {

View File

@ -11,11 +11,14 @@ use think\Validate;
class AdminCheck extends Validate
{
protected $regex = [ 'checkUser' => '/^[A-Za-z]{1}[A-Za-z0-9_-]{4,19}$/'];
protected $rule = [
'username' => 'require|unique:admin',
'pwd' => 'require|confirm',
'mobile' => 'require',
'nickname' => 'require',
'username' => 'require|regex:checkUser|unique:admin',
'pwd' => 'require|min:6|confirm',
'edit_pwd' => 'min:6|confirm',
'mobile' => 'require|mobile',
'nickname' => 'require|chsAlpha',
'group_id' => 'require',
'id' => 'require',
'status' => 'require|checkStatus:-1,1',
@ -24,23 +27,29 @@ class AdminCheck extends Validate
protected $message = [
'username.require' => '登录账号不能为空',
'username.regex' => '登录账号必须是以字母开头只能包含字母数字下划线和减号5到20位',
'username.unique' => '同样的登录账号已经存在',
'pwd.require' => '密码不能为空',
'pwd.min' => '密码至少要6个字符',
'pwd.confirm' => '两次密码不一致',
'username.unique' => '同样的登录账号已经存在!',
'edit_pwd.min' => '密码至少要6个字符',
'edit_pwd.confirm' => '两次密码不一致',
'mobile.require' => '手机不能为空',
'mobile.mobile' => '手机格式错误',
'nickname.require' => '昵称不能为空',
'nickname.chsAlpha' => '昵称只能是汉子和字母',
'group_id.require' => '至少要选择一个用户角色',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
'status.checkStatus' => '系统所有者不能被禁用!',
'status.checkStatus' => '系统所有者不能被禁用',
'old_pwd.require' => '请提供旧密码',
'old_pwd.different' => '新密码不能和旧密码一样',
];
protected $scene = [
'add' => ['phone', 'nickname', 'group_id', 'pwd', 'username', 'status'],
'edit' => ['phone', 'nickname', 'group_id', 'id', 'username.unique', 'status'],
'editPersonal' => ['phone', 'nickname'],
'add' => ['mobile', 'nickname', 'group_id', 'pwd', 'username', 'status'],
'edit' => ['mobile', 'nickname', 'group_id', 'edit_pwd','id', 'username', 'status'],
'editPersonal' => ['mobile', 'nickname'],
'editpwd' => ['old_pwd', 'pwd'],
];

View File

@ -13,21 +13,17 @@ class ArticleCateCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:article_cate',
'pid' => 'require',
'id' => 'require',
'field' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'pid.require' => '父级分类为必选',
'title.unique' => '同样的记录已经存在',
'title.unique' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
'filed.require' => '缺少要更新的字段名',
];
protected $scene = [
'add' => ['title', 'pid'],
'edit' => ['id', 'field', 'title.unique'],
'add' => ['title'],
'edit' => ['id', 'title'],
];
}

View File

@ -21,14 +21,14 @@ class ArticleCheck extends Validate
protected $message = [
'title.require' => '标题不能为空',
'title.unique' => '同样的文章标题已经存在',
'article_cate_id.require' => '所属分类为必选',
'title.unique' => '同样的记录已经存在!',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
];
protected $scene = [
'add' => ['title', 'thumb', 'article_cate_id', 'content', 'status'],
'edit' => ['title', 'thumb', 'article_cate_id', 'content', 'id', 'status'],
'add' => ['title', 'article_cate_id', 'content', 'status'],
'edit' => ['title', 'article_cate_id', 'content', 'id', 'status'],
];
}

View File

@ -18,8 +18,8 @@ class ConfCheck extends Validate
protected $message = [
'title.require' => '配置名称不能为空',
'name.require' => '配置标识不能为空',
'title.unique' => '同样的配置名称已经存在',
'name.require' => '配置标识不能为空',
'name.unique' => '同样的配置标识已经存在',
];
}

View File

@ -19,10 +19,10 @@ class GroupCheck extends Validate
protected $message = [
'title.require' => '名称不能为空',
'title.unique' => '同样的记录已经存在!',
'title.unique' => '同样的记录已经存在',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
'status.checkStatus' => '系统所有者组不能被禁用!',
'status.checkStatus' => '系统所有者组不能被禁用',
];
protected $scene = [

View File

@ -13,13 +13,13 @@ use think\Validate;
class KeywordsCheck extends Validate
{
protected $rule = [
'title' => 'require|checkUnique',
'title' => 'require|unique:keywords',
'id' => 'require',
];
protected $message = [
'title.require' => '关键字名称不能为空',
'title.checkUnique' => '同样的关键字名称已经存在',
'title.unique' => '同样的关键字名称已经存在',
'id.require' => '缺少更新条件',
];
@ -28,20 +28,4 @@ class KeywordsCheck extends Validate
'edit' => ['id', 'title'],
];
//自定义验证规则
protected function checkUnique($value, $rule, $data)
{
if (isset($data['id'])) {
$unique = Db::name('keywords')->where([['id', '<>', $data['id']], ['title', '=', $value], ['status', '>=', 0]])->value('id');
} else {
$unique = Db::name('keywords')->where([['title', '=', $value], ['status', '>=', 0]])->value('id');
}
if ($unique) {
return false;
} else {
return true;
}
}
}

View File

@ -13,21 +13,17 @@ class MenuCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:admin_menu',
'pid' => 'require',
'id' => 'require',
'field' => 'require',
];
protected $message = [
'title.require' => '菜单名称不能为空',
'pid.require' => '父级菜单为必选',
'title.unique' => '同样的菜单名称已经存在',
'id.require' => '缺少更新条件',
'filed.require' => '缺少要更新的字段名',
];
protected $scene = [
'add' => ['title', 'pid'],
'edit' => ['id', 'field', 'title.unique'],
'add' => ['title'],
'edit' => ['id','title'],
];
}

View File

@ -21,9 +21,9 @@ class NavCheck extends Validate
protected $message = [
'title.require' => '标题不能为空',
'title.unique' => '同样的标题已经存在',
'name.require' => '标识不能为空',
'title.unique' => '同样的记录已经存在!',
'name.unique' => '同样的记录已经存在!',
'name.unique' => '同样的标识已经存在',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
'slide_id.require' => '缺少导航组ID',

View File

@ -14,14 +14,11 @@ class RuleCheck extends Validate
protected $rule = [
'title' => 'require|unique:admin_rule',
'src' => 'unique:admin_rule',
'pid' => 'require',
'id' => 'require',
'field' => 'require',
];
protected $message = [
'title.require' => '节点名称不能为空',
'pid.require' => '父级节点为必选',
'title.unique' => '同样的节点名称已经存在',
'src.unique' => '同样的节点规则已经存在',
'id.require' => '缺少更新条件',
@ -29,7 +26,8 @@ class RuleCheck extends Validate
];
protected $scene = [
'add' => ['title', 'pid', 'src'],
'edit' => ['id', 'field', 'title.unique', 'src.unique'],
'add' => ['title','src'],
'edit_title' => ['id', 'title'],
'edit_src' => ['id', 'src'],
];
}

View File

@ -18,7 +18,7 @@ class SitemapCateCheck extends Validate
protected $message = [
'name.require' => '名称不能为空',
'name.unique' => '同样的记录已经存在!',
'name.unique' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];

View File

@ -22,9 +22,9 @@ class SlideCheck extends Validate
protected $message = [
'title.require' => '标题不能为空',
'title.unique' => '同样的标题已经存在',
'name.require' => '标识不能为空',
'title.unique' => '同样的记录已经存在!',
'name.unique' => '同样的记录已经存在!',
'name.unique' => '同样的标识已经存在',
'id.require' => '缺少更新条件',
'status.require' => '状态为必选',
'img.require' => '请上传图片',

View File

@ -106,12 +106,12 @@
<tr>
<td class="layui-td-gray2">密码</td>
<td>
<input type="password" name="pwd" placeholder="请输入密码" autocomplete="off" class="layui-input">
<input type="password" name="edit_pwd" placeholder="请输入密码" autocomplete="off" class="layui-input">
</td>
<td class="layui-td-gray2">确认密码<font>*</font>
<td class="layui-td-gray2">确认密码
</td>
<td>
<input type="password" name="pwd_confirm" placeholder="请再次输入密码" autocomplete="off" class="layui-input">
<input type="password" name="edit_pwd_confirm" placeholder="请再次输入密码" autocomplete="off" class="layui-input">
</td>
</tr>
<tr>

View File

@ -18,20 +18,16 @@
{/volist}
</select>
</td>
<td class="layui-td-gray2">关键字</td>
<td class="layui-td-gray2">关键字<span style="color: red">*</span></td>
<td>
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" placeholder="请选择关键字"
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" lay-verify="required" lay-reqText="请选择关键字" placeholder="请选择关键字"
class="layui-input" readonly>
<input type="hidden" id="keyword_id" name="keyword_ids" autocomplete="off">
</td>
<td class="layui-td-gray2">属性</td>
<td class="layui-td-gray2">状态<span style="color: red">*</span></td>
<td>
<select name="type">
<option value="">请选择属性</option>
<option value="1">精华</option>
<option value="2">热门</option>
<option value="3">推荐</option>
</select>
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="下架">
</td>
</tr>
<tr>
@ -44,10 +40,14 @@
<input type="radio" name="is_home" value="1" title="是" checked>
<input type="radio" name="is_home" value="0" title="否">
</td>
<td class="layui-td-gray2">状态<span style="color: red">*</span></td>
<td class="layui-td-gray2">属性</td>
<td>
<input type="radio" name="status" value="1" title="正常" checked>
<input type="radio" name="status" value="0" title="下架">
<select name="type">
<option value="">请选择属性</option>
<option value="1">精华</option>
<option value="2">热门</option>
<option value="3">推荐</option>
</select>
</td>
</tr>
<tr>

View File

@ -11,7 +11,7 @@
{block name="body"}
<div class="body-content" style="height: 100%">
<div style="height:39px;">
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/article/cate_add">+ 添加分类</a>
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/article/cate_add">+ 添加分类</a><span style="color:#999;margin-left:20px">点击表格内容可编辑</span>
</div>
<div style="height: calc(100% - 30px)">
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
@ -67,8 +67,11 @@
type:'post',
data:{id:obj.data.id,field:obj.field,value:obj.value},
success:function(res){
if(res.code == 1){
layer.msg(res.msg);
if(res.code == 0){
setTimeout(function(){
location.reload()
},2000)
}
}
})

View File

@ -19,20 +19,16 @@
{/volist}
</select>
</td>
<td class="layui-td-gray2">关键字</td>
<td class="layui-td-gray2">关键字<span style="color: red">*</span></td>
<td>
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" placeholder="请选择关键字"
<input type="text" id="keyword_name" name="keyword_names" autocomplete="off" lay-verify="required" lay-reqText="请选择关键字" placeholder="请选择关键字"
class="layui-input" value="{$article.keyword_names}" readonly>
<input type="hidden" id="keyword_id" name="keywords_id" autocomplete="off" value="{$article.keyword_ids}">
</td>
<td class="layui-td-gray2">属性</td>
<td class="layui-td-gray2">状态<span style="color: red">*</span></td>
<td>
<select name="type">
<option value="">请选择属性</option>
<option value="1" {eq name="$article.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$article.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$article.type" value="3" }selected{/eq}>推荐</option>
</select>
<input type="radio" name="status" value="1" title="正常" {eq name="$article.status" value="1" }checked{/eq}>
<input type="radio" name="status" value="0" title="下架" {eq name="$article.status" value="0" }checked{/eq}>
</td>
</tr>
<tr>
@ -46,10 +42,14 @@
<input type="radio" name="is_home" value="1" title="是" {eq name="$article.is_home" value="1" }checked{/eq}>
<input type="radio" name="is_home" value="0" title="否" {eq name="$article.is_home" value="0" }checked{/eq}>
</td>
<td class="layui-td-gray2">状态<span style="color: red">*</span></td>
<td class="layui-td-gray2">属性</td>
<td>
<input type="radio" name="status" value="1" title="正常" {eq name="$article.status" value="1" }checked{/eq}>
<input type="radio" name="status" value="0" title="下架" {eq name="$article.status" value="0" }checked{/eq}>
<select name="type">
<option value="">请选择属性</option>
<option value="1" {eq name="$article.type" value="1" }selected{/eq}>精华</option>
<option value="2" {eq name="$article.type" value="2" }selected{/eq}>热门</option>
<option value="3" {eq name="$article.type" value="3" }selected{/eq}>推荐</option>
</select>
</td>
</tr>
<tr>

View File

@ -51,10 +51,10 @@
<div class="bottom">
<form class="layui-form" id="gougu-login">
<div class="layui-form-item">
<input type="text" name="username" lay-verify="required" value="gougucms" placeholder="请输入账户" lay-reqText="请输入账户" autocomplete="off" class="layui-input">
<input type="text" name="username" lay-verify="required" value="" placeholder="请输入账户" lay-reqText="请输入账户" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<input type="password" name="password" lay-verify="required" value="gougucms" placeholder="请输入密码" lay-reqText="请输入密码" autocomplete="off" class="layui-input">
<input type="password" name="password" lay-verify="required" value="" placeholder="请输入密码" lay-reqText="请输入密码" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<div class="layui-input-inline" style="width:188px;">

View File

@ -13,7 +13,7 @@
{block name="body"}
<div class="body-content" style="height: 100%">
<div style="height:39px;">
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/menu/add">+ 添加菜单</a>
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/menu/add">+ 添加菜单</a><span style="color:#999;margin-left:20px">点击表格内容可编辑</span>
</div>
<div style="height: calc(100% - 30px)">
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
@ -63,9 +63,11 @@
type: 'post',
data: { id: obj.data.id, field: obj.field, value: obj.value },
success: function (res) {
if (res.code == 1) {
layer.msg(res.msg);
setTimeout('location.reload()', 2000);
if(res.code == 0){
setTimeout(function(){
location.reload()
},2000)
}
}
})

View File

@ -13,7 +13,7 @@
{block name="body"}
<div class="body-content" style="height: 100%">
<div style="height:39px;">
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/rule/add">+ 添加节点</a>
<a class="layui-btn layui-btn-normal layui-btn-sm" href="/admin/rule/add">+ 添加节点</a><span style="color:#999;margin-left:20px">点击表格内容可编辑</span>
</div>
<div style="height: calc(100% - 30px)">
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
@ -63,9 +63,11 @@
type: 'post',
data: { id: obj.data.id, field: obj.field, value: obj.value },
success: function (res) {
if (res.code == 1) {
layer.msg(res.msg);
setTimeout('location.reload()', 2000);
if(res.code == 0){
setTimeout(function(){
location.reload()
},2000)
}
}
})

View File

@ -36,6 +36,7 @@ class Login
{
$url = $_SERVER["HTTP_REFERER"]; //获取完整的来路URL
$str = str_replace("http://","",$url); //去掉http://
$str = str_replace("https://","",$str); //去掉https://
$strdomain = explode("/",$str); // 以“/”分开成数组
$domain = $strdomain[0]; //取第一个“/”以前的字符
add_user_log('install', '系统',0,['domain'=>$domain]);
@ -57,7 +58,7 @@ class Login
return to_assign(0, $e->getError());
}
$user = Db::name('User')->where(['username' => $param['username']])->find();
$user = Db::name('User')->where(['username' => $param['name']])->find();
if (empty($user)) {
return to_assign(0, '用户名或密码错误');
}

View File

@ -11,16 +11,21 @@ use think\Validate;
class UserCheck extends Validate
{
protected $regex = [ 'checkUser' => '/^[A-Za-z]{1}[A-Za-z0-9_-]{4,19}$/'];
protected $rule = [
'username' => 'require',
'name' => 'require',
'password' => 'require',
'username' => 'require|regex:checkUser|unique:user',
'pwd' => 'require|min:6|confirm',
'captcha' => 'require|captcha',
];
protected $message = [
'username.require' => '账号不能为空',
'name.require' => '账号不能为空',
'password.require' => '密码不能为空',
'username.require' => '账号不能为空',
'username.regex' => '账号必须是以字母开头只能包含字母数字下划线和减号5到20位',
'username.unique' => '同样的登录账号已经存在',
'pwd.require' => '密码不能为空',
'pwd.min' => '密码必须6位以上',
'pwd.confirm' => '两次密码不一致', //confirm自动相互验证
@ -29,7 +34,7 @@ class UserCheck extends Validate
];
protected $scene = [
'login' => ['username', 'password', 'captcha'],
'login' => ['name', 'password', 'captcha'],
'reg' => ['username', 'pwd', 'captcha'],
];

View File

@ -6,7 +6,7 @@
<div class="r nav-menu">
<ul>
{volist name="COMMON_NAV" id="vo"}
<li><a class="nav-a" href="{$vo.src}" {eq name="vo.target" value="1"} target="_blank"{/eq}>{$vo.title}</a></li>
<li {if condition="strpos($vo.param,$params.action) nheq false"}class="on"{/if}><a class="nav-a" href="{$vo.src}" {eq name="vo.target" value="1"} target="_blank"{/eq}>{$vo.title}</a></li>
{/volist}
<li class="{$login_class}">
{:htmlspecialchars_decode($login_top)}

View File

@ -77,6 +77,82 @@
</div>
</div>
</div>
<div class="cms-banner">
<div class="blog">
<img src="https://blog.gougucms.com/static/admin/images/login_logo.png">
<span>轻巧的技术博客系统</span>
<ul>
<li>● 基于勾股CMS二次开发一脉相承</li>
<li>● 简约、易用、轻快、内存低等特点</li>
</ul>
<ul>
<li>● 集成文章、动态、归档、访问统计等功能</li>
<li>● 可做博客,工作室,自媒体等各类网站</li>
</ul>
<a href="https://blog.gougucms.com/" target="_blank">免费开源</a>
</div>
</div>
<div class="function">
<div class="function-title">功能矩阵</div>
<div class="function-sub-title">系统后台集成了主流的通用功能登录验证、系统配置、操作日志管理、用户管理、用户权限、功能管理后台菜单管理、导航设置、网站地图、轮播广告、TAG关键字管理、文件上传、数据备份/还原、文章功能、用户管理、用户操作日志、用户注册/登录等。更多的个性化功能可以基于当前系统便捷做二次开发。</div>
<div class="function-wrap">
<div class="function-img">
<img src="{__IMG__}/function.png">
</div>
<div class="function-main">
<div class="function-item">
<div class="item-box">
<img src="{__IMG__}/system.png">
<h3>系统管理</h3>
</div>
<ul>
<li><span></span>系统配置</li>
<li><span></span>功能菜单</li>
<li><span></span>功能节点</li>
<li><span></span>权限角色</li>
<li><span></span>管 理 员</li>
<li><span></span>操作日志</li>
<li><span></span>系统配置</li>
<li><span></span>数据备份</li>
<li><span></span>数据还原</li>
</ul>
</div>
<div class="function-item">
<div class="item-box">
<img src="{__IMG__}/data.png">
<h3>基础数据</h3>
</div>
<ul>
<li><span></span>导航设置</li>
<li><span></span>网站地图</li>
<li><span></span>轮播广告</li>
<li><span></span>SEO关键字</li>
<li><span></span>搜索关键词</li>
</ul>
</div>
<div class="function-item">
<div class="item-box">
<img src="{__IMG__}/user.png">
<h3>平台用户</h3>
</div>
<ul>
<li><span></span>用户列表</li>
<li><span></span>操作记录</li>
<li><span></span>操作日志</li>
</ul>
</div>
<div class="function-item">
<div class="item-box">
<img src="{__IMG__}/actrcle.png">
<h3>资讯中心</h3>
</div>
<ul>
<li><span></span>文章分类</li>
<li><span></span>文章列表</li>
</ul>
</div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->

View File

@ -14,6 +14,33 @@
<li class="layui-timeline-item">
<a name="2-4-x"> </a>
<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">
<h2>1.0.9</h2>
</div>
<blockquote class="layui-elem-quote">
<p>规范登录账号的格式新增api请求接口操作日志。</p>
</blockquote>
<ul>
<li>
<a name="1.0.8"> </a>
<h3>v1.2021.09.01 <span class="layui-badge-rim">2021-09-01</span></h3>
<ul>
<li>顶部导航新增当前高亮状态</li>
<li>新增后台账号规范必须是以字母开头只能包含字母数字下划线和减号5到20位</li>
<li>新增用户注册账号规范必须是以字母开头只能包含字母数字下划线和减号5到20位</li>
<li>后台各个模块的数据校验优化</li>
<li>修改CMS的描述</li>
<li>系统首页增加功能描述</li>
<li>新增开发日志页面</li>
</ul>
</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<a name="2-4-x"> </a>
<i class="layui-icon layui-timeline-axis">&#xe63f;</i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">
<h2>1.0.8</h2>

View File

@ -184,7 +184,7 @@
<div class="form-box">
<form id="gouguLogin">
<div class="form-item">
<input type="text" name="username" placeholder="账户" autocomplete="off"
<input type="text" name="name" placeholder="账户" autocomplete="off"
class="login-input">
</div>
<div class="form-item">

View File

@ -423,9 +423,9 @@ CREATE TABLE `cms_nav_info` (
-- -----------------------------
-- Records of `cms_nav_info`
-- -----------------------------
INSERT INTO `cms_nav_info` VALUES ('1', '0', '1', '首页', '/', '', '0', '1', '1', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('2', '0', '1', '文档', '/', '', '0', '1', '2', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('3', '0', '1', '社区', '/', '', '0', '1', '3', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('1', '0', '1', '首页', '/', 'index', '0', '1', '1', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('2', '0', '1', '开发日志', 'https://www.gougucms.com/home/index/logs.html', 'logs', '1', '1', '2', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('3', '0', '1', '博客社区', 'https://blog.gougucms.com/', '', '0', '1', '3', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('4', '0', '1', 'API接口', '/api/index', '', '1', '1', '4', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('5', '0', '1', '腾讯云优惠', 'https://curl.qcloud.com/PPEgI0oV', '', '1', '1', '5', '0', '0');
INSERT INTO `cms_nav_info` VALUES ('6', '0', '1', '阿里云特惠', 'https://www.aliyun.com/activity/daily/bestoffer?userCode=dmrcx154', '', '1', '1', '6', '0', '0');

View File

@ -8,10 +8,14 @@
// [ 应用入口文件 ]
namespace think;
if (empty(file_exists(__DIR__ . '/../vendor/autoload.php'))) {
echo '您还未安装PHP依赖包请输入命令安装composer install安装教程点击<a href="https://gitee.com/gougucms/gougucms" target="_blank">这里</a>。';
exit;
}
require __DIR__ . '/../vendor/autoload.php';
// 定义当前版本号
define('CMS_VERSION','1.0.0');
define('CMS_VERSION','1.09.01');
// 定义ThinkPHP版本号
define('TP_VERSION','6.0.5');

View File

@ -79,16 +79,19 @@ a:active {color:#4385F5;}
.nav-logo a{width:210px; height:60px; display:block;}
.nav-menu{font-size:16px;}
.nav-menu li{height:60px; float:left; color:#fff;}
.nav-menu li a.nav-a{height:60px; min-width:36px; text-align:center; line-height:60px; padding:0 25px; display:inline-block; color:#323232;transition: all 0.6s ;}
.nav-menu li a.nav-a:hover{color:#4385F5; transition: all 0.6s;}
.nav-menu li.on a.nav-a{color:#4385F5}
.nav-menu li{height:60px; float:left; color:#fff; padding: 0 20px;}
.nav-menu li a.nav-a{height:60px; position: relative; min-width:36px; text-align:center; line-height:60px; padding:0 3px; display:inline-block; color:#323232;transition: all 0.6s ;}
.nav-menu li a.nav-a:hover{color:#186AF2; transition: all 0.6s;}
.nav-menu li.on a.nav-a{color:#186AF2}
.nav-menu li.nav-login{position:relative; padding-left:25px}
.nav-menu li.nav-login a.nav-a{padding:0 2px; margin:0 5px}
.nav-menu li.nav-login span{padding:5px 16px 6px; border-radius:3px; font-size:14px; background-color:#EB4336; color:#fff}
.nav-menu li.nav-login span.login-span{background-color: #4385F5;}
.nav-menu li.nav-login{position:relative; padding-left:20px; padding-right: 0;}
.nav-menu li.nav-login a.nav-a{padding:0 2px; margin-left:5px}
.nav-menu li.nav-login span{padding:5px 16px 6px; border-radius:3px; font-size:14px; background-color:#186AF2; color:#fff}
.nav-menu li.nav-login span.reg-span{background-color:#EA4335;}
.nav-menu li a.nav-a:hover{color:#186AF2; transition: all 0.6s;}
.nav-menu li.on a.nav-a{color:#186AF2}
.nav-menu li.nav-login a:hover span{opacity:0.8;transition: all 0.5s;}
.nav-menu li.on a.nav-a:after { position: absolute; bottom: -1px; left: 0; content: ''; height: 3px; width: 100%; background-color: #186AF2;}
.nav-login-box{width:320px; border-radius:2px; position:absolute; top:60px; right:0; background-color:#fff; z-index:-1; color:#333; font-size:14px;-webkit-transform:scale(0.5);transform:scale(0.5);-webkit-transition:.2s;transition:.2s;opacity:0;-webkit-transform-origin:center top;transform-origin:center top;-webkit-box-shadow:0 15px 30px rgba(0,0,0,.2);box-shadow:0 15px 30px rgba(0,0,0,.2);}
.login-note{padding: 15px 15px 0; color: #FF5722;}

View File

@ -31,3 +31,29 @@
.part-text {text-align: left; line-height: 1.6;font-size: 14px; color: #888; padding: 10px 0;}
.feature:hover .part-text h3,.feature:hover .part-text {color: #fff;}
.part-icon img { width: 60px;height: 60px;}
.cms-banner{width:100%; height:120px; background-color:#4385F5}
.blog {width: 1220px;margin: auto; padding: 30px 0; color: rgba(255,255,255,0.9);overflow: hidden;}
.blog img {display: block; float: left; height: 60px; margin-right: 2px;}
.blog span { display: block; float: left; line-height: 60px; margin-right:39px; font-size: 28px; font-weight: 100;}
.blog ul { overflow: hidden; float: left; margin: 0 39px 0 0;}
.blog ul li {font-size: 15px; padding: 5px 0;}
.blog a {float: right;display: block; margin-top: 12px; padding: 6px 24px 7px; border: solid 2px #ed5d18; border-radius: 100px; background: #ed5d18; color: #fff; font-size: 16px; }
.function {background:#f2f2f2; width: 100%; text-align: center; padding: 100px 0;}
.function-title{font-size: 42px; font-weight: 500; text-align: center; font-weight: 100;}
.function-sub-title{font-size: 18px; padding: 20px 0 160px; line-height:2; font-weight: 100; text-align: left; width:1220px; margin:0 auto;}
.function-wrap{width:1220px;position: relative; margin:0 auto; background-color: #fff; padding:180px 0 30px; border-radius: 10px; box-shadow: 0 0 10px rgb(0 0 0 / 10%);}
.function-img{width: 100%;position: absolute; top: -96px;}
.function-main{display: flex; justify-content: center; padding: 30px;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
}
.function-item { width: 246px; font-size: 14px; line-height: 1.5; margin:0 30px; word-wrap: break-word;}
.item-box{padding: 15px 0; background-color: #4385F5; background: linear-gradient(to left, #4385F5, #00aaff); border-radius: 8px; color: #fff;margin-bottom: 10px;}
.function-item ul li { width: 40%; float: left; padding:5px 5%; text-align: left;}
.function-item ul li span{font-size: 16px; color: #4385F5; font-weight: 800; margin-right: 3px;}
.item-box h3{font-size: 18px; font-weight: 100;}
.item-box img{height:80px;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB