瀏覽代碼

fix:
- 配置管理
- 轮播图
- 模块管理

zzb 2 年之前
父節點
當前提交
ca62e58969

+ 12 - 0
.example.env

@@ -10,3 +10,15 @@ db_prefix = tplay_
 
 # 开放用户模块
 open_user_module = false
+# 模板文件存放目录,默认: D:\wwwroot\local.tplay.com\app\common\view\template\
+article_templet_path =
+# 生成的HTML存放目录,默认: D:\wwwroot\local.tplay.com\public\uploads\q1464674022\
+article_static_path =
+# 数据库备份文件存放目录,默认: D:\wwwroot\local.tplay.com\runtime\backup\
+data_backup_path =
+# HTML发布ftp配置
+article_ftp_host = 127.0.0.1
+article_ftp_port = 21
+article_ftp_user = username
+article_ftp_pwd = password
+article_ftp_webroot = /

+ 2 - 2
app/admin/controller/Admin.php

@@ -68,7 +68,7 @@ class Admin extends Permissions
             if ($this->request->isPost()) {
                 $post = $this->request->post();
                 $validate = new \think\Validate([
-                    ['admin_cate_id', 'require', '请选择管理员分组'],
+                    ['admin_cate_id', 'require', '请选择角色'],
                 ]);
                 if (!$validate->check($post)) {
                     $this->error('提交失败:' . $validate->getError());
@@ -97,7 +97,7 @@ class Admin extends Permissions
                     ['name|账号', 'require|alphaDash'],
                     ['password', 'require|confirm', '密码不能为空|两次密码不一致'],
                     ['password_confirm', 'require', '重复密码不能为空'],
-                    ['admin_cate_id', 'require', '请选择管理员分组'],
+                    ['admin_cate_id', 'require', '请选择角色'],
                 ]);
                 if (!$validate->check($post)) {
                     $this->error('提交失败:' . $validate->getError());

+ 2 - 8
app/admin/controller/AdminCate.php

@@ -16,7 +16,7 @@ use think\Db;
 class AdminCate extends Permissions
 {
     /**
-     * 管理员权限列表
+     * 权限组
      * @return mixed
      */
     public function index()
@@ -37,10 +37,7 @@ class AdminCate extends Permissions
         return $this->fetch();
     }
 
-    /**
-     * 管理员角色添加和修改操作
-     * @return mixed
-     */
+
     public function publish()
     {
         $id = $this->request->param('id', 0, 'intval');
@@ -147,9 +144,6 @@ class AdminCate extends Permissions
         return $menus;
     }
 
-    /**
-     * 管理员角色删除
-     */
     public function delete()
     {
         if ($this->request->isAjax()) {

+ 2 - 2
app/admin/controller/Attachment.php

@@ -73,7 +73,7 @@ class Attachment extends Permissions
     {
         $model = new model();
         $where = [
-            'fileext' => ['in', ['jpg', 'png', 'gif', 'jpeg']],
+            'fileext' => ['in', ['jpg', 'png', 'gif', 'jpeg', 'bmp', 'webp']],
             'status' => model::STATUS_OPEN
         ];
         $attachment = $model->where($where)->order('create_time desc')->paginate(24);
@@ -232,7 +232,7 @@ class Attachment extends Permissions
                 'use' => $use,//来源
                 'filename' => $pathinfo['basename'],//文件名
                 'filepath' => $filepath,//文件路径
-                'fileext' => $pathinfo['extension']??'',//文件后缀
+                'fileext' => $pathinfo['extension']??'webp',//文件后缀
                 'filesize' => 0,//文件大小
                 'create_time' => time(),//时间
                 'uploadip' => $this->request->ip(),//IP

+ 39 - 5
app/admin/controller/Config.php

@@ -15,13 +15,12 @@ use think\Db;
 
 class Config extends Permissions
 {
+    //扩展配置
     public function index()
     {
         if ($this->request->isAjax()) {
             $post = $this->request->param();
-            $where = [
-                'hide' => cateModel::STATUS_SHOW,
-            ];
+            $where = [];
             if (isset($post['tab_id']) && !empty($post['tab_id'])) {
                 $where['tab_id'] = $post['tab_id'];
             }
@@ -43,12 +42,12 @@ class Config extends Permissions
         }
     }
 
-    public function index2()
+    //显示到系统配置
+    public function indexWebconfig()
     {
         if ($this->request->isAjax()) {
             $post = $this->request->param();
             $where = [
-                'hide' => cateModel::STATUS_SHOW,
                 'status' => cateModel::STATUS_OPEN
             ];
             if (isset($post['tab_id']) && !empty($post['tab_id'])) {
@@ -120,6 +119,41 @@ class Config extends Permissions
     }
 
 
+    public function publishWebconfig()
+    {
+        $id = $this->request->param('id', 0, 'intval');
+        $model = new cateModel();
+        $post = $this->request->post();
+        if ($this->request->isPost()) {
+            $validate = new \think\Validate([
+                ['name', 'require', '名称不能为空'],
+            ]);
+            if (!$validate->check($post)) {
+                $this->error('提交失败:' . $validate->getError());
+            }
+        } else {
+        }
+
+        if ($id > 0) {
+            $cate = $model->where('id', $id)->find();
+            if (empty($cate)) {
+                $this->error('id不正确');
+            }
+            if ($this->request->isPost()) {
+                if (false == $model->allowField(true)->save($post, ['id' => $id])) {
+                    $this->error('修改失败');
+                } else {
+                    $this->success('修改成功');
+                }
+            } else {
+                $this->assign('cate', $cate);
+                return $this->fetch();
+            }
+        } else {
+        }
+    }
+
+
     public function delete()
     {
         if ($this->request->isAjax()) {

+ 2 - 3
app/admin/controller/ConfigOption.php

@@ -22,7 +22,6 @@ class ConfigOption extends Permissions
             $post = $this->request->param();
             $where = [
                 'pid' => $pid,
-                'hide' => optionModel::STATUS_SHOW
             ];
             if (isset($post['keywords']) and !empty($post['keywords'])) {
                 $where['name'] = ['like', '%' . $post['keywords'] . '%'];
@@ -40,7 +39,7 @@ class ConfigOption extends Permissions
 
             return array('code' => 0, 'count' => $count, 'data' => $data);
         } else {
-            $this->assign('json_config', \app\common\model\Config::get($pid)->getJsonConfig());
+            $this->assign('config', \app\common\model\Config::get($pid));
             return $this->fetch();
         }
     }
@@ -61,7 +60,7 @@ class ConfigOption extends Permissions
                 $this->error('提交失败:' . $validate->getError());
             }
         } else {
-            $this->assign('json_config', \app\common\model\Config::get($pid)->getJsonConfig());
+            $this->assign('config', \app\common\model\Config::get($pid));
         }
         if ($id > 0) {
             //是修改操作

+ 2 - 1
app/admin/controller/Databackup.php

@@ -4,6 +4,7 @@ namespace app\admin\controller;
 
 use app\admin\controller\base\Permissions;
 use databackup\src\Backup;
+use think\Env;
 use think\Request;
 use think\Session;
 
@@ -23,7 +24,7 @@ class Databackup extends Permissions
     {
         parent::_initialize();
 
-        $path = \app\common\model\Webconfig::getValue('data_backup_path');
+        $path = Env::get('data_backup_path', '');
         $path = empty($path) ? self::DEFAULT_PATH : (endWith($path, DS) ? $path : $path . DS);
 
         self::$sdk = new Backup([

+ 10 - 5
app/admin/controller/FileManage.php

@@ -17,6 +17,7 @@ use file\ImgHelper;
 use file\PathHelper;
 use file\ZipHelper;
 use network\FtpHelper;
+use think\Env;
 use think\Exception;
 use think\Log;
 
@@ -228,17 +229,21 @@ class FileManage extends Permissions
         $relativePath = $this->request->param('relative_path', '', 'replaceDS');
         //
         $rootPath = FileManageModel::getRootDir();
-        $config = \app\common\model\Webconfig::getFtpConfig();
-        $ftpHost = $config['host']??'';
+        $ftpHost = Env::get('article_ftp_host', '127.0.0.1');
+        $ftpPort = Env::get('article_ftp_port', 21);
+        $ftpUser = Env::get('article_ftp_user', 'username');
+        $ftpPwd = Env::get('article_ftp_pwd', 'password');
+        $ftpWebroot = Env::get('article_ftp_webroot', '');
+
         if (empty($ftpHost)) {
             $this->error('请先配置ftp');
         }
         try {
             $ftp = new FtpHelper();
-            $ftp->connect($ftpHost, $config['user']??'', $config['pwd']??'', $config['port']??21);
+            $ftp->connect($ftpHost, $ftpUser, $ftpPwd, $ftpPort);
             //设置根目录
-            if ($config['webRoot']??'') {
-                $ftp->cd($config['webRoot']??'');
+            if ($ftpWebroot) {
+                $ftp->cd($ftpWebroot);
             }
             foreach ($file_list as $filename) {
                 $upDownPath = $rootPath . DS . ($relativePath ? $relativePath . DS . $filename : $filename);

+ 4 - 13
app/admin/controller/Webconfig.php

@@ -12,6 +12,7 @@ namespace app\admin\controller;
 use app\admin\controller\base\Permissions;
 use app\admin\model\AdminLog;
 use app\admin\model\Urlconfig;
+use app\common\model\ConfigTab as configTabModel;
 use think\Cache;
 use think\Db;
 
@@ -23,11 +24,9 @@ class Webconfig extends Permissions
         $this->assign('is_close_site_key', (new Urlconfig())->getCloseSiteKey());
         $this->assign('admin_log_num', (new AdminLog())->count());
         $this->assign('backend_pass', (new Urlconfig())->getBackendPass());
-        $this->assign('default_static_path', \app\common\model\Templet::DEFAULT_STATIC_PATH);
-        $this->assign('default_templet_path', \app\common\model\Templet::DEFAULT_TEMPLET_PATH);
-        $this->assign('default_backup_path', Databackup::DEFAULT_PATH);
-        $grouptabs = (new \app\common\model\ConfigTab())->order('sort desc')->select();
-        $this->assign('tabs', $grouptabs);
+        //扩展配置标签
+        $tabs = (new configTabModel())->where('status', configTabModel::STATUS_OPEN)->order('sort desc')->select();
+        $this->assign('tabs', $tabs);
         return $this->fetch();
     }
 
@@ -43,14 +42,6 @@ class Webconfig extends Permissions
             if (!$validate->check($post)) {
                 $this->error('提交失败:' . $validate->getError());
             }
-            if (isset($post['article_ftp_config']) && !empty($post['article_ftp_config'])) {
-                $json = json_decode($post['article_ftp_config'], true);
-                if (!is_array($json)) {
-                    $this->error('ftp配置格式错误');
-                } else {
-                    $post['article_ftp_config'] = json_encode($json, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
-                }
-            }
             if (!isset($post['is_log'])) {
                 $post['is_log'] = 0;
             }

+ 2 - 2
app/admin/view/admin/publish.html

@@ -36,10 +36,10 @@
     <form class="layui-form" id="admin">
 
         <div class="layui-form-item">
-            <label class="layui-form-label">分组</label>
+            <label class="layui-form-label">角色</label>
             <div class="layui-input-inline">
                 <select name="admin_cate_id" lay-filter="">
-                    <option value="">请选择分组</option>
+                    <option value="">请选择角色</option>
                     {volist name="info['admin_cate']" id="vo"}
                     <option value="{$vo.id}" {notempty name="$info.admin.admin_cate_id"}
                             {eq name="$info.admin.admin_cate_id" value="$vo.id"} selected=""{/eq}{/notempty}>{$vo.name}</option>

+ 2 - 2
app/admin/view/config/index.html

@@ -39,7 +39,7 @@
             </div>
             <div class="layui-input-inline">
                 <select name="tab_id" lay-search="">
-                    <option value="">分组标签</option>
+                    <option value="">标签</option>
                     {foreach name="$tabs" item="vo" key="k"}
                     <option value="{$vo.id}">{$vo.name}</option>
                     {/foreach}
@@ -91,6 +91,7 @@
                         return '<input type="text" name="sorts[]" value="' + row.sort + '" style="width: 20px;" class="sort"><input type="hidden" name="ids[]" value="' + row.id + '">';
                     }
                     },
+                    {field: 'tab_text', title: '标签', width: 120, align: 'center'},
                     {field: 'id', title: 'ID', width: 60, align: 'center'},
                     {field: 'name', title: '名称'},
                     {field: 'type_text', title: '配置类型', width: 100, align: 'center'},
@@ -101,7 +102,6 @@
                         return '<a class="layui-btn layui-btn-xs" lay-event="options">配置</a>';
                     }},
                     {field: 'remark', title: '备注'},
-                    {field: 'tab_text', title: '分组标签', width: 120, align: 'center'},
                     {
                         field: 'status', title: '状态', align: 'center', width: 100, templet: function (row) {
                         return '<a href="javascript:;" style="font-size:18px;" class="status" data-id="' + row.id + '" data-val="' + row.status + '">' + (row.status == 1 ? '<i class="fa fa-toggle-on"></i>' : '<i class="fa fa-toggle-off"></i>') + '</a>';

+ 5 - 19
app/admin/view/config/index2.html → app/admin/view/config/index_webconfig.html

@@ -13,22 +13,7 @@
 <body style="padding:10px;">
 <div class="tplay-body-div">
 
-    <div class="layui-tab">
-        <ul class="layui-tab-title">
-            <li><a href="{:url('webconfig/index')}" class="a_menu">系统设置</a></li>
-            <li><a href="{:url('emailconfig/index')}" class="a_menu">邮件配置</a></li>
-            <li><a href="{:url('smsconfig/index')}" class="a_menu">短信配置</a></li>
-            <!--config_tab-->
-            {foreach $tabs as $tab}
-            {eq name="$tab.id" value="$Request.param.tab_id"}
-            <li class="layui-this">{$tab.name}</li>
-            {else/}
-            <li><a href="{:url('admin/config/index2')}?tab_id={$tab.id}">{$tab.name}</a></li>
-            {/eq}
-            {/foreach}
-        </ul>
-    </div>
-
+    {include file="webconfig/tab"}
 
     <script type="text/html" id="barDemo">
         <div class="layui-btn-group">
@@ -50,17 +35,18 @@
             table.render({
                 id: 'table'
                 , elem: '#table'
-                , size: 'sm' //小尺寸的表格
+//                , size: 'sm' //小尺寸的表格
 //                , toolbar: '#toolbarDemo'
                 , defaultToolbar: []
                 , limit: 15
                 , limits: [15, 20, 30, 40, 50, 100]
-                , url: "{:url('index2')}?tab_id={$Request.param.tab_id}" //数据接口
+                , url: "{:url('indexWebconfig')}?tab_id={$Request.param.tab_id}" //数据接口
                 , page: true //开启分页
                 , cols: [[ //表头
                     {field: 'id', title: 'ID', width: 100, align: 'center'},
                     {field: 'name', title: '名称'},
                     {field: 'value_text', title: '配置值'},
+                    {field: 'remark', title: '备注'},
                     {field: 'action', title: '操作', align: 'center', toolbar: '#barDemo', width: 150, fixed: 'right'}
                 ]],
                 done: function () {
@@ -80,7 +66,7 @@
             table.on('tool(table)', function (obj) {
                 if (obj.event == 'edit') {
                     if (obj.data.type == 0) {
-                        location.href = "{:url('admin/config/publish2')}?id=" + obj.data.id;
+                        location.href = "{:url('admin/config/publishWebconfig')}?id=" + obj.data.id;
                     } else {
                         layer.open({
                             type: 2,

+ 88 - 41
app/admin/view/config/publish.html

@@ -22,58 +22,105 @@
     </div>
     <form class="layui-form" id="admin">
 
-        <div class="layui-form-item">
-            <label class="layui-form-label">配置名称</label>
-            <div class="layui-input-inline">
-                <input name="name" lay-verify="required" placeholder="自定义配置名称" autocomplete="off" class="layui-input"
-                       type="text" {notempty name="$cate.name" }value="{$cate.name}" {/notempty}>
+        <div class="layui-col-md6">
+            <div class="layui-form-item">
+                <label class="layui-form-label">配置名</label>
+                <div class="layui-input-inline">
+                    <input name="name" lay-verify="required" placeholder="自定义配置名称" autocomplete="off" class="layui-input"
+                           type="text" {notempty name="$cate.name" }value="{$cate.name}" {/notempty}>
+                </div>
             </div>
-        </div>
 
-        <div class="layui-form-item">
-            <label class="layui-form-label">配置类型</label>
-            <div class="layui-input-inline" style="max-width:300px;">
-                <select name="type" lay-filter="type">
-                    {foreach name="$types" item="vo" key="k"}
-                    <option value="{$k}" {notempty name="$cate"}{if condition="$type eq $k"} selected=""{/if}{/notempty}>{$vo}</option>
-                    {/foreach}
-                </select>
+            <div class="layui-form-item">
+                <label class="layui-form-label">类型</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                    <select name="type" lay-filter="type">
+                        {foreach name="$types" item="vo" key="k"}
+                        <option value="{$k}" {notempty name="$cate"}{if condition="$type eq $k"} selected=""{/if}{/notempty}>{$vo}</option>
+                        {/foreach}
+                    </select>
+                </div>
             </div>
-        </div>
 
-        <div class="layui-form-item layui-form-text" id="val">
-            <label class="layui-form-label">配置值</label>
-            <div class="layui-input-block" style="max-width:500px;">
-                <input name="value" maxlength="50" placeholder="请输入,限制255字" autocomplete="off" class="layui-input"
-                       type="text" {notempty name="$cate.value" }value="{$cate.value}" {/notempty}>
+            <div class="layui-form-item layui-form-text" id="val">
+                <label class="layui-form-label">配置值</label>
+                <div class="layui-input-block" style="max-width:500px;">
+                    <input name="value" maxlength="50" placeholder="请输入,限制255字" autocomplete="off" class="layui-input"
+                           type="text" {notempty name="$cate.value" }value="{$cate.value}" {/notempty}>
+                </div>
             </div>
-        </div>
 
-        <div class="layui-form-item">
-            <label class="layui-form-label">分组标签</label>
-            <div class="layui-input-inline" style="max-width:300px;">
-                <select name="tab_id">
-                    <option value="">请选择</option>
-                    {foreach name="$tabs" item="vo" key="k"}
-                    <option value="{$vo.id}"
-                            {notempty name="$cate"}
-                            {eq name="$cate.tab_id" value="$vo.id"} selected=""{/eq}
-                    {else/}
-                    {notempty name="$Request.param.tab_id"}{eq name="$Request.param.tab_id" value="$vo.id"} selected=""{/eq}{/notempty}
-                    {/notempty}>{$vo.name}</option>
-                    {/foreach}
-                </select>
+            <div class="layui-form-item">
+                <label class="layui-form-label">标签</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                    <select name="tab_id">
+                        <option value="">请选择</option>
+                        {foreach name="$tabs" item="vo" key="k"}
+                        <option value="{$vo.id}"
+                                {notempty name="$cate"}
+                                {eq name="$cate.tab_id" value="$vo.id"} selected=""{/eq}
+                        {else/}
+                        {notempty name="$Request.param.tab_id"}{eq name="$Request.param.tab_id" value="$vo.id"} selected=""{/eq}{/notempty}
+                        {/notempty}>{$vo.name}</option>
+                        {/foreach}
+                    </select>
+                </div>
             </div>
-            <div class="layui-form-mid layui-word-aux">
-                按标签分组展示
+
+
+            <div class="layui-form-item layui-form-text">
+                <label class="layui-form-label">备注</label>
+                <div class="layui-input-block" style="max-width:500px;">
+                    <textarea placeholder="请输入,限制500字" maxlength="255" class="layui-textarea" name="remark">{notempty name="$cate.remark"}{$cate.remark}{/notempty}</textarea>
+                </div>
             </div>
         </div>
 
 
-        <div class="layui-form-item layui-form-text">
-            <label class="layui-form-label">备注</label>
-            <div class="layui-input-block" style="max-width:500px;">
-                <textarea placeholder="请输入,限制500字" maxlength="255" class="layui-textarea" name="remark">{notempty name="$cate.remark"}{$cate.remark}{/notempty}</textarea>
+        <div class="layui-col-md6">
+
+            <div class="layui-form-item">
+                <label class="layui-form-label" style="width: 90px">启用图片配置</label>
+                <div class="layui-input-inline">
+                    <input type="radio" name="image_open" value="0" title="关闭" {if condition="(isset($cate) && $cate.image_open eq '0') || !isset($cate)"}checked{/if}>
+                    <input type="radio" name="image_open" value="1" title="启用" {if condition="isset($cate) && $cate.image_open eq '1'"}checked{/if}>
+                </div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label" style="width: 90px">图片label</label>
+                <div class="layui-input-inline">
+                    <input name="image_label" lay-verify="" placeholder="自定义label文字,请输入" autocomplete="off" class="layui-input"
+                           type="text" {if condition="isset($cate) && $cate->getData('image_label')" }value="{$cate.image_label}" {/if}>
+                </div>
+                <div class="layui-form-mid layui-word-aux">默认为“配图”</div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label" style="width: 90px">配置名label</label>
+                <div class="layui-input-inline">
+                    <input name="name_label" lay-verify="" placeholder="自定义label文字,请输入" autocomplete="off" class="layui-input"
+                           type="text" {if condition="isset($cate) && $cate->getData('name_label')" }value="{$cate.name_label}" {/if}>
+                </div>
+                <div class="layui-form-mid layui-word-aux">默认为“名称”</div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label" style="width: 90px">配置值label</label>
+                <div class="layui-input-inline">
+                    <input name="value_label" lay-verify="" placeholder="自定义label文字,请输入" autocomplete="off" class="layui-input"
+                           type="text" {if condition="isset($cate) && $cate->getData('value_label')" }value="{$cate.value_label}" {/if}>
+                </div>
+                <div class="layui-form-mid layui-word-aux">默认为“配置值”</div>
+            </div>
+
+            <div class="layui-form-item">
+                <label class="layui-form-label" style="width: 90px">备注label</label>
+                <div class="layui-input-inline">
+                    <input name="desc_label" lay-verify="" placeholder="自定义label文字,请输入" autocomplete="off" class="layui-input"
+                           type="text" {if condition="isset($cate) && $cate->getData('desc_label')" }value="{$cate.desc_label}" {/if}>
+                </div>
+                <div class="layui-form-mid layui-word-aux">默认为“备注”</div>
             </div>
         </div>
 

+ 98 - 0
app/admin/view/config/publish_webconfig.html

@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>layui</title>
+    <meta name="renderer" content="webkit">
+    <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="__PUBLIC__/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="__PUBLIC__/font-awesome/css/font-awesome.min.css" media="all"/>
+    <link rel="stylesheet" href="__CSS__/admin.css" media="all">
+</head>
+<body style="padding:10px;">
+<div class="tplay-body-div">
+    <div class="layui-tab">
+        <ul class="layui-tab-title">
+            <li><a href="javascript:history.back(-1);" class="a_menu">返回</a></li>
+            <li class="layui-this">编辑</li>
+        </ul>
+    </div>
+    <div style="margin-top: 20px;">
+    </div>
+    <form class="layui-form" id="admin">
+
+        <div class="layui-col-md6">
+            <div class="layui-form-item">
+                <label class="layui-form-label">配置名</label>
+                <div class="layui-input-inline">
+                    <input name="name" lay-verify="required" placeholder="自定义配置名称" autocomplete="off" class="layui-input"
+                           type="text" {notempty name="$cate.name" }value="{$cate.name}" {/notempty} readonly="readonly">
+                </div>
+            </div>
+
+
+            <div class="layui-form-item layui-form-text" id="val">
+                <label class="layui-form-label">配置值</label>
+                <div class="layui-input-block" style="max-width:500px;">
+                    <input name="value" maxlength="50" placeholder="请输入,限制255字" autocomplete="off" class="layui-input"
+                           type="text" {notempty name="$cate.value" }value="{$cate.value}" {/notempty}>
+                </div>
+            </div>
+
+
+            <div class="layui-form-item layui-form-text">
+                <label class="layui-form-label">备注</label>
+                <div class="layui-input-block" style="max-width:500px;">
+                    <textarea placeholder="请输入,限制500字" maxlength="255" class="layui-textarea" name="remark">{notempty name="$cate.remark"}{$cate.remark}{/notempty}</textarea>
+                </div>
+            </div>
+        </div>
+
+
+        {notempty name="$cate"}
+        <input type="hidden" name="id" value="{$cate.id}">
+        {/notempty}
+        <div class="layui-form-item">
+            <div class="layui-input-block">
+                <button class="layui-btn" lay-submit lay-filter="admin">保存</button>
+                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+            </div>
+        </div>
+
+    </form>
+
+    {include file="public/foot"}
+
+    <script>
+        layui.use(['layer', 'form'], function () {
+            var layer = layui.layer,
+                $ = layui.jquery,
+                form = layui.form;
+            $(window).on('load', function () {
+                form.on('submit(admin)', function (data) {
+                    $.ajax({
+                        url: "{:url('publishWebconfig')}",
+                        dataType: 'json',
+                        data: $('#admin').serialize(),
+                        type: 'post',
+                        async: false,
+                        success: function (res) {
+                            if (res.code == 1) {
+                                layer.alert(res.msg, function (index) {
+                                    history.back(-1);
+                                })
+                            } else {
+                                layer.msg(res.msg);
+                            }
+                        }
+                    })
+                    return false;
+                });
+            });
+
+        });
+    </script>
+</div>
+</body>
+</html>

+ 5 - 12
app/admin/view/config_option/index.html

@@ -1,10 +1,3 @@
-{php}
-$name_label = $json_config['config_option']['name']['label']??'';
-$value_label = $json_config['config_option']['value']['label']??'';
-$desc_label = $json_config['config_option']['description']['label']??'';
-$image_label = $json_config['config_option']['image']['label']??'';
-$image_show = $json_config['config_option']['image']['show']??'';
-{/php}
 <!DOCTYPE html>
 <html>
 <head>
@@ -92,13 +85,13 @@ $image_show = $json_config['config_option']['image']['show']??'';
                     },
                     {type: 'checkbox'},
                     {field: 'id', title: 'ID', width: 60, align: 'center'},
-                    {field: 'name', title: '{if condition="!empty($name_label)"}{$name_label}{else/}名称{/if}', minWidth: 150},
-                    {field: 'value', title: '{if condition="!empty($value_label)"}{$value_label}{else/}配置值{/if}', align: 'center',minWidth:150},
-                    {field: 'description', title: '{if condition="!empty($desc_label)"}{$desc_label}{else/}备注{/if}', minWidth:150},
-                    //{if condition="$image_show==true"}
+                    {field: 'name', title: '{$config.name_label}', minWidth: 150},
+                    {field: 'value', title: '{$config.value_label}', align: 'center',minWidth:150},
+                    {field: 'description', title: '{$config.desc_label}', minWidth:150},
+                    //{if condition="$config->image_open"}
 
                     {
-                        field: 'image', title: '{if condition="!empty($image_label)"}{$image_label}{else/}配图{/if}', minWidth: 80, align: 'center', templet: function (row) {
+                        field: 'image', title: '{$config.image_label}', minWidth: 80, align: 'center', templet: function (row) {
                         return (row.thumb_url == '') ? '' : '<a href="' + row.thumb_url + '" class="tooltip" target="_blank"><img src="' + row.thumb_url + '" width="20" height="20"></a>';
                     }
                     },

+ 8 - 18
app/admin/view/config_option/publish.html

@@ -1,13 +1,3 @@
-{php}
-$name_label = $json_config['config_option']['name']['label']??'';
-$value_label = $json_config['config_option']['value']['label']??'';
-$desc_label = $json_config['config_option']['description']['label']??'';
-$image_label = $json_config['config_option']['image']['label']??'';
-$image_show = $json_config['config_option']['image']['show']??'';
-$name_placeholder = $json_config['config_option']['name']['placeholder']??'';
-$value_placeholder = $json_config['config_option']['value']['placeholder']??'';
-$desc_placeholder = $json_config['config_option']['description']['placeholder']??'';
-{/php}
 <!DOCTYPE html>
 <html>
 <head>
@@ -49,31 +39,31 @@ $desc_placeholder = $json_config['config_option']['description']['placeholder']?
 
       <div class="layui-col-md7">
         <div class="layui-form-item">
-          <label class="layui-form-label">{if condition="!empty($name_label)"}{$name_label}{else/}名称{/if}</label>
+          <label class="layui-form-label">{$config.name_label}</label>
           <div class="layui-input-inline" style="max-width:300px;">
-            <input name="name" lay-verify="required" maxlength="30" autocomplete="off" placeholder="{if condition='!empty($name_placeholder)'}{$name_placeholder}{else/}请输入{/if}" class="layui-input" type="text" {notempty name="$link.name"}value="{$link.name}"{/notempty}>
+            <input name="name" lay-verify="required" maxlength="30" autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$link.name"}value="{$link.name}"{/notempty}>
           </div>
         </div>
 
         <div class="layui-form-item">
-          <label class="layui-form-label">{if condition="!empty($value_label)"}{$value_label}{else/}配置值{/if}</label>
+          <label class="layui-form-label">{$config.value_label}</label>
           <div class="layui-input-block" style="max-width:600px;">
-            <input name="value" lay-verify="" maxlength="255" autocomplete="off" placeholder="{notempty name='$value_placeholder'}{$value_placeholder}{else/}请输入,限制255字{/notempty}" class="layui-input" type="text" {notempty name="$link.value"}value="{$link.value}"{/notempty}>
+            <input name="value" lay-verify="" maxlength="255" autocomplete="off" placeholder="请输入,限制255字" class="layui-input" type="text" {notempty name="$link.value"}value="{$link.value}"{/notempty}>
           </div>
         </div>
 
         <div class="layui-form-item layui-form-text">
-          <label class="layui-form-label">{if condition="!empty($desc_label)"}{$desc_label}{else/}备注{/if}</label>
+          <label class="layui-form-label">{$config.desc_label}</label>
           <div class="layui-input-block" style="max-width:600px;">
-            <textarea placeholder="{notempty name='$desc_placeholder'}{$desc_placeholder}{else/}请输入,限制500字{/notempty}" maxlength="500" class="layui-textarea" name="description">{notempty name="$link.description"}{$link.description}{/notempty}</textarea>
+            <textarea placeholder="请输入,限制500字" maxlength="500" class="layui-textarea" name="description">{notempty name="$link.description"}{$link.description}{/notempty}</textarea>
           </div>
         </div>
       </div>
 
-      {if condition="$image_show==true"}
+      {if condition="$config->image_open"}
       <div class="layui-col-md5">
         <div class="layui-upload">
-          <label class="layui-form-label">{if condition="!empty($image_label)"}{$image_label}{else/}配图{/if}</label>
+          <label class="layui-form-label">{$config.image_label}</label>
           <div class="layui-upload-list">
             <img class="layui-upload-img" id="upload_img" {notempty name="$link.image"}src="{$link.image|geturl}"{/notempty}>
             <input type="hidden" id="upload_value" name="image" value='{notempty name="$link.image"}{$link.image}{/notempty}'>

+ 14 - 19
app/admin/view/config_tab/index.html

@@ -24,10 +24,16 @@
 <body style="padding:10px;">
 <div class="tplay-body-div">
 
+    <div class="layui-tab">
+        <ul class="layui-tab-title">
+            <li class="layui-this">列表</li>
+            <li><a href="{:url('publish')}" class="a_menu">新增</a></li>
+        </ul>
+    </div>
+
     <script type="text/html" id="toolbarDemo">
         <div class="layui-btn-container">
             <button class="layui-btn layui-btn-sm" lay-submit lay-filter="admin">排序</button>
-            <button class="layui-btn layui-btn-sm" lay-event="addGroupTab">新增</button>
         </div>
     </script>
 
@@ -69,9 +75,16 @@
                     {field: 'id', title: 'ID', width: 60},
                     {field: 'name', title: '名称'},
                     {field: 'remark', title: '备注', align: 'center'},
+                    {
+                        field: 'status', title: '显示到系统配置', align: 'center', width: 150, templet: function (row) {
+                        return '<a href="javascript:;" style="font-size:18px;" class="status" data-id="' + row.id + '" data-val="' + row.status + '">' + (row.status == 1 ? '<i class="fa fa-toggle-on"></i>' : '<i class="fa fa-toggle-off"></i>') + '</a>';
+                    }
+                    },
                     {field: 'action', title: '操作', toolbar: '#barDemo',width: 150, fixed: 'right'}
                 ]],
                 done: function () {
+                    //审核
+                    switchStatus('.status',"{:url('status')}");
                 }
             });
 
@@ -106,24 +119,6 @@
                 }
             });
 
-            //监听事件
-            table.on('toolbar(table)', function (obj) {
-                if(obj.event == 'addGroupTab') {
-                    layer.prompt({
-                        title: '输入标签名'
-                    }, function (value, index, elem) {
-                        $.post("{:url('publish')}", {
-                            name: value
-                        }, function (res) {
-                            layer.msg(res.msg);
-                            if (res.code == 1) {
-                                table.reload('table');
-                            }
-                        });
-                        layer.close(index);
-                    });
-                }
-            });
         });
     </script>
     <script>

+ 1 - 1
app/admin/view/config_tab/publish.html

@@ -15,7 +15,7 @@
     <div class="layui-tab">
         <ul class="layui-tab-title">
             <li><a href="{:url('index')}" class="a_menu">列表</a></li>
-            <li class="layui-this">编辑</li>
+            <li class="layui-this">{notempty name="$cate"}编辑{else/}新增{/notempty}</li>
         </ul>
     </div>
     <div style="margin-top: 20px;">

+ 2 - 11
app/admin/view/emailconfig/index.html

@@ -13,17 +13,8 @@
 <body style="padding:10px;">
 <div class="tplay-body-div">
 
-    <div class="layui-tab">
-        <ul class="layui-tab-title">
-            <li><a href="{:url('webconfig/index')}" class="a_menu">系统设置</a></li>
-            <li class="layui-this">邮件配置</li>
-            <li><a href="{:url('smsconfig/index')}" class="a_menu">短信配置</a></li>
-            <!--config_tab-->
-            {foreach $tabs as $tab}
-            <li><a href="{:url('admin/config/index2')}?tab_id={$tab.id}">{$tab.name}</a></li>
-            {/foreach}
-        </ul>
-    </div>
+    {include file="webconfig/tab"}
+
     <div style="margin-top: 20px;">
     </div>
     <form class="layui-form" id="admin">

+ 3 - 11
app/admin/view/smsconfig/index.html

@@ -12,17 +12,9 @@
 </head>
 <body style="padding:10px;">
 <div class="tplay-body-div">
-    <div class="layui-tab">
-        <ul class="layui-tab-title">
-            <li><a href="{:url('webconfig/index')}" class="a_menu">系统设置</a></li>
-            <li><a href="{:url('emailconfig/index')}" class="a_menu">邮件配置</a></li>
-            <li class="layui-this">短信配置</li>
-            <!--config_tab-->
-            {foreach $tabs as $tab}
-            <li><a href="{:url('admin/config/index2')}?tab_id={$tab.id}">{$tab.name}</a></li>
-            {/foreach}
-        </ul>
-    </div>
+
+    {include file="webconfig/tab"}
+
     <div style="margin-top: 20px;">
     </div>
     <form class="layui-form" id="admin">

+ 2 - 60
app/admin/view/webconfig/index.html

@@ -13,23 +13,13 @@
 <body style="padding:10px;">
 <div class="tplay-body-div">
 
-    <div class="layui-tab">
-        <ul class="layui-tab-title">
-            <li class="layui-this">系统设置</li>
-            <li><a href="{:url('emailconfig/index')}" class="a_menu">邮件配置</a></li>
-            <li><a href="{:url('smsconfig/index')}" class="a_menu">短信配置</a></li>
-            <!--config_tab-->
-            {foreach $tabs as $tab}
-            <li><a href="{:url('admin/config/index2')}?tab_id={$tab.id}">{$tab.name}</a></li>
-            {/foreach}
-        </ul>
-    </div>
+    {include file="webconfig/tab"}
 
     <div style="margin-top: 20px;">
     </div>
     <form class="layui-form" id="admin">
 
-        <div class="layui-col-md6">
+        <div class="layui-col-md12">
             <div class="layui-form-item">
                 <label class="layui-form-label">系统别名</label>
                 <div class="layui-input-inline" style="max-width: 400px">
@@ -106,54 +96,6 @@
             </div>
         </div>
 
-        <div class="layui-col-md6">
-
-            <div class="layui-form-item layui-form-text">
-                <label class="layui-form-label">FTP配置</label>
-                <div class="layui-input-block" style="max-width: 600px">
-                <textarea rows="8" placeholder="生成HTML后,配置要发布的远程ftp,请输入json格式
-举例:
-{
-    &quot;host&quot;:&quot;127.0.0.1&quot;,
-    &quot;user&quot;:&quot;username&quot;,
-    &quot;pwd&quot;:&quot;password&quot;,
-    &quot;port&quot;:&quot;21&quot;,
-    &quot;webRoot&quot;:&quot;www&quot;
-}" class="layui-textarea" name="article_ftp_config">{$web_config.article_ftp_config}</textarea>
-                </div>
-            </div>
-
-
-            <div class="layui-form-item">
-                <label class="layui-form-label">模板目录</label>
-                <div class="layui-input-block" style="max-width: 600px">
-                    <input name="article_templet_path" placeholder="模板文件存放目录,默认: {$default_templet_path}" autocomplete="off"
-                           class="layui-input" type="text" value="{$web_config.article_templet_path}">
-                </div>
-            </div>
-
-            <div class="layui-form-item">
-                <label class="layui-form-label">HTML目录</label>
-                <div class="layui-input-block" style="max-width: 600px">
-                    <input name="article_static_path" placeholder="生成的HTML存放目录,默认: {$default_static_path}" autocomplete="off"
-                           class="layui-input" type="text" value="{$web_config.article_static_path}">
-                </div>
-            </div>
-
-            <div class="layui-form-item">
-                <label class="layui-form-label">备份目录</label>
-                <div class="layui-input-block" style="max-width: 600px">
-                    <input name="data_backup_path" placeholder="数据库备份文件存放目录,默认: {$default_backup_path}" autocomplete="off"
-                           class="layui-input" type="text" value="{$web_config.data_backup_path}">
-                </div>
-            </div>
-        </div>
-
-
-
-
-
-
         <div class="layui-form-item">
             <div class="layui-input-block">
                 <button class="layui-btn" lay-submit lay-filter="admin">立即提交</button>

+ 11 - 0
app/admin/view/webconfig/tab.html

@@ -0,0 +1,11 @@
+<div class="layui-tab">
+    <ul class="layui-tab-title">
+        <li {eq name="$Request.baseUrl" value=":url('admin/webconfig/index')"}class="layui-this"{/eq}><a href="{:url('admin/webconfig/index')}" class="a_menu">系统设置</a></li>
+        <li {eq name="$Request.baseUrl" value=":url('admin/emailconfig/index')"}class="layui-this"{/eq}><a href="{:url('admin/emailconfig/index')}" class="a_menu">邮件配置</a></li>
+        <li {eq name="$Request.baseUrl" value=":url('admin/smsconfig/index')"}class="layui-this"{/eq}><a href="{:url('admin/smsconfig/index')}" class="a_menu">短信配置</a></li>
+        <!--扩展配置-->
+        {foreach $tabs as $tab}
+        <li {if condition="$Request.baseUrl==url('admin/config/indexWebconfig') && $Request.param.tab_id==$tab->id"}class="layui-this"{/if}><a href="{:url('admin/config/indexWebconfig')}?tab_id={$tab.id}" class="a_menu">{$tab.name}</a></li>
+        {/foreach}
+    </ul>
+</div>

+ 6 - 3
app/api/controller/Index.php

@@ -11,6 +11,7 @@ namespace app\api\controller;
 
 use app\api\controller\base\Base;
 use app\common\model\Announcement;
+use app\common\model\ConfigOption;
 
 class Index extends Base
 {
@@ -22,12 +23,14 @@ class Index extends Base
     //首页接口
     public function site()
     {
+        $banners = (new ConfigOption())->where(['pid' => 1, 'status' => ConfigOption::STATUS_OPEN])->order('sort desc')->select();
+        $boxs = (new ConfigOption())->where(['pid' => 2, 'status' => ConfigOption::STATUS_OPEN])->order('sort desc')->select();
         $announcements = (new Announcement())->order('id desc')->limit(3)->select();
         return [
-            "banners" => [],
-            "boxs" => [],
+            "banners" => $banners,//轮播图
+            "boxs" => $boxs,//模块
 //            "contact_us" => "",
-            "announcements" => $announcements
+            "announcements" => $announcements,//公告
         ];
     }
 }

+ 38 - 12
app/common/model/Config.php

@@ -17,17 +17,14 @@ class Config extends Model
     const STATUS_OPEN = 1;//开启
     const STATUS_CLOSE = 0;//关闭
 
-    const STATUS_HIDE = 1;//隐藏的配置
-    const STATUS_SHOW = 0;//显示的配置
-
-    const TYPE_INPUT = 0;//固定值
+    const TYPE_INPUT = 0;//输入型配置
     const TYPE_SELECT = 1;//多选
     const TYPE_RADIO = 2;//单选
 
     const TYPES = [
-        self::TYPE_INPUT => '固定值',
-        self::TYPE_SELECT => '多选',
-        self::TYPE_RADIO => '单选',
+        self::TYPE_INPUT => '输入型配置',
+        self::TYPE_SELECT => '多选配置',
+        self::TYPE_RADIO => '单选配置',
     ];
 
     //value_text
@@ -36,9 +33,8 @@ class Config extends Model
         if ($this->getData('type') == self::TYPE_INPUT) {
             return $this->value;
         } elseif ($this->getData('type') == self::TYPE_SELECT) {
-            $names = (new ConfigOption())->where('pid', $this->id)->where('status', ConfigOption::STATUS_OPEN)->column('name');
-//            return implode(',', $names);
-            return "已配置了" . count($names) . "个值";
+            $count = (new ConfigOption())->where('pid', $this->id)->where('status', ConfigOption::STATUS_OPEN)->count();
+            return $count . "个" . $data['name'];
         } elseif ($this->getData('type') == self::TYPE_RADIO) {
             return (new ConfigOption())->where('pid', $this->id)->where('single_status', ConfigOption::STATUS_OPEN)->column('name');
         } else {
@@ -62,14 +58,44 @@ class Config extends Model
         }
     }
 
-    //json配置
+    //image_open
+    public function getImageOpenAttr($value, $data)
+    {
+        return $value == 1 ? true : false;
+    }
+
+    //image_label
+    public function getImageLabelAttr($value, $data)
+    {
+        return $value ?: '配图';
+    }
+
+    //name_label
+    public function getNameLabelAttr($value, $data)
+    {
+        return $value ?: '名称';
+    }
+
+    //value_label
+    public function getValueLabelAttr($value, $data)
+    {
+        return $value ?: '配置值';
+    }
+
+    //desc_label
+    public function getDescLabelAttr($value, $data)
+    {
+        return $value ?: '备注';
+    }
+
+    //如果remark是json格式,用此方法获取对象
     public function getJsonConfig()
     {
         $config = json_decode($this->remark, true);
         return is_array($config) ? $config : [];
     }
 
-    //关联分组标签
+    //关联标签
     public function tab()
     {
         return $this->belongsTo('ConfigTab', 'tab_id');

+ 0 - 3
app/common/model/ConfigOption.php

@@ -17,9 +17,6 @@ class ConfigOption extends Model
     const STATUS_OPEN = 1;//开启
     const STATUS_CLOSE = 0;//关闭
 
-    const STATUS_HIDE = 1;//隐藏的配置
-    const STATUS_SHOW = 0;//显示的配置
-
     //关联配置
     public function config()
     {

+ 3 - 0
app/common/model/ConfigTab.php

@@ -14,6 +14,9 @@ class ConfigTab extends Model
 {
     protected $autoWriteTimestamp = false;
 
+    const STATUS_OPEN = 1;//开启
+    const STATUS_CLOSE = 0;//关闭
+
     //关联配置
     public function configs()
     {

+ 3 - 2
app/common/model/Templet.php

@@ -9,6 +9,7 @@
 namespace app\common\model;
 
 use file\FileHelper;
+use think\Env;
 
 class Templet
 {
@@ -61,7 +62,7 @@ class Templet
      */
     public static function getRootDir()
     {
-        $path = Webconfig::getValue('article_static_path');
+        $path = Env::get('article_static_path', '');
         return empty($path) ? self::DEFAULT_STATIC_PATH : appendEndDS($path);
     }
 
@@ -71,7 +72,7 @@ class Templet
      */
     public static function getTempletDir()
     {
-        $path = Webconfig::getValue('article_templet_path');
+        $path = Env::get('article_templet_path', '');
         return empty($path) ? self::DEFAULT_TEMPLET_PATH : appendEndDS($path);
     }
 

+ 0 - 8
app/common/model/Webconfig.php

@@ -37,12 +37,4 @@ class Webconfig extends Model
         }
         return $value;
     }
-
-    //ftp配置
-    public static function getFtpConfig()
-    {
-        $replace = self::getValue('article_ftp_config');
-        $replace = json_decode($replace, true);
-        return is_array($replace) ? $replace : [];
-    }
 }

+ 0 - 1
app/helper_str.php

@@ -54,7 +54,6 @@ function isUrl($str)
         return false;
     }
 }
-
 // +----------------------------------------------------------------------
 // 字符串截取
 // +----------------------------------------------------------------------