Browse Source

feat:
- 更新sql
- 公告管理
- 首页接口
- 预约记录管理
- 专家管理

zhengzhibin 2 years ago
parent
commit
4e26ae2bdb

+ 0 - 29
README.md

@@ -1,22 +1,4 @@
 
-![预览](https://images.gitee.com/uploads/images/2020/1209/110523_b9207c4c_396298.jpeg "tplaylogin.jpg")
-![预览](https://images.gitee.com/uploads/images/2020/1209/110503_e5481600_396298.jpeg "tplayindex.jpg")
-![预览](https://images.gitee.com/uploads/images/2020/1209/110535_c00e2385_396298.jpeg "tplaymenu.jpg")
-
-## 简介
- 
-Tplay是一款基于TP5 + layui + Mysql开发的后台管理框架,致力于快速建站。
-
-集成了一般应用所必须的基础性功能,为开发者减少重复性的工作,提升开发速度,规范团队开发模式。
-
-本人基于Tplay 1.3.4二次开发,修复了许多bug,添加了许多功能,让开发更有效率。
-
-
-
-## 安装使用
-
-### [查看在线文档](https://gitee.com/pps/tplay/wikis/pages?sort_id=4562118&doc_id=480370)
-> 离线文档已加入到源码中,文档目录 tplay/app/install/doc/
 
 ## 版本信息
 
@@ -28,14 +10,3 @@ mysql适用版本:5.5 ~ 5.7
 
 基于thinkphp-5.0.24
 
-## 版权信息
-
-遵循Apache2开源协议发布,并提供免费使用。
-
-本项目包含的第三方源码和二进制文件之版权信息另行标注。
-
-版权所有Copyright © 2017 by Tplay
-
-All rights reserved
-
-

+ 118 - 0
app/admin/controller/Announcement.php

@@ -0,0 +1,118 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\controller\base\Permissions;
+use think\Db;
+
+class Announcement extends Permissions
+{
+    private function getModel()
+    {
+        return new \app\common\model\Announcement();
+    }
+
+    public function index()
+    {
+        if ($this->request->isAjax()) {
+            $post = $this->request->param();
+            $where = [];
+            if (isset($post['ids']) and !empty($post['ids'])) {
+                $where['id'] = ['in', $post['ids']];
+            }
+            if (!empty($post["title"])) {
+                $where["title"] = ['like', '%' . $post["title"] . '%'];
+            }
+            if (isset($post["admin_id"]) and "" != $post["admin_id"]) {
+                $where["admin_id"] = $post["admin_id"];
+            }
+            if (isset($post["create_time"]) and !empty($post["create_time"])) {
+                $timerang = explode(' - ', $post["create_time"]);
+                $min_time = strtotime($timerang[0]);
+                $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime($timerang[1]??'');
+                $where["create_time"] = [['>=', $min_time], ['<=', $max_time]];
+            }
+
+            $model = $this->getModel();
+            $count = $model->where($where)->count();
+            $data = $model->where($where)->page($post['page']??0, $post['limit']??15)->order('id desc')->select();
+
+            return array('code' => 0, 'count' => $count, 'data' => $data);
+        } else {
+            return $this->fetch();
+        }
+    }
+
+
+    public function publish()
+    {
+        $id = $this->request->param('id', 0, 'intval');
+        $model = $this->getModel();
+        $post = $this->request->post();
+        if ($this->request->isPost()) {
+
+
+            //验证
+            $validate = new \think\Validate([
+                ['title|标题', 'max:50'],
+                ['content|内容', 'max:5000'],
+            ]);
+            if (!$validate->check($post)) {
+                $this->error('提交失败:' . $validate->getError());
+            }
+        }
+
+        if ($id > 0) {
+            //修改
+            $data = $model->where('id', $id)->find();
+            if (empty($data)) {
+                $this->error('id不正确');
+            }
+            if ($this->request->isPost()) {
+                if (false == $model->allowField(true)->save($post, ['id' => $id])) {
+                    $this->error('修改失败');
+                } else {
+                    $this->success('修改成功');
+                }
+            } else {
+                $this->assign('data', $data);
+                return $this->fetch();
+            }
+        } else {
+            //新增
+            if ($this->request->isPost()) {
+                if (false == $model->allowField(true)->save($post)) {
+                    $this->error('添加失败');
+                } else {
+                    $this->success('添加成功', 'index');
+                }
+            } else {
+                return $this->fetch();
+            }
+        }
+    }
+
+    public function delete()
+    {
+        if ($this->request->isAjax()) {
+            $id = $this->request->param('id', 0, 'intval');
+            if (false == $this->getModel()->where('id', $id)->delete()) {
+                $this->error('删除失败');
+            } else {
+                $this->success('删除成功', 'index');
+            }
+        }
+    }
+
+    public function deletes()
+    {
+        if ($this->request->isAjax()) {
+            $post = $this->request->param();
+            $ids = $post['ids'];
+            if ($this->getModel()->where('id', 'in', $ids)->delete()) {
+                $this->success('删除成功');
+            }
+        }
+    }
+
+}

+ 169 - 0
app/admin/controller/AppointmentApplication.php

@@ -0,0 +1,169 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\controller\base\Permissions;
+use think\Db;
+
+class AppointmentApplication extends Permissions
+{
+    private function getModel()
+    {
+        return new \app\common\model\AppointmentApplication();
+    }
+
+    public function index()
+    {
+        if ($this->request->isAjax()) {
+            $post = $this->request->param();
+            $where = [];
+                                if (isset($post['ids']) and !empty($post['ids'])) {
+                        $where['id'] = ['in', $post['ids']];
+                    }
+                                        if (!empty($post["name"])) {
+                        $where["name"] = ['like', '%' . $post["name"] . '%'];
+                    }
+                                        if (isset($post["user_id"]) and ""!=$post["user_id"]) {
+                        $where["user_id"] = $post["user_id"];
+                    }
+                                        if (!empty($post["phone"])) {
+                        $where["phone"] = ['like', '%' . $post["phone"] . '%'];
+                    }
+                                        if (isset($post["age"]) and ""!=$post["age"]) {
+                        $where["age"] = $post["age"];
+                    }
+                                        if (isset($post["childs_num"]) and ""!=$post["childs_num"]) {
+                        $where["childs_num"] = $post["childs_num"];
+                    }
+                                        if (!empty($post["desc"])) {
+                        $where["desc"] = ['like', '%' . $post["desc"] . '%'];
+                    }
+                                        if (isset($post["appointment_id"]) and ""!=$post["appointment_id"]) {
+                        $where["appointment_id"] = $post["appointment_id"];
+                    }
+                                        if (isset($post["time_period"]) and !empty($post["time_period"])) {
+                        $timerang = explode(' - ', $post["time_period"]);
+                        $min_time = strtotime($timerang[0]);
+                        $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime($timerang[1]??'');
+                        $where["time_period"] = [['>=', $min_time], ['<=', $max_time]];
+                    }
+                                        if (isset($post["appointment_num"]) and ""!=$post["appointment_num"]) {
+                        $where["appointment_num"] = $post["appointment_num"];
+                    }
+                                        if (isset($post["status"]) and ""!=$post["status"]) {
+                        $where["status"] = $post["status"];
+                    }
+                                        if (!empty($post["remark"])) {
+                        $where["remark"] = ['like', '%' . $post["remark"] . '%'];
+                    }
+                                        if (isset($post["create_time"]) and !empty($post["create_time"])) {
+                        $timerang = explode(' - ', $post["create_time"]);
+                        $min_time = strtotime($timerang[0]);
+                        $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime($timerang[1]??'');
+                        $where["create_time"] = [['>=', $min_time], ['<=', $max_time]];
+                    }
+                                        if (isset($post["finish_time"]) and !empty($post["finish_time"])) {
+                        $timerang = explode(' - ', $post["finish_time"]);
+                        $min_time = strtotime($timerang[0]);
+                        $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime($timerang[1]??'');
+                        $where["finish_time"] = [['>=', $min_time], ['<=', $max_time]];
+                    }
+                    
+            $model = $this->getModel();
+            $count = $model->where($where)->count();
+            $data = $model->where($where)->page($post['page']??0, $post['limit']??15)->order('id desc')->select();
+
+                        return array('code' => 0, 'count' => $count, 'data' => $data);
+        } else {
+            return $this->fetch();
+        }
+    }
+
+
+    public function publish()
+    {
+        $id = $this->request->param('id', 0, 'intval');
+        $model = $this->getModel();
+        $post = $this->request->post();
+        if ($this->request->isPost()) {
+
+                                if (isset($post['time_period']) && !empty($post['time_period'])) {
+                        $post['time_period'] = strtotime($post['time_period']);
+                    }
+                                    if (isset($post['finish_time']) && !empty($post['finish_time'])) {
+                        $post['finish_time'] = strtotime($post['finish_time']);
+                    }
+                
+            //验证
+            $validate = new \think\Validate([
+                                    ['name|姓名', 'require|max:50'],
+                                        ['user_id', 'require|number'],
+                                        ['phone|电话', 'require|max:50'],
+                                        ['age|年龄', 'number'],
+                                        ['childs_num|子女数量', 'number'],
+                                        ['desc|问题描述', 'require|max:200'],
+                                        ['appointment_id|预约放号ID', 'require|number'],
+                                        ['time_period|1上午2下午3晚上', 'require|number'],
+                                        ['appointment_num|预约号码', 'require|number'],
+                                        ['status|订单状态', 'number'],
+                                        ['remark|备注', 'max:200'],
+                                        ['finish_time|完成时间', 'number'],
+                                ]);
+            if (!$validate->check($post)) {
+                $this->error('提交失败:' . $validate->getError());
+            }
+        }
+
+        if ($id > 0) {
+                            //修改
+                $data = $model->where('id', $id)->find();
+                if (empty($data)) {
+                    $this->error('id不正确');
+                }
+                if ($this->request->isPost()) {
+                    if (false == $model->allowField(true)->save($post, ['id' => $id])) {
+                        $this->error('修改失败');
+                    } else {
+                        $this->success('修改成功');
+                    }
+                } else {
+                    $this->assign('data', $data);
+                    return $this->fetch();
+                }
+                    } else {
+                            //新增
+                if ($this->request->isPost()) {
+                    if (false == $model->allowField(true)->save($post)) {
+                        $this->error('添加失败');
+                    } else {
+                        $this->success('添加成功', 'index');
+                    }
+                } else {
+                    return $this->fetch();
+                }
+                    }
+    }
+    public function delete()
+    {
+        if ($this->request->isAjax()) {
+            $id = $this->request->param('id', 0, 'intval');
+            if (false == $this->getModel()->where('id', $id)->delete()) {
+                $this->error('删除失败');
+            } else {
+                $this->success('删除成功', 'index');
+            }
+        }
+    }
+
+    public function deletes()
+    {
+        if ($this->request->isAjax()) {
+            $post = $this->request->param();
+            $ids = $post['ids'];
+            if ($this->getModel()->where('id', 'in', $ids)->delete()) {
+                $this->success('删除成功');
+            }
+        }
+    }
+
+}

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

@@ -106,7 +106,7 @@ class Attachment extends Permissions
         if ($this->request->isAjax()) {
             $id = $this->request->param('id', 0, 'intval');
             $attachment = Db::name('attachment')->where('id', $id)->value('filepath');
-            if (file_exists(ROOT_PATH . 'public' . $attachment)) {
+            if (!isUrl($attachment) && file_exists(ROOT_PATH . 'public' . $attachment)) {
                 //删除本地文件
                 if (unlink(ROOT_PATH . 'public' . $attachment)) {
                     if (false == Db::name('attachment')->where('id', $id)->delete()) {
@@ -137,7 +137,7 @@ class Attachment extends Permissions
             $ids = $post['ids'];
             $attachments = (new model())->where('id', 'in', $ids)->select();
             foreach ($attachments as $attachment) {
-                if (file_exists(ROOT_PATH . 'public' . $attachment->filepath)) {
+                if (!isUrl($attachment->filepath) && file_exists(ROOT_PATH . 'public' . $attachment->filepath)) {
                     //删除本地文件
                     if (unlink(ROOT_PATH . 'public' . $attachment->filepath)) {
                         if (false == Db::name('attachment')->where('id', $attachment->id)->delete()) {

+ 127 - 0
app/admin/controller/Specialist.php

@@ -0,0 +1,127 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\controller\base\Permissions;
+use think\Db;
+
+class Specialist extends Permissions
+{
+    private function getModel()
+    {
+        return new \app\common\model\Specialist();
+    }
+
+    public function index()
+    {
+        if ($this->request->isAjax()) {
+            $post = $this->request->param();
+            $where = [];
+                                if (isset($post['ids']) and !empty($post['ids'])) {
+                        $where['id'] = ['in', $post['ids']];
+                    }
+                                        if (!empty($post["name"])) {
+                        $where["name"] = ['like', '%' . $post["name"] . '%'];
+                    }
+                                        if (!empty($post["head_pic"])) {
+                        $where["head_pic"] = ['like', '%' . $post["head_pic"] . '%'];
+                    }
+                                        if (isset($post["sex"]) and ""!=$post["sex"]) {
+                        $where["sex"] = $post["sex"];
+                    }
+                                        if (!empty($post["desc"])) {
+                        $where["desc"] = ['like', '%' . $post["desc"] . '%'];
+                    }
+                                        if (!empty($post["consultation_direction"])) {
+                        $where["consultation_direction"] = ['like', '%' . $post["consultation_direction"] . '%'];
+                    }
+                                        if (isset($post["address_id"]) and ""!=$post["address_id"]) {
+                        $where["address_id"] = $post["address_id"];
+                    }
+                    
+            $model = $this->getModel();
+            $count = $model->where($where)->count();
+            $data = $model->where($where)->page($post['page']??0, $post['limit']??15)->order('id desc')->select();
+
+                        return array('code' => 0, 'count' => $count, 'data' => $data);
+        } else {
+            return $this->fetch();
+        }
+    }
+
+
+    public function publish()
+    {
+        $id = $this->request->param('id', 0, 'intval');
+        $model = $this->getModel();
+        $post = $this->request->post();
+        if ($this->request->isPost()) {
+
+            
+            //验证
+            $validate = new \think\Validate([
+                                    ['name|名字', 'max:50'],
+                                        ['head_pic|头像', 'max:255'],
+                                        ['sex|性别', 'number'],
+                                        ['desc|简介', 'max:500'],
+                                        ['consultation_direction|咨询方向', 'max:500'],
+                                        ['address_id|地址', 'require|number'],
+                                ]);
+            if (!$validate->check($post)) {
+                $this->error('提交失败:' . $validate->getError());
+            }
+        }
+
+        if ($id > 0) {
+                            //修改
+                $data = $model->where('id', $id)->find();
+                if (empty($data)) {
+                    $this->error('id不正确');
+                }
+                if ($this->request->isPost()) {
+                    if (false == $model->allowField(true)->save($post, ['id' => $id])) {
+                        $this->error('修改失败');
+                    } else {
+                        $this->success('修改成功');
+                    }
+                } else {
+                    $this->assign('data', $data);
+                    return $this->fetch();
+                }
+                    } else {
+                            //新增
+                if ($this->request->isPost()) {
+                    if (false == $model->allowField(true)->save($post)) {
+                        $this->error('添加失败');
+                    } else {
+                        $this->success('添加成功', 'index');
+                    }
+                } else {
+                    return $this->fetch();
+                }
+                    }
+    }
+    public function delete()
+    {
+        if ($this->request->isAjax()) {
+            $id = $this->request->param('id', 0, 'intval');
+            if (false == $this->getModel()->where('id', $id)->delete()) {
+                $this->error('删除失败');
+            } else {
+                $this->success('删除成功', 'index');
+            }
+        }
+    }
+
+    public function deletes()
+    {
+        if ($this->request->isAjax()) {
+            $post = $this->request->param();
+            $ids = $post['ids'];
+            if ($this->getModel()->where('id', 'in', $ids)->delete()) {
+                $this->success('删除成功');
+            }
+        }
+    }
+
+}

+ 199 - 0
app/admin/view/announcement/index.html

@@ -0,0 +1,199 @@
+<!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="/static/public/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="/static/public/font-awesome/css/font-awesome.min.css" media="all"/>
+    <link rel="stylesheet" href="/static/admin/css/admin.css" media="all">
+    <style type="text/css">
+        /* tooltip */
+        #tooltip {
+            position: absolute;
+            border: 1px solid #ccc;
+            background: #333;
+            padding: 2px;
+            display: none;
+            color: #fff;
+        }
+
+        .tooltip > img {
+            width: 20px;
+            height: 20px;
+        }
+    </style>
+</head>
+<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-danger layui-btn-sm" lay-event="deletes">批量删除</button>
+        </div>
+    </script>
+
+    <form class="layui-form serch" action="index" method="post">
+        <div class="layui-form-item" style="float: left;">
+
+            <div class="layui-input-inline">
+                <input type="text" name="ids" autocomplete="off" placeholder="请输入ID,多个id逗号分隔"
+                       class="layui-input layui-btn-sm">
+            </div>
+            <div class="layui-input-inline">
+                <input type="text" name="title" autocomplete="off" placeholder="标题(模糊搜索)"
+                       class="layui-input layui-btn-sm">
+            </div>
+            <div class="layui-input-inline" style="width:100px">
+                <input type="number" name="admin_id" autocomplete="off" placeholder="发布人"
+                       class="layui-input layui-btn-sm">
+            </div>
+            <div class="layui-input-inline">
+                <input type="text" class="layui-input time_range" id="time_range_create_time" autocomplete="off"
+                       placeholder="日期" name="create_time">
+            </div>
+            <button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="serch">立即提交</button>
+        </div>
+    </form>
+
+    <script type="text/html" id="barDemo">
+        <div class="layui-btn-group">
+            <button class="layui-btn layui-btn-xs a_menu" lay-event="edit"><i class="layui-icon"
+                                                                              style="margin-right: 0;"></i></button>
+            <button class="layui-btn layui-btn-xs delete" lay-event="del"><i class="layui-icon"
+                                                                             style="margin-right: 0;"></i></button>
+        </div>
+    </script>
+
+    <table class="layui-table" id="table" lay-filter="table"></table>
+    {include file="public/foot"}
+
+    <script type="text/javascript">
+        layui.use(['table', 'layer', 'form', 'laydate'], function () {
+            var table = layui.table,
+                form = layui.form,
+                layer = layui.layer;
+            var laydate = layui.laydate;
+            //第一个实例
+            table.render({
+                id: 'table'
+                , elem: '#table'
+                , size: 'sm' //小尺寸的表格
+                , toolbar: '#toolbarDemo'
+                , limit: 15
+                , limits: [15, 20, 30, 40, 50, 100]
+                , url: "{:url('index')}" //数据接口
+                , page: true //开启分页
+                , cols: [[ //表头
+                    {type: 'checkbox'},
+
+                    {field: 'id', title: 'ID', width: 60},
+                    {field: "title", title: '标题'},
+                    {field: "admin_id", title: '发布人'},
+                    {field: "create_time", title: '日期'},
+                    {field: 'action', title: '操作', toolbar: '#barDemo', fixed: 'right'}
+                ]],
+                done: function () {
+                    if (isExitsFunction('showThumb')) {
+                        showThumb()
+                    }
+                }
+            });
+
+            laydate.render({
+                elem: '#time_range_create_time'
+                , type: 'datetime'
+                , range: true
+                , max: 0 //最大值0天后
+                , theme: 'molv'
+                , calendar: true
+                , done: function (value, date, endDate) {
+                    if (endDate.hours == 0 && endDate.minutes == 0 && endDate.seconds == 0) {
+                        setTimeout(function () {
+                            $('#time_range_create_time').val(value.replace(/00:00:00$/, '23:59:59'))
+                        }, 100)
+                    }
+                }
+            });
+
+            form.on('submit(serch)', function (data) {
+                table.reload('table', {
+                    where: data.field
+                    , page: {
+                        curr: 1 //重新从第 1 页开始
+                    }
+                });
+                return false;
+            });
+
+            table.on('tool(table)', function (obj) {
+                if (obj.event == 'edit') {
+                    window.parent.tab.tabAdd({
+                        icon: "fa-bookmark",
+                        id: "tplay_announcement" + obj.data.id,
+                        title: obj.data.title == null ? "公告表" + obj.data.id : obj.data.title,
+                        url: "/admin/announcement/publish?id=" + obj.data.id
+                    });
+                }
+                else if (obj.event == 'del') {
+                    layer.confirm('确定要删除?', function (index) {
+                        $.ajax({
+                            url: "{:url('delete')}",
+                            dataType: 'json',
+                            data: {id: obj.data.id},
+                            success: function (res) {
+                                layer.msg(res.msg);
+                                if (res.code == 1) {
+                                    table.reload('table');
+                                }
+                            }
+                        })
+                    })
+                }
+            });
+            //监听事件
+            table.on('toolbar(table)', function (obj) {
+                if (obj.event == 'deletes') {
+                    var checkStatus = table.checkStatus(obj.config.id);//获取选中的数据
+                    var data = checkStatus.data;
+                    if (data.length > 0) {
+                        var ids = [];//数组
+                        data.forEach(function (item, key) {
+                            ids[key] = item.id;
+                        })
+                        layer.confirm('是否删除?', function (index, layero) {
+                            $.ajax({
+                                url: "{:url('deletes')}",
+                                dataType: 'json',
+                                data: {"ids": ids},
+                                type: 'post',
+                                success: function (res) {
+                                    layer.msg(res.msg);
+                                    if (res.code == 1) {
+                                        table.reload('table');
+                                    }
+                                }
+                            })
+                            layer.close(index)
+                        });
+                    } else {
+                        layer.msg('请先勾选需要操作的记录');
+                    }
+                }
+            });
+        });
+    </script>
+
+
+</div>
+</body>
+</html>

+ 118 - 0
app/admin/view/announcement/publish.html

@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>公告表编辑</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="/static/public/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="/static/public/font-awesome/css/font-awesome.min.css" media="all"/>
+    <link rel="stylesheet" href="/static/admin/css/admin.css" media="all">
+    <script src="/static/public/layui/layui.js"></script>
+    <script src="/static/public/jquery/jquery.min.js"></script>
+</head>
+<style>
+    .layui-upload-img {
+        cursor: pointer;
+        width: 150px;
+        height: 150px;
+        background: url('/static/public/images/uploadimg.jpg');
+        background-size: contain;
+        border-radius: 2px;
+        border-width: 1px;
+        border-style: solid;
+        border-color: #e6e6e6;
+    }
+</style>
+<body style="padding:10px;">
+<div class="tplay-body-div">
+
+    {empty name="$data"}
+    <div class="layui-tab">
+        <ul class="layui-tab-title">
+            <li><a href="index" class="a_menu">列表</a></li>
+            <li class="layui-this">新增</li>
+        </ul>
+    </div>
+    {/empty}
+
+    <div style="margin-top: 20px;"></div>
+    <form class="layui-form" id="publish" method="post">
+
+        <!-- 输入框 -->
+        <div class="layui-form-item">
+            <label class="layui-form-label">标题</label>
+            <div class="layui-input-inline" style="max-width:300px;">
+                <input name="title" autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty
+                       name="$data" }value="{$data.title}" {/notempty}>
+            </div>
+        </div>
+        <!-- 文章富文本 -->
+
+        {php}$web_config = \think\Db::name('webconfig')->where('id', 1)->find();{/php}
+        {switch name="$web_config.article_editor" }
+        {case value="ueditor"} {include file="article/publish_ueditor" item="data" field="content"}{/case}
+        {case value="tinymce"} {include file="article/publish_tinymce" item="data" field="content"}{/case}
+        {case value="markdown"} {include file="article/publish_markdown" item="data" field="content"}{/case}
+        {default /} {include file="article/publish_wangEditor" item="data" field="content"}
+        {/switch}
+
+
+        {notempty name="$data"}
+        <input type="hidden" name="id" value="{$data.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>
+
+    <script>
+        layui.use(['layer', 'form', 'laydate'], function () {
+            var layer = layui.layer,
+                $ = layui.jquery,
+                form = layui.form;
+            var laydate = layui.laydate;
+
+            $(window).on('load', function () {
+                form.on('submit(admin)', function (data) {
+                    $.ajax({
+                        url: "{:url('publish')}",
+                        data: $('#publish').serialize(),
+                        type: 'post',
+                        dataType: 'json',
+                        async: false,
+                        success: function (res) {
+                            if (res.code == 1) {
+                                if (res.msg == "添加成功") {
+                                    layer.alert(res.msg, function (index) {
+                                        location.href = res.url;
+                                    })
+                                } else {
+                                    layer.confirm(res.msg, {
+                                        btn: ['关闭', '继续编辑']
+                                    }, function (index) {
+                                        window.parent.tab.close('tplay_announcement{$data.id|default=0}');
+                                    }, function (index, layero) {
+                                        location.href = res.url;
+                                    });
+                                }
+                            } else {
+                                layer.msg(res.msg);
+                            }
+                        }
+                    })
+                    return false;
+                });
+
+
+            });
+        });
+    </script>
+</div>
+</body>
+</html>

+ 249 - 0
app/admin/view/appointment_application/index.html

@@ -0,0 +1,249 @@
+<!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="/static/public/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="/static/public/font-awesome/css/font-awesome.min.css" media="all"/>
+    <link rel="stylesheet" href="/static/admin/css/admin.css" media="all">
+    <style type="text/css">
+        /* tooltip */
+        #tooltip {
+            position: absolute;
+            border: 1px solid #ccc;
+            background: #333;
+            padding: 2px;
+            display: none;
+            color: #fff;
+        }
+        .tooltip > img{
+            width: 20px;
+            height: 20px;
+        }
+    </style>
+</head>
+<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-danger layui-btn-sm" lay-event="deletes">批量删除</button>
+                    </div>
+    </script>
+
+    <form class="layui-form serch" action="index" method="post">
+        <div class="layui-form-item" style="float: left;">
+
+            <div class="layui-input-inline">
+                                <input type="text" name="ids" autocomplete="off" placeholder="请输入ID,多个id逗号分隔" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                            <input type="text" name="name" autocomplete="off" placeholder="姓名(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="user_id" autocomplete="off" placeholder="user_id" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                            <input type="text" name="phone" autocomplete="off" placeholder="电话(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="age" autocomplete="off" placeholder="年龄" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="childs_num" autocomplete="off" placeholder="子女数量" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                            <input type="text" name="desc" autocomplete="off" placeholder="问题描述(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="appointment_id" autocomplete="off" placeholder="预约放号ID" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                                <input type="text" class="layui-input time_range" id="time_range_time_period" autocomplete="off" placeholder="1上午2下午3晚上" name="time_period">
+                            </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="appointment_num" autocomplete="off" placeholder="预约号码" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="status" autocomplete="off" placeholder="订单状态" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                            <input type="text" name="remark" autocomplete="off" placeholder="备注(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline">
+                                <input type="text" class="layui-input time_range" id="time_range_create_time" autocomplete="off" placeholder="下单时间" name="create_time">
+                            </div><div class="layui-input-inline">
+                                <input type="text" class="layui-input time_range" id="time_range_finish_time" autocomplete="off" placeholder="完成时间" name="finish_time">
+                            </div>
+            <button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="serch">立即提交</button>
+        </div>
+    </form>
+
+        <script type="text/html" id="barDemo">
+        <div class="layui-btn-group">
+                        <button class="layui-btn layui-btn-xs a_menu" lay-event="edit"><i class="layui-icon" style="margin-right: 0;"></i></button>
+                        <button class="layui-btn layui-btn-xs delete" lay-event="del"><i class="layui-icon" style="margin-right: 0;"></i></button>
+                    </div>
+    </script>
+    
+    <table class="layui-table" id="table" lay-filter="table"></table>
+    {include file="public/foot"}
+
+    <script type="text/javascript">
+        layui.use(['table', 'layer', 'form','laydate'], function () {
+            var table = layui.table,
+                form = layui.form,
+                layer = layui.layer;
+            var laydate = layui.laydate;
+            //第一个实例
+            table.render({
+                id: 'table'
+                , elem: '#table'
+                , size: 'sm' //小尺寸的表格
+                                , toolbar: '#toolbarDemo'
+                                , limit: 15
+                , limits: [15, 20, 30, 40, 50, 100]
+                , url: "{:url('index')}" //数据接口
+                , page: true //开启分页
+                , cols: [[ //表头
+                    {type: 'checkbox'},
+
+                                                {field: 'id', title: 'ID', width: 60},
+                                                        {field: "name", title: '姓名'},
+                                                        {field: "user_id", title: 'user_id'},
+                                                        {field: "phone", title: '电话'},
+                                                        {field: "age", title: '年龄'},
+                                                        {field: "childs_num", title: '子女数量'},
+                                                        {field: "desc", title: '问题描述'},
+                                                        {field: "appointment_id", title: '预约放号ID'},
+                                                        {field: "time_period", title: '1上午2下午3晚上'},
+                                                        {field: "appointment_num", title: '预约号码'},
+                                                        {field: "status", title: '订单状态'},
+                                                        {field: "remark", title: '备注'},
+                                                        {field: "create_time", title: '下单时间'},
+                                                        {field: "finish_time", title: '完成时间'},
+                                                    {field: 'action', title: '操作', toolbar: '#barDemo', fixed: 'right'}
+                                    ]],
+                done: function () {
+                    if (isExitsFunction('showThumb')) {
+                        showThumb()
+                    }
+                                    }
+            });
+
+                                laydate.render({
+                        elem: '#time_range_time_period'
+                        , type: 'datetime'
+                        , range: true
+                        , max: 0 //最大值0天后
+                        , theme: 'molv'
+                        , calendar: true
+                        , done: function (value, date, endDate) {
+                            if (endDate.hours == 0 && endDate.minutes == 0 && endDate.seconds == 0) {
+                                setTimeout(function () {
+                                    $('#time_range_time_period').val(value.replace(/00:00:00$/, '23:59:59'))
+                                }, 100)
+                            }
+                        }
+                    });
+                                    laydate.render({
+                        elem: '#time_range_create_time'
+                        , type: 'datetime'
+                        , range: true
+                        , max: 0 //最大值0天后
+                        , theme: 'molv'
+                        , calendar: true
+                        , done: function (value, date, endDate) {
+                            if (endDate.hours == 0 && endDate.minutes == 0 && endDate.seconds == 0) {
+                                setTimeout(function () {
+                                    $('#time_range_create_time').val(value.replace(/00:00:00$/, '23:59:59'))
+                                }, 100)
+                            }
+                        }
+                    });
+                                    laydate.render({
+                        elem: '#time_range_finish_time'
+                        , type: 'datetime'
+                        , range: true
+                        , max: 0 //最大值0天后
+                        , theme: 'molv'
+                        , calendar: true
+                        , done: function (value, date, endDate) {
+                            if (endDate.hours == 0 && endDate.minutes == 0 && endDate.seconds == 0) {
+                                setTimeout(function () {
+                                    $('#time_range_finish_time').val(value.replace(/00:00:00$/, '23:59:59'))
+                                }, 100)
+                            }
+                        }
+                    });
+                
+            form.on('submit(serch)', function (data) {
+                table.reload('table', {
+                    where: data.field
+                    , page: {
+                        curr: 1 //重新从第 1 页开始
+                    }
+                });
+                return false;
+            });
+
+                        table.on('tool(table)', function (obj) {
+                if (obj.event == 'edit') {
+                                     window.parent.tab.tabAdd({
+                        icon: "fa-bookmark",
+                        id: "tplay_appointment_application" + obj.data.id,
+                        title: obj.data.title == null ? "预约记录" + obj.data.id : obj.data.title,
+                        url: "/admin/appointment_application/publish?id=" + obj.data.id
+                    });
+                                  }
+                                else if (obj.event == 'del') {
+                    layer.confirm('确定要删除?', function (index) {
+                        $.ajax({
+                            url: "{:url('delete')}",
+                            dataType: 'json',
+                            data: {id: obj.data.id},
+                            success: function (res) {
+                                layer.msg(res.msg);
+                                if (res.code == 1) {
+                                    table.reload('table');
+                                }
+                            }
+                        })
+                    })
+                }
+                            });
+                        //监听事件
+            table.on('toolbar(table)', function (obj) {
+                if (obj.event == 'deletes') {
+                    var checkStatus = table.checkStatus(obj.config.id);//获取选中的数据
+                    var data = checkStatus.data;
+                    if (data.length > 0) {
+                        var ids = [];//数组
+                        data.forEach(function (item, key) {
+                            ids[key] = item.id;
+                        })
+                        layer.confirm('是否删除?', function (index, layero) {
+                            $.ajax({
+                                url: "{:url('deletes')}",
+                                dataType: 'json',
+                                data: {"ids": ids},
+                                type: 'post',
+                                success: function (res) {
+                                    layer.msg(res.msg);
+                                    if (res.code == 1) {
+                                        table.reload('table');
+                                    }
+                                }
+                            })
+                            layer.close(index)
+                        });
+                    } else {
+                        layer.msg('请先勾选需要操作的记录');
+                    }
+                }
+            });
+                    });
+    </script>
+
+    
+</div>
+</body>
+</html>

+ 201 - 0
app/admin/view/appointment_application/publish.html

@@ -0,0 +1,201 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>预约记录编辑</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="/static/public/layui/css/layui.css"  media="all">
+    <link rel="stylesheet" href="/static/public/font-awesome/css/font-awesome.min.css" media="all" />
+    <link rel="stylesheet" href="/static/admin/css/admin.css"  media="all">
+    <script src="/static/public/layui/layui.js"></script>
+    <script src="/static/public/jquery/jquery.min.js"></script>
+</head>
+<style>
+  .layui-upload-img{
+    cursor: pointer;
+    width:150px;
+    height:150px;
+    background: url('/static/public/images/uploadimg.jpg');
+    background-size:contain;
+    border-radius: 2px;
+    border-width: 1px;
+    border-style: solid;
+    border-color: #e6e6e6;
+  }
+</style>
+<body style="padding:10px;">
+  <div class="tplay-body-div">
+
+    {empty name="$data"}
+    <div class="layui-tab">
+      <ul class="layui-tab-title">
+        <li><a href="index" class="a_menu">列表</a></li>
+        <li class="layui-this">新增</li>
+      </ul>
+    </div>
+    {/empty}
+
+    <div style="margin-top: 20px;"></div>
+    <form class="layui-form" id="publish" method="post">
+
+                      <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">姓名</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="name" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.name}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">user_id</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="user_id" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.user_id}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+                          <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">电话</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="phone" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.phone}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">年龄</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="age"  autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.age}"{/notempty}>
+                </div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">子女数量</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="childs_num"  autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.childs_num}"{/notempty}>
+                </div>
+                                </div>
+                          <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">问题描述</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="desc" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.desc}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">预约放号ID</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="appointment_id" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.appointment_id}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+                            <!-- 时间 -->
+                <div class="layui-form-item">
+                    <label class="layui-form-label">1上午2下午3晚上</label>
+                    <div class="layui-input-inline" style="max-width:300px;">
+                        <input name="time_period" id="time_period" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.time_period}"{/notempty}>
+                    </div>
+                                            <div class="layui-form-mid layui-word-aux">必填</div>
+                                    </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">预约号码</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="appointment_num" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.appointment_num}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">订单状态</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="status"  autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.status}"{/notempty}>
+                </div>
+                                </div>
+                          <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">备注</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="remark"  autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.remark}"{/notempty}>
+                </div>
+                                </div>
+                            <!-- 时间 -->
+                <div class="layui-form-item">
+                    <label class="layui-form-label">完成时间</label>
+                    <div class="layui-input-inline" style="max-width:300px;">
+                        <input name="finish_time" id="finish_time"  autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.finish_time}"{/notempty}>
+                    </div>
+                                    </div>
+            
+
+        
+        {notempty name="$data"}
+          <input type="hidden" name="id" value="{$data.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>
+
+    <script>
+        layui.use(['layer', 'form' ,'laydate'], function () {
+            var layer = layui.layer,
+                $ = layui.jquery,
+                form = layui.form;
+            var laydate = layui.laydate;
+
+            $(window).on('load', function () {
+                form.on('submit(admin)', function (data) {
+                    $.ajax({
+                        url: "{:url('publish')}",
+                        data: $('#publish').serialize(),
+                        type: 'post',
+                        dataType: 'json',
+                        async: false,
+                        success: function (res) {
+                            if (res.code == 1) {
+                                if (res.msg == "添加成功") {
+                                    layer.alert(res.msg, function (index) {
+                                        location.href = res.url;
+                                    })
+                                }else{
+                                    layer.confirm(res.msg, {
+                                        btn: ['关闭', '继续编辑']
+                                    }, function (index) {
+                                        window.parent.tab.close('tplay_appointment_application{$data.id|default=0}');
+                                    }, function (index, layero) {
+                                        location.href = res.url;
+                                    });
+                                }
+                            } else {
+                                layer.msg(res.msg);
+                            }
+                        }
+                    })
+                    return false;
+                });
+
+                                    laydate.render({
+                        elem: '#time_period', //指定元素
+                        type: 'datetime',
+                    });
+                                        laydate.render({
+                        elem: '#finish_time', //指定元素
+                        type: 'datetime',
+                    });
+                    
+            });
+        });
+    </script>
+  </div>
+</body>
+</html>

+ 183 - 0
app/admin/view/specialist/index.html

@@ -0,0 +1,183 @@
+<!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="/static/public/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="/static/public/font-awesome/css/font-awesome.min.css" media="all"/>
+    <link rel="stylesheet" href="/static/admin/css/admin.css" media="all">
+    <style type="text/css">
+        /* tooltip */
+        #tooltip {
+            position: absolute;
+            border: 1px solid #ccc;
+            background: #333;
+            padding: 2px;
+            display: none;
+            color: #fff;
+        }
+        .tooltip > img{
+            width: 20px;
+            height: 20px;
+        }
+    </style>
+</head>
+<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-danger layui-btn-sm" lay-event="deletes">批量删除</button>
+                    </div>
+    </script>
+
+    <form class="layui-form serch" action="index" method="post">
+        <div class="layui-form-item" style="float: left;">
+
+            <div class="layui-input-inline">
+                                <input type="text" name="ids" autocomplete="off" placeholder="请输入ID,多个id逗号分隔" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                            <input type="text" name="name" autocomplete="off" placeholder="名字(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline">
+                            <input type="text" name="head_pic" autocomplete="off" placeholder="头像(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="sex" autocomplete="off" placeholder="性别" class="layui-input layui-btn-sm">
+                            </div><div class="layui-input-inline">
+                            <input type="text" name="desc" autocomplete="off" placeholder="简介(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline">
+                            <input type="text" name="consultation_direction" autocomplete="off" placeholder="咨询方向(模糊搜索)" class="layui-input layui-btn-sm">
+                        </div><div class="layui-input-inline" style="width:100px">
+                                <input type="number" name="address_id" autocomplete="off" placeholder="地址" class="layui-input layui-btn-sm">
+                            </div>
+            <button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="serch">立即提交</button>
+        </div>
+    </form>
+
+        <script type="text/html" id="barDemo">
+        <div class="layui-btn-group">
+                        <button class="layui-btn layui-btn-xs a_menu" lay-event="edit"><i class="layui-icon" style="margin-right: 0;"></i></button>
+                        <button class="layui-btn layui-btn-xs delete" lay-event="del"><i class="layui-icon" style="margin-right: 0;"></i></button>
+                    </div>
+    </script>
+    
+    <table class="layui-table" id="table" lay-filter="table"></table>
+    {include file="public/foot"}
+
+    <script type="text/javascript">
+        layui.use(['table', 'layer', 'form','laydate'], function () {
+            var table = layui.table,
+                form = layui.form,
+                layer = layui.layer;
+            var laydate = layui.laydate;
+            //第一个实例
+            table.render({
+                id: 'table'
+                , elem: '#table'
+                , size: 'sm' //小尺寸的表格
+                                , toolbar: '#toolbarDemo'
+                                , limit: 15
+                , limits: [15, 20, 30, 40, 50, 100]
+                , url: "{:url('index')}" //数据接口
+                , page: true //开启分页
+                , cols: [[ //表头
+                    {type: 'checkbox'},
+
+                                                {field: 'id', title: 'ID', width: 60},
+                                                        {field: "name", title: '名字'},
+                                                        {field: "head_pic", title: '头像'},
+                                                        {field: "sex", title: '性别'},
+                                                        {field: "desc", title: '简介'},
+                                                        {field: "consultation_direction", title: '咨询方向'},
+                                                        {field: "address_id", title: '地址'},
+                                                    {field: 'action', title: '操作', toolbar: '#barDemo', fixed: 'right'}
+                                    ]],
+                done: function () {
+                    if (isExitsFunction('showThumb')) {
+                        showThumb()
+                    }
+                                    }
+            });
+
+            
+            form.on('submit(serch)', function (data) {
+                table.reload('table', {
+                    where: data.field
+                    , page: {
+                        curr: 1 //重新从第 1 页开始
+                    }
+                });
+                return false;
+            });
+
+                        table.on('tool(table)', function (obj) {
+                if (obj.event == 'edit') {
+                                     window.parent.tab.tabAdd({
+                        icon: "fa-bookmark",
+                        id: "tplay_specialist" + obj.data.id,
+                        title: obj.data.title == null ? "专家" + obj.data.id : obj.data.title,
+                        url: "/admin/specialist/publish?id=" + obj.data.id
+                    });
+                                  }
+                                else if (obj.event == 'del') {
+                    layer.confirm('确定要删除?', function (index) {
+                        $.ajax({
+                            url: "{:url('delete')}",
+                            dataType: 'json',
+                            data: {id: obj.data.id},
+                            success: function (res) {
+                                layer.msg(res.msg);
+                                if (res.code == 1) {
+                                    table.reload('table');
+                                }
+                            }
+                        })
+                    })
+                }
+                            });
+                        //监听事件
+            table.on('toolbar(table)', function (obj) {
+                if (obj.event == 'deletes') {
+                    var checkStatus = table.checkStatus(obj.config.id);//获取选中的数据
+                    var data = checkStatus.data;
+                    if (data.length > 0) {
+                        var ids = [];//数组
+                        data.forEach(function (item, key) {
+                            ids[key] = item.id;
+                        })
+                        layer.confirm('是否删除?', function (index, layero) {
+                            $.ajax({
+                                url: "{:url('deletes')}",
+                                dataType: 'json',
+                                data: {"ids": ids},
+                                type: 'post',
+                                success: function (res) {
+                                    layer.msg(res.msg);
+                                    if (res.code == 1) {
+                                        table.reload('table');
+                                    }
+                                }
+                            })
+                            layer.close(index)
+                        });
+                    } else {
+                        layer.msg('请先勾选需要操作的记录');
+                    }
+                }
+            });
+                    });
+    </script>
+
+    
+</div>
+</body>
+</html>

+ 145 - 0
app/admin/view/specialist/publish.html

@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>专家编辑</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="/static/public/layui/css/layui.css"  media="all">
+    <link rel="stylesheet" href="/static/public/font-awesome/css/font-awesome.min.css" media="all" />
+    <link rel="stylesheet" href="/static/admin/css/admin.css"  media="all">
+    <script src="/static/public/layui/layui.js"></script>
+    <script src="/static/public/jquery/jquery.min.js"></script>
+</head>
+<style>
+  .layui-upload-img{
+    cursor: pointer;
+    width:150px;
+    height:150px;
+    background: url('/static/public/images/uploadimg.jpg');
+    background-size:contain;
+    border-radius: 2px;
+    border-width: 1px;
+    border-style: solid;
+    border-color: #e6e6e6;
+  }
+</style>
+<body style="padding:10px;">
+  <div class="tplay-body-div">
+
+    {empty name="$data"}
+    <div class="layui-tab">
+      <ul class="layui-tab-title">
+        <li><a href="index" class="a_menu">列表</a></li>
+        <li class="layui-this">新增</li>
+      </ul>
+    </div>
+    {/empty}
+
+    <div style="margin-top: 20px;"></div>
+    <form class="layui-form" id="publish" method="post">
+
+                      <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">名字</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="name"  autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.name}"{/notempty}>
+                </div>
+                                </div>
+                          <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">头像</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="head_pic"  autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.head_pic}"{/notempty}>
+                </div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">性别</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="sex"  autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.sex}"{/notempty}>
+                </div>
+                                </div>
+                          <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">简介</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="desc"  autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.desc}"{/notempty}>
+                </div>
+                                </div>
+                          <!-- 输入框 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">咨询方向</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="consultation_direction"  autocomplete="off" placeholder="请输入" class="layui-input" type="text" {notempty name="$data"}value="{$data.consultation_direction}"{/notempty}>
+                </div>
+                                </div>
+                            <!-- 数字 -->
+              <div class="layui-form-item">
+                <label class="layui-form-label">地址</label>
+                <div class="layui-input-inline" style="max-width:300px;">
+                  <input name="address_id" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input" type="number" {notempty name="$data"}value="{$data.address_id}"{/notempty}>
+                </div>
+                                      <div class="layui-form-mid layui-word-aux">必填</div>
+                                </div>
+            
+
+        
+        {notempty name="$data"}
+          <input type="hidden" name="id" value="{$data.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>
+
+    <script>
+        layui.use(['layer', 'form' ,'laydate'], function () {
+            var layer = layui.layer,
+                $ = layui.jquery,
+                form = layui.form;
+            var laydate = layui.laydate;
+
+            $(window).on('load', function () {
+                form.on('submit(admin)', function (data) {
+                    $.ajax({
+                        url: "{:url('publish')}",
+                        data: $('#publish').serialize(),
+                        type: 'post',
+                        dataType: 'json',
+                        async: false,
+                        success: function (res) {
+                            if (res.code == 1) {
+                                if (res.msg == "添加成功") {
+                                    layer.alert(res.msg, function (index) {
+                                        location.href = res.url;
+                                    })
+                                }else{
+                                    layer.confirm(res.msg, {
+                                        btn: ['关闭', '继续编辑']
+                                    }, function (index) {
+                                        window.parent.tab.close('tplay_specialist{$data.id|default=0}');
+                                    }, function (index, layero) {
+                                        location.href = res.url;
+                                    });
+                                }
+                            } else {
+                                layer.msg(res.msg);
+                            }
+                        }
+                    })
+                    return false;
+                });
+
+                
+            });
+        });
+    </script>
+  </div>
+</body>
+</html>

+ 13 - 0
app/api/controller/Index.php

@@ -10,6 +10,7 @@ namespace app\api\controller;
 
 
 use app\api\controller\base\Base;
+use app\common\model\Announcement;
 
 class Index extends Base
 {
@@ -17,4 +18,16 @@ class Index extends Base
     {
         $this->json_success('success', ['ip' => $this->request->ip()]);
     }
+
+    //首页接口
+    public function site()
+    {
+        $announcements = (new Announcement())->order('id desc')->limit(3)->select();
+        return [
+            "banners" => [],
+            "boxs" => [],
+//            "contact_us" => "",
+            "announcements" => $announcements
+        ];
+    }
 }

+ 10 - 0
app/common/model/Announcement.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+class Announcement extends Model
+{
+    protected $updateTime = false;
+}

+ 18 - 0
app/common/model/AppointmentApplication.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+class AppointmentApplication extends Model
+{
+    protected $updateTime = false;            public function getTimePeriodAttr($value, $data)
+            {
+                return $value ? date('Y-m-d H:i:s', $value) : '';
+            }
+                    public function getFinishTimeAttr($value, $data)
+            {
+                return $value ? date('Y-m-d H:i:s', $value) : '';
+            }
+        
+}

+ 10 - 0
app/common/model/Specialist.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+class Specialist extends Model
+{
+    protected $autoWriteTimestamp = false;
+}

+ 13 - 0
app/helper_str.php

@@ -42,6 +42,19 @@ function ifContain($str, $pattern)
     return strpos($str, $pattern) !== false;
 }
 
+/**
+ * 判断字符串是url格式
+ */
+function isUrl($str)
+{
+    $preg = "/http[s]?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is";
+    if (preg_match($preg, $str)) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
 // +----------------------------------------------------------------------
 // 字符串截取
 // +----------------------------------------------------------------------

File diff suppressed because it is too large
+ 49 - 90
db.sql


Some files were not shown because too many files changed in this diff