Browse Source

项目初始化

linwu 1 năm trước cách đây
mục cha
commit
4057d63346
100 tập tin đã thay đổi với 16959 bổ sung0 xóa
  1. 1 0
      .example.env
  2. 5 0
      .gitignore
  3. 1 0
      .htaccess
  4. 42 0
      .travis.yml
  5. 26 0
      404.html
  6. 32 0
      LICENSE.txt
  7. 57 0
      README.md
  8. 103 0
      app/BaseController.php
  9. 68 0
      app/ExceptionHandle.php
  10. 17 0
      app/Request.php
  11. 1 0
      app/admin/.htaccess
  12. 147 0
      app/admin/BaseController.php
  13. 68 0
      app/admin/ExceptionHandle.php
  14. 17 0
      app/admin/Request.php
  15. 116 0
      app/admin/common.php
  16. 9 0
      app/admin/config/view.php
  17. 209 0
      app/admin/controller/Admin.php
  18. 283 0
      app/admin/controller/Agent.php
  19. 36 0
      app/admin/controller/Alisms.php
  20. 343 0
      app/admin/controller/Article.php
  21. 192 0
      app/admin/controller/Attachment.php
  22. 341 0
      app/admin/controller/Broker.php
  23. 17 0
      app/admin/controller/Captcha.php
  24. 103 0
      app/admin/controller/Cert.php
  25. 34 0
      app/admin/controller/Chuanglansms.php
  26. 109 0
      app/admin/controller/Coach.php
  27. 650 0
      app/admin/controller/Comjobs.php
  28. 394 0
      app/admin/controller/Comjobsreport.php
  29. 711 0
      app/admin/controller/Demand.php
  30. 51 0
      app/admin/controller/Feedback.php
  31. 314 0
      app/admin/controller/Form.php
  32. 14 0
      app/admin/controller/Help.php
  33. 111 0
      app/admin/controller/Home.php
  34. 38 0
      app/admin/controller/Index.php
  35. 54 0
      app/admin/controller/Login.php
  36. 393 0
      app/admin/controller/Mall.php
  37. 112 0
      app/admin/controller/Navigation.php
  38. 217 0
      app/admin/controller/Notice.php
  39. 82 0
      app/admin/controller/Param.php
  40. 236 0
      app/admin/controller/Partjob.php
  41. 216 0
      app/admin/controller/Question.php
  42. 641 0
      app/admin/controller/Report.php
  43. 212 0
      app/admin/controller/Resident.php
  44. 406 0
      app/admin/controller/Settle.php
  45. 48 0
      app/admin/controller/Sinpage.php
  46. 112 0
      app/admin/controller/Slide.php
  47. 187 0
      app/admin/controller/Supply.php
  48. 118 0
      app/admin/controller/Test.php
  49. 141 0
      app/admin/controller/Train.php
  50. 102 0
      app/admin/controller/Trainjoin.php
  51. 1163 0
      app/admin/controller/User.php
  52. 157 0
      app/admin/controller/Video.php
  53. 318 0
      app/admin/controller/Worder.php
  54. 431 0
      app/admin/controller/Worker.php
  55. 27 0
      app/admin/event.php
  56. 12 0
      app/admin/middleware.php
  57. 19 0
      app/admin/provider.php
  58. 130 0
      app/admin/view/admin/adminform.html
  59. 190 0
      app/admin/view/admin/adminlist.html
  60. 82 0
      app/admin/view/admin/myinfo.html
  61. 70 0
      app/admin/view/admin/mypassword.html
  62. 330 0
      app/admin/view/agent/agentform.html
  63. 213 0
      app/admin/view/agent/agentlist.html
  64. 116 0
      app/admin/view/agent/fagentform.html
  65. 175 0
      app/admin/view/agent/fagentlist.html
  66. 138 0
      app/admin/view/appcenter/cert/certform.html
  67. 167 0
      app/admin/view/appcenter/cert/certlist.html
  68. 145 0
      app/admin/view/appcenter/form/formform.html
  69. 219 0
      app/admin/view/appcenter/form/formlist.html
  70. 141 0
      app/admin/view/appcenter/form/itemform.html
  71. 114 0
      app/admin/view/appcenter/form/logdetail.html
  72. 159 0
      app/admin/view/appcenter/form/loglist.html
  73. 173 0
      app/admin/view/artapp/article/articlecommentlist.html
  74. 233 0
      app/admin/view/artapp/article/articleform.html
  75. 220 0
      app/admin/view/artapp/article/articlelist.html
  76. 73 0
      app/admin/view/artapp/article/cateform.html
  77. 110 0
      app/admin/view/artapp/article/catelist.html
  78. 209 0
      app/admin/view/artapp/article/commentlist.html
  79. 73 0
      app/admin/view/artapp/notice/cateform.html
  80. 110 0
      app/admin/view/artapp/notice/catelist.html
  81. 134 0
      app/admin/view/artapp/notice/noticeform.html
  82. 195 0
      app/admin/view/artapp/notice/noticelist.html
  83. 73 0
      app/admin/view/artapp/question/cateform.html
  84. 109 0
      app/admin/view/artapp/question/catelist.html
  85. 134 0
      app/admin/view/artapp/question/questionform.html
  86. 195 0
      app/admin/view/artapp/question/questionlist.html
  87. 212 0
      app/admin/view/attachment/image.html
  88. 91 0
      app/admin/view/broker/brokerdefault.html
  89. 154 0
      app/admin/view/broker/brokerform.html
  90. 228 0
      app/admin/view/broker/brokerlist.html
  91. 114 0
      app/admin/view/broker/fbrokerform.html
  92. 174 0
      app/admin/view/broker/fbrokerlist.html
  93. 105 0
      app/admin/view/coach/coachform.html
  94. 170 0
      app/admin/view/coach/coachlist.html
  95. 77 0
      app/admin/view/comjobs/cateform.html
  96. 113 0
      app/admin/view/comjobs/catelist.html
  97. 479 0
      app/admin/view/comjobs/comjobsform.html
  98. 260 0
      app/admin/view/comjobs/comjobslist.html
  99. 96 0
      app/admin/view/comjobs/comjobsreport.html
  100. 192 0
      app/admin/view/comjobs/loglist.html

+ 1 - 0
.example.env

@@ -0,0 +1 @@
+APP_DEBUG = true

[APP]
DEFAULT_TIMEZONE = Asia/Shanghai

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = test
USERNAME = username
PASSWORD = password
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true

[LANG]
default_lang = zh-cn

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/.idea
+/.vscode
+*.log
+.env
+/extend/echowx/json/access_token.json

+ 1 - 0
.htaccess

@@ -0,0 +1 @@
+ 

+ 42 - 0
.travis.yml

@@ -0,0 +1,42 @@
+sudo: false
+
+language: php
+
+branches:
+  only:
+    - stable
+
+cache:
+  directories:
+    - $HOME/.composer/cache
+
+before_install:
+  - composer self-update
+
+install:
+  - composer install --no-dev --no-interaction --ignore-platform-reqs
+  - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
+  - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
+  - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
+  - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
+
+script:
+  - php think unit
+
+deploy:
+  provider: releases
+  api_key:
+    secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
+  file:
+    - ThinkPHP_Core.zip
+    - ThinkPHP_Full.zip
+  skip_cleanup: true
+  on:
+    tags: true

+ 26 - 0
404.html

@@ -0,0 +1,26 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+<title>404</title>
+<style>
+	body{
+		background-color:#444;
+		font-size:14px;
+	}
+	h3{
+		font-size:60px;
+		color:#eee;
+		text-align:center;
+		padding-top:30px;
+		font-weight:normal;
+	}
+</style>
+</head>
+
+<body>
+<h3>404,The file not exits!</h3>
+</body>
+</html>

+ 32 - 0
LICENSE.txt

@@ -0,0 +1,32 @@
+
+ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
+版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
+All rights reserved。
+ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
+
+Apache Licence是著名的非盈利开源组织Apache采用的协议。
+该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,
+允许代码修改,再作为开源或商业软件发布。需要满足
+的条件: 
+1. 需要给代码的用户一份Apache Licence ;
+2. 如果你修改了代码,需要在被修改的文件中说明;
+3. 在延伸的代码中(修改和有源代码衍生的代码中)需要
+带有原来代码中的协议,商标,专利声明和其他原来作者规
+定需要包含的说明;
+4. 如果再发布的产品中包含一个Notice文件,则在Notice文
+件中需要带有本协议内容。你可以在Notice中增加自己的
+许可,但不可以表现为对Apache Licence构成更改。 
+具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.

+ 57 - 0
README.md

@@ -0,0 +1,57 @@
+ThinkPHP 6.0
+===============
+
+> 运行环境要求PHP7.1+。
+
+## 主要新特性
+
+* 采用`PHP7`强类型(严格模式)
+* 支持更多的`PSR`规范
+* 原生多应用支持
+* 更强大和易用的查询
+* 全新的事件系统
+* 模型事件和数据库事件统一纳入事件系统
+* 模板引擎分离出核心
+* 内部功能中间件化
+* SESSION/Cookie机制改进
+* 对Swoole以及协程支持改进
+* 对IDE更加友好
+* 统一和精简大量用法
+
+## 安装
+
+~~~
+composer create-project topthink/think tp 6.0.*-dev
+~~~
+
+如果需要更新框架使用
+~~~
+composer update topthink/framework
+~~~
+
+## COMPOSER
+使用composer更新后,请执行如下操作
+* vendor_back/service.php复制到vendor/service.php
+* vendor_back/Url.php复制到vendor/topthink/think-multi-app/src/Url.php
+
+## 文档
+
+[完全开发手册](https://www.kancloud.cn/manual/thinkphp6_0/content)
+
+## 参与开发
+
+请参阅 [ThinkPHP 核心框架包](https://github.com/top-think/framework)。
+
+## 版权信息
+
+ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
+
+本项目包含的第三方源码和二进制文件之版权信息另行标注。
+
+版权所有Copyright © 2006-2019 by ThinkPHP (http://thinkphp.cn)
+
+All rights reserved。
+
+ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
+
+更多细节参阅 [LICENSE.txt](LICENSE.txt)

+ 103 - 0
app/BaseController.php

@@ -0,0 +1,103 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+declare (strict_types = 1);
+
+namespace app;
+
+use think\App;
+use think\exception\ValidateException;
+use think\Validate;
+
+/**
+ * 控制器基础类
+ */
+abstract class BaseController
+{
+    /**
+     * Request实例
+     * @var \think\Request
+     */
+    protected $request;
+
+    /**
+     * 应用实例
+     * @var \think\App
+     */
+    protected $app;
+
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param  App  $app  应用对象
+     */
+    public function __construct(App $app)
+    {
+        $this->app     = $app;
+        $this->request = $this->app->request;
+
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {}
+
+    /**
+     * 验证数据
+     * @access protected
+     * @param  array        $data     数据
+     * @param  string|array $validate 验证器名或者验证规则数组
+     * @param  array        $message  提示信息
+     * @param  bool         $batch    是否批量验证
+     * @return array|string|true
+     * @throws ValidateException
+     */
+    protected function validate(array $data, $validate, array $message = [], $batch = false)
+    {
+        if (is_array($validate)) {
+            $v = new Validate();
+            $v->rule($validate);
+        } else {
+            if (strpos($validate, '.')) {
+                // 支持场景
+                list($validate, $scene) = explode('.', $validate);
+            }
+            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+            $v     = new $class();
+            if (!empty($scene)) {
+                $v->scene($scene);
+            }
+        }
+
+        $v->message($message);
+
+        // 是否批量验证
+        if ($batch || $this->batchValidate) {
+            $v->batch(true);
+        }
+
+        return $v->failException(true)->check($data);
+    }
+
+}

+ 68 - 0
app/ExceptionHandle.php

@@ -0,0 +1,68 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+namespace app;
+
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\Handle;
+use think\exception\HttpException;
+use think\exception\HttpResponseException;
+use think\exception\ValidateException;
+use think\Response;
+use Throwable;
+
+/**
+ * 应用异常处理类
+ */
+class ExceptionHandle extends Handle
+{
+    /**
+     * 不需要记录信息(日志)的异常类列表
+     * @var array
+     */
+    protected $ignoreReport = [
+        HttpException::class,
+        HttpResponseException::class,
+        ModelNotFoundException::class,
+        DataNotFoundException::class,
+        ValidateException::class,
+    ];
+
+    /**
+     * 记录异常信息(包括日志或者其它方式记录)
+     *
+     * @access public
+     * @param  Throwable $exception
+     * @return void
+     */
+    public function report(Throwable $exception): void
+    {
+        // 使用内置的方式记录异常日志
+        parent::report($exception);
+    }
+
+    /**
+     * Render an exception into an HTTP response.
+     *
+     * @access public
+     * @param \think\Request   $request
+     * @param Throwable $e
+     * @return Response
+     */
+    public function render($request, Throwable $e): Response
+    {
+        // 添加自定义异常处理机制
+
+        // 其他错误交给系统处理
+        return parent::render($request, $e);
+    }
+}

+ 17 - 0
app/Request.php

@@ -0,0 +1,17 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+namespace app;
+
+class Request extends \think\Request
+{
+
+}

+ 1 - 0
app/admin/.htaccess

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

+ 147 - 0
app/admin/BaseController.php

@@ -0,0 +1,147 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+declare (strict_types = 1);
+
+namespace app\admin;
+
+use think\App;
+use think\exception\ValidateException;
+use think\Validate;
+
+use think\facade\Session;
+
+/**
+ * 控制器基础类
+ */
+abstract class BaseController
+{
+    /**
+     * Request实例
+     * @var \think\Request
+     */
+    protected $request;
+
+    /**
+     * 应用实例
+     * @var \think\App
+     */
+    protected $app;
+
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+	
+	/**
+	 * 控制器中间件
+	 * @var array
+	 */
+	protected $access_admin = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param  App  $app  应用对象
+     */
+    public function __construct(App $app)
+    {
+        $this->app     = $app;
+        $this->request = $this->app->request;
+				
+				
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {
+		// 验证登陆信息
+		$access_admin = Session::has('access_admin');
+		if ( $access_admin ) {
+			
+		}else{
+			echo '<script language="javascript" type="text/javascript"> top.location.href="/admin.php/login/index"; </script>';
+			exit(json_encode(array(
+				'code' 	=> 1001,
+				'msg'	=> "You do not have permission to access."
+			)));
+		}
+	}
+
+    /**
+     * 验证数据
+     * @access protected
+     * @param  array        $data     数据
+     * @param  string|array $validate 验证器名或者验证规则数组
+     * @param  array        $message  提示信息
+     * @param  bool         $batch    是否批量验证
+     * @return array|string|true
+     * @throws ValidateException
+     */
+    protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+    {
+        if (is_array($validate)) {
+            $v = new Validate();
+            $v->rule($validate);
+        } else {
+            if (strpos($validate, '.')) {
+                // 支持场景
+                list($validate, $scene) = explode('.', $validate);
+            }
+            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+            $v     = new $class();
+            if (!empty($scene)) {
+                $v->scene($scene);
+            }
+        }
+
+        $v->message($message);
+
+        // 是否批量验证
+        if ($batch || $this->batchValidate) {
+            $v->batch(true);
+        }
+
+        return $v->failException(true)->check($data);
+    }
+
+    protected function dealEqualInput($result ,$equal_array)
+    {
+        foreach ($equal_array as $k => $v) {
+            $value = input($v);
+            if (!empty($value)) {
+                $result[] = [is_numeric($k) ? $v : $k,'=',$value];
+            }
+        }
+
+        return $result;
+    }
+
+    protected function dealLikeInput($result,$like_array)
+    {
+        foreach ($like_array as $k => $v) {
+            $value = input($v);
+            if (!empty($value)) {
+                $result[] = [is_numeric($k) ? $v : $k,'like',"%{$value}%"];
+            }
+        }
+
+        return $result;
+    }
+}

+ 68 - 0
app/admin/ExceptionHandle.php

@@ -0,0 +1,68 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+namespace app\admin;
+
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\Handle;
+use think\exception\HttpException;
+use think\exception\HttpResponseException;
+use think\exception\ValidateException;
+use think\Response;
+use Throwable;
+
+/**
+ * 应用异常处理类
+ */
+class ExceptionHandle extends Handle
+{
+    /**
+     * 不需要记录信息(日志)的异常类列表
+     * @var array
+     */
+    protected $ignoreReport = [
+        HttpException::class,
+        HttpResponseException::class,
+        ModelNotFoundException::class,
+        DataNotFoundException::class,
+        ValidateException::class,
+    ];
+
+    /**
+     * 记录异常信息(包括日志或者其它方式记录)
+     *
+     * @access public
+     * @param  Throwable $exception
+     * @return void
+     */
+    public function report(Throwable $exception): void
+    {
+        // 使用内置的方式记录异常日志
+        parent::report($exception);
+    }
+
+    /**
+     * Render an exception into an HTTP response.
+     *
+     * @access public
+     * @param \think\Request   $request
+     * @param Throwable $e
+     * @return Response
+     */
+    public function render($request, Throwable $e): Response
+    {
+        // 添加自定义异常处理机制
+
+        // 其他错误交给系统处理
+        return parent::render($request, $e);
+    }
+}

+ 17 - 0
app/admin/Request.php

@@ -0,0 +1,17 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+namespace app\admin;
+
+class Request extends \think\Request
+{
+
+}

+ 116 - 0
app/admin/common.php

@@ -0,0 +1,116 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: 流年 <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+// 应用公共文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function outExcel($data){
+        $objExcel = new PHPExcel();
+        $objWriter = \PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
+        $objActSheet = $objExcel->getActiveSheet(0);
+        $objActSheet->setTitle('领取报表');//设置excel的标题
+        $objActSheet->setCellValue('A1','用户id');
+        $objActSheet->setCellValue('B1','红包金额(元)');
+        $objActSheet->setCellValue('C1','时间');
+        $objActSheet->setCellValue('D1','发放状态');
+
+        $baseRow = 2; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
+        foreach ( $data as $r => $d ) {
+            $i = $baseRow + $r;
+            // $objExcel->getActiveSheet()->setCellValue('A'.$i,$d['user_id']);
+            // $objExcel->getActiveSheet()->setCellValue('B'.$i,$d['price']);
+            // $objExcel->getActiveSheet()->setCellValue('C'.$i,$d['create_time']);
+            // $objExcel->getActiveSheet()->setCellValue('D'.$i,$d['status'] == 1 ? '成功' : '失败');
+        }
+        $objExcel->setActiveSheetIndex(0);
+        //4、输出
+        $objExcel->setActiveSheetIndex();
+        header('Content-Type: applicationnd.ms-excel');
+        $time=date('Y-m-d');
+        header("Content-Disposition: attachment;filename=领取报表$time.xls");
+        header('Cache-Control: max-age=0');
+        $objWriter->save('php://output');
+    }
+
+
+/**
+ * excel表格导出
+ * @param string $fileName 文件名称
+ * @param array $headArr 表头名称
+ * @param array $data 要导出的数据
+ */
+if (!function_exists('excel_export')) {
+    function excel_export($fileName = '', $headArr = [], $data = []) {
+        $fileName .= "_" . date("Ymd", \think\facade\Request::instance()->time()) . ".xls";
+        $objPHPExcel = new \PHPExcel();
+        $objPHPExcel->getProperties();
+        $key = ord("A"); // 设置表头
+        foreach ($headArr as $v) {
+            $colum = chr($key);
+            //设置表头值
+            $objPHPExcel->getActiveSheet()->setCellValue($colum.'1',$v);
+            //设置表头字体样式
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->setName('微软雅黑');
+            //设置表头字体大小
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->setSize(13);
+            //设置表头字体是否加粗
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->setBold(true);
+            //设置表头文字水平居中
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
+            //设置文字上下居中
+            $objPHPExcel->getActiveSheet()->getStyle($colum)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
+            //设置单元格背景色
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFill()->getStartColor()->setARGB('FFFFFFFF');
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFill()->getStartColor()->setARGB('FF6DBA43');
+            //设置字体颜色
+            $objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->getColor()->setARGB('FFFFFFFF');
+
+            //设置列宽度
+            $objPHPExcel->getActiveSheet()->getColumnDimension($colum)->setWidth(strlen($v)*3);
+            $key += 1;
+        }
+
+        $column = 2;
+        $objActSheet = $objPHPExcel->getActiveSheet();
+        foreach ($data as $key => $rows) { // 行写入
+            $span = ord("A");
+            foreach ($rows as $keyName => $value) { // 列写入
+                if (is_numeric($value)) $value = ' '.$value;
+                $objActSheet->setCellValue(chr($span) . $column, $value);
+                $span++;
+            }
+            $column++;
+        }
+
+        $fileName = iconv("utf-8", "gb2312", $fileName); // 重命名表
+        $objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表
+        header('Content-Type: application/vnd.ms-excel');
+        header("Content-Disposition: attachment;filename='$fileName'");
+        header('Cache-Control: max-age=0');
+        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
+        $objWriter->save('php://output'); // 文件通过浏览器下载
+        exit();
+    }
+}

+ 9 - 0
app/admin/config/view.php

@@ -0,0 +1,9 @@
+<?php
+// +----------------------------------------------------------------------
+// | 模板设置
+// +----------------------------------------------------------------------
+
+return [
+	'layout_on'    => true, 
+	'layout_name'  => 'layout', 
+];

+ 209 - 0
app/admin/controller/Admin.php

@@ -0,0 +1,209 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Admin as AdminModel;
+use app\common\model\Menu as MenuModel;
+
+use app\common\validate\Admin as AdminValidate;
+use think\exception\ValidateException;
+
+class Admin extends BaseController
+{
+	
+	public function adminList()
+	{
+		return view('admin/adminlist');
+	}
+	
+	public function adminForm()
+	{
+		$id = input('id/d, 0');
+		$admin = AdminModel::findOrEmpty($id);
+		$menulist = MenuModel::where(['mtype'=>'admin','status'=>1])->order(['pid'=>'asc','priority'=>'asc','id'=>'asc'])->select()->toArray();
+		$powerarr = array();
+		$poweridsarr = ($admin->powerids==null||empty($admin->powerids)) ? [] : explode(",", $admin->powerids);
+		if (!empty($menulist)){
+			foreach ($menulist as $k=>$v){
+				if ($v['pid']==0){
+					$v['checked'] = false;
+					$v['children'] = array();
+					$v['spread'] = true;
+					$powerarr[$v['id']] = $v;
+				}else {
+					$v['checked'] = in_array($v['id'], $poweridsarr);
+					$powerarr[$v['pid']]['children'][] = $v;
+				}
+			}
+		}
+		return view('admin/adminform',[
+			'admin'		=> $admin,
+			'powerarr'	=> json_encode( array_values($powerarr) )
+		]);
+	}
+	
+	public function editAdmin()
+	{
+		$id = input('id/d');
+		$vdata = array(
+			'id'		=> $id,
+			'adminname' => input('adminname/s'),
+			'realname'  => input('realname/s'),
+			'mobile'    => input('mobile/s')
+		);
+		try {
+			validate(AdminValidate::class)->check($vdata);
+		} catch (ValidateException $e) {
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> $e->getError()
+			)));
+		}
+		$password = input('password/s');
+		$role = input('role/d', 2);
+		$powerids = input('powerids/s', "");
+		if($role==1){
+			$idsarr = MenuModel::where(['mtype'=>'admin','status'=>1])->order(['pid'=>'asc','priority'=>'asc','id'=>'asc'])->column('id');
+			$powerids = implode(",", $idsarr);
+		}
+		$data = [
+			'role'		=> $role,
+			'adminname' => input('adminname/s', ""),
+			'realname'  => input('realname/s', ""),
+			'mobile'    => input('mobile/s', ""),
+			'status'	=> input('status/d')==1 ? 1 : 2,
+			'powerids'	=> $powerids,
+			'remark'	=> input('remark', "")
+		];
+		if (empty($id)){
+			$data['password'] 	= empty($password) ? md5("123456789") : md5($password);
+			$data['joindate'] 	= time();
+			$data['joinip'] 	= $_SERVER['SERVER_ADDR'];
+			$data['lastdate'] 	= time();
+			$data['lastip'] 	= $_SERVER['SERVER_ADDR'];
+			$admin = AdminModel::create($data);
+		}else{
+			if (!empty($password)){
+				$data['password'] = md5($password);
+			}
+			$admin = AdminModel::find($id);
+			$admin->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	// 删除管理员
+	public function delAdmin()
+	{
+		$access_admin = session('access_admin');
+		$password = input('password');
+		if ( $access_admin['password'] !== md5($password) ){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "操作密码验证失败"
+			)));
+		}
+		$idarr = input('idarr/a');
+		$admin = AdminModel::where('role',2)->whereIn('id',$idarr)->select();
+		$result = $admin->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listAdmin()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$adminname = input('adminname');
+		if (!empty($adminname)){
+			$map['adminname'] = $adminname;
+		}
+		$realname = input('realname');
+		if (!empty($realname)){
+			$map['realname'] = $realname;
+		}
+		$mobile = input('mobile');
+		if (!empty($mobile)){
+			$map['mobile'] = $mobile;
+		}
+		$role = input('role');
+		if (!empty($role)){
+			$map['role'] = $role;
+		}
+		$list = AdminModel::where($map)->order('id','asc')->limit($limit)->page($page)->append(['status_text','role_text'])->select();
+		$count = AdminModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	// 个人信息
+	public function myInfo()
+	{
+		$access_admin = session('access_admin');
+		$admin = AdminModel::find($access_admin['id']);
+		return view('admin/myinfo',[
+			'admin' => $admin
+		]);
+	}
+
+	public function editMyInfo()
+	{
+		$access_admin = session('access_admin');
+		AdminModel::update(['realname'=>input('realname'),'mobile'=>input('mobile'),'remark'=>input('remark')], ['id'=>$access_admin['id']]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+
+	public function myPassword()
+	{
+		return view('admin/mypassword');
+	}
+
+	public function editMyPassword()
+	{
+		$access_admin = session('access_admin');
+		$oldpassword = input('oldpassword');
+		if ( $access_admin['password']!==md5($oldpassword) ){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "当前密码不正确。"
+			)));
+		}
+		$password = input('password');
+		$repassword = input('repassword');
+		if ( $password!==$repassword ){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "两次输入的新密码不一致。"
+			)));
+		}
+		AdminModel::update(['password'=>md5($password)], ['id'=>$access_admin['id']]);
+		session('access_admin', null);
+		echo json_encode(array(
+			'code' 	=> 0
+		));
+	}
+
+}

+ 283 - 0
app/admin/controller/Agent.php

@@ -0,0 +1,283 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\User as UserModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Agent as AgentModel;
+use app\common\model\AgentForm as AgentFormModel;
+use app\common\model\Broker as BrokerModel;
+
+use app\common\validate\Agent as AgentValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+
+class Agent extends BaseController
+{
+	
+	public function agentList()
+	{ 
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		return view('agent/agentlist',[
+			'workerlist'		=> $workerlist
+		]);
+	}
+	
+	public function agentForm()
+	{
+		$id = input('id/d, 0');
+		$agent = AgentModel::with(['muser'])->findOrEmpty($id);
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		return view('agent/agentform',[
+			'workerlist'	=> $workerlist,
+			'agent'			=> $agent
+		]);
+	}
+	
+	public function editAgent()
+	{
+		$id = input('id/d');
+		$vdata = array(
+			'id'			=> $id,
+			'loginname'		=> input('loginname/s', ""),
+			'idnumber'		=> input('idnumber/s', "")
+		);
+		try {
+			validate(AgentValidate::class)->check($vdata);
+		} catch (ValidateException $e) {
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> $e->getError()
+			)));
+		}
+		$muser = UserModel::where(['mobile'=>input('musermobile/s', '')])->findOrEmpty();
+		if ($muser->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "关联的用户不存在。"
+			)));
+		}
+		$data = [
+			'userid'		=> $muser->id,
+			'workerid'		=> input('workerid/d', 0),
+			'loginname'  	=> input('loginname/s', ""),
+			'idnumber'  	=> input('idnumber/s', ""),
+			'title'			=> input('title/s', ""),
+			'tilpic'		=> input('tilpic/s', ""),
+			'picall'		=> input('picall/a', array()),
+			'realname'  	=> input('realname/s', ""),
+			'mobile'    	=> input('mobile/s', ""),
+			'telephone'		=> input('telephone/s', ""),
+			'latitude'		=> input('latitude/f', 0.00),
+			'longitude'		=> input('longitude/f', 0.00),
+			'province'		=> input('province/s', ""),
+			'city'			=> input('city/s', ""),
+			'district'		=> input('district/s', ""),
+			'address'		=> input('address/s', ""),
+			'details'		=> input('details/s', ""),
+			'priority'		=> input('priority/d', 0),
+			'remark'		=> input('remark/s', ""),
+			'status'		=> input('status/d', 0)
+		];
+		$password = input('password/s', "");
+		if (empty($id)){
+			$data['password'] = empty($password) ? md5("123456789") : md5($password);
+			$data['createtime'] = time();
+			$agent = AgentModel::create($data);
+		}else{
+			if (!empty($password)){
+				$data['password'] = md5($password);
+			}
+			$agent = AgentModel::find($id);
+			$agent->save($data);
+		}
+		BrokerModel::update([
+			'workerid' => input('workerid/d', 0)
+		],['agentid'=>$agent->id]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldAgent()
+	{
+		$id = input('id/d',0); 
+		$info = AgentModel::findOrEmpty($id);
+		if ($info->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$info->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delAgent()
+	{
+		$access_admin = session('access_admin');
+		$password = input('password');
+		if ( $access_admin['password'] !== md5($password) ){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "操作密码验证失败"
+			)));
+		}
+		$idarr = input('idarr/a');
+        $result = Db::name('agent')->whereIn('id',$idarr)->update(['deletetime'=>time()]);
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listAgent()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['idnumber', 'like', '%'.$keywords.'%'];
+		}
+		$workerid = input('workerid/d');
+		if (!empty($workerid)){
+			$map[] = ['workerid', '=', $workerid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = AgentModel::with(['worker','muser'])->where($map)->order(['priority'=>'DESC','id'=>'DESC'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = AgentModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+	
+	
+	// 申请注册经纪人
+	public function fagentList()
+	{
+		return view('agent/fagentlist');
+	}
+	
+	public function fagentForm()
+	{
+		$id = input('id/d, 0');
+		$fagent = AgentFormModel::findOrEmpty($id);
+		return view('agent/fagentform',[
+			'fagent'	=> $fagent
+		]);
+	}
+	
+	public function editFagent()
+	{
+		$id = input('id/d');
+		$fagent = AgentFormModel::findOrEmpty($id);
+		$fagent->save([
+			'realname'  	=> input('realname/s', ""),
+			'mobile'    	=> input('mobile/s', ""),
+			'address'		=> input('address/s', ""),
+			'idcard'		=> input('idcard/s', ""),
+			'recommender'	=> input('recommender/s', ""),
+			'status'		=> input('status/d', 1),
+			'remark'		=> input('remark/s', ""),
+			'createtime'	=> input('createtime/s', ""),
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldFagent()
+	{
+		$id = input('id/d',0); 
+		$info = AgentFormModel::findOrEmpty($id);
+		if ($info->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$info->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delFagent()
+	{
+		$idarr = input('idarr/a');
+		$fagent = AgentFormModel::whereIn('id',$idarr)->select();
+		$result = $fagent->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listFagent()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['realname|mobile', 'like', '%'.$keywords.'%'];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = AgentFormModel::where($map)->order('id','DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = AgentFormModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+	
+
+}

+ 36 - 0
app/admin/controller/Alisms.php

@@ -0,0 +1,36 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Config as ConfigModel;
+
+class Alisms extends BaseController
+{
+	
+	public function index()
+	{
+		$alisms = ConfigModel::getConfigValue(['sms_ali_accesskeyid','sms_ali_accesskeysecret','sms_ali_signname','sms_ali_register','sms_ali_getpassword','sms_ali_mobilelogin']);
+		return view('set/alisms',[
+			'alisms' => $alisms 
+		]);
+	}
+	
+	public function editAlisms()
+	{
+		$data = array(
+			'sms_ali_accesskeyid'		=> input('sms_ali_accesskeyid/s'),
+			'sms_ali_accesskeysecret'	=> input('sms_ali_accesskeysecret/s'),
+			'sms_ali_signname'			=> input('sms_ali_signname/s'),
+			'sms_ali_register'			=> input('sms_ali_register/s'),
+			'sms_ali_getpassword'		=> input('sms_ali_getpassword/s'),
+			'sms_ali_mobilelogin'		=> input('sms_ali_mobilelogin/s')
+		);
+        ConfigModel::setConfigValue($data);
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'   => ""
+		)));
+	}
+	
+}
+	

+ 343 - 0
app/admin/controller/Article.php

@@ -0,0 +1,343 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Article as ArticleModel;
+use app\common\model\ArticleCate as ArticleCateModel;
+use app\common\model\ArticleComment as ArticleCommentModel;
+use app\common\model\ArticleThumb as ArticleThumbModel;
+use app\common\model\ArticleCollect as ArticleCollectModel;
+
+class Article extends BaseController
+{
+
+	// 评论
+	public function articleCommentList()
+	{
+		$articleid = input('articleid/d');
+		return view('artapp/article/articlecommentlist',[
+			'articleid' => $articleid
+		]);
+	}
+	
+	public function commentList()
+	{
+		return view('artapp/article/commentlist');
+	}
+	
+	public function listComment()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['details', 'like', '%'.$keywords.'%'];
+		}
+		$articleid = input('articleid/d', 0);
+		if (!empty($articleid)){
+			$map[] = ['articleid', '=', $articleid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = ArticleCommentModel::with(['user','puser'])->where($map)->order('id','desc')->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = ArticleCommentModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function fieldComment()
+	{
+		$id = input('id/d');
+		$comment = ArticleCommentModel::find($id);
+		if ($comment==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$comment->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function statusComment()
+	{
+		$id = input('id/d');
+		$comment = ArticleCommentModel::find($id);
+		if ($comment==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}elseif($comment->status==2){
+			$comment->save([
+				'status' => 1
+			]);
+		}else{
+			$comment->save([
+				'status' => 2
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function statusCommentAll()
+	{
+		$idarr = input('idarr/a');
+		ArticleCommentModel::update(['status' => 1], ['id'=>$idarr]);
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+	
+	public function delComment()
+	{
+		$idarr = input('idarr/a');
+		$comment = ArticleCommentModel::whereIn('id',$idarr)->select();
+		$result = $comment->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+
+
+	// 文章资讯
+	public function articleList()
+	{
+		$catelist = ArticleCateModel::order(['priority'=>'desc','id'=>'desc'])->select();;
+		return view('artapp/article/articlelist',[
+			'catelist'	=> $catelist
+		]);
+	}
+	
+	public function articleForm()
+	{
+		$catelist = ArticleCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		$id = input('id/d, 0');
+		$article = ArticleModel::findOrEmpty($id);
+		return view('artapp/article/articleform',[
+			'catelist'	=> $catelist,
+			'article'	=> $article
+		]);
+	}
+	
+	public function listArticle()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$cateid = input('cateid/d');
+		if (!empty($cateid)){
+			$map[] = ['cateid', '=', $cateid];
+		}
+		$atype = input('atype/d');
+		if (!empty($atype)){
+			$map[] = ['atype', '=', $atype];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = ArticleModel::with('articleCate')->withCount(['articleComment','articleThumb','articleCollect'])->where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['atype_text','status_text'])->select();
+		$count = ArticleModel::where($map)->count(); 
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function delArticle()
+	{
+		$idarr = input('idarr/a');
+		ArticleCommentModel::whereIn('articleid',$idarr)->delete();
+		ArticleThumbModel::whereIn('articleid',$idarr)->delete();
+		ArticleCollectModel::whereIn('articleid',$idarr)->delete();
+		ArticleModel::whereIn('id',$idarr)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+	
+	public function editArticle()
+	{
+		$id = input('id/d');
+		$data = array(
+			'cateid'      => input('cateid/d'),
+			'title'       => input('title/s'),
+			'tilpic'      => input('tilpic/s'),
+			'author'      => input('author/s'),
+			'summary'     => input('summary/s'),
+			'atype'       => input('atype/d'),
+			'details'     => input('details/s'),
+			'tilurl'      => input('tilurl/s'),
+			'priority'    => input('priority/d'),
+			'createtime'  => input('createtime/s'),
+			'status'	  => input('status/d')==1 ? 1 : 2,
+			'volume'      => input('volume/d') 
+		);
+		if (empty($id)){
+			ArticleModel::create($data);
+		}else{
+			$data['id'] = $id;
+			ArticleModel::update($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldArticle()
+	{
+		$id = input('id/d',0); 
+		$article = ArticleModel::findOrEmpty($id);
+		if ($article->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$article->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+
+
+	// 分类
+	public function cateList()
+	{
+		return view('artapp/article/catelist');
+	}
+	
+	public function cateForm()
+	{
+		$id = input('id/d, 0');
+		$cate = ArticleCateModel::findOrEmpty($id);
+		return view('artapp/article/cateform',[
+			'cate'	=> $cate
+		]);
+	}
+	
+	public function listCate()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = ArticleCateModel::order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = ArticleCateModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function fieldCate()
+	{
+		$id = input('id/d');
+		$cate = ArticleCateModel::find($id);
+		if ($cate==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$cate->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editCate()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			$cate = ArticleCateModel::create([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}else{
+			$cate = ArticleCateModel::find($id);
+			$cate->save([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delCate()
+	{
+		$id = input('id/d');
+		$cate = ArticleCateModel::where('id',$id)->select();
+		$result = $cate->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+
+}

+ 192 - 0
app/admin/controller/Attachment.php

@@ -0,0 +1,192 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use think\facade\Request;
+
+use think\facade\Filesystem;
+
+use app\common\model\Attachment as AttachmentModel;
+
+class Attachment
+{
+	
+	// 文件上传
+	public function tplFieldFile()
+	{
+		$file = request()->file("file");
+		$savename = \think\facade\Filesystem::disk('public')->putFile('files',$file);
+		if($file){
+			$filename = str_replace(strrchr($_FILES['file']['name'], "."),"",$_FILES['file']['name']);
+			$attachment = AttachmentModel::create([
+				'filename'  	=> $filename,
+				'atype'     	=> 4,
+				'attachment'    => request()->domain() ."/attachment/". str_replace("\\","/",$savename),
+				'createtime'	=> time() 
+			]);
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'   => "",
+				'data'  => array(
+					'src'	=> request()->domain() ."/attachment/". str_replace("\\","/",$savename),
+					'path'	=> "./attachment/". str_replace("\\","/",$savename),
+					'title'	=> $filename
+				)
+			)));
+		}else{
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'   => "上传失败,请稍后重试"
+			)));
+		}
+	}
+	
+	// 图片上传
+	public function tplFieldImage()
+	{
+		$file = request()->file("file");
+		$savename = \think\facade\Filesystem::disk('public')->putFile('images',$file);
+		if($file){
+			$filename = str_replace(strrchr($_FILES['file']['name'], "."),"",$_FILES['file']['name']);
+			$attachment = AttachmentModel::create([
+				'filename'  	=> $filename,
+				'atype'     	=> 1,
+				'attachment'    => request()->domain() ."/attachment/". str_replace("\\","/",$savename),
+				'createtime'	=> time() 
+			]);
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'   => "",
+				'data'  => array(
+					'src'	=> request()->domain() ."/attachment/". str_replace("\\","/",$savename),
+					'title'	=> $filename
+				)
+			)));
+		}else{
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'   => "上传失败,请稍后重试"
+			)));
+		}
+	}
+	
+	
+	
+	
+	// 图片
+	public function image()
+	{
+		$years = range( date('Y'), date('Y')-9 );
+		$months = array(
+			array('key'=>1, 'val'=>1),
+			array('key'=>2, 'val'=>2),
+			array('key'=>3, 'val'=>3),
+			array('key'=>4, 'val'=>4),
+			array('key'=>5, 'val'=>5),
+			array('key'=>6, 'val'=>6),
+			array('key'=>7, 'val'=>7),
+			array('key'=>8, 'val'=>8),
+			array('key'=>9, 'val'=>9),
+			array('key'=>10, 'val'=>10),
+			array('key'=>11, 'val'=>11),
+			array('key'=>12, 'val'=>12)
+		);
+		$yearmonth = array();
+		foreach ( $years as $key=>$value ){
+			$yearmonth[$key]['key'] = $value;
+			$yearmonth[$key]['val'] = $value;
+			$yearmonth[$key]['month'] = $months;
+		}
+		return view('attachment/image',[
+			'yearmonth' => json_encode($yearmonth)
+		]);
+	}
+	
+	public function listImage()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$map[] = ['atype', '=', 1];
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['filename', 'like', '%'.$keywords.'%'];
+		}
+		$yearmonth = input('yearmonth/s');
+		if (!empty($yearmonth)){
+			$yearmontharr = explode(",", $yearmonth);
+			if (!empty($yearmontharr[1])) {
+				$year = $yearmontharr[0];
+				$month = $yearmontharr[1];
+				$monthday = date("t",strtotime($year."-".$month));
+				$stime = mktime(0,0,0,$month,1,$year);
+				$etime = mktime(23,59,59,$month,$monthday,$year);
+				$map[] = ['createtime', 'between', [$stime,$etime]];
+			}else{
+				$year = $yearmontharr[0];
+				$stime = mktime(0,0,0,1,1,$year);
+				$etime = mktime(23,59,59,12,31,$year);
+				$map[] = ['createtime', 'between', [$stime,$etime]];
+			}
+		}
+		$list = AttachmentModel::where($map)->order(['id'=>'desc'])->limit($limit)->page($page)->select();
+		$count = AttachmentModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+
+	
+	
+	// 附件公共操作
+	public function fieldAttachment()
+	{
+		$id = input('id/d');
+		$attachment = AttachmentModel::findOrEmpty($id);
+		if ($attachment->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "附件信息不存在"
+			)));
+		}else{
+			$attachment->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delAttachment()
+	{
+		$idarr = input('idarr/a');
+		$attachment = AttachmentModel::whereIn('id',$idarr)->select();
+		foreach($attachment as $v){
+			$attachmenturl = str_replace( request()->domain(), ".", $v['attachment']);
+			@unlink( $attachmenturl );
+		}
+		$result = $attachment->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	
+}

+ 341 - 0
app/admin/controller/Broker.php

@@ -0,0 +1,341 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Config;
+use app\common\model\User as UserModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Agent as AgentModel;
+use app\common\model\Broker as BrokerModel;
+use app\common\model\Resident as ResidentModel;
+use app\common\model\BrokerForm as BrokerFormModel;
+
+use app\common\validate\Broker as BrokerValidate;
+use think\exception\ValidateException;
+
+class Broker extends BaseController
+{
+
+    public function brokerList()
+    {
+        $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+        $agentlist  = AgentModel::order(['id' => 'desc'])->select();
+        return view('broker/brokerlist', [
+            'workerlist' => $workerlist,
+            'agentlist'  => $agentlist,
+        ]);
+    }
+
+    public function brokerForm()
+    {
+        $id         = input('id/d, 0');
+        $broker     = BrokerModel::findOrEmpty($id);
+        $workerlist = WorkerModel::with(['agent', 'muser'])->order(['id' => 'desc'])->select();
+        return view('broker/brokerform', [
+            'workerlist' => $workerlist,
+            'broker'     => $broker,
+        ]);
+    }
+
+    public function editBroker()
+    {
+        $id   = input('id/d');
+        $data = [
+            'title'       => input('title/s', ""),
+            'mobile'      => input('mobile/s', ""),
+            'weixin'      => input('weixin/s', ""),
+            'qq'          => input('qq/s', ""),
+            'province'    => input('province/s', ""),
+            'city'        => input('city/s', ""),
+            'district'    => input('district/s', ""),
+            'details'     => input('details/s', ""),
+            'powerreport' => input('powerreport/d') == 1 ? 1 : 2,
+            'status'      => input('status/d') == 1 ? 1 : 2,
+        ];
+        if (empty($id)) {
+            $vdata = [
+                'id'     => $id,
+                'mobile' => input('mobile/s'),
+            ];
+            try {
+                validate(BrokerValidate::class)->check($vdata);
+            } catch (ValidateException $e) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => $e->getError(),
+                ]));
+            }
+
+            $muser = UserModel::where(['mobile' => input('musermobile/s', '')])->findOrEmpty();
+            if ($muser->isEmpty()) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "关联的用户不存在。",
+                ]));
+            }
+            $workeragentarr = explode(",", input('workeragent/s'));
+            $workerid       = isset($workeragentarr[0]) ? $workeragentarr[0] : 0;
+            $agentid        = isset($workeragentarr[1]) ? $workeragentarr[1] : 0;
+            if (empty($workerid) || empty($agentid)) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "请选择劳务公司和代理门店。",
+                ]));
+            }
+
+            $broker_user = BrokerModel::where('userid', $muser->id)->find();
+            if (!empty($broker_user)) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "该用户已是经纪人。",
+                ]));
+            }
+
+            $data['userid']     = $muser->id;
+            $data['workerid']   = $workerid;
+            $data['agentid']    = $agentid;
+            $data['createtime'] = time();
+            $broker             = BrokerModel::create($data);
+
+            event('brokerAdd', $broker);
+        } else {
+            $broker = BrokerModel::find($id);
+            $broker->save($data);
+        }
+
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function fieldBroker()
+    {
+        $id     = input('id/d', 0);
+        $broker = BrokerModel::findOrEmpty($id);
+        if ($broker->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $broker->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delBroker()
+    {
+        $access_admin = session('access_admin');
+        $password     = input('password');
+        if ($access_admin['password'] !== md5($password)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "操作密码验证失败",
+            ]));
+        }
+        $idarr      = input('idarr/a');
+        $user_check = UserModel::whereIn('brokerid', $idarr)->findOrEmpty();
+        if (!empty($user_check)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "该经纪人还有下线,请先转移再删除",
+            ]));
+        }
+        $user_ids       = BrokerModel::whereIn('id', $idarr)->column('userid');
+        $resident_check = ResidentModel::whereIn('userid', $user_ids)->findOrEmpty();
+        if (empty($resident_check)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "该经纪人是驻场老师,请取消驻场老师资格",
+            ]));
+        }
+
+        $result = BrokerModel::whereIn('id', $idarr)->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function listBroker()
+    {
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $workerid = input('workerid/d');
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $list  = BrokerModel::with(['worker', 'agent', 'muser'])->withCount(['user'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text', 'powerreport_text'])->select();
+        $count = BrokerModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+
+    // 申请注册经纪人
+    public function fbrokerList()
+    {
+        return view('broker/fbrokerlist');
+    }
+
+    public function fbrokerForm()
+    {
+        $id      = input('id/d, 0');
+        $fbroker = BrokerFormModel::findOrEmpty($id);
+        return view('broker/fbrokerform', [
+            'fbroker' => $fbroker,
+        ]);
+    }
+
+    public function editFbroker()
+    {
+        $id      = input('id/d');
+        $fbroker = BrokerFormModel::findOrEmpty($id);
+        $fbroker->save([
+            'realname'    => input('realname/s', ""),
+            'mobile'      => input('mobile/s', ""),
+            'address'     => input('address/s', ""),
+            'idcard'      => input('idcard/s', ""),
+            'recommender' => input('recommender/s', ""),
+            'status'      => input('status/d', 1),
+            'remark'      => input('remark/s', ""),
+            'createtime'  => input('createtime/s', ""),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function fieldFbroker()
+    {
+        $id   = input('id/d', 0);
+        $info = BrokerFormModel::findOrEmpty($id);
+        if ($info->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $info->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delFbroker()
+    {
+        $idarr   = input('idarr/a');
+        $fbroker = BrokerFormModel::whereIn('id', $idarr)->select();
+        $result  = $fbroker->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function listFbroker()
+    {
+        $limit    = input('limit');
+        $page     = input('page');
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['realname|mobile', 'like', '%' . $keywords . '%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list  = BrokerFormModel::where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text', 'powerreport_text'])->select();
+        $count = BrokerFormModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function brokerdefault()
+    {
+        $broker_id = Config::getConfigValue("default_broker");
+        $broker    = [];
+        if (!empty($broker_id)) {
+            $broker = BrokerModel::where('id', $broker_id)->find();
+        }
+
+        return view('broker/brokerdefault', [
+            'broker' => $broker,
+        ]);
+    }
+
+    public function brokerajax()
+    {
+        $keyword = input('keyword');
+        $list    = BrokerModel::where('title|mobile', 'like', "%{$keyword}%")->limit(10)->select();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+            'data' => $list,
+        ]));
+    }
+
+    public function editdefault()
+    {
+        $brokerid = input('brokerid/d',0);
+        if (empty($brokerid)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "请选择经纪人",
+            ]));
+        }
+
+        Config::setConfigValue('default_broker',$brokerid);
+        exit(json_encode(['code'  => 0]));
+    }
+}

+ 17 - 0
app/admin/controller/Captcha.php

@@ -0,0 +1,17 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\View;
+use app\admin\BaseController;
+
+class Captcha extends BaseController
+{
+
+    // 验证码表单
+    public function index()
+    {
+		// return View::fetch('captcha');
+        // return $this->fetch();
+    }
+
+}

+ 103 - 0
app/admin/controller/Cert.php

@@ -0,0 +1,103 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Cert as CertModel;
+
+class Cert extends BaseController
+{
+	
+	public function certList()
+	{
+		return view('appcenter/cert/certlist');
+	}
+	
+	public function certForm()
+	{
+		$id = input('id/d, 0');
+		$cert = CertModel::findOrEmpty($id);
+		return view('appcenter/cert/certform',[
+			'cert' => $cert
+		]);
+	}
+	
+	
+	public function listCert()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title|cnumber', '=', $keywords];
+		}
+		$list = CertModel::where($map)->order(['id'=>'desc'])->limit($limit)->page($page)->append(['stype_text'])->select();
+		$count = CertModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+	public function fieldCert()
+	{
+		$id = input('id/d');
+		$cert = CertModel::find($id);
+		if ($cert==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$cert->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	
+	public function editCert()
+	{
+		$id = input('id/d');
+		$data = array(
+			'title'			=> input('title/s', ""),
+			'cnumber'		=> input('cnumber/s', ""),
+			'tilpic'		=> input('tilpic/s', ""),
+			'remark'		=> input('remark/s', ""),
+			'createtime'	=> input('createtime/s', date('Y-m-d H:i'))
+		);
+		if (empty($id)){
+			CertModel::create($data);
+		}else{
+			$data['id'] = $id;
+			CertModel::update($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delCert()
+	{
+		$idarr = input('idarr/a');
+		CertModel::whereIn('id',$idarr)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+}

+ 34 - 0
app/admin/controller/Chuanglansms.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Config as ConfigModel;
+
+class Chuanglansms extends BaseController
+{
+
+    public function index()
+    {
+        $sms = ConfigModel::getConfigValue(['sms_chuanglan_appkey', 'sms_chuanglan_secret', 'examine_mobile']);
+        return view('set/chuanglansms', [
+            'sms' => $sms,
+        ]);
+    }
+
+    public function editSms()
+    {
+        $data = [
+            'sms_chuanglan_appkey' => input('sms_chuanglan_appkey/s'),
+            'sms_chuanglan_secret' => input('sms_chuanglan_secret/s'),
+            'examine_mobile'       => input('examine_mobile/s'),
+        ];
+        ConfigModel::setConfigValue($data);
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+}
+	

+ 109 - 0
app/admin/controller/Coach.php

@@ -0,0 +1,109 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\agent\BaseController;
+use app\common\model\Coach as CoachModel;
+use app\common\model\Agent as AgentModel;
+
+class Coach extends BaseController
+{
+
+    // 删除
+    public function delCoach()
+    {
+        $idarr = input('idarr/a');
+        CoachModel::whereIn('id', $idarr)->where('status', 1)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    // 编辑&添加
+    public function editCoach()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => '数据异常',
+            ]));
+        } else {
+            $coach = CoachModel::find($id);
+            if (empty($coach)) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => '数据异常',
+                ]));
+            }
+            CoachModel::update([
+                'id'        => $id,
+                'title'     => input('title/s'),
+                'content'   => input('content/s'),
+                'num'       => input('num/d'),
+                'status'    => input('status/d'),
+                'coachtime' => input('coachtime/s'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    // 列表
+    public function index()
+    {
+        $statuslist = CoachModel::$status;
+        $agentlist  = AgentModel::order(['id' => 'desc'])->where('status',1)->select();
+        return view('coach/coachlist', [
+            'statuslist' => $statuslist,
+            'agentlist' => $agentlist,
+        ]);
+    }
+
+    public function coachForm()
+    {
+        $id         = input('id/d, 0');
+        $coach      = CoachModel::findOrEmpty($id);
+        $statuslist = CoachModel::$status;
+
+        return view('coach/coachform', [
+            'coach'      => $coach,
+            'statuslist' => $statuslist,
+        ]);
+    }
+
+    public function listCoach()
+    {
+        $limit    = input('limit');
+        $page     = input('page');
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $agentid = input('agentid/d');
+        if (!empty($agentid)) {
+            $map[] = ['agentid', '=', $agentid];
+        }
+        $list  = CoachModel::with('agent')->where($map)->order(['id' => 'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = CoachModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+}

+ 650 - 0
app/admin/controller/Comjobs.php

@@ -0,0 +1,650 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Config;
+use app\common\model\RensheCode;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Comjobs as ComjobsModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+use app\common\model\ComjobsLog as ComjobsLogModel;
+use app\common\model\ComjobsStar as ComjobsStarModel;
+use app\common\model\ComjobsReport as ComjobsReportModel;
+use app\common\model\Broker as BrokerModel;
+
+use app\common\model\ComjobsShare as ComjobsShareModel;
+
+use app\common\model\WorkerThird;
+use app\common\service\RensheService;
+use app\common\validate\Comjobs as ComjobsValidate;
+use think\exception\ValidateException;
+
+class Comjobs extends BaseController
+{
+
+
+    // 报名记录
+    public function logList()
+    {
+        $workerlist = WorkerModel::with('comjobs')->order(['id' => 'desc'])->select();
+        return view('comjobs/loglist', [
+            'workerlist' => $workerlist,
+        ]);
+    }
+
+    public function delLog()
+    {
+        $idarr  = input('idarr/a');
+        $log    = ComjobsLogModel::whereIn('id', $idarr)->select();
+        $result = $log->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function fieldLog()
+    {
+        $id  = input('id/d', 0);
+        $log = ComjobsLogModel::findOrEmpty($id);
+        if ($log->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $log->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function listLog()
+    {
+        $limit            = input('limit/d', 20);
+        $page             = input('page/d', 1);
+        $map              = [];
+        $workercomjobsarr = explode(",", input('workercomjobs/s'));
+        $workerid         = isset($workercomjobsarr[0]) ? $workercomjobsarr[0] : 0;
+        $comjobsid        = isset($workercomjobsarr[1]) ? $workercomjobsarr[1] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        if (!empty($comjobsid)) {
+            $map[] = ['comjobsid', '=', $comjobsid];
+        }
+        $status = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list  = ComjobsLogModel::with(['user', 'worker', 'comjobs'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = ComjobsLogModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function exportLog()
+    {
+        $map              = [];
+        $workercomjobsarr = explode(",", input('workercomjobs/s'));
+        $workerid         = isset($workercomjobsarr[0]) ? $workercomjobsarr[0] : 0;
+        $comjobsid        = isset($workercomjobsarr[1]) ? $workercomjobsarr[1] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        if (!empty($comjobsid)) {
+            $map[] = ['comjobsid', '=', $comjobsid];
+        }
+        $status = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $xlsData = ComjobsLogModel::with(['user', 'worker', 'comjobs'])->where($map)->order('id', 'DESC')->append(['status_text'])->select()->toArray();
+        $xlsCell = [
+            ['id', '表ID'],
+            ['user.nickname', '昵称'],
+            ['user.realname', '姓名'],
+            ['user.mobile', '手机号'],
+            ['worker.title', '劳务公司'],
+            ['comjobs.title', '招聘标题'],
+            ['status_text', '公司反馈'],
+            ['remark', '反馈备注'],
+            ['createtime', '报名时间'],
+        ];
+        export_excel("招聘报名记录", $xlsCell, $xlsData);
+    }
+
+
+    // 企业招聘
+    public function comjobsList()
+    {
+        $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+        $catelist   = ComjobsCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        return view('comjobs/comjobslist', [
+            'workerlist' => $workerlist,
+            'catelist'   => $catelist,
+        ]);
+    }
+
+    public function comjobsForm()
+    {
+        $id            = input('id/d, 0');
+        $comjobs       = ComjobsModel::findOrEmpty($id);
+        $workerlist    = WorkerModel::order(['id' => 'desc'])->select();
+        $catelist      = ComjobsCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        $agelist       = RensheCode::getList('age');
+        $educationlist = RensheCode::getList('education');
+        $emptimelist   = RensheCode::getList('emp_time');
+        $welfarelist   = RensheCode::getList('welfare');
+        return view('comjobs/comjobsform', [
+            'catelist'      => $catelist,
+            'workerlist'    => $workerlist,
+            'agelist'       => $agelist,
+            'educationlist' => $educationlist,
+            'emptimelist'   => $emptimelist,
+            'welfarelist'   => $welfarelist,
+            'comjobs'       => $comjobs,
+        ]);
+    }
+
+    public function editComjobs()
+    {
+        $id      = input('id/d', 0);
+        $wtype   = input('wtype/d', 1);
+        $zwagall = $wtype == 1 ? input('zwagall/s', "") : '';
+        $data    = [
+            'workerid'         => input('workerid/d', 0),
+            'title'            => input('title/s', ""),
+            'cateid'           => input('cateid/d', 0),
+            'province'         => input('province/s', ""),
+            'city'             => input('city/s', ""),
+            'district'         => input('district/s', ""),
+            'agegroup'         => input('agegroup/s', ""),
+            'tags'             => array_values(input('tags/a', [])),
+            'requirement'      => input('requirement/s', ""),
+            'comdetails'       => input('comdetails/s', ""),
+            'companydetails'   => input('companydetails/s', ""),
+            'retmoney'         => input('retmoney/d', ""),
+            'picall'           => input('picall/a', []),
+            'recruit_num'      => input('recruit_num/d', 1),
+            'wtype'            => $wtype,
+            'zwagall'          => $zwagall,
+            'telephone'        => input('telephone/s', ""),
+            'remark'           => input('remark/s', ""),
+            'status'           => input('status/d', 1),
+            'num'              => input('num/d', 1),
+            'priority'         => input('priority/d', 0),
+            'updatetime'       => input('updatetime/s', ""),
+            'createtime'       => input('createtime/s', ""),
+            'volume'           => input('volume/d', 0),
+            'recruitment_cate' => input('recruitment_cate/d', 1),
+            'latitude'         => input('latitude/f', 0),
+            'longitude'        => input('longitude/f', 0),
+            'address'          => input('address/s', ''),
+            'is_worry'         => input('is_worry/d', 0),
+            'education'        => input('education/s', ''),
+            'emp_time'         => array_values(input('emp_time/a', [])),
+        ];
+        try {
+            validate(ComjobsValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => $e->getError(),
+            ]));
+        }
+        if (empty($id)) {
+            $data['video'] = input('new_video/s', "");
+            ComjobsModel::create($data);
+        } else {
+
+            $old_video = input('old_video/s', '');
+            $new_video = input('new_video/s', '');
+            if (!empty($new_video)) {
+                $data['video'] = $new_video;
+            } else {
+                if (!empty($old_video)) {
+                    $data['video'] = $old_video;
+                }
+            }
+
+            $comjobs = ComjobsModel::find($id);
+            ComjobsLogModel::update(['workerid' => input('workerid/d', 0)], ['comjobsid' => $comjobs->id]);
+            $comjobs->save($data);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function fieldComjobs()
+    {
+        $id      = input('id/d', 0);
+        $comjobs = ComjobsModel::findOrEmpty($id);
+        if ($comjobs->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $comjobs->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delComjobs()
+    {
+        $idarr = input('idarr/a');
+        ComjobsLogModel::whereIn('comjobsid', $idarr)->delete();
+        ComjobsStarModel::whereIn('comjobsid', $idarr)->delete();
+        ComjobsReportModel::whereIn('comjobsid', $idarr)->delete();
+        $result = ComjobsModel::destroy($idarr, true);
+
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function listComjobs()
+    {
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $keywords = input('keywords/s', "");
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $workerid = input('workerid/d', 0);
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $cateid = input('cateid/d', 0);
+        if (!empty($cateid)) {
+            $map[] = ['cateid', '=', $cateid];
+        }
+        $wtype = input('wtype/d');
+        if (!empty($wtype)) {
+            $map[] = ['wtype', '=', $wtype];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $daterange = input('daterange/s', "");
+        if (!empty($daterange)) {
+            $daterangearr = explode("~", $daterange);
+            $map[]        = ['createtime', '>= time', trim($daterangearr[0])];
+            $map[]        = ['createtime', '<= time', trim($daterangearr[1])];
+        }
+//        $list  = ComjobsModel::with(['worker', 'comjobsCate'])->withCount(['comjobsLog'])->where($map)->order(['priority' => 'desc', 'id' => 'desc'])->limit($limit)->page($page)->append(['wtype_text', 'status_text'])->select();
+        $list  = ComjobsModel::with(['worker', 'comjobsCate'])->withCount(['comjobsLog'])->where($map)->order(['updatetime' => 'desc'])->limit($limit)->page($page)->append(['wtype_text', 'status_text'])->select();
+        $count = ComjobsModel::where($map)->count();
+
+        $list = $list->toArray();
+        foreach ($list as $k => $v) {
+            if (!empty($v['company_name'])) {
+                $list[$k]['worker']['title'] = $v['company_name'];
+            }
+        }
+
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    // 岗位类型
+    public function cateList()
+    {
+        return view('comjobs/catelist');
+    }
+
+    public function cateForm()
+    {
+        $id       = input('id/d', 0);
+        $cate     = ComjobsCateModel::findOrEmpty($id);
+        $catelist = ComjobsCateModel::where('pid', 0)->select();
+        return view('comjobs/cateform', [
+            'cate'     => $cate,
+            'catelist' => $catelist,
+        ]);
+    }
+
+    public function listCate()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+        $list  = ComjobsCateModel::with('pcate')->order(['pid' => 'asc', 'priority' => 'desc'])->limit($limit)->page($page)->select();
+        $count = ComjobsCateModel::count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function fieldCate()
+    {
+        $id   = input('id/d', 0);
+        $info = ComjobsCateModel::find($id);
+        $info->save([
+            input('field/s') => input('value/s', ""),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function editCate()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            $cate = ComjobsCateModel::create([
+                'title'    => input('title/s', ""),
+                'pid'      => input('pid/d', 0),
+                'priority' => input('priority/d', 0),
+            ]);
+        } else {
+            $cate = ComjobsCateModel::find($id);
+            $cate->save([
+                'title'    => input('title/s', ""),
+                'pid'      => input('pid/d', 0),
+                'priority' => input('priority/d', 0),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delCate()
+    {
+        $id     = input('id/d');
+        $cate   = ComjobsCateModel::where('id', $id)->select();
+        $result = $cate->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+
+    // 推广海报
+    public function shareList()
+    {
+        return view('comjobs/sharelist', []);
+    }
+
+    public function shareForm()
+    {
+        $id    = input('id/d', 0);
+        $share = ComjobsShareModel::findOrEmpty($id);
+        return view('comjobs/shareform', [
+            'share' => $share,
+        ]);
+    }
+
+    public function editShare()
+    {
+        $id   = input('id/d', 0);
+        $data = [
+            'title'    => input('title/s', ""),
+            'tilpic'   => input('tilpic/s', ""),
+            'status'   => input('status/d', 1),
+            'priority' => input('priority/d', 0),
+        ];
+        if (empty($id)) {
+            $share = ComjobsShareModel::create($data);
+        } else {
+            $share = ComjobsShareModel::find($id);
+            $share->save($data);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function listShare()
+    {
+        $limit  = input('limit');
+        $page   = input('page');
+        $map    = [];
+        $status = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list  = ComjobsShareModel::where($map)->order(['priority' => 'desc', 'id' => 'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = ComjobsShareModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function fieldShare()
+    {
+        $id   = input('id/d', 0);
+        $info = ComjobsShareModel::find($id);
+        $info->save([
+            input('field/s') => input('value/s', ""),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delShare()
+    {
+        $id     = input('id/d', 0);
+        $share  = ComjobsShareModel::where('id', $id)->select();
+        $result = $share->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function synRenshe()
+    {
+        //发送数据
+        $id      = input('id/d', 0);
+        $service = new RensheService();
+        $res     = $service->jobInfoByComId($id);
+
+        if ($res['code'] == 200) {
+            return json(['code' => 0]);
+        } else {
+            return json([
+                'code' => 1,
+                'msg'  => '网络异常,请重试',
+            ]);
+        }
+    }
+
+    public function import()
+    {
+        $data       = ['cate', 'title', 'type', 'zwagall', 'community', 'province', 'city', 'district', 'education', 'agegroup', 'tags', 'comdetails', 'requirement',
+                       'worker', 'telephone', 'name', 'address', 'time', 'emp_time', 'is_worry'];
+        $list       = importExecl('2.xlsx', $data, 1);
+        $data       = [];
+        $wtype      = ['按月' => 1, '按时' => 2, '按件' => 3, '按项目' => 4, '其他' => 5];
+        $rensheCode = RensheCode::select();
+        $renshe     = [];
+        foreach ($rensheCode as $v) {
+            $renshe[$v['type']][$v['name']] = $v['code'];
+        }
+        $cateList = ComjobsCateModel::column('id', 'title');
+
+        foreach ($list as $v) {
+            if (empty($v['cate'])) {
+                continue;
+            }
+            $item             = [];
+            $third            = WorkerThird::create(['name' => $v['worker'], 'contact' => $v['name']]);
+            $item['third_id'] = $third['id'];
+            $item['cateid']   = empty($cateList[$v['cate']]) ? '' : $cateList[$v['cate']];
+            $item['title']    = $v['title'];
+            $item['wtype']    = $wtype[$v['type']];
+            $item['zwagall']  = $item['bwagall'] = $v['zwagall'];
+            if (!empty($renshe['community'][$v['community']])) {
+                $item['community'] = $renshe['community'][$v['community']];
+            }
+            $item['province'] = $v['province'];
+            $item['city']     = $v['city'];
+            $item['district'] = $v['district'];
+            if (!empty($renshe['education'][$v['education']])) {
+                $item['education'] = $v['education'];
+            }
+            if (!empty($renshe['age'][$v['agegroup']])) {
+                $item['agegroup'] = $v['agegroup'];
+            }
+            $tags = explode(',', $v['tags']);
+            if (empty($tags[0])) {
+                $tags = [];
+            }
+            $item['tags']        = $tags;
+            $item['comdetails']  = (string)$v['comdetails'];
+            $item['requirement'] = (string)$v['requirement'];
+            $item['workerid']    = 8;
+            $item['telephone']   = (string)$v['telephone'];
+            $item['address']     = (string)$v['address'];
+            $emp_time            = explode(',', $v['emp_time']);
+            if (empty($emp_time[0])) {
+                $emp_time = [];
+            }
+            $item['emp_time']       = $emp_time;
+            $item['is_worry']       = $v['is_worry'] ? $v['is_worry'] : 0;
+            $item['picall']         = [];
+            $item['companydetails'] = '';
+            $item['video']          = '';
+            $item['priority']       = 0;
+            $item['status']         = 3;
+            $item['enddate']        = 1664553599;
+            $item['createtime']     = $item['updatetime'] = time();
+            $data[]                 = $item;
+        }
+        foreach ($data as $v) {
+            ComjobsModel::create($v);
+        }
+
+    }
+
+    /**
+     * 代报名
+     */
+    public function comjobsreport()
+    {
+        $id = input('id/d', 0);
+        if (empty($id)) {
+            return json([
+                'code' => 1,
+                'msg'  => '网络异常,请重试',
+            ]);
+        }
+        $comjobs = ComjobsModel::with('worker')->findOrEmpty($id);
+        if (empty($comjobs)) {
+            return json([
+                'code' => 1,
+                'msg'  => '网络异常,请重试',
+            ]);
+        }
+
+        return view('comjobs/comjobsreport', [
+            'comjobs' => $comjobs,
+        ]);
+    }
+
+    /**
+     * 代报名提交
+     */
+    public function submitreport()
+    {
+        $data = [
+            'comjobsid' => input('comjobsid/d',0),
+            'realname' => input('realname/s',''),
+            'mobile' => input('mobile/s',''),
+            'idcard' => input('idcard/s',''),
+            'arrivetime' => input('arrivetime/s',''),
+            'remark' => input('remark/s',''),
+        ];
+
+        //数据处理
+        $data['createtime'] = time();
+        $brokerid = Config::getConfigValue('default_broker');
+        $broker = BrokerModel::findOrEmpty($brokerid);
+        $data['workerid'] = $broker['workerid'];
+        $data['agentid'] = $broker['agentid'];
+        $data['brokerid'] = $broker['id'];
+
+        //代报名
+        ComjobsReportModel::create($data);
+        return json(['code' => 0]);
+    }
+
+}

+ 394 - 0
app/admin/controller/Comjobsreport.php

@@ -0,0 +1,394 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\ComjobsReport as ComjobsReportModel;
+use app\common\model\ReportLog as ReportLogModel;
+
+use app\common\model\Comjobs as ComjobsModel;
+use app\common\model\Agent as AgentModel;
+
+use app\common\validate\Report as ReportValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+
+class Comjobsreport extends BaseController
+{
+
+
+	// 报备记录
+	public function reportList()
+	{
+		$comjobslist = ComjobsModel::select();
+		$agentlist = AgentModel::order(['id'=>'desc'])->select();
+		$statusarr = array(1=>'待审核', 2=>'待面试', 3=>'已入职', 4=>'无效报备');
+		return view('comjobsreport/reportlist',[
+			'comjobslist'	=> $comjobslist,
+			'agentlist'		=> $agentlist,
+			'statusarr'		=> $statusarr
+		]);
+	}
+
+    // 报备记录(待审核)
+    public function reportExamine()
+    {
+        $comjobslist = ComjobsModel::select();
+        $agentlist = AgentModel::order(['id'=>'desc'])->select();
+        $statusarr = array(1=>'待审核', 2=>'待面试', 3=>'已入职', 4=>'无效报备');
+        return view('comjobsreport/reportexamine',[
+            'comjobslist'	=> $comjobslist,
+            'agentlist'		=> $agentlist,
+            'statusarr'		=> $statusarr
+        ]);
+    }
+	
+	public function listReport()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+
+		$map = array();
+        $date6 = input('date6');
+
+        if(!empty($date6))
+        {
+            $date6 =explode('~',$date6);
+            $startTime = strtotime($date6[0]);
+            $endTime = strtotime($date6[1]);
+            $map[] = ['createtime', 'between', [$startTime,$endTime]];
+        }
+
+		$comjobsid = input('comjobsid/d', 0);
+		if (!empty($comjobsid)){
+			$map[] = ['comjobsid', '=', $comjobsid];
+		}
+		$agentid = input('agentid/s', "");
+		if ($agentid!=""){
+			$map[] = ['agentid', '=', intval($agentid)];
+		}
+		$status = input('status/d', 0);
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = ComjobsReportModel::with(['comjobs','agent','broker'])->where($map)->order('id','DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = ComjobsReportModel::where($map)->count();
+
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list 
+		)));
+	}
+
+	
+	public function exportReport()
+	{
+		$map = array();
+		$comjobsid = input('comjobsid/d', 0);
+		if (!empty($comjobsid)){
+			$map[] = ['comjobsid', '=', $comjobsid];
+		}
+		$agentid = input('agentid/d', 0);
+		if (!empty($agentid)){
+			$map[] = ['agentid', '=', $agentid];
+		}
+		$status = input('status/d', 0);
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$xlsData = ComjobsReportModel::with(['comjobs','agent','broker'])->where($map)->order('id','DESC')->append(['status_text'])->select()->toArray();
+		$xlsCell = array(
+			array('id','表ID'),
+			array('comjobs.title','招聘标题'),
+			array('agent.title','代理门店'),
+			array('broker.title','经纪人'),
+			array('realname','姓名'),
+			array('mobile','手机号'),
+			array('idcard','身份证号'),
+			array('arrivetime','预计到达时间'),
+			array('remark','报名备注'),
+			array('status_text','状态'),
+			array('createtime','接单时间')
+		);
+		export_excel("报备记录",$xlsCell,$xlsData);
+	}
+	
+	public function setComtype()
+	{
+		$idarr = input('idarr/a');
+		$comjobsid = input('comjobsid/d', 0);
+		$comjobs = ComjobsModel::with(['company'])->findOrEmpty($comjobsid);
+		if ($comjobs->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "请选择招聘信息和代理门店"
+			)));
+		}
+		$data = [
+			'comjobsid'			=> $comjobs->id,
+			'comtype'			=> input('comtype/s', ""),
+			'comprice'			=> input('comprice/s', ""),
+			'comremark'			=> input('comremark/s', ""),
+			'updatetime'		=> input('updatetime/s', date("Y-m-d H:i"))
+		];
+		ComjobsReportModel::whereIn('id',$idarr)->update($data);
+		$reportall = ComjobsReportModel::whereIn('id',$idarr)->select()->toArray();
+		$logdata = array();
+		$statusarr = array(1=>'待审核', 2=>'待面试', 3=>'已入职', 4=>'无效报备');
+		$agentall = AgentModel::column('realname', 'id');
+		foreach($reportall as $key=>$item){
+			$logdata[] = array(
+				'reportid'		=> $item['id'],
+				'logstatus'		=> $statusarr[$item['status']],
+				'editrealname'	=> "管理员",
+				'comjobstil'	=> $comjobs->isEmpty() ? "" : $comjobs->title,
+				'agenttil'		=> empty($agentall[$item['agentid']]) ? "未报备" : $agentall[$item['agentid']],
+				'realname'		=> $item['realname'],
+				'mobile'		=> $item['mobile'],
+				'idcard'		=> $item['idcard'],
+				'comtype'		=> input('comtype/s', ""),
+				'comprice'		=> input('comprice/s', ""),
+				'comremark'		=> input('comremark/s', ""),
+				'arrivetime'	=> $item['arrivetime'],
+				'remark'		=> $item['remark'],
+				'createtime'	=> date("Y-m-d H:i")
+			);
+		}
+		$reportlog = new ReportLogModel;
+		$reportlog->saveAll($logdata);
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+	
+	public function setStatus()
+	{
+		$idarr = input('idarr/a');
+		$status = input('status/d', 1);
+		ComjobsReportModel::whereIn('id',$idarr)->update(['status'=>$status]);
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+	
+	public function delReport()
+	{
+		$idarr = input('idarr/a');
+
+        $ComjobsReport = ComjobsReportModel::whereIn('id',$idarr)->select();
+        $result = $ComjobsReport->delete();
+
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function reportImport()
+	{
+		$id = input('id/d, 0');
+		$comjobslist = ComjobsModel::with(['comjobsRefund.agentGroups'])->order(['id'=>'desc'])->select();
+		$agentlist = AgentModel::order(['id'=>'asc'])->select();
+		return view('comjobsreport/reportimport',[
+			'comjobslist'	=> $comjobslist,
+			'agentlist'		=> $agentlist
+		]);
+	}
+	
+	public function importReport()
+	{
+		$execlfile = input('execlfile/s', "");
+		if (empty($execlfile)){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "请上传导入文件"
+			)));
+		}
+		$comjobsid = input('comjobsid/d', 0);
+		$comjobs = ComjobsModel::findOrEmpty($comjobsid);
+		$agentid = input('agentid/d', 0);
+		$agent = AgentModel::findOrEmpty($agentid);
+		$filedata = read_excel( $execlfile );
+		$sucnumber = 0;
+		$errnumber = 0;
+		$errarr = "";
+		$statusarr = array(1=>'待审核', 2=>'待面试', 3=>'已入职', 4=>'无效报备');
+		foreach( $filedata as $k=>$v ){
+			$tabcomjobsid = intval($v[1]);
+			if (empty($tabcomjobsid)){
+				$tabcomjobs = $comjobs;
+			}else{
+				$tabcomjobs = ComjobsModel::findOrEmpty($tabcomjobsid);
+			}
+			$tabagentid = intval($v[2]);
+			if (empty($tabagentid)){
+				$tabagent = $agent;
+			}else{
+				$tabagent = AgentModel::findOrEmpty($tabagentid);
+			}
+			if( $tabcomjobs->isEmpty() ){
+				$errarr .= $v[0] . ",";
+				$errnumber++;
+				continue;
+			}else{
+				$data = array(
+					'comjobsid'			=> $tabcomjobs->id,
+					'agentid'			=> $tabagent->isEmpty() ? 0 : $tabagent->id,
+					'brokerid'			=> 0,
+					'realname'			=> trim($v[3]),
+					'mobile'			=> trim($v[4]),
+					'idcard'			=> trim($v[5]),
+					'gender'			=> trim($v[6])=='男' ? 1 : 2,
+					'comtype'			=> empty(trim($v[7])) ? trim($v[7]) : input('comtype/s', ""),
+					'comprice'			=> empty(trim($v[8])) ? trim($v[8]) : input('comprice/s', ""),
+					'comremark'			=> empty(trim($v[9])) ? trim($v[9]) : input('comremark/s', ""),
+					'arrivetime'		=> trim($v[10]),
+					'remark'			=> trim($v[11]),
+					'status'			=> intval($v[12]),
+					'updatetime'		=> date("Y-m-d H:i"),
+					'createtime'		=> date("Y-m-d H:i")
+				);
+				try {
+				    validate(ReportValidate::class)->check($data);
+				} catch (ValidateException $e) {
+					$errarr .= $v[0] . ",";
+					$errnumber++;
+					continue;
+				}
+				$report = new ComjobsReportModel;
+				$report->save($data);
+				$logdata = array(
+					'reportid'		=> $report->id,
+					'logstatus'		=> $statusarr[$report->status],
+					'editrealname'	=> "管理员",
+					'comjobstil'	=> $tabcomjobs->title,
+					'agenttil'		=> $tabagent->isEmpty() ? "未报备" : $tabagent->title,
+					'realname'		=> trim($v[3]),
+					'mobile'		=> trim($v[4]),
+					'idcard'		=> trim($v[5]),
+					'comtype'		=> empty(trim($v[7])) ? trim($v[7]) : input('comtype/s', ""),
+					'comprice'		=> empty(trim($v[8])) ? trim($v[8]) : input('comprice/s', ""),
+					'comremark'		=> empty(trim($v[9])) ? trim($v[9]) : input('comremark/s', ""),
+					'arrivetime'	=> trim($v[10]),
+					'remark'		=> trim($v[11]),
+					'createtime'	=> date("Y-m-d H:i")
+				);
+				ReportLogModel::create($logdata);
+				$sucnumber++;
+			}
+		}
+		exit(json_encode(array(
+			'code' 			=> 0,
+			'sucnumber'		=> $sucnumber,
+			'errnumber'		=> $errnumber,
+			'errarr'		=> $errarr
+		)));
+	}
+	
+	
+	public function reportForm()
+	{
+		$id = input('id/d, 0');
+		$comjobslist = ComjobsModel::field('id,title,workerid')->order(['id'=>'desc'])->select();
+		$agentlist = AgentModel::with('broker')->order(['id'=>'asc'])->select();
+		$report = ComjobsReportModel::with(['comjobs','agent','broker'])->append(['gender_text','status_text'])->findOrEmpty($id);
+		$statusarr = array(1=>'待审核', 2=>'待面试', 3=>'已入职', 4=>'无效报备');
+		return view('comjobsreport/reportform',[
+			'comjobslist'	=> $comjobslist,
+			'agentlist'		=> $agentlist,
+			'report'		=> $report,
+			'statusarr'		=> $statusarr
+		]);
+	}
+	 
+	public function editReport()
+	{
+		$id = input('id/d', 0);
+		$comjobsid = input('comjobsid/d', 0);
+		$agentbrokerarr = explode(",", input('agentbroker/s'));
+		$agentid = isset($agentbrokerarr[0]) ? $agentbrokerarr[0] : 0;
+		$brokerid = isset($agentbrokerarr[1]) ? $agentbrokerarr[1] : 0;
+
+		$comjobs_data = Db::name("comjobs")
+                        ->field('id,workerid,title')
+                        ->where('id',$comjobsid)
+                        ->find();
+
+		$data = array(
+			'comjobsid'			=> $comjobsid,
+			'agentid'			=> $agentid,
+			'brokerid'			=> $brokerid,
+			'workerid'			=> $comjobs_data['workerid'],
+			'realname'			=> input('realname/s', ""),
+			'mobile'			=> input('mobile/s', ""),
+			'idcard'			=> input('idcard/s', ""),
+			'arrivetime'		=> input('arrivetime/s', ""),
+			'remark'			=> input('remark/s', ""),
+			'status'			=> input('status/d', 1),
+			'updatetime'		=> input('updatetime/s', date("Y-m-d H:i")),
+			'createtime'		=> input('createtime/s', date("Y-m-d H:i"))
+		);
+		if (empty($id)){
+			$report = new ComjobsReportModel;
+			$report->save($data); 
+		}else{
+			$report = ComjobsReportModel::find($id);
+			$report->save($data); 
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	// 记录
+	public function logList()
+	{
+		$reportid = input('reportid/d',0);
+		$report = ComjobsReportModel::findOrEmpty($reportid);
+		return view('comjobsreport/loglist',[
+			'reportid'		=> $reportid,
+			'report'		=> $report
+		]); 
+	}
+	
+	public function listLog()
+	{
+		$limit = input('limit/d',50);
+		$page = input('page/d',1);
+		$map = array();
+		$map[] = ['reportid', '=', input('reportid/d',0)];
+        $map[] = ['delstatus', '<>', 2];
+		$list = ReportLogModel::with(['report'])->where($map)->order(['id'=>'desc'])->limit($limit)->page($page)->select();
+		$count = ReportLogModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+
+}

+ 711 - 0
app/admin/controller/Demand.php

@@ -0,0 +1,711 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Demand as DemandModel;
+use app\common\model\DemandOther as DemandOtherModel;
+use app\common\model\DemandCate as DemandCateModel;
+use app\common\model\DemandLog as DemandLogModel;
+use app\common\model\DemandSnatch as DemandSnatchModel;
+use app\common\model\DemandReport as DemandReportModel;
+
+use app\common\validate\Demand as DemandValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+use think\facade\Request;
+
+class Demand extends BaseController
+{
+
+
+    // 报名记录
+    /*public function logList()
+    {
+        $workerlist = WorkerModel::with('demand')->order(['id' => 'desc'])->select();
+        return view('demand/loglist', [
+            'workerlist' => $workerlist,
+        ]);
+    }*/
+
+    public function logList()
+    {
+        if (Request::isAjax()) {
+            $limit = input('limit/d', 20);
+            $page  = input('page/d', 1);
+            $map   = $this->dealLikeInput([], ['realname', 'mobile', 'idcard']);
+
+            $list  = DemandReportModel::with(['demand','snatch','snatch.worker','worker','agent', 'broker'])
+                ->where($map)
+                ->order(['id' => 'desc'])
+                ->limit($limit)
+                ->page($page)
+                ->select();
+            $count = DemandReportModel::where($map)->count();
+            if ($count == 0) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "未查询到数据",
+                ]));
+            }
+            exit(json_encode([
+                'code'  => 0,
+                'msg'   => "",
+                'count' => $count,
+                'data'  => $list,
+            ]));
+
+        } else {
+            return view('demand/loglist');
+        }
+    }
+
+    public function delLog()
+    {
+        $idarr  = input('idarr/a');
+        $log    = DemandLogModel::whereIn('id', $idarr)->select();
+        $result = $log->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function fieldLog()
+    {
+        $id  = input('id/d', 0);
+        $log = DemandLogModel::findOrEmpty($id);
+        if ($log->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $log->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function listLog()
+    {
+        $limit           = input('limit/d', 20);
+        $page            = input('page/d', 1);
+        $map             = [];
+        $workerdemandarr = explode(",", input('workerdemand/s'));
+        $workerid        = isset($workerdemandarr[0]) ? $workerdemandarr[0] : 0;
+        $demandid        = isset($workerdemandarr[1]) ? $workerdemandarr[1] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        if (!empty($demandid)) {
+            $map[] = ['demandid', '=', $demandid];
+        }
+        $list  = DemandLogModel::with(['gworker', 'worker', 'demand'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->select();
+        $count = DemandLogModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function exportLog()
+    {
+        $map             = [];
+        $workerdemandarr = explode(",", input('workerdemand/s'));
+        $workerid        = isset($workerdemandarr[0]) ? $workerdemandarr[0] : 0;
+        $demandid        = isset($workerdemandarr[1]) ? $workerdemandarr[1] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        if (!empty($demandid)) {
+            $map[] = ['demandid', '=', $demandid];
+        }
+        $xlsData = DemandLogModel::with(['gworker', 'worker', 'demand'])->where($map)->order('id', 'DESC')->select()->toArray();
+        $xlsCell = [
+            ['id', '表ID'],
+            ['gworker.title', '接单公司名称'],
+            ['gworker.realname', '接单公司联系人姓名'],
+            ['gworker.mobile', '接单公司联系人手机号'],
+            ['worker.title', '发单公司'],
+            ['demand.title', '订单标题'],
+            ['createtime', '接单时间'],
+        ];
+        export_excel("接单报名记录", $xlsCell, $xlsData);
+    }
+
+
+    // 企业招聘
+    public function demandList()
+    {
+        $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+        $catelist   = DemandCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        return view('demand/demandlist', [
+            'workerlist' => $workerlist,
+            'catelist'   => $catelist,
+        ]);
+    }
+
+    public function demandForm()
+    {
+        $id         = input('id/d, 0');
+        $demand     = DemandModel::findOrEmpty($id);
+        $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+        $catelist   = DemandCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        return view('demand/demandform', [
+            'catelist'   => $catelist,
+            'workerlist' => $workerlist,
+            'demand'     => $demand,
+        ]);
+    }
+
+    public function editDemand()
+    {
+        $id      = input('id/d', 0);
+        $wtype   = input('wtype/d', 1);
+        $type    = input('type/d', 1);
+        $zwagall = $wtype == 1 ? input('zwagall/s', "") : '';
+        $data    = [
+            'workerid'    => input('workerid/d', 0),
+            'title'       => input('title/s', ""),
+            'num'         => input('num/d', 1),
+            'cateid'      => input('cateid/d', 0),
+            'province'    => input('province/s', ""),
+            'city'        => input('city/s', ""),
+            'district'    => input('district/s', ""),
+            'agegroup'    => input('agegroup/s', ""),
+            'tags'        => input('tags/a', []),
+            'enddate'     => input('enddate/s', ""),
+            'requirement' => input('requirement/s', ""),
+            'comdetails'  => input('comdetails/s', ""),
+            'type'        => $type,
+            'wtype'       => $wtype,
+            'bwagall'     => input('bwagall/s', ""),
+            'zwagall'     => $zwagall,
+            'ftype'       => input('ftype/d', 1),
+            'fwagall'     => input('fwagall/s', ""),
+            'telephone'   => input('telephone/s', ""),
+            'remark'      => input('remark/s', ""),
+            'status'      => input('status/d', 1),
+            'isfree'      => input('isfree/d', 1),
+            'priority'    => input('priority/d', 0),
+            'updatetime'  => input('updatetime/s', ""),
+            'createtime'  => input('createtime/s', ""),
+            'volume'      => input('volume/d', 0),
+        ];
+        try {
+            validate(DemandValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => $e->getError(),
+            ]));
+        }
+        if (empty($id)) {
+            $data['telearr'] = [];
+            $data['video']   = input('new_video/s', "");
+            $demand          = DemandModel::create($data);
+        } else {
+
+            $old_video = input('old_video/s', '');
+            $new_video = input('new_video/s', '');
+            if (!empty($new_video)) {
+                $data['video'] = $new_video;
+            } else {
+                if (!empty($old_video)) {
+                    $data['video'] = $old_video;
+                }
+            }
+
+            $demand = DemandModel::find($id);
+            DemandLogModel::update(['workerid' => input('workerid/d', 0)], ['demandid' => $demand->id]);
+            $demand->save($data);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function fieldDemand()
+    {
+        $id     = input('id/d', 0);
+        $demand = DemandModel::findOrEmpty($id);
+        if ($demand->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $demand->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delDemand()
+    {
+        $idarr = input('idarr/a');
+        DemandLogModel::whereIn('demandid', $idarr)->delete();
+        $result = Db::name('demand')->whereIn('id', $idarr)->update(['deletetime' => time()]);
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function listDemand()
+    {
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $keywords = input('keywords/s', "");
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $workerid = input('workerid/d', 0);
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $cateid = input('cateid/d', 0);
+        if (!empty($cateid)) {
+            $map[] = ['cateid', '=', $cateid];
+        }
+        $wtype = input('wtype/d');
+        if (!empty($wtype)) {
+            $map[] = ['wtype', '=', $wtype];
+        }
+        $ftype = input('ftype/d');
+        if (!empty($ftype)) {
+            $map[] = ['ftype', '=', $ftype];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $isfree = input('isfree/d', 0);
+        if (!empty($isfree)) {
+            $map[] = ['isfree', '=', $isfree];
+        }
+        $daterange = input('daterange/s', "");
+        if (!empty($daterange)) {
+            $daterangearr = explode("~", $daterange);
+            $map[]        = ['createtime', '>= time', trim($daterangearr[0])];
+            $map[]        = ['createtime', '<= time', trim($daterangearr[1])];
+        }
+        $list  = DemandModel::with(['worker', 'demandCate'])->withCount(['demandLog'])->where($map)->order(['priority' => 'desc', 'id' => 'desc',])->limit($limit)->page($page)->append(['wtype_text', 'ftype_text', 'status_text', 'isfree_text'])->select();
+        $count = DemandModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    // 岗位类型
+    public function cateList()
+    {
+        return view('demand/catelist');
+    }
+
+    public function cateForm()
+    {
+        $id   = input('id/d', 0);
+        $cate = DemandCateModel::findOrEmpty($id);
+        return view('demand/cateform', [
+            'cate' => $cate,
+        ]);
+    }
+
+    public function listCate()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+        $list  = DemandCateModel::order(['priority' => 'desc', 'id' => 'desc'])->limit($limit)->page($page)->select();
+        $count = DemandCateModel::count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function fieldCate()
+    {
+        $id   = input('id/d', 0);
+        $info = DemandCateModel::find($id);
+        $info->save([
+            input('field/s') => input('value/s', ""),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function editCate()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            $cate = DemandCateModel::create([
+                'title'    => input('title/s', ""),
+                'priority' => input('priority/d', 0),
+            ]);
+        } else {
+            $cate = DemandCateModel::find($id);
+            $cate->save([
+                'title'    => input('title/s', ""),
+                'priority' => input('priority/d', 0),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delCate()
+    {
+        $id     = input('id/d');
+        $cate   = DemandCateModel::where('id', $id)->select();
+        $result = $cate->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+// 企业招聘
+    public function otherList()
+    {
+        if (Request::isAjax()) {
+            $limit = input('limit/d', 20);
+            $page  = input('page/d', 1);
+            $map   = [];
+
+            $title = input('title/s', "");
+            if (!empty($title)) {
+                $map[] = ['title', 'like', '%' . $title . '%'];
+            }
+
+            $keywords = input('keywords/s', "");
+            if (!empty($keywords)) {
+                $map[] = ['company_name|company_contact|company_mobile', 'like', '%' . $keywords . '%'];
+            }
+
+            $cateid = input('cateid/d', 0);
+            if (!empty($cateid)) {
+                $map[] = ['cateid', '=', $cateid];
+            }
+            $workerid = input('workerid/d', 0);
+            if (!empty($workerid)) {
+                $map[] = ['workerid', '=', $workerid];
+            }
+            $wtype = input('wtype/d');
+            if (!empty($wtype)) {
+                $map[] = ['wtype', '=', $wtype];
+            }
+            $ftype = input('ftype/d');
+            if (!empty($ftype)) {
+                $map[] = ['ftype', '=', $ftype];
+            }
+            $status = input('status/d');
+            if (!empty($status)) {
+                $map[] = ['status', '=', $status];
+            } else {
+                $map[] = ['status', '<', 6];
+            }
+            $isfree = input('isfree/d', 0);
+            if (!empty($isfree)) {
+                $map[] = ['isfree', '=', $isfree];
+            }
+            $list  = DemandOtherModel::with(['worker', 'demandCate'])
+                ->where($map)
+                ->order(['priority' => 'desc', 'id' => 'desc',])
+                ->limit($limit)
+                ->page($page)
+                ->append(['wtype_text', 'ftype_text', 'status_text', 'isfree_text'])
+                ->select();
+            $count = DemandOtherModel::where($map)->count();
+            if ($count == 0) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "未查询到数据",
+                ]));
+            }
+            exit(json_encode([
+                'code'  => 0,
+                'msg'   => "",
+                'count' => $count,
+                'data'  => $list,
+            ]));
+
+        } else {
+            $catelist   = DemandCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+            $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+
+            return view('demand/otherlist', [
+                'workerlist' => $workerlist,
+                'catelist'   => $catelist,
+            ]);
+        }
+
+    }
+
+    public function otherForm()
+    {
+        $id         = input('id/d, 0');
+        $demand     = DemandOtherModel::findOrEmpty($id);
+        $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+
+        $catelist = DemandCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        return view('demand/otherform', [
+            'workerlist' => $workerlist,
+            'catelist'   => $catelist,
+            'demand'     => $demand,
+        ]);
+    }
+
+    public function editOther()
+    {
+        $id      = input('id/d', 0);
+        $wtype   = input('wtype/d', 1);
+        $type    = input('type/d', 1);
+        $zwagall = $wtype == 1 ? input('zwagall/s', "") : '';
+        $data    = [
+            'workerid'        => input('workerid/d', 0),
+            'title'           => input('title/s', ""),
+            'cateid'          => input('cateid/d', 0),
+            'province'        => input('province/s', ""),
+            'city'            => input('city/s', ""),
+            'district'        => input('district/s', ""),
+            'agegroup'        => input('agegroup/s', ""),
+            'tags'            => input('tags/a', []),
+            'enddate'         => input('enddate/s', ""),
+            'requirement'     => input('requirement/s', ""),
+            'comdetails'      => input('comdetails/s', ""),
+            'type'            => $type,
+            'wtype'           => $wtype,
+            'bwagall'         => input('bwagall/s', ""),
+            'zwagall'         => $zwagall,
+            'ftype'           => input('ftype/d', 1),
+            'fwagall'         => input('fwagall/s', ""),
+            'telephone'       => input('telephone/s', ""),
+            'remark'          => input('remark/s', ""),
+            'status'          => input('status/d', 1),
+            'isfree'          => input('isfree/d', 1),
+            'priority'        => input('priority/d', 0),
+            'updatetime'      => input('updatetime/s', ""),
+            'createtime'      => input('createtime/s', ""),
+            'volume'          => input('volume/d', 0),
+            'company_name'    => input('remark/s', ""),
+            'company_contact' => input('remark/s', ""),
+            'company_mobile'  => input('remark/s', ""),
+        ];
+        try {
+            validate(DemandValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => $e->getError(),
+            ]));
+        }
+        if (empty($id)) {
+            $data['telearr'] = [];
+            $data['video']   = input('new_video/s', "");
+            DemandOtherModel::create($data);
+        } else {
+
+            $old_video = input('old_video/s', '');
+            $new_video = input('new_video/s', '');
+            if (!empty($new_video)) {
+                $data['video'] = $new_video;
+            } else {
+                if (!empty($old_video)) {
+                    $data['video'] = $old_video;
+                }
+            }
+
+            $demand = DemandOtherModel::find($id);
+            $demand->save($data);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function snatchList()
+    {
+        if (Request::isAjax()) {
+            $limit = input('limit/d', 20);
+            $page  = input('page/d', 1);
+            $map   = [];
+
+            $worker_id = input('worker_id/d', 0);
+            if (!empty($worker_id)) {
+                $map[] = ['worker_id', '=', $worker_id];
+            }
+            $status = input('status/d', 0);
+            if (!empty($status)) {
+                $map[] = ['status', '=', $status];
+            }
+            $list = DemandSnatchModel::with(['demand', 'worker', 'demand.worker'])
+                ->where($map)
+                ->order(['id' => 'desc',])
+                ->limit($limit)
+                ->page($page)
+                ->append(['status_text'])
+                ->select();
+
+            $count = DemandSnatchModel::where($map)->count();
+            if ($count == 0) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "未查询到数据",
+                ]));
+            }
+            exit(json_encode([
+                'code'  => 0,
+                'msg'   => "",
+                'count' => $count,
+                'data'  => $list,
+            ]));
+
+        } else {
+            $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+            return view('demand/snatchlist', [
+                'workerlist' => $workerlist,
+            ]);
+        }
+    }
+
+    public function demandDetail()
+    {
+        $id = input('id/d, 0');
+        if (empty($id)) {
+            return '未查询到数据';
+        }
+        $demand = DemandModel::with(['worker', 'demand_cate'])->findOrEmpty($id);
+        if ($demand->isEmpty()) {
+            return '未查询到数据';
+        }
+
+        $typelist   = [1 => '代招', 2 => '劳务派遣'];
+        $wtypelist  = [1 => '按月', 2 => '按时', 3 => '按件', 4 => '按项目', 5 => '其他'];
+        $ftypelist  = [1 => '一次性', 2 => '小时工', 3 => '管理费', 4 => '其他'];
+        $statuslist = [1 => '待修改', 2 => '待审核', 3 => '已上架', 4 => '已停招', 5 => '已下架'];
+        return view('demand/demanddetail', [
+            'demand'     => $demand,
+            'typelist'   => $typelist,
+            'wtypelist'  => $wtypelist,
+            'ftypelist'  => $ftypelist,
+            'statuslist' => $statuslist,
+        ]);
+    }
+
+    public function snatchstatus()
+    {
+        $id = input('id/d, 0');
+        $status = input('status/d, 0');
+
+        $snatch = DemandSnatchModel::findOrEmpty($id);
+        if ($snatch->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $snatch->save([
+                'status' => $status,
+            ]);
+        }
+
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function reportLog()
+    {
+        $id = input('id/d', 0);
+        if (empty($id)) {
+            return '未查询到数据';
+        }
+
+        if (Request::isAjax()) {
+            $limit = input('limit/d', 20);
+            $page  = input('page/d', 1);
+            $map   = [['snatchid', '=', $id]];
+            $map   = $this->dealLikeInput($map, ['realname', 'mobile', 'idcard']);
+
+            $list  = DemandReportModel::with(['agent', 'broker'])
+                ->where($map)
+                ->order(['id' => 'desc'])
+                ->limit($limit)
+                ->page($page)
+                ->select();
+            $count = DemandReportModel::where($map)->count();
+            if ($count == 0) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "未查询到数据",
+                ]));
+            }
+            exit(json_encode([
+                'code'  => 0,
+                'msg'   => "",
+                'count' => $count,
+                'data'  => $list,
+            ]));
+
+        } else {
+            return view('demand/reportlog', [
+                'id' => $id,
+            ]);
+        }
+    }
+}

+ 51 - 0
app/admin/controller/Feedback.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Feedback as FeedbackModel;
+
+class Feedback extends BaseController
+{
+
+    // 列表
+    public function feedbacklist()
+    {
+        return view('feedback/feedbacklist');
+    }
+
+    public function listfeedback()
+    {
+        $limit = input('limit');
+        $page = input('page');
+        $map         = [];
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = FeedbackModel::with('user')->where($map)->order(['createtime'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = FeedbackModel::where($map)->count();
+        if ($count==0){
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+
+    public function dealfeedback()
+    {
+        $idarr = input('idarr/a');
+        FeedbackModel::whereIn('id', $idarr)->update(['status' => 1]);
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+}

+ 314 - 0
app/admin/controller/Form.php

@@ -0,0 +1,314 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\User as UserModel;
+use app\common\model\Form as FormModel;
+use app\common\model\FormItem as FormItemModel;
+use app\common\model\FormLog as FormLogModel;
+use app\common\model\FormLogval as FormLogvalModel;
+
+class Form extends BaseController
+{
+	
+	// 表单记录
+	public function logList()
+	{
+		$formid = input('formid/d', 0);
+		$form = FormModel::with(['formItem'])->findOrEmpty($formid);
+		return view('appcenter/form/loglist',[
+			'form'	=> $form
+		]); 
+	}
+	
+	public function logDetail()
+	{
+		$logid = input('logid/d', 0);
+		$log = FormLogModel::with(['user', 'form'])->findOrEmpty($logid);
+		$itemlist = FormItemModel::where(['formid'=>$log->formid])->order(['priority'=>'ASC','id'=>'DESC'])->append(['itype_text'])->select();
+		$logvallist = FormLogvalModel::where(['logid'=>$logid])->column('*', 'itemid');
+		foreach( $itemlist as $k=>$v ){
+			if ($v->itype==5 || $v->itype==8){
+				$logvallist[$v->id]['ivalue'] = explode("###", $logvallist[$v->id]['ivalue']);
+			}
+		}
+		return view('appcenter/form/logdetail',[
+			'log'			=> $log,
+			'itemlist'		=> $itemlist,
+			'logvallist'	=> $logvallist
+		]); 
+	}
+	
+	public function editLog()
+	{
+		$id = input('id/d', 0);
+		$data = array(
+			'remark' 	=> input('remark/s', "")
+		);
+		$log = FormLogModel::find($id);
+		$log->save($data);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function listLog()
+	{
+		$formid = input('formid/d', 0);
+		$itemidarr = FormItemModel::where(['formid'=>$formid])->order(['priority'=>'ASC','id'=>'DESC'])->column('id');
+		$itemids = implode(',', $itemidarr);	
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$list = FormLogModel::with(['user', 'formLogval' => function($query) use($itemids) {
+					$query->orderRaw("FIELD ( itemid,".$itemids." )");
+				}])->where(['formid'=>$formid])->order('id','DESC')->limit($limit)->page($page)->select();
+		$count = FormLogModel::where(['formid'=>$formid])->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function exportLog()
+	{
+		$formid = input('formid/d', 0);
+		$itemidlist = FormItemModel::where(['formid'=>$formid])->order(['priority'=>'ASC','id'=>'DESC'])->select();
+		$xlsData = FormLogModel::with(['user'])->where(['formid'=>$formid])->order('id','DESC')->select()->toArray();
+		foreach( $xlsData as $k=>$v ){
+			$logvallist = FormLogvalModel::where(['logid'=>$v['id']])->select()->toArray();
+			foreach( $logvallist as $valk=>$valv ){
+				$xlsData[$k]['item'.$valv['itemid']] = $valv['ivalue'];
+			}
+		}
+		$xlsCell = array(
+			array('id','表ID'),
+			array('user.realname','姓名'),
+			array('user.mobile','手机号'),
+			array('remark','备注'),
+			array('createtime','提交时间'),
+		);
+		foreach( $itemidlist as $k=>$v ){
+			$xlsCell[] = array('item'.$v->id, $v->title);
+		}
+		export_excel("表单提交记录",$xlsCell,$xlsData);
+	}
+	
+	public function fieldLog()
+	{
+		$id = input('id/d', 0);
+		$info = FormLogModel::find($id);
+		$info->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delLog()
+	{
+		$idarr = input('idarr/a');
+		$log = FormLogModel::whereIn('id',$idarr)->select();
+		FormLogvalModel::whereIn('logid',$idarr)->delete(); 
+		$result = $log->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	
+	// 自定义表单
+	public function formList()
+	{
+		return view('appcenter/form/formlist',[]); 
+	}
+	
+	public function itemForm()
+	{
+		$id = input('id/d', 0);
+		$item = FormItemModel::with(['form'])->findOrEmpty($id);
+		if (!$item->isEmpty()){
+			$item->options = implode("\r\n", $item->options);
+		}
+		$formlist = FormModel::order(['id'=>'desc'])->select();
+		return view('appcenter/form/itemform',[
+			'item'		=> $item,
+			'formlist'	=> $formlist
+		]);
+	}
+	
+	public function formForm()
+	{
+		$id = input('id/d', 0);
+		$form = FormModel::findOrEmpty($id);
+		return view('appcenter/form/formform',[
+			'form'		=> $form
+		]);
+	}
+	
+	public function editForm()
+	{
+		$id = input('id/d', 0);
+		$data = array(
+			'title' 		=> input('title/s', ""),
+			'explain' 		=> input('explain/s', ""),
+			'usernumber' 	=> input('usernumber/d', 0),
+			'sharetil' 		=> input('sharetil/s', ""),
+			'sharepic' 		=> input('sharepic/s', "")
+		);
+		if (empty($id)){
+			$form = FormModel::create($data);
+		}else{
+			$form = FormModel::find($id);
+			$form->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editItem()
+	{
+		$id = input('id/d', 0);
+		$data = array(
+			'formid'		=> input('formid/d', 0),
+			'title' 		=> input('title/s', ""),
+			'imust'			=> input('imust/d', 1),
+			'itype'			=> input('itype/d', 1),
+			'options'		=> explode("\n", str_replace("\r\n", "\n", input('options/s', ""))),
+			'picnumber'		=> input('picnumber/d', 1),
+			'placeholder' 	=> input('placeholder/s', ""),
+			'priority'  	=> input('priority/d', 0)
+		);
+		if (empty($id)){
+			$search = FormItemModel::create($data);
+		}else{
+			$search = FormItemModel::find($id);
+			$search->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function listForm()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = FormModel::withCount(['formItem','formLog'])->order(['id'=>'desc'])->limit($limit)->page($page)->select();
+		$count = FormModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function listItem()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$formid = input('formid/d', 0);
+		$map[] = ['formid', '=', $formid];
+		$list = FormItemModel::where($map)->order(['priority'=>'asc','id'=>'desc'])->limit($limit)->page($page)->append(['imust_text','itype_text'])->select();
+		$count = FormItemModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function fieldForm()
+	{
+		$id = input('id/d', 0);
+		$info = FormModel::find($id);
+		$info->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldItem()
+	{
+		$id = input('id/d', 0);
+		$info = FormItemModel::find($id);
+		$info->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delForm()
+	{
+		$id = input('id/d', 0);
+		$form = FormModel::where('id',$id)->select();
+		FormItemModel::where('formid', '=', $id)->delete(); 
+		FormLogModel::where('formid', '=', $id)->delete(); 
+		FormLogvalModel::where('formid', '=', $id)->delete(); 
+		$result = $form->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function delItem()
+	{
+		$id = input('id/d', 0);
+		$item = FormItemModel::where('id',$id)->select();
+		$result = $item->delete();
+		FormLogvalModel::where('itemid', '=', $id)->delete(); 
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+}

+ 14 - 0
app/admin/controller/Help.php

@@ -0,0 +1,14 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+
+class Help extends BaseController
+{
+	// 系统链接
+	public function Link()
+	{
+		return view('help/link',[]);
+	}
+}

+ 111 - 0
app/admin/controller/Home.php

@@ -0,0 +1,111 @@
+<?php
+namespace app\admin\controller;
+
+use app\common\model\ComjobsLog;
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Admin as AdminModel;
+use app\common\model\Menu as MenuModel;
+
+use app\common\model\User as UserModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Comjobs as ComjobsModel;
+use app\common\model\Demand as DemandModel;
+use app\common\model\Supply as SupplyModel;
+
+use app\common\model\ArticleComment as ArticleCommentModel;
+
+use think\facade\Env;
+
+class Home extends BaseController
+{
+	
+	public function index()
+	{
+		$access_admin = session('access_admin');
+		$admin = AdminModel::findOrEmpty($access_admin['id']);
+		$menulist = MenuModel::where(['mtype'=>'admin','status'=>1])->where('id','in',$admin->powerids)->order(['pid'=>'asc','priority'=>'asc','id'=>'asc'])->select()->toArray();
+		$powerarr = array();
+//		$poweridsarr = ($admin->powerids==null||empty($admin->powerids)) ? [] : explode(",", $admin->powerids);
+		if (!empty($menulist)){
+			foreach ($menulist as $k=>$v){
+				if ($v['pid']==0){
+					$v['children'] = array();
+					$powerarr[$v['id']] = $v;
+				}else {
+					$powerarr[$v['pid']]['children'][] = $v;
+				}
+			}
+		}
+		return view('index', [
+			'access_admin'	=> $access_admin,
+			'powerarr'		=> $powerarr
+		]);
+	}
+	
+	public function console()
+	{
+		
+		$usertol['today'] = UserModel::whereDay('createtime')->count();
+		$usertol['yesterday'] = UserModel::whereDay('createtime', 'yesterday')->count();
+		$usertol['week'] = UserModel::whereWeek('createtime')->count();
+		$usertol['month'] = UserModel::whereMonth('createtime')->count();
+		
+		$workertol['today'] = WorkerModel::whereDay('createtime')->count();
+		$workertol['yesterday'] = WorkerModel::whereDay('createtime', 'yesterday')->count();
+		$workertol['week'] = WorkerModel::whereWeek('createtime')->count();
+		$workertol['month'] = WorkerModel::whereMonth('createtime')->count();
+		
+		$comjobstol['today'] = ComjobsModel::whereDay('createtime')->count();
+		$comjobstol['yesterday'] = ComjobsModel::whereDay('createtime', 'yesterday')->count();
+		$comjobstol['week'] = ComjobsModel::whereWeek('createtime')->count();
+		$comjobstol['month'] = ComjobsModel::whereMonth('createtime')->count();
+		
+		$demandtol['today'] = DemandModel::whereDay('createtime')->count();
+		$demandtol['yesterday'] = DemandModel::whereDay('createtime', 'yesterday')->count();
+		$demandtol['week'] = DemandModel::whereWeek('createtime')->count();
+		$demandtol['month'] = DemandModel::whereMonth('createtime')->count();
+		
+		$supplytol['today'] = SupplyModel::whereDay('createtime')->count();
+		$supplytol['yesterday'] = SupplyModel::whereDay('createtime', 'yesterday')->count();
+		$supplytol['week'] = SupplyModel::whereWeek('createtime')->count();
+		$supplytol['month'] = SupplyModel::whereMonth('createtime')->count();
+
+		//企业入住量
+        $workercount = WorkerModel::where(["deletetime"=>0])->count();
+        //岗位数量
+        $comjobscount = ComjobsModel::where(["deletetime"=>0])->count();
+        //个人进驻量
+        $usercount = UserModel::where(["deletetime"=>0])->count();
+        //求职成功量
+        $comjobssuccesscount = ComjobsLog::where(["status"=>6,"del_status"=>0])->count();
+
+        //按分类统计个人
+        $catedata[0] = UserModel::where(["deletetime"=>0,"groupsid"=>7])->count();
+        $catedata[1] = UserModel::where(["deletetime"=>0,"groupsid"=>8])->count();
+        $catedata[2] = UserModel::where(["deletetime"=>0,"groupsid"=>9])->count();
+        $catedata[3] = UserModel::where(["deletetime"=>0,"groupsid"=>10])->count();
+        $catedata[4] = UserModel::where(["deletetime"=>0,"groupsid"=>11])->count();
+        $catedata[5] = UserModel::where(["deletetime"=>0,"groupsid"=>12])->count();
+		
+		// var_dump($_SERVER);die;
+		
+		
+		return view('home/console',[
+			'domain' 			=> request()->domain(),
+			'access_admin'  	=> session('access_admin'),
+			'usertol'			=> $usertol,
+			'workertol'			=> $workertol,
+			'comjobstol'		=> $comjobstol,
+			'demandtol'			=> $demandtol,
+			'supplytol'			=> $supplytol,
+            'catedata'			=> $catedata,
+            'workercount'		=> $workercount,
+            'comjobscount'			=> $comjobscount,
+            'usercount'			=> $usercount,
+            'comjobssuccesscount'			=> $comjobssuccesscount
+		]);
+	}
+	
+
+}

+ 38 - 0
app/admin/controller/Index.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace app\admin\controller;
+
+use chuanglan\Chuanglan;
+use payment\wechat\WechatTransfers;
+
+class Index
+{
+    public function index()
+    {
+        return redirect('/admin.php/home');
+    }
+
+    public function t1()
+    {
+        halt(11);
+        $batch_name   = '测试提现功能';//转账的名称
+        $out_trade_no = 'lgd'.getUniId();//单号
+        $money        = 1;//金额
+        $openid       = 'o4a9g5ffjsMcXS9wCtTyONqMTdEc';//用户openid
+        $detail = [];
+        $transfers = new WechatTransfers();
+        $detail[] = $transfers->getDetailList($out_trade_no,$money,$batch_name,$openid);
+        $res = $transfers->transfers($batch_name,$detail);
+        halt($res);
+    }
+
+    public function t2()
+    {
+        halt(22);
+        $msg = '福利商城有订单已超过24小时未发货,订单号:请及时发货';
+        $mobile = '13313826760';
+        $sms = new Chuanglan();
+        $res = $sms->send($mobile,['message'=>$msg]);
+        halt($res);
+    }
+}

+ 54 - 0
app/admin/controller/Login.php

@@ -0,0 +1,54 @@
+<?php
+namespace app\admin\controller;
+
+use app\common\model\Admin as AdminModel;
+use think\Session;
+class Login
+{
+	
+	public function index()
+	{
+		return view('login/login',[
+			'domain' => request()->domain()
+		]);
+	}
+	
+	
+    public function login()
+    {
+		 if (!captcha_check( input('vercode') )) {
+			
+		 	exit(json_encode(array(
+		 		'code' 	=> 1,
+		 		'msg'	=> "验证码错误。"
+		 	)));
+		 }
+		$admin = AdminModel::where(['adminname'=>input('adminname')])->findOrEmpty()->toArray();
+		if ( empty($admin) || $admin['password']!=md5(input('password')) ) {
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "账号密码不正确。"
+			)));
+		}
+		if ($admin['status']==2){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "该管理员账号已被禁言,如有疑问请联系超级管理员。"
+			)));
+		}
+		AdminModel::update(['lastdate'=>time(),'lastip'=>$_SERVER['SERVER_ADDR']], ['id' => $admin['id']]);
+		session('access_admin', $admin);
+		echo json_encode(array(
+			'code' 	=> 0,
+			'msg'   => ""
+		));
+	}
+	
+	
+	public function logout()
+	{
+		session(null);
+		return redirect(url('/login/index'));
+	}
+
+}

+ 393 - 0
app/admin/controller/Mall.php

@@ -0,0 +1,393 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\MallCate as MallCateModel;
+use app\common\model\MallGoods as MallGoodsModel;
+use app\common\model\MallOrder as MallOrderModel;
+
+use app\common\model\User as UserModel;
+use app\common\model\UserIntegral as UserIntegralModel;
+
+use PHPExcel_IOFactory;
+use PHPExcel;
+
+class Mall extends BaseController
+{
+    
+    // 商品
+    public function orderList()
+    {
+        return view('mall/orderlist', []);
+    }
+    
+    public function orderForm()
+    {
+        $id = input('id/d, 0');
+        $order = MallOrderModel::findOrEmpty($id);
+        if ($order->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "订单信息不存在"
+            )));
+        }
+        return view('mall/orderform', [
+            'order'		=> $order
+        ]);
+    }
+    
+    public function listOrder()
+    {
+        $limit = input('limit');
+        $page = input('page');
+        $map = array();
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] =['ordersn|title', 'like', '%'.$keywords.'%'];
+        }
+        $goodsid = input('goodsid/d');
+        if (!empty($goodsid)) {
+            $map[] = ['goodsid', '=', $goodsid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = MallOrderModel::with('user', 'mallGoods')->where($map)->order(['id'=>'desc'])->limit($limit)->page($page)->select()->append(['status_text']);
+        $count = MallOrderModel::where($map)->count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+    
+    public function exportOrder()
+    {
+        $map = array();
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] =['ordersn|title', 'like', '%'.$keywords.'%'];
+        }
+        $goodsid = input('goodsid/d');
+        if (!empty($goodsid)) {
+            $map[] = ['goodsid', '=', $goodsid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $xlsData = MallOrderModel::with('user', 'mallGoods')->where($map)->order(['id'=>'desc'])->select()->append(['status_text'])->toArray();
+        $xlsCell = array(
+            array('id','表ID'),
+            array('ordersn','订单编号'),
+            array('user.nickname','用户昵称'),
+            array('user.mobile','用户手机号'),
+            array('goodsid','商品ID'),
+            array('title','商品名称'),
+            array('gintegral','单量积分'),
+            array('gpaymoney','单量金额'),
+            array('buynumber','兑购量'),
+            
+            array('integral','订单积分'),
+            array('paymoney','订单金额'),
+            array('status_text','订单状态'),
+            
+            array('username','收货人姓名'),
+            array('usermobile', '收货人手机号'),
+            array('province', '省'),
+            array('city', '市'),
+            array('county', '区县'),
+            array('detailinfo', '详细地址'),
+            array('remark', '用户备注'),
+            array('createtime', '下单时间')
+        );
+        export_excel("积分商城订单", $xlsCell, $xlsData);
+    }
+    
+    public function delOrder()
+    {
+        $idarr = input('idarr/a');
+        $info = MallOrderModel::whereIn('id', $idarr)->select();
+        $info->delete();
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> ""
+        )));
+    }
+    
+    public function editOrder()
+    {
+        $id = input('id/d', 0);
+        $order = MallOrderModel::findOrEmpty($id);
+        if ($order->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "订单信息不存在"
+            )));
+        }
+        $data = array(
+            'id'			=> $id,
+            'ordersn'		=> input('ordersn/s', ""),
+            'title'			=> input('title/s', ""),
+            'tilpic'		=> input('tilpic/s', ""),
+            'gintegral'		=> input('gintegral/d', 0),
+            'gpaymoney'		=> input('gpaymoney/f', 0.00),
+            'buynumber'		=> input('buynumber/d', 0),
+            
+            'integral'		=> input('integral/d', 0),
+            'paymoney'		=> input('paymoney/f', 0.00),
+            'status'		=> input('status/d', 1),
+            
+            'username'		=> input('username/s', ""),
+            'usermobile'	=> input('usermobile/s', ""),
+            'province'		=> input('province/s', ""),
+            'city'			=> input('city/s', ""),
+            'county'		=> input('county/s', ""),
+            'detailinfo'	=> input('detailinfo/s', ""),
+            'remark'		=> input('remark/s', "")
+        );
+        MallOrderModel::update($data);
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function fieldOrder()
+    {
+        $id = input('id/d', 0);
+        $info = MallOrderModel::findOrEmpty($id);
+        if ($info->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "信息不存在"
+            )));
+        } else {
+            $info->save([
+                input('field/s')  => input('value')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    
+    
+    
+    // 商品
+    public function goodsList()
+    {
+        $catelist = MallCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+        ;
+        return view('mall/goodslist', [
+            'catelist'	=> $catelist
+        ]);
+    }
+    
+    public function goodsForm()
+    {
+        $catelist = MallCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+        $id = input('id/d, 0');
+        $goods = MallGoodsModel::findOrEmpty($id);
+        return view('mall/goodsform', [
+            'catelist'	=> $catelist,
+            'goods'		=> $goods
+        ]);
+    }
+    
+    public function listGoods()
+    {
+        $limit = input('limit');
+        $page = input('page');
+        $map = array();
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] =['title', 'like', '%'.$keywords.'%'];
+        }
+        $cateid = input('cateid/d');
+        if (!empty($cateid)) {
+            $map[] = ['cateid', '=', $cateid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = MallGoodsModel::with('mallCate')->withCount(['mallCate','mallOrder'])->where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->select()->append(['status_text']);
+        $count = MallGoodsModel::where($map)->count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+    
+    public function delGoods()
+    {
+        $idarr = input('idarr/a');
+        $info = MallGoodsModel::whereIn('id', $idarr)->select();
+        $info->delete();
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> ""
+        )));
+    }
+    
+    public function editGoods()
+    {
+        $id = input('id/d');
+        $data = array(
+            'cateid'		=> input('cateid/d', 0),
+            'title'			=> input('title/s', ""),
+            'tilpic'		=> input('tilpic/s', ""),
+            'picall'		=> input('picall/a', array()),
+            'stock'			=> input('stock/d', 0),
+            'sales'			=> input('sales/d', 0),
+            'integral'		=> input('integral/d', 0),
+            'paymoney'		=> input('paymoney/f', 0.00),
+            'summary'		=> input('summary/s', ""),
+            'oremark'		=> input('oremark/s', ""),
+            'details'		=> input('details/s', ""),
+            'priority'		=> input('priority/d', 0),
+            'createtime'	=> input('createtime/s', ""),
+            'status'		=> input('status/d', 1)
+        );
+        if (empty($id)) {
+            MallGoodsModel::create($data);
+        } else {
+            $data['id'] = $id;
+            MallGoodsModel::update($data);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function fieldGoods()
+    {
+        $id = input('id/d', 0);
+        $goods = MallGoodsModel::findOrEmpty($id);
+        if ($goods->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "信息不存在"
+            )));
+        } else {
+            $goods->save([
+                input('field/s')  => input('value')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+
+
+    // 分类
+    public function cateList()
+    {
+        return view('mall/catelist');
+    }
+    
+    public function cateForm()
+    {
+        $id = input('id/d, 0');
+        $cate = MallCateModel::findOrEmpty($id);
+        return view('mall/cateform', [
+            'cate'	=> $cate
+        ]);
+    }
+    
+    public function listCate()
+    {
+        $limit = input('limit');
+        $page = input('page');
+        $list = MallCateModel::order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->select()->append(['status_text']);
+        $count = MallCateModel::count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+    
+    public function fieldCate()
+    {
+        $id = input('id/d');
+        $cate = MallCateModel::find($id);
+        if ($cate==null) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "分类信息不存在"
+            )));
+        } else {
+            $cate->save([
+                input('field/s')  => input('value/d')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function editCate()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            $cate = MallCateModel::create([
+                'title' 	=> input('title/s'),
+                'status'    => input('status/d')==1 ? 1 : 2,
+                'priority'  => input('priority/d')
+            ]);
+        } else {
+            $cate = MallCateModel::find($id);
+            $cate->save([
+                'title' 	=> input('title/s'),
+                'status'    => input('status/d')==1 ? 1 : 2,
+                'priority'  => input('priority/d')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function delCate()
+    {
+        $id = input('id/d');
+        $cate = MallCateModel::where('id', $id)->select();
+        $result = $cate->delete();
+        if ($result) {
+            exit(json_encode(array(
+                'code' 	=> 0,
+                'msg'	=> ""
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 1,
+            'msg'	=> "删除失败,请稍后重试"
+        )));
+    }
+}

+ 112 - 0
app/admin/controller/Navigation.php

@@ -0,0 +1,112 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Navigation as NavigationModel;
+
+class Navigation extends BaseController
+{
+	
+	public function index()
+	{
+		return view('set/navigationlist');
+	}
+	
+	public function navigationForm()
+	{
+		$id = input('id/d, 0');
+		$navigation = NavigationModel::findOrEmpty($id);
+		return view('set/navigationform',[
+			'navigation' => $navigation
+		]);
+	}
+	
+	
+	public function listNavigation()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$pagetab = input('pagetab/d');
+		if (!empty($pagetab)){
+			$map[] = ['pagetab', '=', $pagetab];
+		}
+		$stype = input('stype/d');
+		if (!empty($stype)){
+			$map[] = ['stype', '=', $stype];
+		}
+		$list = NavigationModel::where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['ntype_text'])->select();
+		$count = NavigationModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+	public function fieldNavigation()
+	{
+		$id = input('id/d');
+		$navigation = NavigationModel::find($id);
+		if ($navigation==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$navigation->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	
+	public function editNavigation()
+	{
+		$id = input('id/d');
+		$data = array(
+			'pagetab'   => input('pagetab/s'),
+			'title' 	=> input('title/s'),
+			'tilpic' 	=> input('tilpic/s'),
+			'ntype' 	=> input('ntype/d', 1),
+			'tilurl' 	=> input('tilurl/s'),
+			'priority'  => input('priority/d', 0)
+		);
+		if (empty($id)){
+			NavigationModel::create($data);
+		}else{
+			$data['id'] = $id;
+			NavigationModel::update($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delNavigation()
+	{
+		$idarr = input('idarr/a');
+		NavigationModel::whereIn('id',$idarr)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+}

+ 217 - 0
app/admin/controller/Notice.php

@@ -0,0 +1,217 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Notice as NoticeModel;
+use app\common\model\NoticeCate as NoticeCateModel;
+
+class Notice extends BaseController
+{
+
+	// 删除
+	public function delNotice()
+	{
+		$idarr = input('idarr/a');
+		NoticeModel::whereIn('id',$idarr)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+	// 编辑&添加
+	public function editNotice()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			NoticeModel::create([
+				'cateid'      => input('cateid/d'),
+				'title'       => input('title/s'),
+				'details'     => input('details/s'),
+				'priority'    => input('priority/d'),
+				'createtime'  => input('createtime/s'),
+				'status'	  => input('status/d')==1 ? 1 : 2,
+				'volume'      => input('volume/d') 
+			]);
+		}else{
+			NoticeModel::update([
+				'id'		  => $id,
+				'cateid'      => input('cateid/d'),
+				'title'       => input('title/s'),
+				'details'     => input('details/s'),
+				'priority'    => input('priority/d'),
+				'createtime'  => input('createtime/s'),
+				'status'	  => input('status/d')==1 ? 1 : 2,
+				'volume'      => input('volume/d') 
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	 
+	// 列表
+	public function noticeList()
+	{
+		$catelist = NoticeCateModel::order(['priority'=>'desc','id'=>'desc'])->select();;
+		return view('artapp/notice/noticelist',[
+			'catelist'	=> $catelist
+		]);
+	}
+	
+	public function noticeForm()
+	{
+		$catelist = NoticeCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		$id = input('id/d, 0');
+		$notice = NoticeModel::findOrEmpty($id);
+		if ($notice->isEmpty()){
+			$notice['atype'] = 1;
+		}
+		return view('artapp/notice/noticeform',[
+			'catelist'	=> $catelist,
+			'notice'	=> $notice
+		]);
+	}
+	
+	public function fieldNotice()
+	{
+		$id = input('id/d',0); 
+		$info = NoticeModel::findOrEmpty($id);
+		if ($info->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$info->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	
+	public function listNotice()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$cateid = input('cateid/d');
+		if (!empty($cateid)){
+			$map[] = ['cateid', '=', $cateid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = NoticeModel::with('noticeCate')->where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = NoticeModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+
+
+	// 分类
+	public function cateList()
+	{
+		return view('artapp/notice/catelist');
+	}
+	
+	public function cateForm()
+	{
+		$id = input('id/d, 0');
+		$cate = NoticeCateModel::findOrEmpty($id);
+		return view('artapp/notice/cateform',[
+			'cate'	=> $cate
+		]);
+	}
+	
+	public function listCate()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = NoticeCateModel::order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = NoticeCateModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function fieldCate()
+	{
+		$id = input('id/d');
+		$cate = NoticeCateModel::find($id);
+		if ($cate==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$cate->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editCate()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			$cate = NoticeCateModel::create([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}else{
+			$cate = NoticeCateModel::find($id);
+			$cate->save([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delCate()
+	{
+		$id = input('id/d');
+		NoticeCateModel::where('id',$id)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+}

+ 82 - 0
app/admin/controller/Param.php

@@ -0,0 +1,82 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Param as ParamModel;
+
+class Param extends BaseController
+{
+	
+	public function index()
+	{
+		$param = ParamModel::where(1)->findOrEmpty();
+		if ($param->isEmpty()) {
+		    $param = new ParamModel;
+			$param->save([
+				'indextopbg'		=> request()->domain()."/static/images/indextopbg.png",
+				'telephone'			=> "",
+				'mycodeban'			=> request()->domain()."/static/images/mycodeban.png",
+				'mycodecolor'		=> "#f33714",
+				'mycodetil'			=> "直说吧,我们要人你要钱,那就来看看!!!",
+				'mycodepic'			=> request()->domain()."/static/images/mycodepic.png",
+				'brokerformpic'		=> request()->domain()."/static/images/brokerformpic.png",
+				'agentformpic'		=> request()->domain()."/static/images/agentformpic.png",
+				'workerformpic'		=> request()->domain()."/static/images/workerformpic.png",
+				'addcomjobs'		=> 0,
+				'addcomjobswyp'		=> 0,
+				'topcomjobs'		=> 0,
+				'adddemand'			=> 0,
+				'adddemandwyd'		=> 0,
+				'topdemand'			=> 0,
+				'addsupply'			=> 0,
+				'topsupply'			=> 0,
+				'teldemand'			=> 0,
+				'telsupply'			=> 0,
+				'mpaccount'			=> request()->domain()."/static/images/mpaccount.png",
+				'defviewtol'		=> 0
+			]);
+		}
+		return view('set/param',[
+			'param' => $param 
+		]);
+	}
+	
+	public function editParam()
+	{
+		$param = ParamModel::where(1)->find();
+		$data = array(
+			'indextopbg'		=> input('indextopbg/s', ""),
+			'telephone'			=> input('telephone/s', ""),
+			'mpaccount'			=> input('mpaccount/s', ""),
+			'mycodeban'			=> input('mycodeban/s', ""),
+			'mycodecolor'		=> input('mycodecolor/s', ""),
+			'mycodetil'			=> input('mycodetil/s', ""),
+			'mycodepic'			=> input('mycodepic/s', ""),
+			'brokerformpic'		=> input('brokerformpic/s', ""),
+			'agentformpic'		=> input('agentformpic/s', ""),
+			'workerformpic'		=> input('workerformpic/s', ""),
+			'addcomjobs'		=> input('addcomjobs/d', 0),
+			'addcomjobswyp'		=> input('addcomjobswyp/d', 0),
+			'topcomjobs'		=> input('topcomjobs/d', 0),
+			'adddemand'			=> input('adddemand/d', 0),
+			'adddemandwyd'		=> input('adddemandwyd/d', 0),
+			'topdemand'			=> input('topdemand/d', 0),
+			'addsupply'			=> input('addsupply/d', 0),
+			'topsupply'			=> input('topsupply/d', 0),
+			'teldemand'			=> input('teldemand/d', 0),
+			'telsupply'			=> input('telsupply/d', 0),
+			'defviewtol'		=> input('defviewtol/d', 0) 
+		);
+		if ($param==null){
+			ParamModel::create($data);
+		}else{
+			$data['id'] = $param->id;
+			ParamModel::update($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'   => ""
+		)));
+	}
+	
+}

+ 236 - 0
app/admin/controller/Partjob.php

@@ -0,0 +1,236 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Agent as AgentModel;
+use app\common\model\Partjob as PartjobModel;
+use app\common\model\PartjobLog as PartjobLogModel;
+
+class Partjob extends BaseController
+{
+	
+	// 报名记录
+	public function logList()
+	{
+		$agentlist = AgentModel::with('partjob')->order(['id'=>'desc'])->select();
+		return view('partjob/loglist',[
+			'agentlist'		=> $agentlist
+		]);
+	}
+	
+	public function delLog()
+	{
+		$idarr = input('idarr/a');
+		$log = PartjobLogModel::whereIn('id',$idarr)->select();
+		$result = $log->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function fieldLog()
+	{
+		$id = input('id/d',0); 
+		$log = PartjobLogModel::findOrEmpty($id);
+		if ($log->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$log->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function listLog()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$map = array();
+		$agentpartjobarr = explode(",", input('agentpartjob/s'));
+		$agentid = isset($agentpartjobarr[0]) ? $agentpartjobarr[0] : 0;
+		$partjobid = isset($agentpartjobarr[1]) ? $agentpartjobarr[1] : 0;
+		if (!empty($agentid)){
+			$map[] = ['agentid', '=', $agentid];
+		}
+		if (!empty($partjobid)){
+			$map[] = ['partjobid', '=', $partjobid];
+		}
+		$list = PartjobLogModel::with(['user','agent','partjob'])->where($map)->order('id','DESC')->limit($limit)->page($page)->select();
+		$count = PartjobLogModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function exportLog()
+	{
+		$map = array();
+		$agentpartjobarr = explode(",", input('agentpartjob/s'));
+		$agentid = isset($agentpartjobarr[0]) ? $agentpartjobarr[0] : 0;
+		$partjobid = isset($agentpartjobarr[1]) ? $agentpartjobarr[1] : 0;
+		if (!empty($agentid)){
+			$map[] = ['agentid', '=', $agentid];
+		}
+		if (!empty($partjobid)){
+			$map[] = ['partjobid', '=', $partjobid];
+		}
+		$xlsData = PartjobLogModel::with(['user','agent','partjob'])->where($map)->order('id','DESC')->select()->toArray();
+		$xlsCell = array(
+			array('id','表ID'),
+			array('user.nickname','昵称'),
+			array('user.realname','姓名'),
+			array('user.mobile','手机号'),
+			array('agent.title','代理门店'),
+			array('partjob.title','兼职标题'),
+			array('remark','反馈备注'),
+			array('createtime','报名时间'),
+		);
+		export_excel("兼职报名记录",$xlsCell,$xlsData);
+	}
+	
+	
+	// 兼职招聘
+	public function partjobList()
+	{
+		$agentlist = AgentModel::order(['id'=>'desc'])->select();
+		return view('partjob/partjoblist',[
+			'agentlist'		=> $agentlist
+		]);
+	}
+	
+	public function partjobForm()
+	{
+		$id = input('id/d, 0');
+		$partjob = PartjobModel::findOrEmpty($id);
+		$agentlist = AgentModel::order(['id'=>'desc'])->select();
+		return view('partjob/partjobform',[
+			'agentlist'		=> $agentlist,
+			'partjob'		=> $partjob
+		]);
+	}
+	
+	public function editPartjob()
+	{
+		$id = input('id/d');
+		$data = [
+			'agentid'			=> input('agentid/d', 0),
+			'title'				=> input('title/s', ""),
+			'tilpic'			=> input('tilpic/s', ""),
+			'tags'				=> input('tags/a', array()),
+			'telephone'			=> input('telephone/s', ""),
+			'address'			=> input('address/s', ""),
+			'wagall'			=> input('wagall/s', ""),
+			'endtime'			=> input('endtime/s', ""),
+			'recruitnum'		=> input('recruitnum/d', 0),
+			'reqdetails'		=> input('reqdetails/s', ""),
+			'jobdetails'		=> input('jobdetails/s', ""),
+			'status'			=> input('status/d', 0),
+			'priority'			=> input('priority/d', 0),
+			'createtime'		=> input('createtime/s', "")
+		];
+		if (empty($id)){
+			$partjob = PartjobModel::create($data);
+		}else{
+			$partjob = PartjobModel::find($id);
+			PartjobLogModel::update([ 'agentid' => input('agentid/d', 0) ],['partjobid'=>$partjob->id]); 
+			$partjob->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldPartjob()
+	{
+		$id = input('id/d',0); 
+		$partjob = PartjobModel::findOrEmpty($id);
+		if ($partjob->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$partjob->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delPartjob()
+	{
+		$idarr = input('idarr/a');
+		$partjob = PartjobModel::whereIn('id',$idarr)->select();
+		PartjobLogModel::whereIn('partjobid',$idarr)->delete();
+		$result = $partjob->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listPartjob()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$agentid = input('agentid/d');
+		if (!empty($agentid)){
+			$map[] = ['agentid', '=', $agentid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = PartjobModel::with(['agent'])->withCount(['partjobLog'])->where($map)->order('id','DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = PartjobModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+
+}

+ 216 - 0
app/admin/controller/Question.php

@@ -0,0 +1,216 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Question as QuestionModel;
+use app\common\model\QuestionCate as QuestionCateModel;
+
+class Question extends BaseController
+{
+
+	// 删除
+	public function delQuestion()
+	{
+		$idarr = input('idarr/a');
+		QuestionModel::whereIn('id',$idarr)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+	// 编辑&添加
+	public function editQuestion()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			QuestionModel::create([
+				'cateid'      => input('cateid/d'),
+				'title'       => input('title/s'),
+				'details'     => input('details/s'),
+				'priority'    => input('priority/d'),
+				'createtime'  => input('createtime/s'),
+				'status'	  => input('status/d')==1 ? 1 : 2,
+				'volume'      => input('volume/d') 
+			]);
+		}else{
+			QuestionModel::update([
+				'id'		  => $id,
+				'cateid'      => input('cateid/d'),
+				'title'       => input('title/s'),
+				'details'     => input('details/s'),
+				'priority'    => input('priority/d'),
+				'createtime'  => input('createtime/s'),
+				'status'	  => input('status/d')==1 ? 1 : 2,
+				'volume'      => input('volume/d') 
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	 
+	// 常见问题
+	public function questionList()
+	{
+		$catelist = QuestionCateModel::order(['priority'=>'desc','id'=>'desc'])->select();;
+		return view('artapp/question/questionlist',[
+			'catelist'	=> $catelist
+		]);
+	}
+	
+	public function questionForm()
+	{
+		$catelist = QuestionCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		$id = input('id/d, 0');
+		$question = QuestionModel::findOrEmpty($id);
+		if ($question->isEmpty()){
+			$question['atype'] = 1;
+		}
+		return view('artapp/question/questionform',[
+			'catelist'	=> $catelist,
+			'question'	=> $question
+		]);
+	}
+	
+	public function fieldQuestion()
+	{
+		$id = input('id/d',0); 
+		$info = QuestionModel::findOrEmpty($id);
+		if ($info->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$info->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function listQuestion()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$cateid = input('cateid/d');
+		if (!empty($cateid)){
+			$map[] = ['cateid', '=', $cateid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = QuestionModel::with('questionCate')->where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = QuestionModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+
+
+	// 分类
+	public function cateList()
+	{
+		return view('artapp/question/catelist');
+	}
+	
+	public function cateForm()
+	{
+		$id = input('id/d, 0');
+		$cate = QuestionCateModel::findOrEmpty($id);
+		return view('artapp/question/cateform',[
+			'cate'	=> $cate
+		]);
+	}
+	
+	public function listCate()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = QuestionCateModel::order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = QuestionCateModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function fieldCate()
+	{
+		$id = input('id/d');
+		$cate = QuestionCateModel::find($id);
+		if ($cate==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$cate->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editCate()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			$cate = QuestionCateModel::create([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}else{
+			$cate = QuestionCateModel::find($id);
+			$cate->save([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delCate()
+	{
+		$id = input('id/d');
+		QuestionCateModel::where('id',$id)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+}

+ 641 - 0
app/admin/controller/Report.php

@@ -0,0 +1,641 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\ReportFactory as ReportFactoryModel;
+use app\common\model\ReportEntry as ReportEntryModel;
+use app\common\model\ReportOrder as ReportOrderModel;
+use app\common\model\ReportOrderlog as ReportOrderlogModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Agent as AgentModel;
+use app\common\model\Broker as BrokerModel;
+
+use app\common\validate\ReportFactory as ReportFactoryValidate;
+use think\exception\ValidateException;
+
+use PHPExcel_IOFactory;
+use PHPExcel;
+
+class Report extends BaseController
+{
+    
+    // 发单记录
+    public function orderlog()
+    {
+        $orderid = input('orderid/d', 0);
+        $order = ReportOrderModel::findOrEmpty($orderid);
+        $factorylist = ReportFactoryModel::order(['id'=>'desc'])->select();
+        $workerlist = WorkerModel::with('agent')->order(['id'=>'desc'])->select();
+        return view('report/orderlog', [
+            'workerlist'	=> $workerlist,
+            'factorylist'	=> $factorylist,
+            'order'			=> $order
+        ]);
+    }
+    
+    public function addOrderlog()
+    {
+        $orderid = input('orderid/d', 0);
+        $order = ReportOrderModel::findOrEmpty($orderid);
+        if ($order->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "订单信息不存在。"
+            )));
+        }
+        $refpolicy = input('refpolicy/s', "");
+        if (empty($refpolicy)) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "返费政策不能为空。"
+            )));
+        }
+        $remark = input('remark/s', "");
+        $agentarr = input('agentarr/a', array());
+        if (empty($agentarr)) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "推送代理门店必选。"
+            )));
+        }
+        $addlist = array();
+        foreach ($agentarr as $wkey=>$wval) {
+            foreach ($wval as $akey=>$aval) {
+                $addlist[] = array(
+                    'orderid'		=> $orderid,
+                    'workerid'		=> $wkey,
+                    'agentid'		=> $aval,
+                    'refpolicy'		=> $refpolicy,
+                    'remark'		=> $remark,
+                    'status'		=> 1,
+                    'createtime'	=> time()
+                );
+            }
+        }
+        $orderlog = new ReportOrderlogModel;
+        $orderlog->saveAll($addlist);
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function listOrderlog()
+    {
+        $orderid = input('orderid/d', 0);
+        $limit = input('limit/d', 20);
+        $page = input('page/d', 1);
+        $map = array();
+        $map[] = ['orderid', '=', $orderid];
+        $keywords = input('keywords/s', "");
+        if (!empty($keywords)) {
+            $map[] =['refpolicy', 'like', '%'.$keywords.'%'];
+        }
+        $workeragentarr = explode(",", input('workeragent/s'));
+        $workerid = isset($workeragentarr[0]) ? $workeragentarr[0] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $agentid = isset($workeragentarr[1]) ? $workeragentarr[1] : 0;
+        if (!empty($agentid)) {
+            $map[] = ['agentid', '=', $agentid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = ReportOrderlogModel::with(['reportOrder','worker','agent'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = ReportOrderlogModel::where($map)->count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+    
+    public function fieldOrderlog()
+    {
+        $id = input('id/d', 0);
+        $orderlog = ReportOrderlogModel::findOrEmpty($id);
+        if ($orderlog->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "信息不存在"
+            )));
+        } else {
+            $orderlog->save([
+                input('field/s')  => input('value')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function delOrderlog()
+    {
+        $idarr = input('idarr/a');
+        $orderlog = ReportOrderlogModel::whereIn('id', $idarr)->select();
+        $orderlog->delete();
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> ""
+        )));
+    }
+    
+    
+    
+    // 发单信息
+    public function orderList()
+    {
+        $factorylist = ReportFactoryModel::order(['id'=>'desc'])->select();
+        return view('report/orderlist', [
+            'factorylist'	=> $factorylist
+        ]);
+    }
+    
+    public function listOrder()
+    {
+        $limit = input('limit/d', 20);
+        $page = input('page/d', 1);
+        $map = array();
+        $keywords = input('keywords/s', "");
+        if (!empty($keywords)) {
+            $map[] =['title', 'like', '%'.$keywords.'%'];
+        }
+        $factoryid = input('factoryid/d', 0);
+        if (!empty($factoryid)) {
+            $map[] = ['factoryid', '=', $factoryid];
+        }
+        $reftype = input('reftype/d');
+        if (!empty($reftype)) {
+            $map[] = ['reftype', '=', $reftype];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = ReportOrderModel::with(['reportFactory'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['reftype_text','status_text'])->select();
+        $count = ReportOrderModel::where($map)->count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+    
+    public function fieldOrder()
+    {
+        $id = input('id/d', 0);
+        $order = ReportOrderModel::findOrEmpty($id);
+        if ($order->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "信息不存在"
+            )));
+        } else {
+            $order->save([
+                input('field/s')  => input('value')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function orderForm()
+    {
+        $id = input('id/d', 0);
+        $order = ReportOrderModel::findOrEmpty($id);
+        $factorylist = ReportFactoryModel::order(['id'=>'desc'])->select();
+        return view('report/orderform', [
+            'factorylist'	=> $factorylist,
+            'order'			=> $order
+        ]);
+    }
+    
+    public function editOrder()
+    {
+        $id = input('id/d');
+        $order = ReportOrderModel::findOrEmpty($id);
+        $data = array(
+            'factoryid'			=> input('factoryid/d', 0),
+            'title'				=> input('title/s', ""),
+            'startdate'			=> input('startdate/s', ""),
+            'reftype'			=> input('reftype/d', 1),
+            'employ'			=> input('employ/s', ""),
+            'prompt'			=> input('prompt/s', ""),
+            'status'			=> input('status/d', 0),
+            'createtime'		=> input('createtime/s', "")
+        );
+        if ($order->isEmpty()) {
+            $order = new ReportOrderModel;
+            $order->save($data);
+        } else {
+            $order->save($data);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function delOrder()
+    {
+        $idarr = input('idarr/a');
+        $order = ReportOrderModel::whereIn('id', $idarr)->select();
+        ReportOrderlogModel::whereIn('orderid', $idarr)->delete();
+        $order->delete();
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> ""
+        )));
+    }
+    
+    
+    // 报备名单
+    public function entryList()
+    {
+        $workerlist = WorkerModel::with('agent')->order(['id'=>'desc'])->select();
+        $factorylist = ReportFactoryModel::order(['id'=>'desc'])->select();
+        return view('report/entrylist', [
+            'workerlist'	=> $workerlist,
+            'factorylist'	=> $factorylist
+        ]);
+    }
+    
+    public function entryForm()
+    {
+        $id = input('id/d, 0');
+        $entry = ReportEntryModel::findOrEmpty($id);
+        $workerlist = WorkerModel::with('agent')->order(['id'=>'desc'])->select();
+        $factorylist = ReportFactoryModel::order(['id'=>'desc'])->select();
+        return view('report/entryform', [
+            'workerlist'	=> $workerlist,
+            'factorylist'	=> $factorylist,
+            'entry'			=> $entry
+        ]);
+    }
+    
+    public function entryImport()
+    {
+        $workerlist = WorkerModel::with('agent')->order(['id'=>'desc'])->select();
+        return view('report/entryimport', [
+            'workerlist'	=> $workerlist
+        ]);
+    }
+    
+    public function importEntry()
+    {
+        $execlfile = input('execlfile/s', "");
+        if (empty($execlfile)) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "请上传导入文件"
+            )));
+        }
+        $filedata = read_excel($execlfile);
+        $factorylist = ReportFactoryModel::where(['status'=>1])->column('idnumber,id,title', 'idnumber');
+        $workeragentarr = explode(",", input('workeragent/s'));
+        $workerid = isset($workeragentarr[0]) ? $workeragentarr[0] : 0;
+        $agentid = isset($workeragentarr[1]) ? $workeragentarr[1] : 0;
+        $createtime = input('createtime/s', "");
+        $entry = new ReportEntryModel;
+        $data = array();
+        $sucnumber = 0;
+        $errnumber = 0;
+        foreach ($filedata as $k=>$v) {
+            $idnumber = trim($v[7]);
+            if (empty($factorylist[$idnumber])) {
+                $errnumber++;
+                continue;
+            } else {
+                $data[] = array(
+                    'workerid'			=> $workerid,
+                    'agentid'			=> $agentid,
+                    'brokerid'			=> 0,
+                    'realname'			=> $v[1],
+                    'mobile'			=> $v[2],
+                    'idcard'			=> $v[3],
+                    'gender'			=> $v[4],
+                    'nation'			=> $v[5],
+                    'address'			=> $v[6],
+                    'factoryid'			=> $factorylist[$idnumber]['id'],
+                    'startdate'			=> $v[8],
+                    'enddate'			=> $v[9],
+                    'reftype'			=> $v[10],
+                    'refpolicy'			=> $v[11],
+                    'agentremark'		=> $v[12],
+                    'status'			=> 2,
+                    'remark'			=> "",
+                    'createtime'		=> $createtime
+                );
+                $sucnumber++;
+            }
+        }
+        $entry->saveAll($data);
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'sucnumber'	=> $sucnumber,
+            'errnumber'	=> $errnumber
+        )));
+    }
+    
+    public function editEntry()
+    {
+        $id = input('id/d');
+        $entry = ReportEntryModel::findOrEmpty($id);
+        $workeragentarr = explode(",", input('workeragent/s'));
+        $workerid = isset($workeragentarr[0]) ? $workeragentarr[0] : 0;
+        $agentid = isset($workeragentarr[1]) ? $workeragentarr[1] : 0;
+        $data = array(
+            'workerid'			=> $workerid,
+            'agentid'			=> $agentid,
+            'factoryid'			=> input('factoryid/d', 0),
+            'realname'			=> input('realname/s'),
+            'mobile'			=> input('mobile/s'),
+            'idcard'			=> input('idcard/s'),
+            'gender'			=> input('gender/s'),
+            'nation'			=> input('nation/s'),
+            'address'			=> input('address/s'),
+            'startdate'			=> input('startdate/s'),
+            'enddate'			=> input('enddate/s'),
+            'reftype'			=> input('reftype/s'),
+            'refpolicy'			=> input('refpolicy/s'),
+            'agentremark'		=> input('agentremark/s'),
+            'status'			=> input('status/d'),
+            'remark'			=> input('remark/s'),
+            'createtime'		=> input('createtime/s')
+        );
+        if ($entry->isEmpty()) {
+            $data['brokerid'] = 0;
+            $entry = new ReportEntryModel;
+            $entry->save($data);
+        } else {
+            $entry->save($data);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function fieldEntry()
+    {
+        $id = input('id/d', 0);
+        $entry = ReportEntryModel::findOrEmpty($id);
+        if ($entry->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "信息不存在"
+            )));
+        } else {
+            $entry->save([
+                input('field/s')  => input('value')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function delEntry()
+    {
+        $idarr = input('idarr/a');
+        $entry = ReportEntryModel::whereIn('id', $idarr)->select();
+        $result = $entry->delete();
+        if ($result) {
+            exit(json_encode(array(
+                'code' 	=> 0,
+                'msg'	=> ""
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 1,
+            'msg'	=> "删除失败,请稍后重试"
+        )));
+    }
+    
+    public function listEntry()
+    {
+        $limit = input('limit/d', 20);
+        $page = input('page/d', 1);
+        $map = array();
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] =['realname|idcard', 'like', '%'.$keywords.'%'];
+        }
+        $workeragentarr = explode(",", input('workeragent/s'));
+        $workerid = isset($workeragentarr[0]) ? $workeragentarr[0] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $agentid = isset($workeragentarr[1]) ? $workeragentarr[1] : 0;
+        if (!empty($agentid)) {
+            $map[] = ['agentid', '=', $agentid];
+        }
+        $factoryid = input('factoryid/d');
+        if (!empty($factoryid)) {
+            $map[] = ['factoryid', '=', $factoryid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = ReportEntryModel::with(['worker','agent','broker','reportFactory'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = ReportEntryModel::where($map)->count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+    
+    public function exportEntry()
+    {
+        $map = array();
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] =['realname|idcard', 'like', '%'.$keywords.'%'];
+        }
+        $workeragentarr = explode(",", input('workeragent/s'));
+        $workerid = isset($workeragentarr[0]) ? $workeragentarr[0] : 0;
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $agentid = isset($workeragentarr[1]) ? $workeragentarr[1] : 0;
+        if (!empty($agentid)) {
+            $map[] = ['agentid', '=', $agentid];
+        }
+        $factoryid = input('factoryid/d');
+        if (!empty($factoryid)) {
+            $map[] = ['factoryid', '=', $factoryid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $xlsData = ReportEntryModel::with(['worker','agent','broker','reportFactory'])->where($map)->order('id', 'DESC')->select()->toArray();
+        $xlsCell = array(
+            array('id','表ID'),
+            array('worker.title','劳务公司'),
+            array('agent.title','代理门店'),
+            array('broker.title','经纪人'),
+            array('report_factory.title','意向工厂'),
+            array('realname','姓名'),
+            array('mobile','手机号'),
+            array('idcard','身份证号'),
+            array('gender','性别'),
+            array('nation','民族'),
+            array('address','现居住地'),
+            array('startdate','出发日期'),
+            array('enddate','预计到达日期'),
+            array('reftype','返费模式'),
+            array('refpolicy','返费政策'),
+            array('agentremark','报备备注'),
+            array('status','状态',array(1=>'待确认',2=>'已确认',3=>'已入职',4=>'未通过')),
+            array('remark','状态备注'),
+            array('createtime','注册时间'),
+        );
+        export_excel("名单报备", $xlsCell, $xlsData);
+    }
+    
+    // 报备工厂
+    public function factoryList()
+    {
+        return view('report/factorylist');
+    }
+    
+    public function factoryForm()
+    {
+        $id = input('id/d, 0');
+        $factory = ReportFactoryModel::findOrEmpty($id);
+        return view('report/factoryform', [
+            'factory'		=> $factory
+        ]);
+    }
+    
+    public function editFactory()
+    {
+        $id = input('id/d');
+        $vdata = array(
+            'id'		=> $id,
+            'idnumber'	=> input('idnumber/s'),
+            'mobile'    => input('mobile/s')
+        );
+        try {
+            validate(ReportFactoryValidate::class)->check($vdata);
+        } catch (ValidateException $e) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> $e->getError()
+            )));
+        }
+        $data = [
+            'idnumber'		=> input('idnumber/s'),
+            'title'			=> input('title/s'),
+            'address'		=> input('address/s'),
+            'realname'		=> input('realname/s'),
+            'mobile'		=> input('mobile/s'),
+            'status'		=> input('status/d')==1 ? 1 : 2,
+            'priority'    	=> input('priority/d', 0)
+        ];
+        if (empty($id)) {
+            $data['password'] = empty($password) ? md5("123456789") : md5($password);
+            $factory = ReportFactoryModel::create($data);
+        } else {
+            if (!empty($password)) {
+                $data['password'] = md5($password);
+            }
+            $factory = ReportFactoryModel::find($id);
+            $factory->save($data);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function fieldFactory()
+    {
+        $id = input('id/d', 0);
+        $factory = ReportFactoryModel::findOrEmpty($id);
+        if ($factory->isEmpty()) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "信息不存在"
+            )));
+        } else {
+            $factory->save([
+                input('field/s')  => input('value')
+            ]);
+        }
+        exit(json_encode(array(
+            'code' 	=> 0
+        )));
+    }
+    
+    public function delFactory()
+    {
+        $idarr = input('idarr/a');
+        $factory = ReportFactoryModel::whereIn('id', $idarr)->select();
+        $result = $factory->delete();
+        if ($result) {
+            exit(json_encode(array(
+                'code' 	=> 0,
+                'msg'	=> ""
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 1,
+            'msg'	=> "删除失败,请稍后重试"
+        )));
+    }
+    
+    public function listFactory()
+    {
+        $limit = input('limit/d', 20);
+        $page = input('page/d', 1);
+        $map = array();
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] =['title', 'like', '%'.$keywords.'%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list = ReportFactoryModel::where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = ReportFactoryModel::where($map)->count();
+        if ($count==0) {
+            exit(json_encode(array(
+                'code' 	=> 1,
+                'msg'	=> "未查询到数据"
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 0,
+            'msg'	=> "",
+            'count' => $count,
+            'data'  => $list
+        )));
+    }
+}

+ 212 - 0
app/admin/controller/Resident.php

@@ -0,0 +1,212 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\ResidentLog as ResidentLogModel;
+use app\common\model\User as UserModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Broker as BrokerModel;
+use app\common\model\Resident as ResidentModel;
+
+use app\common\validate\Resident as ResidentValidate;
+use think\exception\ValidateException;
+
+class Resident extends BaseController
+{
+
+    public function residentlist()
+    {
+        $workerlist = WorkerModel::order(['id' => 'desc'])->select();
+        return view('resident/residentlist', [
+            'workerlist' => $workerlist,
+        ]);
+    }
+
+    public function residentForm()
+    {
+        $id       = input('id/d, 0');
+        $resident = ResidentModel::findOrEmpty($id);
+        return view('resident/residentform', [
+            'resident' => $resident,
+        ]);
+    }
+
+    public function editresident()
+    {
+        $id   = input('id/d');
+        $data = [
+            'title'    => input('title/s', ""),
+            'mobile'   => input('mobile/s', ""),
+            'weixin'   => input('weixin/s', ""),
+            'qq'       => input('qq/s', ""),
+            'province' => input('province/s', ""),
+            'city'     => input('city/s', ""),
+            'district' => input('district/s', ""),
+            'details'  => input('details/s', ""),
+            'status'   => input('status/d') == 1 ? 1 : 2,
+        ];
+        if (empty($id)) {
+            $vdata = [
+                'id'     => $id,
+                'mobile' => input('mobile/s'),
+            ];
+            try {
+                validate(ResidentValidate::class)->check($vdata);
+            } catch (ValidateException $e) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => $e->getError(),
+                ]));
+            }
+
+            $user = UserModel::where(['mobile' => input('usermobile/s', '')])->findOrEmpty();
+            if ($user->isEmpty()) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "关联的用户不存在。",
+                ]));
+            }
+            $broker = BrokerModel::where('userid', $user['id'])->findOrEmpty();
+            if (empty($broker)) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "只有经纪人才能关联。",
+                ]));
+            }
+
+            $resident_user = ResidentModel::where('userid', $user->id)->find();
+            if (!empty($resident_user)) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "该用户已是经纪人。",
+                ]));
+            }
+
+            $data['userid']     = $user->id;
+            $data['workerid']   = $broker['workerid'];
+            $data['agentid']    = $broker['agentid'];
+            $data['createtime'] = time();
+            ResidentModel::create($data);
+        } else {
+            $resident = ResidentModel::find($id);
+            $resident->save($data);
+        }
+
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function fieldresident()
+    {
+        $id       = input('id/d', 0);
+        $resident = ResidentModel::findOrEmpty($id);
+        if ($resident->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $resident->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delresident()
+    {
+        $access_admin = session('access_admin');
+        $password     = input('password');
+        if ($access_admin['password'] !== md5($password)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "操作密码验证失败",
+            ]));
+        }
+        $idarr  = input('idarr/a');
+        $result = ResidentModel::whereIn('id', $idarr)->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function listresident()
+    {
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $workerid = input('workerid/d');
+        if (!empty($workerid)) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $list  = ResidentModel::with(['worker', 'user'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = ResidentModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    // 用户跟进记录
+    public function follow()
+    {
+        return view('resident/follow');
+    }
+
+    public function listfollow()
+    {
+        $limit  = input('limit/d', 20);
+        $page   = input('page/d', 1);
+        $map    = [];
+        $mobile = input('mobile/s');
+        if (!empty($mobile)) {
+            $resident = ResidentModel::where('mobile',$mobile)->findOrEmpty();
+            if (empty($resident)) {
+                $map[] = ['id','=',0];
+            } else {
+                $map[] = ['residentid', '=', $resident['id']];
+            }
+        }
+        $list  = ResidentLogModel::with(['resident', 'worker'])->where($map)->order('createtime', 'DESC')->limit($limit)->page($page)->select();
+        $count = ResidentLogModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+}

+ 406 - 0
app/admin/controller/Settle.php

@@ -0,0 +1,406 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+
+use app\common\model\Agent as AgentModel;
+use app\common\model\SettleCate as SettleCateModel;
+use app\common\model\SettleAgent as SettleAgentModel;
+
+use PHPExcel_IOFactory;
+use PHPExcel;
+
+class Settle extends BaseController
+{
+	
+	
+	// 结算名单 
+	public function agentList()
+	{
+		$cateid = input('cateid/d', 0);
+		$catelist = SettleCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		$agentlist = AgentModel::order(['id'=>'desc'])->select();
+		return view('settle/agentlist',[
+			'cateid'		=> $cateid,
+			'catelist'		=> $catelist,
+			'agentlist'		=> $agentlist
+		]);
+	}
+	
+	public function agentForm()
+	{
+		$id = input('id/d, 0');
+		$agent = SettleAgentModel::findOrEmpty($id);
+		$catelist = SettleCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		$agentlist = AgentModel::order(['id'=>'desc'])->select();
+		return view('settle/agentform',[
+			'catelist'			=> $catelist,
+			'agentlist'			=> $agentlist,
+			'agent'				=> $agent
+		]);
+	}
+	
+	public function agentImport()
+	{
+		$catetitle = date("YmdHis");
+		return view('settle/agentimport',[
+			'catetitle'		=> $catetitle
+		]);
+	}
+	
+	public function importAgent()
+	{
+		$execlfile = input('execlfile/s', "");
+		if (empty($execlfile)){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "请上传导入文件。"
+			)));
+		}	
+		$filedata = read_excel( $execlfile );
+		$agentlist = AgentModel::column('idnumber,id,title','idnumber');
+		$catetitle = input('catetitle/s', "");
+		$cate = SettleCateModel::where(['title'=>$catetitle])->findOrEmpty();
+		if ($cate->isEmpty()){
+			$cate = new SettleCateModel;
+			$cate->save([
+				'title' 	=> $catetitle,
+				'status'    => 1,
+				'remark'	=> "",
+				'priority'  => 0
+			]);
+		}
+		$cateid = $cate->id;
+		$stype = input('stype/d', 1);
+		$createtime = input('createtime/s', "");
+		$sagent = new SettleAgentModel;
+		$data = array();
+		$sucnumber = 0;
+		$errnumber = 0;
+		foreach( $filedata as $k=>$v ){ 
+			$idnumber = trim($v[0]);
+			if (empty($idnumber) || empty($agentlist[$idnumber])){
+				$errnumber++;
+				continue;
+			}else{
+				$data[] = array(
+					'cateid'		=> $cateid,
+					'agentid'		=> $agentlist[$idnumber]['id'],
+					'yearmonth'		=> $v[1],
+					'pername'		=> $v[2],
+					'perid'			=> $v[3],
+					'permobile'		=> $v[4],
+					'pernumber'		=> $v[5],
+					'sdate'			=> $v[6],
+					'edate'			=> $v[7],
+					'factory'		=> $v[8],
+					'accountname'	=> $v[9],
+					'accountnumber'	=> $v[10],
+					'accountbank'	=> $v[11],
+					'accountstatus'	=> $v[12],
+					'remark'		=> $v[13],
+					'accountmoney'	=> floatval($v[14]),
+					'createtime'	=> $createtime,
+					'stype'			=> $stype,
+					'onefield1'		=> $stype==1 ? $v[15] : "",
+					'onefield2'		=> $stype==1 ? $v[16] : "",
+					'onefield3'		=> $stype==1 ? $v[17] : "",
+					'onefield4'		=> $stype==1 ? $v[18] : "",
+					'onefield5'		=> $stype==1 ? $v[19] : "",
+					'onefield6'		=> $stype==1 ? $v[20] : "",
+					
+					'thrfield1'		=> $stype==3 ? $v[15] : "",
+					'thrfield2'		=> $stype==3 ? $v[16] : "",
+					'thrfield3'		=> $stype==3 ? $v[17] : ""
+				);
+				$sucnumber++;
+			}
+		}
+		$sagent->saveAll($data);
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'sucnumber'	=> $sucnumber,
+			'errnumber'	=> $errnumber
+		)));
+	}
+	
+	public function editAgent()
+	{
+		$id = input('id/d');
+		$agent = SettleAgentModel::findOrEmpty($id);
+		$stype = input('stype/d', 1);
+		$data = array(
+			'cateid'		=> input('cateid/d', 0),
+			'agentid'		=> input('agentid/d', 0),
+			'yearmonth'		=> input('yearmonth/s', ""),
+			'pername'		=> input('pername/s', ""),
+			'perid'			=> input('perid/s', ""),
+			'permobile'		=> input('permobile/s', ""),
+			'pernumber'		=> input('pernumber/s', ""),
+			'sdate'			=> input('sdate/s', ""),
+			'edate'			=> input('edate/s', ""),
+			'factory'		=> input('factory/s', ""),
+			
+			'accountname'	=> input('accountname/s', ""),
+			'accountnumber'	=> input('accountnumber/s', ""),
+			'accountbank'	=> input('accountbank/s', ""),
+			'accountstatus'	=> input('accountstatus/s', ""),
+			'remark'		=> input('remark/s', ""),
+			'accountmoney'	=> floatval(input('accountmoney/f', 0.00)),
+			'createtime'	=> input('createtime/s', ""),
+			'stype'			=> $stype,
+			
+			'onefield1'		=> $stype==1 ? input('onefield1/s', "") : "",
+			'onefield2'		=> $stype==1 ? input('onefield2/s', "") : "",
+			'onefield3'		=> $stype==1 ? input('onefield3/s', "") : "",
+			'onefield4'		=> $stype==1 ? input('onefield4/s', "") : "",
+			'onefield5'		=> $stype==1 ? input('onefield5/s', "") : "",
+			'onefield6'		=> $stype==1 ? input('onefield6/s', "") : "",
+			
+			'thrfield1'		=> $stype==3 ? input('thrfield1/s', "") : "",
+			'thrfield2'		=> $stype==3 ? input('thrfield2/s', "") : "",
+			'thrfield3'		=> $stype==3 ? input('thrfield3/s', "") : ""
+		);
+		if ($agent->isEmpty()){
+			$agent = new SettleAgentModel;
+			$agent->save($data);
+		}else{
+			$agent->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldAgent()
+	{
+		$id = input('id/d',0); 
+		$info = SettleAgentModel::findOrEmpty($id);
+		if ($info->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$info->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delAgent()
+	{
+		$idarr = input('idarr/a');
+		$info = SettleAgentModel::whereIn('id',$idarr)->select();
+		$result = $info->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listAgent()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['factory|pername', 'like', '%'.$keywords.'%'];
+		}
+		$cateid = input('cateid/d', 0);
+		if (!empty($cateid)){
+			$map[] = ['cateid', '=', $cateid];
+		}
+		$agentid = input('agentid/d', 0);
+		if (!empty($agentid)){
+			$map[] = ['agentid', '=', $agentid];
+		}
+		$stype = input('stype/d', 0);
+		if (!empty($stype)){
+			$map[] = ['stype', '=', $stype];
+		}
+		$list = SettleAgentModel::with(['settleCate','agent'])->where($map)->order('id','DESC')->limit($limit)->page($page)->append(['stype_text'])->select();
+		$count = SettleAgentModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function exportAgent()
+	{
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['factory|pername', 'like', '%'.$keywords.'%'];
+		}
+		$cateid = input('cateid/d', 0);
+		if (!empty($cateid)){
+			$map[] = ['cateid', '=', $cateid];
+		}
+		$agentid = input('agentid/d', 0);
+		if (!empty($agentid)){
+			$map[] = ['agentid', '=', $agentid];
+		}
+		$stype = input('stype/d', 0);
+		if (!empty($stype)){
+			$map[] = ['stype', '=', $stype];
+		}
+		$xlsData = SettleAgentModel::with(['settleCate','agent'])->where($map)->order('id','DESC')->append(['stype_text'])->select()->toArray();
+		$xlsCell = array(
+			array('id','表ID'),
+			array('settle_cate.title','批次号'),
+			array('agent.idnumber','代理编号'),
+			array('agent.title','代理门店'),
+			array('yearmonth', '年月'),
+			array('pername', '员工姓名'),
+			array('perid', '员工工号'),
+			array('permobile', '员工手机号'),
+			array('pernumber', '员工身份证号'),
+			array('sdate', '入职日期'),
+			array('edate', '离职日期'),
+			array('factory', '入职企业'),
+			
+			array('accountname', '收款人姓名'),
+			array('accountnumber', '收款人身份证号码'),
+			array('accountbank', '收款人银行账号'),
+			array('accountstatus', '结算状态'),
+			array('remark', '备注'),
+			array('accountmoney', '实结金额'),
+			array('createtime', '添加时间'),
+			array('stype', '类型'),
+			
+			array('onefield1', '小时工-出勤时数'),
+			array('onefield2', '小时工-员工单价'),
+			array('onefield3', '小时工-代理费基数'),
+			array('onefield4', '小时工-结算单价'),
+			array('onefield5', '小时工-应结费用'),
+			array('onefield6', '小时工-税费'),
+			
+			array('thrfield1', '管理费-返费政策'),
+			array('thrfield2', '管理费-核对情况'),
+			array('thrfield3', '管理费-员工薪资')
+		);
+		export_excel("代理结算",$xlsCell,$xlsData);
+	}
+	
+	
+	
+	
+	// 分类
+	public function cateList()
+	{
+		return view('settle/catelist');
+	}
+	
+	public function cateForm()
+	{
+		$id = input('id/d, 0');
+		$cate = SettleCateModel::findOrEmpty($id);
+		return view('settle/cateform',[
+			'cate'	=> $cate
+		]);
+	}
+	
+	public function listCate()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = SettleCateModel::withCount('settleAgent')->withSum('settleAgent','accountmoney')->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = SettleCateModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			))); 
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function fieldCate()
+	{
+		$id = input('id/d');
+		$cate = SettleCateModel::find($id);
+		if ($cate==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "批次信息不存在"
+			)));
+		}else{
+			$cate->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editCate()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			$cate = SettleCateModel::create([
+				'title' 	=> input('title/s', ""),
+				'status'    => input('status/d', 0)==1 ? 1 : 2,
+				'remark'	=> input('remark/s', ""),
+				'priority'  => input('priority/d', 0)
+			]);
+		}else{
+			$cate = SettleCateModel::find($id);
+			$cate->save([
+				'title' 	=> input('title/s', ""),
+				'status'    => input('status/d', 0)==1 ? 1 : 2,
+				'remark'	=> input('remark/s', ""),
+				'priority'  => input('priority/d', 0)
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delCate()
+	{
+		$id = input('id/d');
+		$cate = SettleCateModel::where('id',$id)->select();
+		$result = $cate->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	
+	
+}

+ 48 - 0
app/admin/controller/Sinpage.php

@@ -0,0 +1,48 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Sinpage as SinpageModel;
+
+class Sinpage extends BaseController
+{
+	
+	public function index()
+	{
+		$sinpage = SinpageModel::where(1)->find();
+		return view('set/sinpage',[
+			'sinpage' => $sinpage 
+		]);
+	}
+	
+	public function editSinpage()
+	{
+		$sinpage = SinpageModel::where(1)->find();
+		if ($sinpage==null){
+			SinpageModel::create([
+				'aboutus'		=> input('aboutus/s'),
+				'privacy'		=> input('privacy/s'),
+				'service'		=> input('service/s'),
+				'contact'		=> input('contact/s'),
+                'wxmp'		    => input('wxmp/s'),
+				'apptreaty'		=> input('apptreaty/s')
+			]);
+		}else{
+			SinpageModel::update([
+				'id'			=> $sinpage['id'],
+				'aboutus'		=> input('aboutus/s'),
+				'privacy'		=> input('privacy/s'),
+				'service'		=> input('service/s'),
+				'contact'		=> input('contact/s'),
+                'wxmp'		    => input('wxmp/s'),
+				'apptreaty'		=> input('apptreaty/s')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'data'  => ""
+		)));
+	}
+	
+}
+	

+ 112 - 0
app/admin/controller/Slide.php

@@ -0,0 +1,112 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+use app\common\model\Slide as SlideModel;
+
+class Slide extends BaseController
+{
+	
+	public function index()
+	{
+		return view('set/slidelist');
+	}
+	
+	public function slideForm()
+	{
+		$id = input('id/d, 0');
+		$slide = SlideModel::findOrEmpty($id);
+		return view('set/slideform',[
+			'slide' => $slide
+		]);
+	}
+	
+	
+	public function listSlide()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$pagetab = input('pagetab/d');
+		if (!empty($pagetab)){
+			$map[] = ['pagetab', '=', $pagetab];
+		}
+		$stype = input('stype/d');
+		if (!empty($stype)){
+			$map[] = ['stype', '=', $stype];
+		}
+		$list = SlideModel::where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['stype_text'])->select();
+		$count = SlideModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+	public function fieldSlide()
+	{
+		$id = input('id/d');
+		$slide = SlideModel::find($id);
+		if ($slide==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$slide->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	
+	public function editSlide()
+	{
+		$id = input('id/d');
+		$data = array(
+			'pagetab'   => input('pagetab/s'),
+			'title' 	=> input('title/s'),
+			'tilpic' 	=> input('tilpic/s'),
+			'stype' 	=> input('stype/d', 1),
+			'tilurl' 	=> input('tilurl/s'),
+			'priority'  => input('priority/d', 0)
+		);
+		if (empty($id)){
+			SlideModel::create($data);
+		}else{
+			$data['id'] = $id;
+			SlideModel::update($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delSlide()
+	{
+		$idarr = input('idarr/a');
+		SlideModel::whereIn('id',$idarr)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+
+}

+ 187 - 0
app/admin/controller/Supply.php

@@ -0,0 +1,187 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\Supply as SupplyModel;
+
+use app\common\validate\Supply as SupplyValidate;
+use think\exception\ValidateException;
+use think\facade\Db;
+
+class Supply extends BaseController
+{
+	
+	// 企业招聘
+	public function supplyList()
+	{
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		return view('supply/supplylist',[
+			'workerlist'	=> $workerlist
+		]);
+	}
+	
+	public function supplyForm()
+	{
+		$id = input('id/d, 0');
+		$supply = SupplyModel::findOrEmpty($id);
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		$provincelist = array(
+			['value'=>"全国", 'title'=>"全国"],
+			['value'=>"北京市", 'title'=>"北京市"],
+			['value'=>"天津市", 'title'=>"天津市"],
+			['value'=>"河北省", 'title'=>"河北省"],
+			['value'=>"山西省", 'title'=>"山西省"],
+			['value'=>"内蒙古自治区", 'title'=>"内蒙古自治区"],
+			['value'=>"辽宁省", 'title'=>"辽宁省"],
+			['value'=>"吉林省", 'title'=>"吉林省"],
+			['value'=>"黑龙江省", 'title'=>"黑龙江省"],
+			['value'=>"上海市", 'title'=>"上海市"],
+			['value'=>"江苏省", 'title'=>"江苏省"],
+			['value'=>"浙江省", 'title'=>"浙江省"],
+			['value'=>"安徽省", 'title'=>"安徽省"],
+			['value'=>"福建省", 'title'=>"福建省"],
+			['value'=>"江西省", 'title'=>"江西省"],
+			['value'=>"山东省", 'title'=>"山东省"],
+			['value'=>"河南省", 'title'=>"河南省"],
+			['value'=>"湖北省", 'title'=>"湖北省"],
+			['value'=>"湖南省", 'title'=>"湖南省"],
+			['value'=>"广东省", 'title'=>"广东省"],
+			['value'=>"广西壮族自治区", 'title'=>"广西壮族自治区"],
+			['value'=>"海南省", 'title'=>"海南省"],
+			['value'=>"重庆市", 'title'=>"重庆市"],
+			['value'=>"四川省", 'title'=>"四川省"],
+			['value'=>"贵州省", 'title'=>"贵州省"],
+			['value'=>"云南省", 'title'=>"云南省"],
+			['value'=>"西藏自治区", 'title'=>"西藏自治区"],
+			['value'=>"陕西省", 'title'=>"陕西省"],
+			['value'=>"甘肃省", 'title'=>"甘肃省"],
+			['value'=>"青海省", 'title'=>"青海省"],
+			['value'=>"宁夏回族自治区", 'title'=>"宁夏回族自治区"],
+			['value'=>"新疆维吾尔自治区", 'title'=>"新疆维吾尔自治区"],
+			['value'=>"台湾省", 'title'=>"台湾省"],
+			['value'=>"香港特别行政区", 'title'=>"香港特别行政区"],
+			['value'=>"澳门特别行政区", 'title'=>"澳门特别行政区"]
+		);
+		return view('supply/supplyform',[
+			'provincelist'	=> $provincelist,
+			'workerlist'	=> $workerlist,
+			'supply'		=> $supply
+		]);
+	}
+	
+	public function editSupply()
+	{
+		$id = input('id/d', 0);
+		$descity = input('descity/a', []);
+		if (in_array('全国', $descity)){
+			$descity = ['全国'];
+		}
+		$data = [
+			'workerid'			=> input('workerid/d', 0),
+			'mnumber'			=> input('mnumber/d', 0),
+			'wnumber'			=> input('wnumber/d', 0),
+			'agegroup'			=> input('agegroup/s', ""),
+			'province'			=> input('province/s', ""),
+			'city'				=> input('city/s', ""),
+			'district'			=> input('district/s', ""),
+			'descity'			=> implode(",", $descity),
+			'candate'			=> input('candate/s', ""),
+			'telephone'			=> input('telephone/s', ""),
+			'remark'			=> input('remark/s', ""),
+			'status'			=> input('status/d', 1),
+			'priority'			=> input('priority/d', 0),
+			'updatetime'		=> input('updatetime/s', ""),
+			'createtime'		=> input('createtime/s', ""),
+			'volume'			=> input('volume/d', 0)
+		];
+		try {
+		    validate(SupplyValidate::class)->check($data);
+		} catch (ValidateException $e) {
+		    exit(json_encode(array(
+		        'code' 	=> 1,
+		        'msg'	=> $e->getError()
+		    )));
+		}
+		if (empty($id)){
+			$data['telearr'] = array();
+			$supply = SupplyModel::create($data);
+		}else{
+			$supply = SupplyModel::find($id);
+			$supply->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldSupply()
+	{
+		$id = input('id/d',0); 
+		$supply = SupplyModel::findOrEmpty($id);
+		$supply->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delSupply()
+	{
+		$idarr = input('idarr/a');
+        $result = Db::name('supply')->whereIn('id',$idarr)->update(['deletetime'=>time()]);
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listSupply()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$map = array();
+		$keywords = input('keywords/s', "");
+		if (!empty($keywords)){
+			$map[] =['province|city|district|descity', 'like', '%'.$keywords.'%'];
+		}
+		$workerid = input('workerid/d', 0);
+		if (!empty($workerid)){
+			$map[] = ['workerid', '=', $workerid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$daterange = input('daterange/s', "");
+		if (!empty($daterange)){
+			$daterangearr = explode("~", $daterange);
+			$map[] = ['createtime', '>= time', trim($daterangearr[0])];
+			$map[] = ['createtime', '<= time', trim($daterangearr[1])];
+		}
+		$list = SupplyModel::with(['worker'])->where($map)->order(['priority'=>'desc','id'=>'desc',])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = SupplyModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+}
+	

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

@@ -0,0 +1,118 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\UserPart;
+use app\common\service\IntegralService;
+use think\facade\Db;
+
+class Test extends BaseController
+{
+    public function t1(){
+        $integralService = new IntegralService();
+        $integralService->add(6,IntegralService::REGISTER);
+    }
+/*
+    public function t2()
+    {
+        $xlsData = Db::table('un_person')->select();
+        $xlsCell = [
+            ['id', '主键(必填)'],
+            ['uid', '微信uid'],
+            ['username', '登陆用户名(必填)'],
+            ['name', '姓名(必填)'],
+            ['sex', '性别(必填)'],
+            ['idCard', '证件号码(必填)'],
+            ['phone', '电话号码(必填)'],
+            ['address', '联系地址(必填)'],
+            ['email', '邮箱(必填)'],
+        ];
+        export_excel("人员信息", $xlsCell, $xlsData);
+    }
+
+    public function t3()
+    {
+        $xlsData = Db::table('un_enterprise')->select();
+        $xlsCell = [
+            ['id', '主键(必填)'],
+            ['uid', '微信uid'],
+            ['name', '单位名称(必填)'],
+            ['idCard', '社会信用代码(必填)'],
+            ['street', '所属街道(必填)'],
+            ['address', '单位地址(必填)'],
+            ['legal', '法人代表(必填)'],
+            ['ephone', '单位电话(必填)'],
+            ['agentName', '经办人(必填)'],
+            ['agentPhone', '经办人电话(必填)'],
+            ['agentEmail', '经办人邮箱(必填)'],
+            ['imgurl', '证件链接(必填)'],
+        ];
+        export_excel("企业信息", $xlsCell, $xlsData);
+    }
+
+    public function t4()
+    {
+        set_time_limit(0);
+        ini_set('memory_limit',-1);
+        $xlsData = Db::table('un_talent_info')->select();
+        $xlsCell = [
+            ['id', '主键(必填)'],
+            ['enterpriseId', '企业Id'],
+            ['year', '申报年度'],
+            ['type', '人才类型'],
+            ['source', '来源'],
+            ['ourCitySource', '是否我市'],
+            ['talentType', '申报人才类型'],
+            ['cardType', '证件类型'],
+            ['idCard', '证件号码'],
+            ['name', '姓名'],
+            ['photo', '头像'],
+            ['sex', '性别'],
+            ['nation', '民族'],
+            ['nationality', '国籍'],
+            ['provinceName', '籍贯省名称'],
+            ['cityName', '籍贯市名称'],
+            ['countyName', '籍贯县名称'],
+            ['birthday', '出生日期'],
+            ['address', '现居地址'],
+            ['politics', '政治面貌'],
+            ['highEducation', '最高学历'],
+            ['graduateSchool', '毕业学校'],
+            ['major', '专业'],
+            ['post', '职务'],
+            ['phone', '手机号码'],
+            ['email', '电子邮箱'],
+            ['bank', '开户银行'],
+            ['bankNetwork', '开户银行网点'],
+            ['bankAccount', '银行账号'],
+            ['bankNumber', '银行行号'],
+            ['entryTime', '入职时间'],
+            ['startTime', '工作合同开始时间'],
+            ['endTime', '工作合同结束时间'],
+            ['talentArrange', '人才层次'],
+            ['identifyCondition', '认定条件'],
+            ['identifyGetTime', '认定条件获得时间'],
+            ['identifyConditionName', '认定条件名称'],
+            ['identifyMonth', '认定月份'],
+            ['certificateNO', '证书编号'],
+            ['letterTime', '行政介绍信时间'],
+            ['gygb', '是否为我市本级国有股比超过50%'],
+            ['certificateStartTime', '人才证书开始时间'],
+            ['qzgccrcActiveTime', '人才证书的有效期'],
+            ['mainHonours', '主要业绩及取得的荣誉'],
+            ['educationAndResume', '教育背景及工作简历'],
+            ['firstInJJTime', '首次来晋工作时间'],
+            ['isIntroduction', '是否引进'],
+            ['introductionMode', '引进方式'],
+            ['industryField', '行业领域'],
+            ['title', '职称'],
+            ['professionalQualifications', '国家职业资格'],
+            ['studyAbroad', '是否有留学经历'],
+            ['studyAbroadCountry', '留学国家'],
+            ['fromCity', '来源县市'],
+            ['qzBatch', '入选泉州高层次人才批次'],
+            ['breakFaith', '曾被相关部门列为失信人员'],
+        ];
+        export_excel("人才信息", $xlsCell, $xlsData);
+    }*/
+}

+ 141 - 0
app/admin/controller/Train.php

@@ -0,0 +1,141 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\Config;
+use app\common\model\Train as TrainModel;
+
+class Train extends BaseController
+{
+    public function index()
+    {
+        return view('train/index');
+    }
+
+    public function form()
+    {
+        $id   = input('id/d, 0');
+        $info = TrainModel::findOrEmpty($id);
+        return view('train/form', [
+            'info' => $info,
+        ]);
+    }
+
+    public function list()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+
+        $where = [];
+        $title = input('title', '');
+        if (!empty($title)) {
+            $where[] = ['title', 'like', "%{$title}%"];
+        }
+        $contact = input('contact', '');
+        if (!empty($contact)) {
+            $where[] = ['contact|mobile', 'like', "%{$contact}%"];
+        }
+        $status = input('status', 0);
+        if (!empty($status)) {
+            $where[] = ['status', '=', $status];
+        }
+
+        $list  = TrainModel::order(['priority' => 'desc', 'id' => 'desc'])->where($where)->limit($limit)->page($page)->select()->append(['status_text']);
+        $count = TrainModel::where($where)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function field()
+    {
+        $id   = input('id/d');
+        $info = TrainModel::find($id);
+        if ($info == null) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "数据不存在",
+            ]));
+        } else {
+            $info->save([
+                input('field/s') => input('value/s'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function edit()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            TrainModel::create([
+                'title'       => input('title/s'),
+                'contact'     => input('contact/s'),
+                'mobile'      => input('mobile/s'),
+                'address'     => input('address/s'),
+                'status'      => input('status/d') == 1 ? 1 : 2,
+                'priority'    => input('priority/d'),
+                'create_time' => time(),
+            ]);
+        } else {
+            $info = TrainModel::find($id);
+            $info->save([
+                'title'    => input('title/s'),
+                'contact'  => input('contact/s'),
+                'mobile'   => input('mobile/s'),
+                'address'  => input('address/s'),
+                'status'   => input('status/d') == 1 ? 1 : 2,
+                'priority' => input('priority/d'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function del()
+    {
+        $id     = input('id/d');
+        $info   = TrainModel::where('id', $id)->select();
+        $result = $info->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function post()
+    {
+        $post = Config::getConfigValue('train_post');
+        return view('train/post', [
+            'post' => $post,
+        ]);
+    }
+
+    public function editpost()
+    {
+        $post = input('post', 0);
+        Config::setConfigValueSingle('train_post', $post);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+}

+ 102 - 0
app/admin/controller/Trainjoin.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\TrainJoin as TrainJoinModel;
+
+class Trainjoin extends BaseController
+{
+    public function index()
+    {
+        return view('trainjoin/index');
+    }
+
+    public function list()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+
+        $where    = [];
+        $keywords = input('keywords', '');
+        if (!empty($keywords)) {
+            $where[] = ['t.title|u.nickname|u.mobile', 'like', "%{$keywords}%"];
+        }
+        $status = input('status', 0);
+        if (!empty($status)) {
+            $where[] = ['tj.status', '=', $status];
+        }
+
+        $list  = TrainJoinModel::alias('tj')
+            ->field(['tj.*', 't.title', 'u.nickname', 'u.mobile'])
+            ->leftJoin('user u', 'u.id = tj.user_id')
+            ->leftJoin('train t', 't.id = tj.train_id')
+            ->where($where)
+            ->limit($limit)->page($page)->select()->append(['status_text']);
+        $count = TrainJoinModel::alias('tj')
+            ->field(['tj.*', 't.title', 'u.nickname', 'u.mobile'])
+            ->leftJoin('user u', 'u.id = tj.user_id')
+            ->leftJoin('train t', 't.id = tj.train_id')
+            ->where($where)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function field()
+    {
+        $id   = input('id/d');
+        $info = TrainJoinModel::find($id);
+        if ($info == null) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "数据不存在",
+            ]));
+        } else {
+            $info->save([
+                input('field/s') => input('value/s'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function del()
+    {
+        $id     = input('id/d');
+        $info   = TrainJoinModel::where('id', $id)->select();
+        $result = $info->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function status()
+    {
+        $idarr  = input('idarr/a');
+        $status = input('status/d');
+        TrainJoinModel::whereIn('id', $idarr)->update(['status' => $status]);
+
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+}

+ 1163 - 0
app/admin/controller/User.php

@@ -0,0 +1,1163 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\common\model\RensheCode;
+use app\common\model\UserTags;
+use app\common\model\UserWill;
+use app\admin\BaseController;
+use app\common\model\User as UserModel;
+use app\common\model\UserAuths as UserAuthsModel;
+use app\common\model\UserFollow as UserFollowModel;
+use app\common\model\UserGroups as UserGroupsModel;
+use app\common\model\UserPart as UserPartModel;
+use app\common\model\UserIntegral as UserIntegralModel;
+use app\common\model\UserRank as UserRankModel;
+use app\common\model\UserParam as UserParamModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+
+use app\common\model\Agent as AgentModel;
+use app\common\model\Broker as BrokerModel;
+
+use app\common\service\IntegralService;
+use app\common\service\UserService;
+use app\common\validate\User as UserValidate;
+use think\exception\ValidateException;
+
+class User extends BaseController
+{
+
+
+    // 用户跟进记录
+    public function follow()
+    {
+        $userid     = input('userid/d');
+        $user       = UserModel::findOrEmpty($userid);
+        $followlist = UserFollowModel::where('userid', $userid)->order('id', 'desc')->limit(100)->select();
+        return view('user/follow', [
+            'user'       => $user,
+            'followlist' => $followlist,
+        ]);
+    }
+
+    public function editFollow()
+    {
+        $userid = input('userid/d', 0);
+        $user   = UserModel::findOrEmpty($userid);
+        if ($user->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "用户信息不存在。",
+            ]));
+        }
+        UserFollowModel::create([
+            'userid'     => $userid,
+            'ftype'      => input('ftype/s', ""),
+            'remark'     => input('remark/s', ""),
+            'createtime' => time(),
+        ]);
+        $followstatus = input('followstatus/d', 1);
+        $user->save([
+            'followstatus' => $followstatus,
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    // 邀请排行榜
+    public function rankList()
+    {
+        return view('user/ranklist');
+    }
+
+    public function rankForm()
+    {
+        $id   = input('id/d');
+        $rank = UserRankModel::findOrEmpty($id);
+        return view('user/rankform', [
+            'rank' => $rank,
+        ]);
+    }
+
+    public function editRank()
+    {
+        $id   = input('id/d');
+        $rank = UserRankModel::findOrEmpty($id);
+        $rank->save([
+            'realname'   => input('realname/s'),
+            'mobile'     => input('mobile/s'),
+            'partnumber' => input('partnumber/d', 0),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function fieldRank()
+    {
+        $id   = input('id/d', 0);
+        $rank = UserRankModel::findOrEmpty($id);
+        if ($rank->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $rank->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function listRank()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+        $map   = [];
+        $list  = UserRankModel::where($map)->order('partnumber', 'desc')->limit($limit)->page($page)->select();
+        $count = UserRankModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function delRank()
+    {
+        $idarr = input('idarr/a');
+        UserRankModel::whereIn('id', $idarr)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    // 邀请记录
+    public function partList()
+    {
+        return view('user/partlist');
+    }
+
+    public function listPart()
+    {
+        $limit    = input('limit');
+        $page     = input('page');
+        $map      = [];
+        $keywords = input('keywords/s', "");
+        $status   = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['UserPart.status', '=', $status];
+        }
+        $list  = UserPartModel::hasWhere('puser', [['realname|mobile', 'like', '%' . $keywords . '%', 'or']])->with(['puser', 'user'])->where($map)->order('id', 'desc')->limit($limit)->page($page)->append(['status_text'])->select();
+        $count = UserPartModel::hasWhere('puser', [['realname|mobile', 'like', '%' . $keywords . '%', 'or']])->where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function exportPart()
+    {
+        $map      = [];
+        $keywords = input('keywords/s', "");
+        $status   = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['UserPart.status', '=', $status];
+        }
+        $xlsData = UserPartModel::hasWhere('puser', [['realname|mobile', 'like', '%' . $keywords . '%', 'or']])->with(['puser', 'user'])->where($map)->order('id', 'desc')->select()->toArray();
+        $xlsCell = [
+            ['id', '表ID'],
+            ['puser.nickname', '邀请人昵称'],
+            ['puser.realname', '邀请人姓名'],
+            ['puser.mobile', '邀请人手机号'],
+            ['puser.bankcard.openbank', '邀请人开户行'],
+            ['puser.bankcard.account', '邀请人帐户名'],
+            ['puser.bankcard.number', '邀请人账户号'],
+            ['user.nickname', '被邀请人昵称'],
+            ['user.realname', '被邀请人姓名'],
+            ['user.mobile', '被邀请人手机号'],
+            ['status', '状态', [1 => '未入职', 2 => '已入职', 3 => '已发放']],
+            ['redmoney', '奖金金额'],
+            ['createtime', '推荐时间'],
+        ];
+        export_excel("系统用户", $xlsCell, $xlsData);
+    }
+
+    public function fieldPart()
+    {
+        $id   = input('id/d', 0);
+        $part = UserPartModel::findOrEmpty($id);
+        if ($part->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $part->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function partForm()
+    {
+        $id   = input('id/d');
+        $part = UserPartModel::with(['puser', 'user'])->findOrEmpty($id);
+        return view('user/partform', [
+            'part' => $part,
+        ]);
+    }
+
+    public function editPart()
+    {
+        $id   = input('id/d');
+        $part = UserPartModel::findOrEmpty($id);
+        $part->save([
+            'status'   => input('status/d', 1),
+            'redmoney' => input('redmoney/d', 0),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delPart()
+    {
+        $idarr = input('idarr/a');
+        UserPartModel::whereIn('id', $idarr)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    // 用户积分
+    public function integralList()
+    {
+        return view('user/integrallist');
+    }
+
+    public function listIntegral()
+    {
+        $limit    = input('limit');
+        $page     = input('page');
+        $map      = [];
+        $keywords = input('keywords/s', "");
+        $itype    = input('itype/d', 0);
+        if (!empty($itype)) {
+            $map[] = ['itype', '=', $itype];
+        }
+        $status = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list  = UserIntegralModel::hasWhere('user', [['realname|mobile', 'like', '%' . $keywords . '%', 'or']])->with(['user'])->where($map)->order('id', 'desc')->limit($limit)->page($page)->select()->append(['itype_text', 'status_text']);
+        $count = UserIntegralModel::hasWhere('user', [['realname|mobile', 'like', '%' . $keywords . '%', 'or']])->where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function exportIntegral()
+    {
+        $map      = [];
+        $keywords = input('keywords/s', "");
+        $itype    = input('itype/d', 0);
+        if (!empty($itype)) {
+            $map[] = ['itype', '=', $itype];
+        }
+        $xlsData = UserIntegralModel::hasWhere('user', [['realname|mobile', 'like', '%' . $keywords . '%', 'or']])->with(['user'])->where($map)->order('id', 'desc')->select()->append(['itype_text', 'status_text'])->toArray();
+        $xlsCell = [
+            ['id', '表ID'],
+            ['user.nickname', '昵称'],
+            ['user.realname', '姓名'],
+            ['user.mobile', '手机号'],
+            ['user.bankcard.openbank', '开户行'],
+            ['user.bankcard.account', '帐户名'],
+            ['user.bankcard.number', '账户号'],
+            ['title', '积分标题'],
+            ['itype_text', '类型'],
+            ['status_text', '状态'],
+            ['intvalue', '积分变更值'],
+            ['intmoney', '积分金额'],
+            ['remark', '备注'],
+            ['createtime', '注册时间'],
+        ];
+        export_excel("用户积分", $xlsCell, $xlsData);
+    }
+
+
+    public function fieldIntegral()
+    {
+        $id       = input('id/d', 0);
+        $integral = UserIntegralModel::findOrEmpty($id);
+        if ($integral->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $integral->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function integralUpdate()
+    {
+        $id       = input('id/d', 0);
+        $integral = UserIntegralModel::with('user')->findOrEmpty($id);
+        return view('user/integralupdate', [
+            'integral' => $integral,
+        ]);
+    }
+
+    public function updateIntegral()
+    {
+        $id       = input('id/d', 0);
+        $integral = UserIntegralModel::findOrEmpty($id);
+        if ($integral->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "用户积分记录不存在",
+            ]));
+        }
+        $createtime = input('createtime/s', date("Y-m-d H:i:s"));
+        $integral->save([
+            'title'      => input('title/s', ""),
+            'intvalue'   => input('intvalue/d', 0),
+            'intmoney'   => input('intmoney/f', 0.00),
+            'remark'     => input('remark/s', ""),
+            'itype'      => input('itype/d', 1),
+            'status'     => input('status/d', 1),
+            'createtime' => $createtime,
+            'yeartime'   => date("Y", strtotime($createtime)),
+            'monthtime'  => date("Ym", strtotime($createtime)),
+        ]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function statusIntegral()
+    {
+        $id       = input('id/d');
+        $integral = UserIntegralModel::where(['itype' => 3])->find($id);
+        if ($integral == null) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "该记录非兑现类型",
+            ]));
+        } elseif ($integral->status == 1) {
+            $integral->save([
+                'status' => 2,
+            ]);
+        } elseif ($integral->status == 2) {
+            $integral->save([
+                'status' => 1,
+            ]);
+        } else {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "该记录非兑现类型。",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function statusIntegralAll()
+    {
+        $idarr = input('idarr/a');
+        UserIntegralModel::update(['status' => 2], ['status' => 1, 'itype' => 3, 'id' => $idarr]);
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function delIntegral()
+    {
+        $idarr = input('idarr/a');
+        UserIntegralModel::whereIn('id', $idarr)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function integralForm()
+    {
+        $userid = input('userid/d');
+        $user   = UserModel::findOrEmpty($userid);
+        return view('user/integralform', [
+            'user' => $user,
+        ]);
+    }
+
+    public function editIntegral()
+    {
+        $userid   = input('userid/d');
+        $user     = UserModel::findOrEmpty($userid);
+        $intvalue = input('intvalue/d', 0);
+        if ($intvalue == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "积分变更值不能为0",
+            ]));
+        }
+        $data = [
+            'userid'      => $userid,
+            'title'       => input('title/s'),
+            'intvalue'    => $intvalue,
+            'intmoney'    => input('intmoney/s', 0.00),
+            'onlycontent' => "",
+            'remark'      => input('remark/s'),
+            'itype'       => input('itype/d'),
+            'status'      => 2,
+            'createtime'  => input('createtime/s'),
+            'yeartime'    => date("Y"),
+            'monthtime'   => date("Ym"),
+        ];
+        UserIntegralModel::create($data);
+        $udata             = [];
+        $udata['integral'] = intval($user->integral) + $intvalue;
+        $isinttotal        = input('isinttotal/d', 0);
+        if ($isinttotal == 1) {
+            $udata['inttotal'] = intval($user->inttotal) + $intvalue;
+        }
+        $user->save($udata);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    // 用户授权
+    public function authsList()
+    {
+        $userid = input('userid/d');
+        return view('user/authslist', [
+            'userid' => $userid,
+        ]);
+    }
+
+    public function listAuths()
+    {
+        $userid = input('userid/d');
+        $list   = UserAuthsModel::where('userid', $userid)->order('id', 'asc')->append(['identitytype_text'])->select();
+        $count  = UserAuthsModel::where('userid', $userid)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function delAuths()
+    {
+        $id    = input('id/d');
+        $auths = UserAuthsModel::find($id);
+        if ($auths->identitytype == 'mobile') {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "手机号授权方式不允许删除",
+            ]));
+        }
+        $result = $auths->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    // 用户
+    public function userPublic()
+    {
+        $groupslist = UserGroupsModel::order(['isdefault' => 'desc', 'id' => 'asc'])->select();
+        $agentlist  = AgentModel::with('broker')->order(['id' => 'desc'])->select();
+        return view('user/userpublic', [
+            'groupslist' => $groupslist,
+            'agentlist'  => $agentlist,
+        ]);
+    }
+
+    public function userList()
+    {
+        $groupslist = UserGroupsModel::order(['isdefault' => 'desc', 'id' => 'asc'])->select();
+        $agentlist  = AgentModel::with('broker')->order(['id' => 'desc'])->select();
+        return view('user/userlist', [
+            'groupslist' => $groupslist,
+            'agentlist'  => $agentlist,
+        ]);
+    }
+
+    public function userForm()
+    {
+        $id            = input('id/d', 0);
+        $user          = UserModel::with(['broker'])->findOrEmpty($id);
+        $agentlist     = AgentModel::with('broker')->order(['id' => 'asc'])->select();
+        $groupslist    = UserGroupsModel::order(['isdefault' => 'desc', 'id' => 'asc'])->select();
+        $willlist      = UserWill::select();
+        $usertags      = UserTags::select();
+        $emptimelist   = RensheCode::getList('emp_time');
+        $communitylist = RensheCode::getList('community')->toArray();
+        array_push($communitylist, ['code' => 0, 'id' => 0, 'name' => "不限"]);
+        $comlist = ComjobsCateModel::select();
+        return view('user/userform', [
+            'groupslist'    => $groupslist,
+            'willlist'      => $willlist,
+            'usertags'      => $usertags,
+            'agentlist'     => $agentlist,
+            'user'          => $user,
+            'emptimelist'   => $emptimelist,
+            'communitylist' => $communitylist,
+            'comlist'       => $comlist,
+        ]);
+    }
+
+    public function fieldUser()
+    {
+        $id   = input('id/d', 0);
+        $user = UserModel::findOrEmpty($id);
+        if ($user->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $user->save([
+                input('field/s') => input('value'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function listUser()
+    {
+        $limit    = input('limit');
+        $page     = input('page');
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['nickname|realname|mobile', 'like', '%' . $keywords . '%', 'or'];
+        }
+        $groupsid = input('groupsid/d');
+        if (!empty($groupsid)) {
+            $map[] = ['groupsid', '=', $groupsid];
+        }
+        $ispublic = input('ispublic/d', 0);
+        if ($ispublic == 0) {
+            $agentbrokerarr = explode(",", input('agentbroker/s'));
+            $agentid        = isset($agentbrokerarr[0]) ? $agentbrokerarr[0] : 0;
+            if (!empty($agentid)) {
+                $brokeridarr = BrokerModel::where('agentid', '=', $agentid)->column('id');
+                $map[]       = ['brokerid', 'in', $brokeridarr];
+                $map[]       = ['brokerid', '<>', 0];
+            }
+            $brokerid = isset($agentbrokerarr[1]) ? $agentbrokerarr[1] : 0;
+            if (!empty($brokerid)) {
+                $map[] = ['brokerid', '=', $brokerid];
+            }
+        } else {
+            $map[] = ['brokerid', '=', 0];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $authstatus = input('authstatus/d');
+        if (!empty($authstatus)) {
+            $map[] = ['authstatus', '=', $authstatus];
+        }
+        $followstatus = input('followstatus/d');
+        if (!empty($followstatus)) {
+            $map[] = ['followstatus', '=', $followstatus];
+        }
+        $list  = UserModel::with(['userGroups', 'broker' => ['agent', 'worker']])->withCount('userPart')->where($map)->order('id', 'desc')->limit($limit)->page($page)->append(['status_text', 'isvip_text', 'authstatus_text', 'followstatus_text', 'education_text', 'worker_text', 'jobintention_text'])->select();
+        $count = UserModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function exportUser()
+    {
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['nickname|realname|mobile', 'like', '%' . $keywords . '%', 'or'];
+        }
+        $groupsid = input('groupsid/d');
+        if (!empty($groupsid)) {
+            $map[] = ['groupsid', '=', $groupsid];
+        }
+        $agentbrokerarr = explode(",", input('agentbroker/s'));
+        $agentid        = isset($agentbrokerarr[0]) ? $agentbrokerarr[0] : 0;
+        if (!empty($agentid)) {
+            $brokeridarr = BrokerModel::where('agentid', '=', $agentid)->column('id');
+            $map[]       = ['brokerid', 'in', $brokeridarr];
+            $map[]       = ['brokerid', '<>', 0];
+        }
+        $brokerid = isset($agentbrokerarr[1]) ? $agentbrokerarr[1] : 0;
+        if (!empty($brokerid)) {
+            $map[] = ['brokerid', '=', $brokerid];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $authstatus = input('authstatus/d');
+        if (!empty($authstatus)) {
+            $map[] = ['authstatus', '=', $authstatus];
+        }
+        $followstatus = input('followstatus/d');
+        if (!empty($followstatus)) {
+            $map[] = ['followstatus', '=', $followstatus];
+        }
+        $xlsData = UserModel::with(['userGroups', 'broker' => ['agent', 'worker']])->withCount('userPart')->where($map)->order('id', 'desc')->append(['status_text', 'isvip_text', 'authstatus_text', 'followstatus_text'])->select()->toArray();
+        $xlsCell = [
+            ['id', '表ID'],
+            ['nickname', '昵称'],
+            ['realname', '姓名'],
+            ['mobile', '手机号'],
+            ['integral', '可用积分'],
+            ['inttotal', '累计积分'],
+            ['status_text', '状态'],
+            ['isvip_text', '是否VIP'],
+            ['authstatus_text', '是否实名认证'],
+            ['idcard', '身份证号'],
+            ['gender', '性别', [1 => '男', 2 => '女']],
+            ['birthday', '出生日期'],
+            ['address', '现居住地'],
+            ['education', '学历'],
+            ['bankcard.openbank', '开户行'],
+            ['bankcard.account', '账户名'],
+            ['bankcard.number', '账户号'],
+            ['followstatus_text', '跟进状态'],
+            ['userGroups.title', '用户组'],
+            ['broker.worker.title', '劳务公司'],
+            ['broker.agent.title', '代理门店'],
+            ['broker.title', '经纪人'],
+            ['user_part_count', '推广人数'],
+            ['createtime', '注册时间'],
+        ];
+        export_excel("系统用户", $xlsCell, $xlsData);
+    }
+
+    public function setBroker()
+    {
+        $idarr          = input('idarr/a');
+        $setagentbroker = explode(",", input('setagentbroker/s'));
+        $brokerid       = isset($setagentbroker[1]) ? $setagentbroker[1] : 0;
+        if (empty($brokerid)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "请选择经纪人。",
+            ]));
+        }
+        UserModel::whereIn('id', $idarr)->update(['brokerid' => $brokerid]);
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function delUser()
+    {
+        $idarr = input('idarr/a');
+        UserModel::destroy($idarr);
+        event('userDel', $idarr);
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function editUser()
+    {
+        $id     = input('id/d');
+        $mobile = input('mobile/s');
+        $vdata  = [
+            'id'     => $id,
+            'mobile' => $mobile,
+        ];
+        try {
+            validate(UserValidate::class)->check($vdata);
+        } catch (ValidateException $e) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => $e->getError(),
+            ]));
+        }
+
+        //手机号
+        $check_user_where = [['mobile', '=', $mobile]];
+        if (!empty($id)) {
+            $check_user_where[] = ['id', '<>', $id];
+        }
+        $check_user = UserModel::where($check_user_where)->find();
+        if (!empty($check_user)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => '手机号已存在',
+            ]));
+        }
+
+        $address        = input('address/s', "");
+        $jobintention   = input('jobintention/s', "");
+        $agentbrokerarr = explode(",", input('agentbroker/s'));
+        $brokerid       = isset($agentbrokerarr[1]) ? $agentbrokerarr[1] : 0;
+        $data           = [
+            'groupsid'       => input('groupsid/d', 0),
+            'brokerid'       => $brokerid,
+            'nickname'       => input('nickname/s', ""),
+            'avatar'         => input('avatar/s', ""),
+            'realname'       => input('realname/s', ""),
+            'mobile'         => $mobile,
+            'inttotal'       => input('inttotal/d', 0),
+            'status'         => input('status/d', 1),
+            'isvip'          => input('isvip/d', 1),
+            'authstatus'     => input('authstatus/d', 1),
+            'authremark'     => input('authremark/s', ""),
+            'idcardzpic'     => input('idcardzpic/s', ""),
+            'idcardfpic'     => input('idcardfpic/s', ""),
+            'idcard'         => input('idcard/s', ""),
+            'gender'         => input('gender/d', 1),
+            'birthday'       => input('birthday/s', ""),
+            'address'        => $address,
+            'education'      => input('education/s', ""),
+            'createtime'     => input('createtime/s', ""),
+            'jobintention'   => $jobintention,
+            'workexperience' => input('workexperience/s', ""),
+            'eduexperience'  => input('eduexperience/s', ""),
+            'followstatus'   => input('followstatus/d', 1),
+            'bankcard'       => input('bankcard/a', []),
+            'emp_time'       => array_values(input('emp_time/a', [])),
+            'user_tags'      => array_values(input('user_tags/a', [])),
+            'work_place'     => array_values(input('work_place/a', [])),
+            'com_cate_type'  => input('com_cate_type/d', 1),
+            'com_cate'       => array_values(input('com_cate/a', [])),
+            'com_cate_other' => input('com_cate_other/s', ""),
+        ];
+        $password       = input('password/s');
+        if (empty($id)) {
+            $data['integral']  = 0;
+            $data['wxampcode'] = '';
+            $user              = UserModel::create($data);
+            UserAuthsModel::create([
+                'userid'       => $user->id,
+                'identitytype' => "mobile",
+                'identifier'   => $mobile,
+                'password'     => empty($password) ? md5("123456789") : md5($password),
+                'logintime'    => time(),
+                'loginip'      => $_SERVER['SERVER_ADDR'],
+                'wxampcode'    => "",
+            ]);
+        } else {
+            $data['id'] = $id;
+            UserModel::update($data);
+            $adata = ['identifier' => $mobile];
+            if (!empty($password)) {
+                $adata['password'] = md5($password);
+            }
+            UserAuthsModel::update($adata, ['userid' => $id, 'identitytype' => 'mobile']);
+
+            //实名认证积分
+            $user = UserModel::where('id', $id)->find();
+            if ($user['authstatus'] == 3 && $user['is_auth'] == 2) {
+                $user->is_auth = 1;
+                $user->save();
+                $integralService = new IntegralService();
+                $integralService->add($id, IntegralService::CERTIFICATION);
+            }
+        }
+
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+
+    // 用户组
+    public function groupsList()
+    {
+        return view('user/groupslist');
+    }
+
+    public function groupsForm()
+    {
+        $id     = input('id/d, 0');
+        $groups = UserGroupsModel::findOrEmpty($id);
+        return view('user/groupsform', [
+            'groups' => $groups,
+        ]);
+    }
+
+    public function listGroups()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+        $list  = UserGroupsModel::order(['isdefault' => 'desc', 'id' => 'asc'])->limit($limit)->page($page)->append(['isdefault_text'])->select();
+        $count = UserGroupsModel::count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function editGroups()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            $groups = UserGroupsModel::create([
+                'title'     => input('title/s'),
+                'isdefault' => input('isdefault/d') == 2 ? 2 : 1,
+            ]);
+        } else {
+            $administer = UserGroupsModel::find($id);
+            $administer->save([
+                'title'     => input('title/s'),
+                'isdefault' => input('isdefault/d') == 2 ? 2 : 1,
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delGroups()
+    {
+        $access_admin = session('access_admin');
+        $password     = input('password');
+        if ($access_admin['password'] !== md5($password)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "操作密码验证失败",
+            ]));
+        }
+        $idarr = input('idarr/a');
+        UserGroupsModel::whereIn('id', $idarr)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    // 参数设置
+    public function param()
+    {
+        $param = UserParamModel::where(1)->findOrEmpty();
+        return view('user/param', [
+            'param' => $param,
+        ]);
+    }
+
+    public function editParam()
+    {
+        $param = UserParamModel::where(1)->findOrEmpty();
+        $data  = [
+            'redmoney'      => input('redmoney/d', 0),
+            'usernumber'    => input('usernumber/d', 0),
+            'shareintegral' => input('shareintegral/d', 0),
+            'postintegral'  => input('postintegral/d', 0),
+            'inttomoney'    => input('inttomoney/d', 0),
+            'minintegral'   => input('minintegral/d', 0),
+            'intrecharge'   => input('intrecharge/d', 0),
+            'picregworker'  => input('picregworker/s', ""),
+            'intregworker'  => input('intregworker/d', 0),
+            'register'      => input('register/d', 0),
+            'improveresume' => input('improveresume/d', 0),
+            'certification' => input('certification/d', 0),
+            'entry'         => input('entry/d', 0),
+            'signin'        => input('signin/d', 0),
+            'sharejob'      => input('sharejob/d', 0),
+            'sharejobnum'   => input('sharejobnum/d', 0),
+            'taskimage'     => input('taskimage/s', ''),
+        ];
+        if ($param->isEmpty()) {
+            UserParamModel::create($data);
+        } else {
+            $data['id'] = $param->id;
+            UserParamModel::update($data);
+        }
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    // 提现设置
+    public function getmoney()
+    {
+        $param = UserParamModel::field('getmoney')->where(1)->findOrEmpty();
+        return view('user/getmoney', [
+            'getmoney' => $param['getmoney'],
+        ]);
+    }
+
+    public function editGetmoney()
+    {
+        $param = UserParamModel::where(1)->findOrEmpty();
+        $data  = [
+            'getmoney' => input('getmoney/a', []),
+        ];
+        foreach ($data['getmoney'] as $v) {
+            if ($v['money'] <= 0) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "金额必须大于0",
+                ]));
+            }
+            if ($v['num'] <= 0) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "次数必须大于0",
+                ]));
+            }
+        }
+        if ($param->isEmpty()) {
+            UserParamModel::create($data);
+        } else {
+            $param->getmoney = $data['getmoney'];
+            $param->save();
+        }
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    // 用户组
+    public function willList()
+    {
+        return view('user/willlist');
+    }
+
+    public function willForm()
+    {
+        $id   = input('id/d, 0');
+        $will = UserWill::findOrEmpty($id);
+        return view('user/willform', [
+            'will' => $will,
+        ]);
+    }
+
+    public function listwill()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+        $list  = UserWill::order(['isdefault' => 'desc', 'id' => 'asc'])->limit($limit)->page($page)->append(['isdefault_text'])->select();
+        $count = UserWill::count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function editwill()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            UserWill::create([
+                'title'     => input('title/s'),
+                'isdefault' => input('isdefault/d') == 2 ? 2 : 1,
+            ]);
+        } else {
+            $administer = UserWill::find($id);
+            $administer->save([
+                'title'     => input('title/s'),
+                'isdefault' => input('isdefault/d') == 2 ? 2 : 1,
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function delwill()
+    {
+        $access_admin = session('access_admin');
+        $password     = input('password');
+        if ($access_admin['password'] !== md5($password)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "操作密码验证失败",
+            ]));
+        }
+        $idarr = input('idarr/a');
+        UserWill::whereIn('id', $idarr)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function importView()
+    {
+        return view('user/importview');
+    }
+
+    public function import()
+    {
+        $file_url = input('file_url/s', "");
+        if (!file_exists($file_url)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "文件不存在",
+            ]));
+        }
+
+        $service = new UserService();
+        $res     = $service->importComjobs($file_url);
+        if (empty($res['code'])) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => $res['msg'],
+            ]));
+        }
+
+        exit(json_encode(['code' => 0]));
+    }
+
+    public function tags()
+    {
+        return view('user/tagslist');
+    }
+
+    public function listtags()
+    {
+        $limit    = input('limit');
+        $page     = input('page');
+        $map      = [];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['name', 'like', '%' . $keywords . '%'];
+        }
+        $list  = UserTags::where($map)->limit($limit)->page($page)->select();
+        $count = UserTags::count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function deltags()
+    {
+        $idarr = input('idarr/a');
+        UserTags::whereIn('id', $idarr)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function tagsForm()
+    {
+        $id   = input('id/d, 0');
+        $tags = UserTags::findOrEmpty($id);
+        return view('user/tagsform', [
+            'tags' => $tags,
+        ]);
+    }
+
+    public function edittags()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            UserTags::create([
+                'name' => input('name/s'),
+            ]);
+        } else {
+            $administer = UserTags::find($id);
+            $administer->save([
+                'name' => input('name/s'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+}

+ 157 - 0
app/admin/controller/Video.php

@@ -0,0 +1,157 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+//use app\common\model\Param as ParamModel;
+
+use app\common\model\Video as VideoModel;
+
+use think\facade\Session;
+use think\facade\Db;
+use think\facade\Request;
+
+class Video extends BaseController
+{
+
+        public function videoList()
+        {
+
+
+            if($this->request->isAjax())
+            {
+
+                $limit = input('limit/d',20);
+                $page = input('page/d',1);
+                $keywords = trim(input('keywords/s'));
+                $status = trim(input('status/d'));
+                $workerid = trim(input('workerid/d'));
+                $map = array();
+                if(!empty($keywords))
+                {
+                    $map[] =['a.title', 'like', '%'.$keywords.'%'];
+                }
+
+                if (!empty($workerid)){
+                    $map[] = ['a.workerid', '=', $workerid];
+                }
+
+                if (!empty($status)){
+                    $map[] = ['a.status', '=', $status];
+                }
+
+                $data = Db::name('video')
+                        ->alias('a')
+                        ->field('a.id,a.workerid,a.title video_title,a.imageurl,a.videourl,from_unixtime(a.createtime) createtime,a.status,b.title worker_title')
+                        ->join('worker b','b.id = a.workerid','LEFT')
+                        ->where($map)
+                        ->page($page)
+                        ->limit($limit)
+                        ->order('a.id desc')
+                        ->select()
+                        ->toArray();
+
+                $count = Db::name('video')
+                        ->alias('a')
+                        ->join('worker b','b.id = a.workerid','LEFT')
+                        ->where($map)
+                        ->count();
+
+                foreach($data as $k=>$v)
+                {
+                    if($v['status'] == 1)
+                    {
+                        $data[$k]['status_text'] = '待审核';
+                    }elseif($v['status'] == 2){
+                        $data[$k]['status_text'] = '未通过';
+                    }elseif($v['status'] == 3){
+                        $data[$k]['status_text'] = '通过';
+                    }
+                }
+
+                //dd($data,$count);
+                return array(
+                            'code' 	=> 0,
+                            'msg'	=> "",
+                            'count' => $count,
+                            'data'  => $data
+                         );
+            }else{
+
+                $worker_data = Db::name('worker')->field('id,title')->select()->toArray();
+                return view('video/videoList',['worker_data'=>$worker_data]);
+
+            }
+
+        }
+
+
+        public function videoform()
+        {
+            $id = input('id/d');
+            if($this->request->isAjax())
+            {
+                // $old_imageurl = trim(input('old_imageurl'));
+                // if(!$old_imageurl)
+                // {
+                    // $data['imageurl'] = ;
+                // }
+				
+				$imgstr = trim(input('imageurl'));
+				
+				$imgdata = substr($imgstr,strpos($imgstr,",") + 1);
+				$decodedData = base64_decode($imgdata);
+				$data['imageurl'] = "attachment/images/".date("Ymd")."/".md5(time()).".jpg";
+				file_put_contents($data['imageurl'], $decodedData );
+				
+                $data['status'] = trim(input('status/d'));
+                if(!empty($id))
+                {
+					$data['imageurl'] = request()->domain()."/".$data['imageurl']; 
+                    $data['id'] = $id;
+                    $res = Db::name('video')->update($data);
+                }
+
+                if($res)
+                {
+                    $rtn['code'] = 0;
+                    $rtn['message'] = '修改成功';
+                }else{
+                    $rtn['code'] = 1;
+                    $rtn['message'] = '修改失败';
+                }
+
+                return $rtn;
+
+            }else{
+
+                 $video_data = Db::name('video')
+                                ->alias('a')
+                                ->field('a.id,a.workerid,a.title video_title,a.imageurl,a.videourl,from_unixtime(a.createtime) createtime,a.status,b.title worker_title')
+                                ->join('worker b','a.workerid = b.id','LEFT')
+                                ->where('a.id',$id)
+                                ->find();
+
+                return view('video/videoform',[
+                    'video_data'=>$video_data
+                ]);
+            }
+        }
+
+    public function delVideo()
+    {
+        $idarr = input('idarr/a');
+        $result = VideoModel::whereIn('id',$idarr)->delete();
+        if ($result){
+            exit(json_encode(array(
+                'code' 	=> 0,
+                'msg'	=> ""
+            )));
+        }
+        exit(json_encode(array(
+            'code' 	=> 1,
+            'msg'	=> "删除失败,请稍后重试"
+        )));
+    }
+
+
+}

+ 318 - 0
app/admin/controller/Worder.php

@@ -0,0 +1,318 @@
+<?php
+namespace app\admin\controller;
+
+use think\facade\Session;
+use app\admin\BaseController;
+
+use app\common\model\Worder as WorderModel;
+use app\common\model\WorderCate as WorderCateModel;
+use app\common\model\WorderLog as WorderLogModel;
+use app\common\model\Worker as WorkerModel;
+
+class Worder extends BaseController
+{
+	
+	
+	// 报名记录
+	public function logList()
+	{
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		$worderlist = WorderModel::field('id,title')->order(['id'=>'desc'])->select();
+		return view('worder/loglist',[
+			'workerlist'		=> $workerlist,
+			'worderlist'		=> $worderlist
+		]);
+	}
+	
+	public function delLog()
+	{
+		$idarr = input('idarr/a');
+		$log = WorderLogModel::whereIn('id',$idarr)->select();
+		$result = $log->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listLog()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$map = array();
+		$setworkerid = input('setworkerid/d',0);
+		if (!empty($setworkerid)){
+			$map[] = ['setworkerid', '=', $setworkerid];
+		}
+		$getworkerid = input('getworkerid/d',0);
+		if (!empty($getworkerid)){
+			$map[] = ['getworkerid', '=', $getworkerid];
+		}
+		$worderid = input('worderid/d',0);
+		if (!empty($worderid)){
+			$map[] = ['worderid', '=', $worderid];
+		}
+		$list = WorderLogModel::with(['setWorker','getWorker','worder'])->where($map)->order('id','DESC')->limit($limit)->page($page)->select();
+		$count = WorderLogModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function exportLog()
+	{
+		$map = array();
+		$setworkerid = input('setworkerid/d',0);
+		if (!empty($setworkerid)){
+			$map[] = ['setworkerid', '=', $setworkerid];
+		}
+		$getworkerid = input('getworkerid/d',0);
+		if (!empty($getworkerid)){
+			$map[] = ['getworkerid', '=', $getworkerid];
+		}
+		$worderid = input('worderid/d',0);
+		if (!empty($worderid)){
+			$map[] = ['worderid', '=', $worderid];
+		}
+		$xlsData = WorderLogModel::with(['setWorker','getWorker','worder'])->where($map)->order('id','DESC')->select()->toArray();
+		$xlsCell = array(
+			array('id','表ID'),
+			array('worder.title','订单标题'),
+			array('setWorker.title','发单公司'),
+			array('getWorker.title','接单公司'),
+			array('createtime','接单时间'),
+		);
+		export_excel("订单接单记录",$xlsCell,$xlsData);
+	}
+	
+	
+	
+	// 订单信息
+	public function worderList()
+	{
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		return view('worder/worderlist',[
+			'workerlist'		=> $workerlist
+		]);
+	}
+	
+	public function worderForm()
+	{
+		$id = input('id/d, 0');
+		$worder = WorderModel::findOrEmpty($id);
+		$workerlist = WorkerModel::order(['id'=>'desc'])->select();
+		$catelist = WorderCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		return view('worder/worderform',[
+			'catelist'		=> $catelist,
+			'workerlist'	=> $workerlist,
+			'worder'		=> $worder
+		]);
+	}
+	
+	public function editWorder()
+	{
+		$id = input('id/d', 0);
+		$data = [
+			'cateid'      		=> input('cateid/d', 0),
+			'workerid'			=> input('workerid/d', 0),
+			'title'				=> input('title/s', ""),
+			'tags'				=> input('tags/a', array()),
+			'otype'				=> input('otype/s', ""),
+			'wagall'			=> input('wagall/s', ""),
+			'telephone'			=> input('telephone/s', ""),
+			'province'			=> input('province/s', ""),
+			'city'				=> input('city/s', ""),
+			'district'			=> input('district/s', ""),
+			'jobdetails'		=> input('jobdetails/s', ""),
+			'coodetails'		=> input('coodetails/s', ""),
+			'status'			=> input('status/d', 0),
+			'priority'			=> input('priority/d', 0),
+			'updatetime'		=> input('updatetime/s', ""),
+			'createtime'		=> input('createtime/s', ""),
+			'volume'			=> input('volume/d', 0)
+		];
+		if (empty($id)){
+			$worder = WorderModel::create($data);
+		}else{
+			$worder = WorderModel::find($id);
+			WorderLogModel::update([ 'setworkerid' => input('workerid/d', 0) ],['worderid'=>$worder->id]); 
+			$worder->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldWorder()
+	{
+		$id = input('id/d',0); 
+		$worder = WorderModel::findOrEmpty($id);
+		if ($worder->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在"
+			)));
+		}else{
+			$worder->save([
+				input('field/s')  => input('value')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delWorder()
+	{
+		$idarr = input('idarr/a');
+		$worder = WorderModel::whereIn('id',$idarr)->select();
+		WorderLogModel::whereIn('worderid',$idarr)->delete();
+		$result = $worder->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listWorder()
+	{
+		$limit = input('limit/d',20);
+		$page = input('page/d',1);
+		$map = array();
+		$keywords = input('keywords/s', "");
+		if (!empty($keywords)){
+			$map[] =['title', 'like', '%'.$keywords.'%'];
+		}
+		$workerid = input('workerid/d', 0);
+		if (!empty($workerid)){
+			$map[] = ['workerid', '=', $workerid];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = WorderModel::with(['worker','worderCate'])->withCount(['worderLog'])->where($map)->order(['priority'=>'desc','updatetime'=>'desc','id'=>'desc',])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = WorderModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	
+	// 分类
+	public function cateList()
+	{
+		return view('worder/catelist');
+	}
+	
+	public function cateForm()
+	{
+		$id = input('id/d, 0');
+		$cate = WorderCateModel::findOrEmpty($id);
+		return view('worder/cateform',[
+			'cate'	=> $cate
+		]);
+	}
+	
+	public function listCate()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = WorderCateModel::order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = WorderCateModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function fieldCate()
+	{
+		$id = input('id/d');
+		$cate = WorderCateModel::find($id);
+		if ($cate==null){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "分类信息不存在"
+			)));
+		}else{
+			$cate->save([
+				input('field/s')  => input('value/s', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editCate()
+	{
+		$id = input('id/d');
+		if (empty($id)){
+			$cate = WorderCateModel::create([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}else{
+			$cate = WorderCateModel::find($id);
+			$cate->save([
+				'title' 	=> input('title/s'),
+				'status'    => input('status/d')==1 ? 1 : 2,
+				'priority'  => input('priority/d')
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delCate()
+	{
+		$id = input('id/d');
+		WorderCateModel::where('id',$id)->delete();
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> ""
+		)));
+	}
+	
+}

+ 431 - 0
app/admin/controller/Worker.php

@@ -0,0 +1,431 @@
+<?php
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+use app\common\model\User as UserModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\WorkerForm as WorkerFormModel;
+
+use app\common\model\WorkerShareCate as WorkerShareCateModel;
+use app\common\model\WorkerShare as WorkerShareModel;
+
+use think\facade\Db;
+
+class Worker extends BaseController
+{
+	
+	// 推广海报
+	public function shareList()
+	{
+		$catelist = WorkerShareCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		return view('worker/sharelist',[
+			'catelist'		=> $catelist
+		]); 
+	}
+	
+	public function shareCateForm()
+	{
+		$id = input('id/d', 0);
+		$sharecate = WorkerShareCateModel::findOrEmpty($id);
+		return view('worker/sharecateform',[
+			'sharecate'		=> $sharecate
+		]);
+	}
+	
+	public function shareForm()
+	{
+		$id = input('id/d', 0);
+		$share = WorkerShareModel::findOrEmpty($id);
+		$catelist = WorkerShareCateModel::order(['priority'=>'desc','id'=>'desc'])->select();
+		return view('worker/shareform',[
+			'share'		=> $share,
+			'catelist'		=> $catelist
+		]);
+	}
+	
+	public function editShareCate()
+	{
+		$id = input('id/d', 0);
+		$data = array(
+			'title' 	=> input('title/s', ""),
+			'status' 	=> input('status/d', 1),
+			'priority'  => input('priority/d', 0)
+		);
+		if (empty($id)){
+			$sharecate = WorkerShareCateModel::create($data);
+		}else{
+			$sharecate = WorkerShareCateModel::find($id);
+			$sharecate->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function editShare()
+	{
+		$id = input('id/d', 0);
+		$data = array(
+			'cateid'	=> input('cateid/d', 0),
+			'title' 	=> input('title/s', ""),
+			'tilpic' 	=> input('tilpic/s', ""),
+			'status'	=> input('status/d', 1),
+			'priority'  => input('priority/d', 0)
+		); 
+		if (empty($id)){
+			$share = WorkerShareModel::create($data);
+		}else{
+			$share = WorkerShareModel::find($id);
+			$share->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function listShareCate()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$list = WorkerShareCateModel::withCount('workerShare')->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = WorkerShareCateModel::count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}	
+	
+	public function listShare()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$cateid = input('cateid/d', 0);
+		if (!empty($cateid)){
+			$map[] = ['cateid', '=', $cateid];
+		}
+		$status = input('status/d', 0);
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = WorkerShareModel::with('workerShareCate')->where($map)->order(['priority'=>'desc','id'=>'desc'])->limit($limit)->page($page)->append(['status_text','stype_text'])->select();
+		$count = WorkerShareModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	public function fieldShareCate()
+	{
+		$id = input('id/d', 0);
+		$info = WorkerShareCateModel::find($id);
+		$info->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldShare()
+	{
+		$id = input('id/d', 0);
+		$info = WorkerShareModel::find($id);
+		$info->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delShareCate()
+	{
+		$id = input('id/d', 0);
+		$sharecate = WorkerShareCateModel::where('id',$id)->select();
+		WorkerShareModel::where('cateid', '=', $id)->delete(); 
+		$result = $sharecate->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function delShare()
+	{
+		$id = input('id/d', 0);
+		$share = WorkerShareModel::where('id',$id)->select();
+		$result = $share->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	// 申请注册经纪人
+	public function fworkerList()
+	{
+		return view('worker/fworkerlist');
+	}
+	
+	public function fworkerForm()
+	{
+		$id = input('id/d, 0');
+		$fworker = WorkerFormModel::findOrEmpty($id);
+		return view('worker/fworkerform',[
+			'fworker'	=> $fworker
+		]);
+	}
+	
+	public function editFworker()
+	{
+		$id = input('id/d');
+		$fworker = WorkerFormModel::findOrEmpty($id);
+		$fworker->save([
+			'comname'  		=> input('comname/s', ""),
+			'address'  		=> input('address/s', ""),
+			'details'  		=> input('details/s', ""),
+			'realname'  	=> input('realname/s', ""),
+			'mobile'    	=> input('mobile/s', ""),
+			'address'		=> input('address/s', ""),
+			'comjobs'		=> input('comjobs/s', ""),
+			'status'		=> input('status/d', 1),
+			'remark'		=> input('remark/s', ""),
+			'createtime'	=> input('createtime/s', ""),
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldFworker()
+	{
+		$id = input('id/d',0); 
+		$info = WorkerFormModel::findOrEmpty($id);
+		$info->save([
+			input('field/s')  => input('value/s', "")
+		]);
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delFworker()
+	{
+		$idarr = input('idarr/a');
+		$fworker = WorkerFormModel::whereIn('id',$idarr)->select();
+		$result = $fworker->delete();
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listFworker()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s');
+		if (!empty($keywords)){
+			$map[] =['comname|realname', 'like', '%'.$keywords.'%'];
+		}
+		$status = input('status/d');
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = WorkerFormModel::where($map)->order('id','DESC')->limit($limit)->page($page)->append(['status_text'])->select();
+		$count = WorkerFormModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+	
+	 
+	
+	
+	
+	
+	public function workerList()
+	{
+		return view('worker/workerlist');
+	}
+	
+	public function workerForm()
+	{
+		$id = input('id/d', 0);
+		$worker = WorkerModel::with(['muser'])->findOrEmpty($id);
+		return view('worker/workerform',[
+			'worker'		=> $worker
+		]);
+	}
+	
+	public function editWorker()
+	{
+		$id = input('id/d', "");
+		$muser = UserModel::where(['mobile'=>input('musermobile/s', '')])->findOrEmpty();
+		if ($muser->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "关联的用户不存在。"
+			)));
+		}
+		$data = [
+			'userid'		=> $muser->id,
+			'wtype'			=> input('wtype/d', 1),
+			'title'			=> input('title/s', ""),
+			'ftitle'		=> input('ftitle/s', ""),
+			'tilpic'  		=> input('tilpic/s', ""),
+			'realname'  	=> input('realname/s', ""),
+			'mobile'    	=> input('mobile/s', ""),
+			'weixin'    	=> input('weixin/s', ""),
+			'latitude'		=> input('latitude/f'),
+			'longitude'		=> input('longitude/f'),
+			'province'		=> input('province/s'),
+			'city'			=> input('city/s'),
+			'district'		=> input('district/s'),
+			'address'		=> input('address/s'),
+			'picone'		=> input('picone/s', ""),
+			'pictwo'		=> input('pictwo/s', ""),
+			'picthr'		=> input('picthr/s', ""),
+			'details'		=> input('details/s'),
+			'priority'    	=> input('priority/d', 0),
+			'remark'  		=> input('remark/s', ""),
+			'status'		=> input('status/d', 1)
+		];
+		$password = input('password/s', "");
+		if (empty($id)){
+			$data['createtime'] = time();
+			$worker = WorkerModel::create($data);
+		}else{
+			$worker = WorkerModel::find($id);
+			$worker->save($data);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function fieldWorker()
+	{
+		$id = input('id/d',0); 
+		$info = WorkerModel::findOrEmpty($id);
+		if ($info->isEmpty()){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "信息不存在。"
+			)));
+		}else{
+			$info->save([
+				input('field/s')  => input('value', "")
+			]);
+		}
+		exit(json_encode(array(
+			'code' 	=> 0
+		)));
+	}
+	
+	public function delWorker()
+	{
+		$access_admin = session('access_admin');
+		$password = input('password');
+		if ( $access_admin['password'] !== md5($password) ){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "操作密码验证失败"
+			)));
+		}
+		$idarr = input('idarr/a');
+        $result = Db::name('worker')->whereIn('id',$idarr)->update(['deletetime'=>time()]);
+		if ($result){
+			exit(json_encode(array(
+				'code' 	=> 0,
+				'msg'	=> ""
+			)));
+		}
+		exit(json_encode(array(
+			'code' 	=> 1,
+			'msg'	=> "删除失败,请稍后重试"
+		)));
+	}
+	
+	public function listWorker()
+	{
+		$limit = input('limit');
+		$page = input('page');
+		$map = array();
+		$keywords = input('keywords/s', "");
+		if (!empty($keywords)){
+			$map[] =['title|realname', 'like', '%'.$keywords.'%'];
+		}
+		$wtype = input('wtype/d', 0);
+		if (!empty($wtype)){
+			$map[] = ['wtype', '=', $wtype];
+		}
+		$status = input('status/d', 0);
+		if (!empty($status)){
+			$map[] = ['status', '=', $status];
+		}
+		$list = WorkerModel::with(['muser'])->where($map)->order(['priority'=>'DESC','id'=>'DESC'])->limit($limit)->page($page)->append(['wtype_text','status_text'])->select();
+		//dd($list);
+		$count = WorkerModel::where($map)->count();
+		if ($count==0){
+			exit(json_encode(array(
+				'code' 	=> 1,
+				'msg'	=> "未查询到数据"
+			)));
+		}
+        //var_dump(json_decode($list,true));
+		exit(json_encode(array(
+			'code' 	=> 0,
+			'msg'	=> "",
+			'count' => $count,
+			'data'  => $list
+		)));
+	}
+
+}

+ 27 - 0
app/admin/event.php

@@ -0,0 +1,27 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+// 事件定义文件
+return [
+    'bind'      => [
+    ],
+
+    'listen'    => [
+        'AppInit'  => [],
+        'HttpRun'  => [],
+        'HttpEnd'  => [],
+        'LogLevel' => [],
+        'LogWrite' => [],
+    ],
+
+    'subscribe' => [
+    ],
+];

+ 12 - 0
app/admin/middleware.php

@@ -0,0 +1,12 @@
+<?php
+
+return [
+    // 全局请求缓存
+    // \think\middleware\CheckRequestCache::class,
+    // 多语言加载
+    // \think\middleware\LoadLangPack::class,
+    // Session初始化
+    \think\middleware\SessionInit::class,
+    // 页面Trace调试
+    // \think\middleware\TraceDebug::class,
+];

+ 19 - 0
app/admin/provider.php

@@ -0,0 +1,19 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+use app\admin\ExceptionHandle;
+use app\admin\Request;
+
+// 容器Provider定义文件
+return [
+    'think\Request'          => Request::class,
+    'think\exception\Handle' => ExceptionHandle::class,
+];

+ 130 - 0
app/admin/view/admin/adminform.html

@@ -0,0 +1,130 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">后台管理员</div>
+				<div class="layui-card-body" pad15>
+
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-admin-adminform-edit">
+						<input type="hidden" name="id" value="{$admin.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>登录名</label>
+							<div class="layui-input-block">
+								<input type="text" name="adminname" value="{$admin.adminname}" lay-verify="required" placeholder="请输入登录名"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>登录密码</label>
+							<div class="layui-input-block">
+								<input type="text" name="password" value="" placeholder="请输入登录密码,不修改留空" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>姓名</label>
+							<div class="layui-input-block">
+								<input type="text" name="realname" value="{$admin.realname}" lay-verify="required" placeholder="请输入姓名"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">手机号</label>
+							<div class="layui-input-block">
+								<input type="text" name="mobile" value="{$admin.mobile}" lay-verify="phone" placeholder="请输入号码" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">备注</label>
+							<div class="layui-input-block">
+								<textarea name="remark" placeholder="请输入备注内容" class="layui-textarea">{$admin.remark}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">角色</label>
+							<div class="layui-input-block">
+								<select lay-filter="adminrole" name="role">
+									<option value="1" {$admin.role===1 ? 'selected' : '' }>超级管理员</option>
+									<option value="2" {$admin.role!==1 ? 'selected' : '' }>普通管理员</option>
+								</select>
+								<div class="layui-form-mid layui-word-aux">超级管理员,默认具备所有权限,请谨慎设置。</div>
+							</div>
+						</div>
+						<div class="layui-form-item powerarrbox" style="display: {$admin.role===1 ? 'none' : 'block' };" pane>
+							<label class="layui-form-label">栏目权限</label>
+							<div class="layui-input-block" id="powerarr"> </div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="admin.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="正常|禁用" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-admin-adminform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload', 'tree'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			tree = layui.tree,
+			upload = layui.upload;
+		form.render();
+		
+		form.on('select(adminrole)', function(data){
+			var val = data.value;
+			if (val==1){
+				$(".powerarrbox").css("display","none");
+			}else{
+				$(".powerarrbox").css("display","block");
+			}
+			console.log(data);
+		});
+		
+		var defpowerarr = {$powerarr|raw|default="[]"};
+		tree.render({
+			elem: '#powerarr',
+			data: defpowerarr,
+			showCheckbox: true,
+			id: 'powerarr'
+		});
+
+		form.on('submit(LAY-admin-adminform-edit-submit)', function(obj) {
+			var checkedData = tree.getChecked('powerarr');
+			obj.field.powerids = getCheckedId(checkedData);
+			
+			// console.log("obj.field.powerids: " + JSON.stringify(obj.field.powerids));
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'admin/editadmin',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-admin-adminlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+	});
+</script>

+ 190 - 0
app/admin/view/admin/adminlist.html

@@ -0,0 +1,190 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-admin-adminlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">登录名</label>
+					<div class="layui-input-block">
+						<input type="text" name="adminname" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">姓名</label>
+					<div class="layui-input-block">
+						<input type="text" name="realname" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">手机</label>
+					<div class="layui-input-block">
+						<input type="text" name="mobile" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">角色</label>
+					<div class="layui-input-block">
+						<select name="role">
+							<option value="">全部管理员</option>
+							<option value="1">超级管理员</option>
+							<option value="2">普通管理员</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-admin-adminlist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+
+			<table id="LAY-admin-adminlist-table" lay-filter="LAY-admin-adminlist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				{{#  if(d.role == 1){ }}
+				<a class="layui-btn layui-btn-disabled layui-btn-xs"><i class="layui-icon layui-icon-delete"></i>删除</a>
+				{{#  } else { }}
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+				{{#  } }}
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-admin-adminlist-table',
+			url: setter.baseAdminUrl + 'admin/listadmin',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 100, title: '表ID', sort: true },
+					{ field: 'adminname', title: '登录名' },
+					{ field: 'realname', title: '姓名' },
+					{ field: 'mobile', title: '手机号' },
+					{ field: 'role_text', title: '角色' },
+					{ field: 'lastdate', title: '最近登录时间', width: 170, sort: true },
+					{ field: 'status_text', title: '状态', templet: '#statusTpl', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-admin-adminlist-btn)', function(data) {
+			table.reload('LAY-admin-adminlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-admin-adminlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.prompt({
+					formType: 1,
+					title: '敏感操作,请验证密码'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定删除此管理员吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'admin/deladmin',
+							data: {
+								password: value,
+								idarr: idarr
+							},
+							done: function(res) {
+								obj.del();
+								layer.msg('已删除');
+							}
+						});
+						table.reload('LAY-admin-adminlist-table');
+						layer.msg('已删除');
+					});
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加管理员',
+					content: 'adminform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-admin-adminlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.prompt({
+					formType: 1,
+					title: '敏感操作,请验证密码'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定删除此管理员吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'admin/deladmin',
+							data: {
+								password: value,
+								idarr: [data.id]
+							},
+							done: function(res) {
+								obj.del();
+								layer.msg('已删除');
+							} 
+						});
+						layer.close(index);
+					});
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑管理员',
+					content: 'adminform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 82 - 0
app/admin/view/admin/myinfo.html

@@ -0,0 +1,82 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">我的资料</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-admin-myinfo-form">
+						<div class="layui-form-item">
+							<label class="layui-form-label">我的角色</label>
+							<div class="layui-input-inline">
+								<select name="role" lay-verify="">
+									<option value="1" {$admin['role']===1 ? 'selected' : '' } disabled>超级管理员</option>
+									<option value="2" {$admin['role']===2 ? 'selected' : '' } disabled>普通管理员</option>
+								</select>
+							</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">
+								<input type="text" name="adminname" value="{$admin['adminname']}" readonly class="layui-input">
+							</div>
+							<div class="layui-form-mid layui-word-aux">不可修改,用于后台登录名</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>姓名</label>
+							<div class="layui-input-inline">
+								<input type="text" name="realname" value="{$admin['realname']}" lay-verify="required" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">手机号</label>
+							<div class="layui-input-inline">
+								<input type="text" name="mobile" value="{$admin['mobile']}" lay-verify="phone" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">备注</label>
+							<div class="layui-input-block">
+								<textarea name="remark" placeholder="请输入内容" class="layui-textarea">{$admin['remark']}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<button class="layui-btn" lay-submit lay-filter="LAY-admin-myinfo-form-submit">确认修改</button>
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'set'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form
+		form.render();
+
+		form.on('submit(LAY-admin-myinfo-form-submit)', function(obj) {
+			admin.req({
+				url: setter.baseAdminUrl + 'admin/editmyinfo',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+				}
+			});
+
+		});
+	});
+</script>

+ 70 - 0
app/admin/view/admin/mypassword.html

@@ -0,0 +1,70 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">修改密码</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-admin-mypassword-form">
+						<div class="layui-form-item">
+							<label class="layui-form-label">当前密码</label>
+							<div class="layui-input-inline">
+								<input type="password" name="oldpassword" lay-verify="required" lay-verType="tips" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">新密码</label>
+							<div class="layui-input-inline">
+								<input type="password" name="password" lay-verify="pass" lay-verType="tips" autocomplete="off" id="LAY_password"
+								 class="layui-input">
+							</div>
+							<div class="layui-form-mid layui-word-aux">6到16个字符</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">确认新密码</label>
+							<div class="layui-input-inline">
+								<input type="password" name="repassword" lay-verify="repass" lay-verType="tips" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<button class="layui-btn" lay-submit lay-filter="LAY-admin-mypassword-form-submit">确认修改</button>
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'set'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form
+		form.render();
+
+		form.on('submit(LAY-admin-mypassword-form-submit)', function(obj) {
+			admin.req({
+				url: setter.baseAdminUrl + 'admin/editmypassword',
+				data: obj.field,
+				done: function(res) {
+					layer.msg('密码修改成功,请重新登录。', {
+						icon: 1,
+						time: 1000
+					}, function() {
+						top.location.href = setter.baseAdminUrl + 'login';
+					});
+				}
+			});
+
+		});
+	});
+</script>

+ 330 - 0
app/admin/view/agent/agentform.html

@@ -0,0 +1,330 @@
+<style type="text/css">
+	.amap-sug-result{
+		z-index:999999999;
+	}
+	#pickerInput{
+		z-index: 999999;
+		position: absolute;
+		right: 30px;
+		top: 20px;
+		width: 200px;
+	}
+</style>
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">代理门店</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-agent-agentform-edit">
+						<input type="hidden" name="id" value="{$agent.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label">关联用户</label>
+							<div class="layui-input-block">
+								<input type="text" name="musermobile" value="{$agent.muser.mobile}" lay-verify="phone" placeholder="请输入关联用户手机号..."
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">关联用户的手机号。<!-- 关联的用户个人中心会出现代理门店管理入口导航。 --></div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>劳务公司</label>
+							<div class="layui-input-block">
+								<select name="workerid" lay-search lay-verify="required">
+									<option value="">请选择劳务公司(可搜索)...</option>
+									{volist name="workerlist" id="vo"}
+									<option value="{$vo['id']}" {$agent.workerid==$vo.id ? 'selected' : '' }>{$vo['title']}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>代理编号</label>
+							<div class="layui-input-block">
+								<input type="text" name="idnumber" value="{$agent.idnumber}" lay-verify="required" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">可以是代理特定编号,需要确保唯一性。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>代理名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$agent.title}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">标图</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="tilpic" data-amount="1">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 最佳尺寸:320px*320px </div>
+									<div class="layui-upload-list echo-attachment-image-list" id="tilpic">
+										{notempty name="agent.tilpic"}
+										<div>
+											<input type="hidden" name="tilpic" value="{$agent.tilpic}">
+											<img src="{$agent.tilpic}">
+										</div>
+										{/notempty}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">轮播图</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="picall" data-amount="9">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 最佳尺寸:750px*375px </div>
+									<div class="layui-upload-list echo-attachment-image-list" id="picall">
+										{volist name="agent.picall" id="vo"}
+										<div>
+											<input type="hidden" name="picall[]" value="{$vo}">
+											<img src="{$vo}"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button>
+										</div>
+										{/volist}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>负责人姓名</label>
+							<div class="layui-input-block">
+								<input type="text" name="realname" value="{$agent.realname}" lay-verify="required" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">负责人手机</label>
+							<div class="layui-input-block">
+								<input type="text" name="mobile" value="{$agent.mobile}" lay-verify="phone" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">门店电话</label>
+							<div class="layui-input-block">
+								<input type="text" name="telephone" value="{$agent.telephone}" placeholder="请输入..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" id="LAY-agent-agentform-edit-areapicker">
+							<label class="layui-form-label">省市区</label>
+							<div class="layui-input-inline">
+								<select name="province" class="province-selector" data-value="{$agent.province}" lay-filter="province-2"
+								 lay-verify="required">
+									<option value="">请选择省</option>
+								</select>
+							</div>
+							<div class="layui-input-inline">
+								<select name="city" class="city-selector" data-value="{$agent.city}" lay-filter="city-2" lay-verify="required">
+									<option value="">请选择市</option>
+								</select>
+							</div>
+							<div class="layui-input-inline">
+								<select name="district" class="district-selector" data-value="{$agent.district}" lay-filter="district-2"
+								 lay-verify="required">
+									<option value="">请选择区</option>
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>详细地址</label>
+							<div class="layui-input-block">
+								<input type="text" name="address" value="{$agent.address}" lay-verify="required" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>经纬度</label>
+							<div class="layui-input-inline">
+								<input type="text" name="longitude" value="{$agent.longitude}" lay-verify="required" placeholder="经度"
+								 autocomplete="off" class="layui-input">
+							</div>
+							<div class="layui-input-inline">
+								<input type="text" name="latitude" value="{$agent.latitude}" lay-verify="required" placeholder="纬度"
+								 autocomplete="off" class="layui-input">
+							</div>
+							<div id="maplocation" style="width:500px;height:500px;display: none;">
+								<input id="pickerInput" class="layui-input" placeholder="输入关键字选取地点"/>
+							</div>
+							<button style="float: left;" type="button" class="layui-btn" id="layuiadmin-map-lnglat">选择地理位置</button>
+						</div>
+						<div class="layui-form-item" id="formdetails">
+							<label class="layui-form-label">门店介绍</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="details" id="details" placeholder="请输入..." style="display: none"
+								 lay-verify="editcontent">
+											{$agent.details}
+										</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$agent.priority|default=0}" lay-verify="number" placeholder="请输入...,倒序,值越大越靠前。"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">信息备注</label>
+							<div class="layui-input-block">
+								<input type="text" name="remark" value="{$agent.remark}" placeholder="请输入..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="radio" name="status" value="1" title="正常" {eq name="agent.status|default=1" value="1" }checked{/eq} />
+								<input type="radio" name="status" value="2" title="禁用" {eq name="agent.status" value="2" }checked{/eq} />
+							</div>
+						</div>
+
+						<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
+							<legend>PC端管理账号密码</legend>
+						</fieldset>
+						<div class="layui-form-item">
+							<label class="layui-form-label">登录账号</label>
+							<div class="layui-input-block">
+								<input type="text" name="loginname" value="{$agent.loginname}" placeholder="请输入..." autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">PC端管理登录账号。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">登录密码</label>
+							<div class="layui-input-block">
+								<input type="text" name="password" value="" placeholder="请输入登录密码,不修改留空" autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">PC端管理登录密码。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-agent-agentform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload', 'layedit', 'layarea'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload,
+			layedit = layui.layedit,
+			layarea = layui.layarea;
+		form.render();
+
+		var details = layedit.build('details', {
+			uploadImage: {
+				url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+				type: 'post'
+			}
+		});
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(details);
+			}
+		});
+
+		layarea.render({
+			elem: '#LAY-agent-agentform-edit-areapicker',
+			data: {
+				province: '福建省',
+				city: '泉州市',
+				district: '晋江市',
+			}
+		});
+		var map = new AMap.Map('maplocation', {
+			center:[118.551494,24.781674],//地图中心位置
+			zoom: 12,
+		});
+		$('#layuiadmin-map-lnglat').on('click', function() {
+			var index = layer.open({
+				type: 1,
+				title: '点击获取地址坐标',
+				area: ['500px', '550px'],
+				content: $('#maplocation'),
+				success: function() {
+					//var map = new AMap.Map("maplocation", { resizeEnable: true });
+					map.on('click', function(e) {
+						$('input[name="longitude"]').val(e.lnglat.getLng());
+						$('input[name="latitude"]').val(e.lnglat.getLat());
+						layer.close(index);
+					});
+				}
+			});
+		});
+
+		var auto = new AMap.Autocomplete({ input: "pickerInput" });
+		var placeSearch = new AMap.PlaceSearch({ map: map });
+		window.select = function (e) {
+			console.log(e);
+			placeSearch.setCity(e.poi.adcode);
+			placeSearch.search(e.poi.name);
+		};
+		AMap.event.addListener(auto, "select", select);
+
+		form.on('submit(LAY-agent-agentform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'agent/editagent',
+				type: 'post',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-agent-agentlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+			accept: 'images',
+			exits: 'jpg|png|jpeg',
+			acceptMime: 'image/*',
+			size: 2048,
+			number: 1,
+			method: 'post',
+			before: function(obj) {
+				var item = this.item;
+				upload_input = $(item).data('input');
+				upload_amount = $(item).data('amount');
+				layer.load();
+			},
+			done: function(res, index, upload) {
+				layer.closeAll('loading');
+				var html = "";
+				if (upload_amount == 1) {
+					html += '<div> <input type="hidden" name="' + upload_input + '" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src + '"></div>';
+					$("#" + upload_input).html(html);
+				} else {
+					html += '<div> <input type="hidden" name="' + upload_input + '[]" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src +
+						'"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).append(html);
+				}
+			},
+			error: function(index, upload) {
+				layer.closeAll('loading');
+			}
+		});
+	});
+</script>

+ 213 - 0
app/admin/view/agent/agentlist.html

@@ -0,0 +1,213 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-agent-agentlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">代理编号</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">劳务公司</label>
+					<div class="layui-input-block">
+						<select name="workerid" lay-search>
+							<option value="">全部公司(可搜索)</option>
+							{volist name="workerlist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">正常</option>
+							<option value="2">禁用</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-agent-agentlist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+			<table id="LAY-agent-agentlist-table" lay-filter="LAY-agent-agentlist-table"></table>
+			<script type="text/html" id="workertitleTpl">
+				{{d.worker.title}}
+			</script>
+			<script type="text/html" id="muserTpl">
+				{{#  if(d.userid != 0){ }}
+					{{d.muser.realname}} - {{d.muser.mobile}} 
+				{{#  } }}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+						<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+					</script>
+		</div>
+	</div>
+</div>
+
+<script src="/static/echoui/layui/layui.js"></script>
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-agent-agentlist-table',
+			url: setter.baseAdminUrl + 'agent/listagent',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'priority', width: 100, title: '排序ID', edit: 'text', sort: true },
+					{ field: 'idnumber', title: '编号' },
+					{ field: 'loginname', title: '登录账号', minWidth: 150 },
+					{ field: 'title', title: '名称', edit: 'text' },
+					{ field: 'workertitle', title: '劳务公司', templet: '#workertitleTpl' },
+					{ field: 'realname', title: '负责人姓名', edit: 'text' },
+					{ field: 'mobile', width: 150, title: '负责人手机号', edit: 'text' },
+					{ field: 'muser', title: '关联的用户(姓名-手机号)', templet: '#muserTpl', minWidth: 250, align: 'left' },
+					{ field: 'province', title: '省' },
+					{ field: 'city', title: '市' },
+					{ field: 'district', title: '区县' },
+					{ field: 'address', width: 200, title: '详细地址', hide: 'true', edit: 'text' },
+					{ field: 'createtime', width: 170, title: '创建时间', sort: true },
+					{ field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-agent-agentlist-btn)', function(data) {
+			table.reload('LAY-agent-agentlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		table.on('edit(LAY-agent-agentlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'agent/fieldagent',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-agent-agentlist-table');
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-agent-agentlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.prompt({
+					formType: 1,
+					title: '敏感操作,请验证密码'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定删除此管理员吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'agent/delagent',
+							data: {
+								password: value,
+								idarr: idarr
+							},
+							done: function(res) {
+								table.reload('LAY-agent-agentlist-table');
+								layer.msg('已删除');
+							}
+						});
+						layer.close(index);
+					});
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加管理员',
+					content: 'agentform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-agent-agentlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.prompt({
+					formType: 1,
+					title: '敏感操作,请验证密码'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定删除此管理员吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'agent/delagent',
+							data: {
+								password: value,
+								idarr: [data.id]
+							},
+							done: function(res) {
+								obj.del();
+								layer.msg('已删除');
+							}
+						});
+						layer.close(index);
+					});
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑管理员',
+					content: 'agentform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 116 - 0
app/admin/view/agent/fagentform.html

@@ -0,0 +1,116 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">代理门店申请信息</div>
+				<div class="layui-card-body" pad15>
+
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-agent-fagentform-edit">
+						<input type="hidden" name="id" value="{$fagent.id}">
+
+						<div class="layui-form-item">
+							<label class="layui-form-label">姓<span style="color:#f90c05;">*</span>名</label>
+							<div class="layui-input-block">
+								<input type="text" name="realname" value="{$fagent.realname}" lay-verify="required" placeholder="请输入"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">手机号</label>
+							<div class="layui-input-block">
+								<input type="text" name="mobile" value="{$fagent.mobile}" lay-verify="phone" placeholder="请输入" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">当前住址</label>
+							<div class="layui-input-block">
+								<input type="text" name="address" value="{$fagent.address}" placeholder="请输入"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">身份证号</label>
+							<div class="layui-input-block">
+								<input type="text" name="idcard" value="{$fagent.idcard}" placeholder="请输入" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">推荐人</label>
+							<div class="layui-input-block">
+								<input type="text" name="recommender" value="{$fagent.recommender}" placeholder="请输入"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">备注信息</label>
+							<div class="layui-input-block">
+								<input type="text" name="remark" value="{$fagent.remark}" placeholder="请输入" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="radio" name="status" value="1" title="待处理" {eq name="fagent.status|default=1" value="1" }checked{/eq}>
+								 <input type="radio" name="status" value="2" title="处理中" {eq name="fagent.status" value="2" }checked{/eq}>
+								 <input type="radio" name="status" value="3" title="已处理" {eq name="fagent.status" value="3" }checked{/eq}> </div>
+								 </div> <div class="layui-form-item">
+								<label class="layui-form-label"><span style="color:#f90c05;">*</span>申请时间</label>
+								<div class="layui-input-block">
+									<input type="text" name="createtime" id="createtime" value="{$fagent.createtime}" lay-verify="required"
+									 placeholder="请选择" autocomplete="off" class="layui-input">
+								</div>
+							</div>
+							<div class="layui-form-item">
+								<div class="layui-input-block">
+									<input type="button" lay-submit lay-filter="LAY-agent-fagentform-edit-submit" value="确认提交" class="layui-btn">
+								</div>
+							</div>
+						</div>
+
+
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'laydate', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			laydate = layui.laydate,
+			upload = layui.upload;
+		form.render();
+
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-agent-fagentform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'agent/editfagent',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-agent-fagentlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 175 - 0
app/admin/view/agent/fagentlist.html

@@ -0,0 +1,175 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-agent-fagentlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">姓名/手机号</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">待处理</option>
+							<option value="2">处理中</option>
+							<option value="3">已处理</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-agent-fagentlist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+			</div>
+			<table id="LAY-agent-fagentlist-table" lay-filter="LAY-agent-fagentlist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script src="/static/echoui/layui/layui.js"></script>
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-agent-fagentlist-table',
+			url: setter.baseAdminUrl + 'agent/listfagent',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'realname', width: 150, title: '姓名', edit: 'text' },
+					{ field: 'mobile', width: 150, title: '手机号', edit: 'text' },
+					{ field: 'address', minWidth: 250, title: '现住地址', edit: 'text' },
+					{ field: 'idcard', minWidth: 200, title: '身份证号', edit: 'text' },
+					{ field: 'recommender', width: 150, title: '推荐人', edit: 'text' },
+					{ field: 'remark', minWidth: 250, title: '备注', edit: 'text' },
+					{ field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-agent-fagentlist-btn)', function(data) {
+			table.reload('LAY-agent-fagentlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		table.on('edit(LAY-agent-fagentlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'agent/fieldfagent',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-agent-fagentlist-table');
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-agent-fagentlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除此申请记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'agent/delfagent',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-agent-fagentlist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加申请记录',
+					content: 'fagentform.html?id=0',
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-agent-fagentlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此申请记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'agent/delfagent',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑申请记录',
+					content: 'fagentform.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 138 - 0
app/admin/view/appcenter/cert/certform.html

@@ -0,0 +1,138 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">证书信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-certform-edit">
+						<input type="hidden" name="id" value="{$cert.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>认证名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$cert.title}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>证书编号</label>
+							<div class="layui-input-block">
+								<input type="text" name="cnumber" value="{$cert.cnumber}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">证书照片</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="tilpic" data-amount="1">上传图片</button>
+									<div class="layui-inline layui-word-aux">  </div>
+									<div class="layui-upload-list echo-attachment-image-list" id="tilpic">
+										{notempty name="cert.tilpic"}
+										<div>
+											<input type="hidden" name="tilpic" value="{$cert.tilpic}">
+											<img src="{$cert.tilpic}">
+										</div>
+										{/notempty}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>备注信息</label>
+							<div class="layui-input-block">
+								<input type="text" name="remark" value="{$cert.remark}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>创建时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="createtime" id="createtime" value="{$cert.createtime|default=date('Y-m-d H:i:s')}" lay-verify="required"
+								 placeholder="请选择..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-certform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'laydate', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			laydate = layui.laydate,
+			upload = layui.upload;
+		form.render();
+		
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-certform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'cert/editcert',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", { icon: 1 });
+					parent.layui.table.reload('LAY-certlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+			accept: 'images',
+			exits: 'jpg|png|jpeg',
+			acceptMime: 'image/*',
+			size: 2048,
+			number: 1,
+			method: 'post',
+			before: function(obj) {
+				var item = this.item;
+				upload_input = $(item).data('input');
+				upload_amount = $(item).data('amount');
+				layer.load();
+			},
+			done: function(res, index, upload) {
+				layer.closeAll('loading');
+				var html = "";
+				if (upload_amount == 1) {
+					html += '<div> <input type="hidden" name="' + upload_input + '" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src + '"></div>';
+					$("#" + upload_input).html(html);
+				} else {
+					html += '<div> <input type="hidden" name="' + upload_input + '[]" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src +
+						'"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).append(html);
+				}
+			},
+			error: function(index, upload) {
+				layer.closeAll('loading');
+			}
+		});
+
+	});
+</script>

+ 167 - 0
app/admin/view/appcenter/cert/certlist.html

@@ -0,0 +1,167 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-certlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">名称/编号</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-certlist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+			<table id="LAY-certlist-table" lay-filter="LAY-certlist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-certlist-table',
+			url: setter.baseAdminUrl + 'cert/listcert',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'title', title: '认证名称', minWidth: 200, edit: 'text' },
+					{ field: 'cnumber', title: '认证编号', minWidth: 200, edit: 'text' },
+					{ field: 'remark', title: '备注信息', edit: 'text' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 200, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-certlist-search-btn)', function(data) {
+			table.reload('LAY-certlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-certlist-table'),
+					checkData = checkStatus.data;
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除所选证书吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'cert/delcert',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-certlist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加证书',
+					content: 'certform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听单元格编辑
+		table.on('edit(LAY-certlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'cert/fieldcert',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-certlist-table');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(LAY-certlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此证书吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'cert/delcert',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑证书',
+					content: 'certform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'pic') {
+				layer.photos({
+					photos: '#pic' + data.id,
+					anim: 5,
+				});
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 145 - 0
app/admin/view/appcenter/form/formform.html

@@ -0,0 +1,145 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">自定义表单信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="formform-edit">
+						<input type="hidden" name="id" value="{$form.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>表单名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$form.title}" lay-verify="required" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">表单说明</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="explain" id="explain" placeholder="请输入..." style="display: none" lay-verify="editcontent">
+									{$form.explain}
+								</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>提交次数</label>
+							<div class="layui-input-block">
+								<input type="text" name="usernumber" value="{$form.usernumber|default=0}" lay-verify="required" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">本次自定义表单,每个用户最大提交次数;0表示不限。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>分享标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="sharetil" value="{$form.sharetil}" lay-verify="required" placeholder="请输入..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">分享图片</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="sharepic" data-amount="1">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 用户自定义页分享图片,最佳尺寸:500px*400px。
+									</div>
+									<div class="layui-upload-list echo-attachment-image-list" id="sharepic">
+										{notempty name="form.sharepic"}
+										<div>
+											<input type="hidden" name="sharepic" value="{$form.sharepic}">
+											<img src="{$form.sharepic}">
+										</div>
+										{/notempty}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="formform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'layedit', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			layedit = layui.layedit,
+			upload = layui.upload;
+		form.render();
+		
+		var explain = layedit.build('explain', {
+			uploadImage: { url: setter.baseAdminUrl + 'attachment/tplfieldimage', type: 'post' }
+		});
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(explain);
+			}
+		});
+
+		form.on('submit(formform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'form/editform',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('formlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+		
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+			accept: 'images',
+			exits: 'jpg|png|jpeg',
+			acceptMime: 'image/*',
+			size: 2048,
+			number: 1,
+			method: 'post',
+			before: function(obj) {
+				var item = this.item;
+				upload_input = $(item).data('input');
+				upload_amount = $(item).data('amount');
+				layer.load();
+			},
+			done: function(res, index, upload) {
+				layer.closeAll('loading');
+				var html = "";
+				if (upload_amount == 1) {
+					html += '<div> <input type="hidden" name="' + upload_input + '" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src + '"></div>';
+					$("#" + upload_input).html(html);
+				} else {
+					html += '<div> <input type="hidden" name="' + upload_input + '[]" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src +
+						'"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).append(html);
+				}
+			},
+			error: function(index, upload) {
+				layer.closeAll('loading');
+			}
+		}); 
+	});
+</script>

+ 219 - 0
app/admin/view/appcenter/form/formlist.html

@@ -0,0 +1,219 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-card-header layuiadmin-card-header-auto">
+			<button class="layui-btn layuiadmin-btn" data-type="formadd">添加自定义表单</button>
+			<button class="layui-btn layuiadmin-btn" data-type="itemadd">添加表单字段</button>
+		</div>
+
+		<div class="layui-card-body">
+			<div class="layui-row layui-col-space15">
+				<div class="layui-col-md6">
+					<table id="formlist-table" lay-filter="formlist-table"></table>
+					<script type="text/html" id="catesetTpl">
+						<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="log"><i class="layui-icon layui-icon-cols"></i>记录</a>
+						<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="item"><i class="layui-icon layui-icon-layer"></i>字段</a>
+						<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+						<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+					</script>
+				</div>
+				<div class="layui-col-md6">
+					<table id="itemlist-table" lay-filter="itemlist-table"></table>
+					<script type="text/html" id="setTpl">
+						<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+						<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+					</script>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		// 筛选列表
+		table.render({
+			elem: '#formlist-table',
+			url: setter.baseAdminUrl + 'form/listform',
+			cols: [
+				[
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'title', title: '表单名称', edit: 'text' },
+					{ field: 'usernumber', width: 110, title: '用户提交数', edit: 'text', align: 'center' },
+					{ field: 'itemcount', title: '字段数', width: 80, align: 'center', templet: '<div>{{d.form_item_count}}</div>' },
+					{ field: 'logcount', title: '记录数', width: 80, align: 'center', templet: '<div>{{d.form_log_count}}</div>' },
+					{ title: '操作', width: 280, align: 'center', fixed: 'right', toolbar: '#catesetTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			toolbar: '<div>自定义表单</div>',
+			defaultToolbar: [],
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		table.render({
+			elem: '#itemlist-table',
+			url: setter.baseAdminUrl + 'form/listitem',
+			where: { formid: 0 },
+			cols: [
+				[
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'priority', width: 80, title: '排序', sort: true, edit: 'text' },
+					{ field: 'title', title: '字段名称', edit: 'text' },
+					{ field: 'imust_text', title: '必填', width: 80, align: 'center' },
+					{ field: 'itype_text', title: '类型', width: 120, align: 'center' },
+					{ title: '操作', width: 160, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			toolbar: '<div><font color="#FF5722">请点击自定义表单列表行字段查看</font></div>',
+			defaultToolbar: [],
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//监听单元格编辑
+		table.on('edit(formlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'form/fieldform',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('formlist-table');
+				}
+			});
+		});
+		
+		table.on('edit(itemlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'form/fielditem',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('itemlist-table');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(formlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('删除此表单时,会同时删除其所有字段、提交记录等,不可恢复。确定删除此表单吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'form/delform',
+						data: {
+							id: data.id
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑自定义表单',
+					content: 'formform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'item') {
+				table.reload('itemlist-table', {
+					toolbar: '<div><font color="#FF5722">' + data.title + '</font> 表单</div>',
+					where: { formid: data.id },
+					page: {
+						curr: 1
+					}
+				});
+			} else if (obj.event === 'log') {
+				var index = layer.open({
+					type: 2,
+					title: '自定义表单【' + data.title + '】提交记录',
+					content: 'loglist.html?formid=' + data.id,
+					maxmin: true,
+					area: ['750px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+		
+		table.on('tool(itemlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('删除此字段时,会同时删除其字段提交记录,并不可恢复,确定删除此表单字段吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'form/delitem',
+						data: {
+							id: data.id
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑表单字段',
+					content: 'itemform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		var active = {
+			formadd: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加自定义表单',
+					content: 'formform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			},
+			itemadd: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加表单字段',
+					content: 'itemform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 141 - 0
app/admin/view/appcenter/form/itemform.html

@@ -0,0 +1,141 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">表单字段信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="itemform-edit">
+						<input type="hidden" name="id" value="{$item.id}">
+						{if $item.formid>0}
+						<input type="hidden" name="formid" value="{$item.formid}">
+						<div class="layui-form-item">
+							<label class="layui-form-label">自定义表单</label>
+							<div class="layui-input-block">
+								<input type="text" name="formtitle" value="{$item.form.title}" placeholder="请输入..." autocomplete="off" readonly="readonly"
+								 class="layui-input layui-disabled">
+							</div>
+						</div>
+						{else /}
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>自定义表单</label>
+							<div class="layui-input-block">
+								<select name="formid" lay-search lay-verify="required">
+									<option value="">请选择(可搜索)...</option>
+									{volist name="formlist" id="vo"}
+									<option value="{$vo.id}" {$item.formid==$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+								<div class="layui-form-mid layui-word-aux">选择后不可修改,请谨慎选择。</div>
+							</div>
+						</div>
+						{/if}
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>字段名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$item.title}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">是否必填</label>
+							<div class="layui-input-block">
+								<input type="radio" name="imust" value="1" title="是" {eq name="item.imust|default=1" value="1"}checked{/eq} />
+								<input type="radio" name="imust" value="2" title="否" {eq name="item.imust" value="2"}checked{/eq} />
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">类型</label>
+							<div class="layui-input-block">
+								<input type="radio" name="itype" lay-filter="itype" value="1" title="单行输入框" {eq name="item.itype|default=1" value="1"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="2" title="多行输入框" {eq name="item.itype" value="2"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="3" title="普通选择" {eq name="item.itype" value="3"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="4" title="单选选择" {eq name="item.itype" value="4"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="5" title="多选选择" {eq name="item.itype" value="5"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="6" title="日期选择" {eq name="item.itype" value="6"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="7" title="时间选择" {eq name="item.itype" value="7"}checked{/eq} />
+								<input type="radio" name="itype" lay-filter="itype" value="8" title="图片上传" {eq name="item.itype" value="8"}checked{/eq} />
+							</div>
+						</div>
+						<div class="layui-form-item itypebox itypebox3 itypebox4 itypebox5">
+							<label class="layui-form-label">选择项集合</label>
+							<div class="layui-input-block">
+								<textarea name="options" placeholder="请输入..." class="layui-textarea">{$item.options}</textarea>
+								<div class="layui-form-mid layui-word-aux">每行一个,并且不要有空行。</div>
+							</div>
+						</div>
+						<div class="layui-form-item itypebox itypebox8">
+							<label class="layui-form-label">图片数量</label>
+							<div class="layui-input-block">
+								<input type="text" name="picnumber" value="{$item.picnumber|default=1}" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">用户提交图片最多数量。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">字段提示</label>
+							<div class="layui-input-block">
+								<input type="text" name="placeholder" value="{$item.placeholder}" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">字段输入提示信息,为空时不显示。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$item.priority|default=0}" lay-verify="required" placeholder="请输入排序值(升序,值越小越靠前)"
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">升序,值越小越靠前。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="itemform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+		
+		function itypeChange(value) {
+			$(".itypebox").hide();
+			$(".itypebox" + value).show();
+		}
+		itypeChange({$item['itype']|default=1});
+		form.on('radio(itype)', function(data) {
+			itypeChange(data.value);
+		});
+
+		form.on('submit(itemform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'form/edititem',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('itemlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+	});
+</script>

+ 114 - 0
app/admin/view/appcenter/form/logdetail.html

@@ -0,0 +1,114 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">记录详情</div>
+		<div class="layui-card-body">
+
+			<fieldset class="layui-elem-field layui-field-title" style="margin-bottom: 30px;">
+				<legend>基本信息</legend>
+			</fieldset>
+			<ul class="layui-timeline">
+				<li class="layui-timeline-item">
+					<i class="layui-icon layui-timeline-axis"></i>
+					<div class="layui-timeline-content layui-text">
+						<h3 class="layui-timeline-title">
+							{$log.form.title}
+						</h3>
+					</div>
+				</li>
+				<li class="layui-timeline-item">
+					<i class="layui-icon layui-timeline-axis"></i>
+					<div class="layui-timeline-content layui-text">
+						<h3 class="layui-timeline-title">
+							{$log.user.realname} - {$log.user.mobile}
+						</h3>
+					</div>
+				</li>
+				<li class="layui-timeline-item">
+					<i class="layui-icon layui-timeline-axis"></i>
+					<div class="layui-timeline-content layui-text">
+						<h3 class="layui-timeline-title">
+							备注信息
+						</h3>
+						<div class="layui-form" lay-filter="logdetail-edit">
+							<blockquote class="layui-elem-quote">
+								<textarea placeholder="请输入..." class="layui-textarea" name="remark">{$log.remark}</textarea>
+							</blockquote>
+							<input type="hidden" name="id" value="{$log.id}">
+							<input type="button" lay-submit lay-filter="logdetail-edit-submit" value="确认提交" class="layui-btn">
+						</div>
+						
+					</div>
+				</li>
+			</ul>
+			
+			<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px; margin-bottom: 30px;">
+				<legend>提交信息</legend>
+			</fieldset>
+			<ul class="layui-timeline">
+				{volist name="itemlist" id="vo"}
+				<li class="layui-timeline-item">
+					<i class="layui-icon layui-timeline-axis"></i>
+					<div class="layui-timeline-content layui-text">
+						<h3 class="layui-timeline-title">
+							{$vo.title} 【{$vo.itype_text}】
+						</h3>
+						{if is_array($logvallist[$vo.id]['ivalue']) && $vo.itype==5}
+							{volist name="logvallist[$vo.id]['ivalue']" id="ivo"}
+							<p>{$ivo}</p>
+							{/volist}
+						{elseif is_array($logvallist[$vo.id]['ivalue']) && $vo.itype==8 /}
+							{volist name="logvallist[$vo.id]['ivalue']" id="ivo"}
+							<a target="_blank" href="{$ivo}">
+								<img style="max-height: 350px; border: 1px solid #666; margin-right: 10px;" src="{$ivo}" />
+							</a>
+							{/volist}
+						{else /}
+						<p>{$logvallist[$vo.id]['ivalue']}</p>
+						{/if}
+					</div>
+				</li>
+				{/volist}
+				<li class="layui-timeline-item">
+					<i class="layui-icon layui-timeline-axis"></i>
+					<div class="layui-timeline-content layui-text">
+						<div class="layui-timeline-title">已加载完 </div>
+					</div>
+				</li>
+			</ul>
+
+
+		</div>
+	</div>
+</div>
+
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		form.on('submit(logdetail-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'form/editlog',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('loglist-table');
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 159 - 0
app/admin/view/appcenter/form/loglist.html

@@ -0,0 +1,159 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">自定义表单【{$form.title}】提交记录</div>
+		<div class="layui-card-body">
+			<table id="loglist-table" lay-filter="loglist-table"></table>
+			<script type="text/html" id="tabletoolbar">
+				<div class="layui-btn-container">
+					<button class="layui-btn layui-btn-sm" lay-event="batchdel">删除</button>
+					<button class="layui-btn layui-btn-sm" lay-event="export">导出全部</button>
+				</div>
+			</script>
+			<script type="text/html" id="useravatarTpl">
+				{{#  if(d.user!=null && d.user.avatar != ''){ }}
+				<div id="pic{{d.id}}" lay-event="pic">
+					<img style="width: 100%; height: 100%;" src="{{d.user.avatar}}">
+				</div>
+				{{#  } }}
+			</script>
+			{foreach $form->formItem as $key=>$vo }
+			<script type="text/html" id="item{$vo->id}Tpl">
+				{{#  if({$vo->itype}==8){ }}
+					请点击详情查看图片
+				{{#  }else { }}
+					<div>{{d.formLogval[{$key}].ivalue}}</div>
+				{{#  } }}
+			</script>
+			{/foreach}
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail"><i class="layui-icon layui-icon-layer"></i>详情</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table', 'selectN', 'selectM'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table,
+			selectN = layui.selectN,
+			selectM = layui.selectM;
+		form.render();
+
+
+		table.render({
+			elem: '#loglist-table',
+			url: setter.baseAdminUrl + 'form/listlog',
+			where: {
+				formid: {$form->id}
+			},
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'useravatar', width: 60, title: '头像', templet: '#useravatarTpl' },
+					{ field: 'userrealname', title: '姓名', width: 120, templet: '<div>{{d.user!=null ? d.user.realname : ""}}</div>' },
+					{ field: 'usermobile', title: '手机号', width: 150, templet: '<div>{{d.user!=null ? d.user.mobile : ""}}</div>' },
+					{ field: 'remark', title: '备注(点击编辑)', minWidth: 300, edit: 'text' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{foreach $form->formItem as $key=>$vo }
+					{ field: 'item{$vo->id}', title: '{$vo->title}', templet: '#item{$vo->id}Tpl', hide: true },
+					{/foreach}
+					{ title: '操作', width: 170, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			toolbar: '#tabletoolbar',
+			cellMinWidth: 300,
+			text: '对不起,加载出现异常!'
+		});
+
+		table.on('edit(loglist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'form/fieldlog',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+				}
+			});
+		});
+
+		//头工具栏事件
+		table.on('toolbar(loglist-table)', function(obj) {
+			var checkStatus = table.checkStatus(obj.config.id);
+			switch (obj.event) {
+				case 'batchdel':
+					var checkData = checkStatus.data;
+					if (checkData.length === 0) {
+						return layer.msg('请选择数据');
+					}
+					var idarr = [];
+					for (var i = 0; i < checkData.length; i++) {
+						idarr.push(checkData[i].id);
+					}
+					layer.confirm('删除后不可恢复,确定删除此提交记录吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'form/dellog',
+							data: {
+								idarr: idarr
+							},
+							done: function(res) {
+								table.reload('loglist-table');
+								layer.msg('已删除');
+							}
+						});
+					});
+					break;
+				case 'export':
+					var url = setter.baseAdminUrl + 'form/exportlog?formid=' + {$form->id};
+					window.location.href = url;
+					break;
+			};
+		});
+		
+		table.on('tool(loglist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此提交记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'form/dellog',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'detail') {
+				var index = layer.open({
+					type: 2,
+					title: '记录详情',
+					content: 'logdetail.html?logid=' + data.id,
+					maxmin: true,
+					area: ['750px', '550px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'pic') {
+				layer.photos({
+					photos: '#pic' + data.id,
+					anim: 5,
+				});
+			}
+		});
+	});
+</script>

+ 173 - 0
app/admin/view/artapp/article/articlecommentlist.html

@@ -0,0 +1,173 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">文章评论</div>
+		<div class="layui-card-body" lay-filter="LAY-artapp-article-articlecommentlist-list">
+
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="cbatchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="cbatchstatus">批量审核通过</button>
+			</div>
+			<table id="LAY-artapp-article-articlecommentlist-list-table" lay-filter="LAY-artapp-article-articlecommentlist-list-table"></table>
+			<script type="text/html" id="useravatarTpl">
+				<img style="width: 100%; height: 100%;" src="{{d.user.avatar}}" alt="{{d.user.nickname}}">
+			</script>
+			<script type="text/html" id="usernicknameTpl">
+				{{d.user.nickname}}
+			</script>
+			<script type="text/html" id="detailsTpl">
+				{{#  if(d.puserid == 0){ }}
+					{{d.details}}
+				{{#  } else { }}
+					回复{{d.puser.nickname}}:{{d.details}}
+				{{#  } }}
+			</script>
+			<script type="text/html" id="commentsetTpl">
+				{{#  if(d.status == 1){ }}
+					<a class="layui-btn layui-btn-xs" lay-event="setstatus"><i class="layui-icon layui-icon-ok"></i>已通过</a>
+				{{#  } else { }}
+					<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="setstatus"><i class="layui-icon layui-icon-edit"></i>待审核</a>
+				{{#  } }}
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delcomment"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+		//列表
+		table.render({
+			elem: '#LAY-artapp-article-articlecommentlist-list-table',
+			url: setter.baseAdminUrl + 'article/listcomment?articleid={$articleid}',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'useravatar', width: 60, title: '头像', templet: '#useravatarTpl' },
+					{ field: 'usernickname', width: 150, title: '昵称', templet: '#usernicknameTpl' },
+					{ field: 'details', title: '内容', templet: '#detailsTpl', edit: 'text' },
+					{ field: 'status_text', width: 160, title: '状态' },
+					{ field: 'createtime', width: 160, title: '发布时间', sort: true },
+					{ title: '操作', width: 200, align: 'center', fixed: 'right', toolbar: '#commentsetTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-article-articlecommentlist-list-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'article/fieldcomment',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					// layui.table.reload('LAY-artapp-article-articlecommentlist-list');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(LAY-artapp-article-articlecommentlist-list-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'delcomment') {
+				layer.confirm('确定删除此评论吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'article/delcomment',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'setstatus') {
+				admin.req({
+					url: setter.baseAdminUrl + 'article/statuscomment',
+					data: { id: data.id },
+					done: function(res) {
+						layer.msg('状态修改成功');
+						layui.table.reload('LAY-artapp-article-articlecommentlist-list-table');
+					}
+				});
+			}
+		});
+
+		//事件
+		var active = {
+			cbatchdel: function() {
+				var checkStatus = table.checkStatus('LAY-artapp-article-articlecommentlist-list-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除所选评论吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'article/delcomment',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-artapp-article-articlecommentlist-list-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			cbatchstatus: function() {
+				var checkStatus = table.checkStatus('LAY-artapp-article-articlecommentlist-list-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定批量通过所选评论吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'article/statuscommentall',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-artapp-article-articlecommentlist-list-table');
+							layer.msg('已审核通过');
+						}
+					});
+					layer.close(index);
+				});
+			}
+		};
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 233 - 0
app/admin/view/artapp/article/articleform.html

@@ -0,0 +1,233 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">文章资讯信息</div>
+				<div class="layui-card-body" pad15>
+
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-artapp-article-articleform-edit">
+						<input type="hidden" name="id" value="{$article.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label">分类</label>
+							<div class="layui-input-block">
+								<select name="cateid">
+									{volist name="catelist" id="vo"}
+									<option value="{$vo.id}" {$article.cateid==$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$article.title}" lay-verify="required" placeholder="请输入标题" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">标图</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="tilpic" data-amount="1">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 最佳尺寸:750px*375px </div>
+									<div class="layui-upload-list echo-attachment-image-list" id="tilpic">
+										{notempty name="article.tilpic"}
+										<div>
+											<input type="hidden" name="tilpic" value="{$article.tilpic}">
+											<img src="{$article.tilpic}">
+										</div>
+										{/notempty}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>作者</label>
+							<div class="layui-input-block">
+								<input type="text" name="author" value="{$article.author}" lay-verify="required" placeholder="请输入作者"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>概要</label>
+							<div class="layui-input-block">
+								<textarea name="summary" lay-verify="required" placeholder="请输入概要" class="layui-textarea">{$article.summary}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">类型</label>
+							<div class="layui-input-block">
+								<input type="radio" name="atype" lay-filter="atype" value="1" title="文章详情" {eq name="article.atype|default=1" value="1" }checked{/eq}> 
+								<input type="radio" name="atype" lay-filter="atype" value="2" title="系统链接" {eq name="article.atype" value="2" }checked{/eq}> 
+								<input type="radio" name="atype" lay-filter="atype" value="3" title="网络链接" {eq name="article.atype" value="3" }checked{/eq}> 
+							</div> 
+						</div> 
+						<div class="layui-form-item" id="formdetails">
+							<label class="layui-form-label">详情</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="details" id="details" placeholder="请输入详情" style="display: none"
+								 lay-verify="editcontent">
+										{$article.details}
+								</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item" id="formtilurl">
+							<label class="layui-form-label">跳转链接</label>
+							<div class="layui-input-block">
+								<input type="text" name="tilurl" value="{$article.tilurl}" placeholder="请输入跳转链接" autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">
+									<b>系统链接:</b>通过系统各栏目复制的链接,以“/pages/”开头;
+									<b>网络链接:</b>普通的url链接,以“http://”或“https://”开头。
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>发布时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="createtime" id="createtime" value="{$article.createtime}" lay-verify="required"
+								 placeholder="请选择发布时间" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">置顶</label>
+							<div class="layui-input-block">
+								<select name="priority">
+									<option value="0" {$article.priority===0 ? 'selected' : '' }>不置顶</option>
+									<option value="1" {$article.priority===1 ? 'selected' : '' }>置顶一</option>
+									<option value="2" {$article.priority===2 ? 'selected' : '' }>置顶二</option>
+									<option value="3" {$article.priority===3 ? 'selected' : '' }>置顶三</option>
+									<option value="4" {$article.priority===4 ? 'selected' : '' }>置顶四</option>
+									<option value="5" {$article.priority===5 ? 'selected' : '' }>置顶五</option>
+									<option value="6" {$article.priority===6 ? 'selected' : '' }>置顶六</option>
+									<option value="7" {$article.priority===7 ? 'selected' : '' }>置顶七</option>
+									<option value="8" {$article.priority===8 ? 'selected' : '' }>置顶八</option>
+									<option value="9" {$article.priority===9 ? 'selected' : '' }>置顶九</option>
+								</select>
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="article.status|default=1" value="1"}checked{/eq} lay-skin="switch" lay-text="已发布|待修改" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">浏览量</label>
+							<div class="layui-input-block">
+								<input type="text" name="volume" value="{$article.volume|default=0}" lay-verify="required|number" placeholder="请输入浏览量"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-artapp-article-articleform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'layedit', 'laydate', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			layedit = layui.layedit,
+			laydate = layui.laydate,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		var details = layedit.build('details', {
+			uploadImage: { url: setter.baseAdminUrl + 'attachment/tplfieldimage', type: 'post' }
+		});
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(details);
+			}
+		});
+
+		function atypeChange(value) {
+			if (value == 1) {
+				$("#formdetails").show();
+				$("#formtilurl").hide();
+			} else {
+				$("#formdetails").hide();
+				$("#formtilurl").show();
+			};
+		}
+		atypeChange({$article['atype']|default=1});
+		form.on('radio(atype)', function(data) {
+			atypeChange(data.value);
+		});
+
+		form.on('submit(LAY-artapp-article-articleform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'article/editarticle',
+				type: 'post',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-artapp-article-articlelist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+			accept: 'images',
+			exits: 'jpg|png|jpeg',
+			acceptMime: 'image/*',
+			size: 2048,
+			number: 1,
+			method: 'post',
+			before: function(obj) {
+				var item = this.item;
+				upload_input = $(item).data('input');
+				upload_amount = $(item).data('amount');
+				layer.load();
+			},
+			done: function(res, index, upload) {
+				layer.closeAll('loading');
+				var html = "";
+				if (upload_amount == 1) {
+					html += '<div> <input type="hidden" name="' + upload_input + '" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src + '"></div>';
+					$("#" + upload_input).html(html);
+				} else {
+					html += '<div> <input type="hidden" name="' + upload_input + '[]" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src +
+						'"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).append(html);
+				}
+			},
+			error: function(index, upload) {
+				layer.closeAll('loading');
+			}
+		});
+
+	});
+</script>

+ 220 - 0
app/admin/view/artapp/article/articlelist.html

@@ -0,0 +1,220 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-artapp-article-articlelist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">标题</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">分类</label>
+					<div class="layui-input-block">
+						<select name="cateid" id="cateid">
+							<option value="">全部分类</option>
+							{volist name="catelist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">类型</label>
+					<div class="layui-input-block">
+						<select name="atype">
+							<option value="">全部类型</option>
+							<option value="1">文章详情</option>
+							<option value="2">系统链接</option>
+							<option value="3">网络链接</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">已发布</option>
+							<option value="2">待修改</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-artapp-article-articlelist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+			<table id="LAY-artapp-article-articlelist-table" lay-filter="LAY-artapp-article-articlelist-table"></table>
+			<script type="text/html" id="priorityTpl">
+				{{chnNumChar[d.priority]}}
+			</script>
+			<script type="text/html" id="cateidTpl">
+				{{d.articleCate.title}}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="comment"><i class="layui-icon layui-icon-ok-circle"></i>评论</a>
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+
+	</div>
+</div>
+
+<script>
+	var chnNumChar = ["", "置顶一", "置顶二", "置顶三", "置顶四", "置顶五", "置顶六", "置顶七", "置顶八", "置顶九"];
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		//列表
+		table.render({
+			elem: '#LAY-artapp-article-articlelist-table',
+			url: setter.baseAdminUrl + 'article/listarticle',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'priority', width: 80, title: '置顶', templet: '#priorityTpl' },
+					{ field: 'cateid', width: 100, title: '分类', templet: '#cateidTpl' },
+					{ field: 'title', title: '标题', width: 300, edit: 'text' },
+					{ field: 'atype_text', width: 100, title: '类型' },
+					{ field: 'createtime', width: 160, title: '发布时间', sort: true },
+					{ field: 'volume', width: 90, title: '浏览量', sort: true },
+					{ field: 'article_comment_count', width: 90, title: '评论量', sort: true },
+					{ field: 'article_thumb_count', width: 90, title: '点赞量', sort: true },
+					{ field: 'article_collect_count', width: 90, title: '收藏量', sort: true },
+					{ field: 'status_text', width: 90, title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 240, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//监听搜索
+		form.on('submit(LAY-artapp-article-articlelist-search-btn)', function(data) {
+			table.reload('LAY-artapp-article-articlelist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-article-articlelist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'article/fieldarticle',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-artapp-article-articlelist-table');
+				}
+			});
+		});
+
+		//事件
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-artapp-article-articlelist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除所选文章资讯吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'article/delarticle',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-artapp-article-articlelist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加文章资讯',
+					content: 'articleform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听工具条
+		table.on('tool(LAY-artapp-article-articlelist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此文章资讯吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'article/delarticle',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '添加文章资讯',
+					content: 'articleform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'comment') {
+				var index = layer.open({
+					type: 2,
+					title: '文章【' + data.title + '】评论列表',
+					content: 'articlecommentlist.html?articleid=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 73 - 0
app/admin/view/artapp/article/cateform.html

@@ -0,0 +1,73 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">分类信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-artapp-article-cateform-edit">
+						<input type="hidden" name="id" value="{$cate.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>分类名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$cate.title}" lay-verify="required" placeholder="请输入分类名称" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$cate.priority|default=0}" lay-verify="required" placeholder="请输入排序值(倒序,值越大越靠前)"
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="cate.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="显示|隐藏" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-artapp-article-cateform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		form.on('submit(LAY-artapp-article-cateform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'article/editcate',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-artapp-article-catelist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+	});
+</script>

+ 110 - 0
app/admin/view/artapp/article/catelist.html

@@ -0,0 +1,110 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-card-header layuiadmin-card-header-auto">
+			<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+		</div>
+
+		<div class="layui-card-body">
+			<table id="LAY-artapp-article-catelist-table" lay-filter="LAY-artapp-article-catelist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-artapp-article-catelist-table',
+			url: setter.baseAdminUrl + 'article/listcate',
+			cols: [
+				[
+					{ field: 'priority', width: 80, title: '排序', sort: true, edit: 'text' },
+					{ field: 'title', title: '分类名称', edit: 'text' },
+					{ field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//事件
+		var active = {
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加分类',
+					content: 'cateform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-article-catelist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'article/fieldcate',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-artapp-article-catelist-table');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(LAY-artapp-article-catelist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此分类吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'article/delcate',
+						data: {
+							id: data.id
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑分类',
+					content: 'cateform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 209 - 0
app/admin/view/artapp/article/commentlist.html

@@ -0,0 +1,209 @@
+		<div class="layui-fluid">
+			<div class="layui-card">
+				<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-artapp-article-commentlist-search">
+					<div class="layui-form-item">
+						<div class="layui-inline">
+							<label class="layui-form-label">标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-inline">
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<select name="status">
+									<option value="">全部状态</option>
+									<option value="1">已通过</option>
+									<option value="2">待审核</option>
+								</select>
+							</div>
+						</div>
+						<div class="layui-inline">
+							<button class="layui-btn" lay-submit lay-filter="LAY-artapp-article-commentlist-search-btn">
+								<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+							</button>
+						</div>
+					</div>
+				</div>
+				
+				
+				<div class="layui-card-body">
+					<div style="padding-bottom: 10px;">
+						<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+						<button class="layui-btn layuiadmin-btn" data-type="batchstatus">批量审核通过</button>
+					</div>
+					
+					<table id="LAY-artapp-article-commentlist-table" lay-filter="LAY-artapp-article-commentlist-table"></table>
+					<script type="text/html" id="useravatarTpl">
+						<img style="width: 100%; height: 100%;" src="{{d.user.avatar}}" alt="{{d.user.nickname}}">
+					</script> 
+					<script type="text/html" id="usernicknameTpl">
+						{{d.user.nickname}}
+					</script>
+					<script type="text/html" id="detailsTpl">
+						{{#  if(d.puserid == 0){ }}
+							{{d.details}}
+						{{#  } else { }}
+							回复{{d.puser.nickname}}:{{d.details}}
+						{{#  } }}
+					</script>
+					<script type="text/html" id="statusTpl">
+						{{#  if(d.status == 1){ }}
+							已通过
+						{{#  } else { }}
+							待审核
+						{{#  } }}
+					</script>
+					<script type="text/html" id="setTpl">
+						{{#  if(d.status == 1){ }}
+							<a class="layui-btn layui-btn-xs" lay-event="setstatus"><i class="layui-icon layui-icon-ok"></i>已通过</a>
+						{{#  } else { }}
+							<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="setstatus"><i class="layui-icon layui-icon-edit"></i>待审核</a>
+						{{#  } }}
+						<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delcomment"><i class="layui-icon layui-icon-delete"></i>删除</a>
+					</script>
+				</div>
+					
+			</div>
+		</div>
+ 
+		<script>
+		layui.config({
+				base: '/static/echoui/' //静态资源所在路径
+			}).extend({
+				index: 'lib/index' //主入口模块
+			}).use(['index', 'form', 'set', 'table'], function() {
+				var $ = layui.$,
+					setter = layui.setter,
+					admin = layui.admin,
+					form = layui.form,
+					table = layui.table;
+				form.render();
+				
+				table.render({
+					elem: '#LAY-artapp-article-commentlist-table',
+					url: setter.baseAdminUrl + 'article/listcomment',
+					cols: [[
+						{type: 'checkbox', fixed: 'left'},
+						{field: 'id', width: 80, title: '表ID', sort: true},
+						{field: 'useravatar', width: 60, title: '头像', templet: '#useravatarTpl'},
+						{field: 'usernickname', width: 150, title: '昵称', templet: '#usernicknameTpl'},
+						{field: 'details', title: '内容', templet: '#detailsTpl', edit: 'text'},
+						{field: 'status', width: 160, title: '状态', templet: '#statusTpl'},
+						{field: 'createtime', width: 160, title: '发布时间', sort: true},
+						{title: '操作', width: 200, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+					]],
+					page: true,
+					limit: 50,
+					cellMinWidth: 150,
+					text: '对不起,加载出现异常!'
+				});
+		
+				form.on('submit(LAY-artapp-article-commentlist-search-btn)', function(data) {
+					table.reload('LAY-artapp-article-commentlist-table', {
+						where: data.field,
+						page: {
+							curr: 1
+						}
+					});
+				});
+		
+				table.on('edit(LAY-artapp-article-commentlist-table)', function(obj){
+					var id = obj.data.id,
+						field = obj.field,
+						value = obj.value;
+					admin.req({
+						url: setter.baseAdminUrl + 'article/fieldcomment',
+						data: {id: id, field: field, value: value},
+						done: function(res) {
+							layer.msg('修改成功');
+						}
+					});
+				});
+				
+				table.on('tool(LAY-artapp-article-commentlist-table)', function(obj) {
+					var data = obj.data;
+					if (obj.event === 'delcomment') {
+						layer.confirm('确定删除此评论吗?', function(index) {
+							admin.req({
+								url: setter.baseAdminUrl + 'article/delcomment',
+								data: {
+									idarr: [data.id]
+								},
+								done: function(res) {
+									obj.del();
+									layer.msg('已删除');
+								}
+							});
+							layer.close(index);
+						});
+					} else if (obj.event === 'setstatus') {
+						admin.req({
+							url: setter.baseAdminUrl + 'article/statuscomment',
+							data: {id: data.id},
+							done: function(res) {
+								layer.msg('状态修改成功');
+								layui.table.reload('LAY-artapp-article-commentlist-table');
+							}
+						});
+					}
+				});
+				
+				var active = {
+					batchdel: function() {
+						var checkStatus = table.checkStatus('LAY-artapp-article-commentlist-table'),
+							checkData = checkStatus.data; //得到选中的数据
+						if (checkData.length === 0) {
+							return layer.msg('请选择数据');
+						}
+						var idarr = [];
+						for (var i = 0; i < checkData.length; i++) {
+							idarr.push(checkData[i].id);
+						}
+						layer.confirm('确定删除所选评论吗?', function(index) {
+							admin.req({
+								url: setter.baseAdminUrl + 'article/delcomment',
+								data: {
+									idarr: idarr
+								},
+								done: function(res) {
+									table.reload('LAY-artapp-article-commentlist-table');
+									layer.msg('已删除');
+								}
+							});
+							layer.close(index);
+						});
+					},
+					batchstatus: function() {
+						var checkStatus = table.checkStatus('LAY-artapp-article-commentlist-table'),
+							checkData = checkStatus.data; //得到选中的数据
+						if (checkData.length === 0) {
+							return layer.msg('请选择数据');
+						}
+						var idarr = [];
+						for (var i = 0; i < checkData.length; i++) {
+							idarr.push(checkData[i].id);
+						}
+						layer.confirm('确定批量通过所选评论吗?', function(index) {
+							admin.req({
+								url: setter.baseAdminUrl + 'article/statuscommentall',
+								data: {
+									idarr: idarr
+								},
+								done: function(res) {
+									table.reload('LAY-artapp-article-commentlist-table');
+									layer.msg('已审核通过');
+								}
+							});
+							layer.close(index);
+						});
+					}
+				};
+				
+				$('.layui-btn.layuiadmin-btn').on('click', function(){
+					var type = $(this).data('type');
+					active[type] ? active[type].call(this) : '';
+				});
+		
+			});
+		</script>

+ 73 - 0
app/admin/view/artapp/notice/cateform.html

@@ -0,0 +1,73 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">分类信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane layui-form-pane" lay-filter="LAY-artapp-notice-cateform-edit">
+						<input type="hidden" name="id" value="{$cate.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>分类名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$cate.title}" lay-verify="required" placeholder="请输入分类名称" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$cate.priority|default=0}" lay-verify="required" placeholder="请输入排序值(倒序,值越大越靠前)"
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="cate.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="显示|隐藏" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-artapp-notice-cateform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		form.on('submit(LAY-artapp-notice-cateform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'notice/editcate',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-artapp-notice-catelist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+	});
+</script>

+ 110 - 0
app/admin/view/artapp/notice/catelist.html

@@ -0,0 +1,110 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-card-header layuiadmin-card-header-auto">
+			<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+		</div>
+
+		<div class="layui-card-body">
+			<table id="LAY-artapp-notice-catelist-table" lay-filter="LAY-artapp-notice-catelist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+						<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+					</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-artapp-notice-catelist-table',
+			url: setter.baseAdminUrl + 'notice/listcate',
+			cols: [
+				[
+					{ field: 'priority', width: 80, title: '排序', sort: true, edit: 'text' },
+					{ field: 'title', title: '分类名称', edit: 'text' },
+					{ field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//事件
+		var active = {
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加分类',
+					content: 'cateform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-notice-catelist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'notice/fieldcate',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-artapp-notice-catelist-table');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(LAY-artapp-notice-catelist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此分类吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'notice/delcate',
+						data: {
+							id: data.id
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑分类',
+					content: 'cateform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 134 - 0
app/admin/view/artapp/notice/noticeform.html

@@ -0,0 +1,134 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">通知公告信息</div>
+				<div class="layui-card-body" pad15>
+
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-artapp-notice-noticeform-edit">
+						<input type="hidden" name="id" value="{$notice.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label">分类</label>
+							<div class="layui-input-block">
+								<select name="cateid">
+									{volist name="catelist" id="vo"}
+									<option value="{$vo.id}" {$notice.cateid==$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$notice.title}" lay-verify="required" placeholder="请输入标题" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">详情</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="details" id="details" placeholder="请输入详情" style="display: none"
+								 lay-verify="editcontent">
+											{$notice.details}
+										</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>发布时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="createtime" id="createtime" value="{$notice.createtime}" lay-verify="required"
+								 placeholder="请选择发布时间" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">置顶</label>
+							<div class="layui-input-block">
+								<select name="priority">
+									<option value="0" {$notice.priority===0 ? 'selected' : '' }>不置顶</option>
+									<option value="1" {$notice.priority===1 ? 'selected' : '' }>置顶一</option>
+									<option value="2" {$notice.priority===2 ? 'selected' : '' }>置顶二</option>
+									<option value="3" {$notice.priority===3 ? 'selected' : '' }>置顶三</option>
+									<option value="4" {$notice.priority===4 ? 'selected' : '' }>置顶四</option>
+									<option value="5" {$notice.priority===5 ? 'selected' : '' }>置顶五</option>
+									<option value="6" {$notice.priority===6 ? 'selected' : '' }>置顶六</option>
+									<option value="7" {$notice.priority===7 ? 'selected' : '' }>置顶七</option>
+									<option value="8" {$notice.priority===8 ? 'selected' : '' }>置顶八</option>
+									<option value="9" {$notice.priority===9 ? 'selected' : '' }>置顶九</option>
+								</select>
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="notice.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="已发布|待修改" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">浏览量</label>
+							<div class="layui-input-block">
+								<input type="text" name="volume" value="{$notice.volume|default=0}" lay-verify="required|number" placeholder="请输入浏览量"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-artapp-notice-noticeform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'layedit', 'laydate', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			layedit = layui.layedit,
+			laydate = layui.laydate,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		var details = layedit.build('details', {
+			uploadImage: { url: setter.baseAdminUrl + 'attachment/tplfieldimage', type: 'post' }
+		});
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(details);
+			}
+		});
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-artapp-notice-noticeform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'notice/editnotice',
+				type: 'post',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-artapp-notice-noticelist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 195 - 0
app/admin/view/artapp/notice/noticelist.html

@@ -0,0 +1,195 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-artapp-notice-noticelist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">标题</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">分类</label>
+					<div class="layui-input-block">
+						<select name="cateid" id="cateid">
+							<option value="">全部分类</option>
+							{volist name="catelist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">已发布</option>
+							<option value="2">待修改</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-artapp-notice-noticelist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+			<table id="LAY-artapp-notice-noticelist-table" lay-filter="LAY-artapp-notice-noticelist-table"></table>
+			<script type="text/html" id="priorityTpl">
+				{{chnNumChar[d.priority]}}
+			</script>
+			<script type="text/html" id="cateidTpl">
+				{{d.noticeCate.title}}
+			</script> 
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+
+	</div>
+</div>
+
+<script>
+	var chnNumChar = ["", "置顶一", "置顶二", "置顶三", "置顶四", "置顶五", "置顶六", "置顶七", "置顶八", "置顶九"];
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		//列表
+		table.render({
+			elem: '#LAY-artapp-notice-noticelist-table',
+			url: setter.baseAdminUrl + 'notice/listnotice',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'priority', width: 80, title: '置顶', templet: '#priorityTpl' },
+					{ field: 'cateid', width: 100, title: '分类', templet: '#cateidTpl' },
+					{ field: 'title', title: '标题', edit: 'text' },
+					{ field: 'createtime', width: 200, title: '发布时间', sort: true },
+					{ field: 'volume', width: 100, title: '浏览量', sort: true },
+					{ field: 'status_text', width: 100, title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 200, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//监听搜索
+		form.on('submit(LAY-artapp-notice-noticelist-search-btn)', function(data) {
+			table.reload('LAY-artapp-notice-noticelist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+		
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-notice-noticelist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'notice/fieldnotice',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-artapp-notice-noticelist-table');
+				}
+			});
+		});
+
+		//事件
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-artapp-notice-noticelist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除所选通知公告吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'notice/delnotice',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-artapp-notice-noticelist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加通知公告',
+					content: 'noticeform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听工具条
+		table.on('tool(LAY-artapp-notice-noticelist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此通知公告吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'notice/delnotice',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑通知公告',
+					content: 'noticeform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 73 - 0
app/admin/view/artapp/question/cateform.html

@@ -0,0 +1,73 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">分类信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-artapp-question-cateform-edit">
+						<input type="hidden" name="id" value="{$cate.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>分类名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$cate.title}" lay-verify="required" placeholder="请输入分类名称" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$cate.priority|default=0}" lay-verify="required" placeholder="请输入排序值(倒序,值越大越靠前)"
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="cate.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="显示|隐藏" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-artapp-question-cateform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		form.on('submit(LAY-artapp-question-cateform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'question/editcate',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-artapp-question-catelist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+	});
+</script>

+ 109 - 0
app/admin/view/artapp/question/catelist.html

@@ -0,0 +1,109 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-card-header layuiadmin-card-header-auto">
+			<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+		</div>
+
+		<div class="layui-card-body">
+			<table id="LAY-artapp-question-catelist-table" lay-filter="LAY-artapp-question-catelist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-artapp-question-catelist-table',
+			url: setter.baseAdminUrl + 'question/listcate',
+			cols: [
+				[
+					{ field: 'priority', width: 80, title: '排序', sort: true, edit: 'text' },
+					{ field: 'title', title: '分类名称', edit: 'text' },
+					{ field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			text: '对不起,加载出现异常!'
+		});
+
+		//事件
+		var active = {
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加分类',
+					content: 'cateform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-question-catelist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'question/fieldcate',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-artapp-question-catelist-table');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(LAY-artapp-question-catelist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此分类吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'question/delcate',
+						data: {
+							id: data.id
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑分类',
+					content: 'cateform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 134 - 0
app/admin/view/artapp/question/questionform.html

@@ -0,0 +1,134 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">常见问题信息</div>
+				<div class="layui-card-body" pad15>
+
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-artapp-question-questionform-edit">
+						<input type="hidden" name="id" value="{$question['id']}">
+						<div class="layui-form-item">
+							<label class="layui-form-label">分类</label>
+							<div class="layui-input-block">
+								<select name="cateid">
+									{volist name="catelist" id="vo"}
+									<option value="{$vo['id']}" {$question['cateid']==$vo['id'] ? 'selected' : '' }>{$vo['title']}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$question['title']}" lay-verify="required" placeholder="请输入标题"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">详情</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="details" id="details" placeholder="请输入详情" style="display: none"
+								 lay-verify="editcontent">
+											{$question['details']}
+										</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>发布时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="createtime" id="createtime" value="{$question['createtime']}" lay-verify="required"
+								 placeholder="请选择发布时间" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">置顶</label>
+							<div class="layui-input-block">
+								<select name="priority">
+									<option value="0" {$question['priority']===0 ? 'selected' : '' }>不置顶</option>
+									<option value="1" {$question['priority']===1 ? 'selected' : '' }>置顶一</option>
+									<option value="2" {$question['priority']===2 ? 'selected' : '' }>置顶二</option>
+									<option value="3" {$question['priority']===3 ? 'selected' : '' }>置顶三</option>
+									<option value="4" {$question['priority']===4 ? 'selected' : '' }>置顶四</option>
+									<option value="5" {$question['priority']===5 ? 'selected' : '' }>置顶五</option>
+									<option value="6" {$question['priority']===6 ? 'selected' : '' }>置顶六</option>
+									<option value="7" {$question['priority']===7 ? 'selected' : '' }>置顶七</option>
+									<option value="8" {$question['priority']===8 ? 'selected' : '' }>置顶八</option>
+									<option value="9" {$question['priority']===9 ? 'selected' : '' }>置顶九</option>
+								</select>
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="question.status|default=1" value="1"
+								 }checked{/eq} lay-skin="switch" lay-text="已发布|待修改" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>浏览量</label>
+							<div class="layui-input-block">
+								<input type="text" name="volume" value="{$question['volume']}" lay-verify="required|number" placeholder="请输入浏览量"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-artapp-question-questionform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'layedit', 'laydate', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			layedit = layui.layedit,
+			laydate = layui.laydate,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		var details = layedit.build('details', {
+			uploadImage: { url: setter.baseAdminUrl + 'attachment/tplfieldimage', type: 'post' }
+		});
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(details);
+			}
+		});
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-artapp-question-questionform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'question/editquestion',
+				type: 'post',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-artapp-question-questionlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 195 - 0
app/admin/view/artapp/question/questionlist.html

@@ -0,0 +1,195 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-artapp-question-questionlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">标题</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">分类</label>
+					<div class="layui-input-block">
+						<select name="cateid" id="cateid">
+							<option value="">全部分类</option>
+							{volist name="catelist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">已发布</option>
+							<option value="2">待修改</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-artapp-question-questionlist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+			<table id="LAY-artapp-question-questionlist-table" lay-filter="LAY-artapp-question-questionlist-table"></table>
+			<script type="text/html" id="priorityTpl">
+				{{chnNumChar[d.priority]}}
+			</script>
+			<script type="text/html" id="cateidTpl">
+				{{d.questionCate.title}}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+
+	</div>
+</div>
+
+<script>
+	var chnNumChar = ["", "置顶一", "置顶二", "置顶三", "置顶四", "置顶五", "置顶六", "置顶七", "置顶八", "置顶九"];
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		//列表
+		table.render({
+			elem: '#LAY-artapp-question-questionlist-table',
+			url: setter.baseAdminUrl + 'question/listquestion',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'priority', width: 80, title: '置顶', templet: '#priorityTpl' },
+					{ field: 'cateid', width: 100, title: '分类', templet: '#cateidTpl' },
+					{ field: 'title', title: '标题', edit: 'text' },
+					{ field: 'createtime', width: 200, title: '发布时间', sort: true },
+					{ field: 'volume', width: 100, title: '浏览量', sort: true },
+					{ field: 'status_text', width: 100, title: '状态', minWidth: 80, align: 'center' },
+					{ title: '操作', width: 200, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//监听搜索
+		form.on('submit(LAY-artapp-question-questionlist-search-btn)', function(data) {
+			table.reload('LAY-artapp-question-questionlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+		
+		//监听单元格编辑
+		table.on('edit(LAY-artapp-question-questionlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'question/fieldquestion',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-artapp-question-questionlist-table');
+				}
+			});
+		});
+
+		//事件
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-artapp-question-questionlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除所选常见问题吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'question/delquestion',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-artapp-question-questionlist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加常见问题',
+					content: 'questionform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听工具条
+		table.on('tool(LAY-artapp-question-questionlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此常见问题吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'question/delquestion',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑常见问题',
+					content: 'questionform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 212 - 0
app/admin/view/attachment/image.html

@@ -0,0 +1,212 @@
+<!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.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+		<link rel="stylesheet" href="/static/echoui/layui/css/layui.css" media="all">
+		<link rel="stylesheet" href="/static/echoui/style/admin.css" media="all">
+	</head>
+	<body>
+		
+		<style>
+			.layui-table-cell{ height:auto !important; }
+			.picbox{ width: 75px; height: 75px; background-color: #F0F0F0; border: 1px solid #DDDDDD; display: table-cell; vertical-align: middle; text-align: center; padding: 1px; }
+			.picbox img{ max-width: 100%; max-height: 100%; vertical-align: middle; }
+		</style>
+
+		<!-- <div class="layui-fluid"> -->
+			<div class="layui-card" style="margin: 0px;">
+				<div class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-attachment-image-imagelist-search">
+					<div class="layui-form-item">
+						<div class="layui-inline">
+							<button class="layui-btn layui-btn-danger attachment-btn" data-type="batchdel">
+								<i class="layui-icon layui-icon-delete layuiadmin-button-btn"></i> 批量删除
+							</button>
+						</div>
+						<div class="layui-inline">
+							<input type="text" name="keywords" placeholder="请输入文件名关键字" autocomplete="off" class="layui-input">
+						</div>
+						<div class="layui-inline" id="yearmonth"></div>
+						<div class="layui-inline">
+							<button class="layui-btn layui-btn-primary" lay-submit lay-filter="LAY-attachment-image-imagelist-search-btn">
+								<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+							</button>
+							<button class="layui-btn" id="attachment-upload-images">
+								<i class="layui-icon layui-icon-upload layuiadmin-button-btn"></i> 上传图片
+							</button>
+						</div>
+					</div>
+				</div>
+				
+				<div class="layui-card-body">
+					<table id="LAY-attachment-image-imagelist-table" lay-filter="LAY-attachment-image-imagelist-table"></table>
+					<script type="text/html" id="attachmentTpl">
+						<div id="pic{{d.id}}" class="picbox" lay-event="pic">
+							<img src="{{d.attachment}}" alt="{{d.filename}}">
+						</div>
+					</script>
+					<script type="text/html" id="setTpl">
+						<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+					</script>
+				</div>
+				
+			</div>
+		<!-- </div> -->
+
+		<script src="/static/echoui/layui/layui.js"></script>
+		<script>
+			layui.config({
+				base: '/static/echoui/' //静态资源所在路径
+			}).extend({
+				index: 'lib/index' //主入口模块
+			}).use(['index', 'form', 'set', 'table', 'upload', 'selectN','selectM'], function() {
+				var $ = layui.$,
+					setter = layui.setter,
+					admin = layui.admin,
+					form = layui.form,
+					table = layui.table,
+					upload = layui.upload,
+					selectN = layui.selectN,
+					selectM = layui.selectM;
+				form.render();
+				
+				var yearmonth = selectN({
+					elem: '#yearmonth',
+					search:[false,true],
+					tips:["请选择上传年份","请选择上传月份"],
+					data: {$yearmonth|raw},
+					field:{idName:'key',titleName:'val',childName:'month'}
+				}); 
+				
+				//列表
+				table.render({
+					elem: '#LAY-attachment-image-imagelist-table',
+					url: setter.baseUrl + 'admin/attachment/listimage',
+					cols: [[
+						{type: 'checkbox'},
+						{field: 'attachment', width: 140, title: '图片', templet: '#attachmentTpl', align: 'center'},
+						{field: 'filename', title: '文件名', edit: 'text'},
+						{field: 'createtime', title: '上传时间'},
+						{title: '操作', width: 100, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+					]],
+					page: true,
+					limit: 20,
+					height: 'full-100',
+					text: '对不起,加载出现异常!',
+					// skin: 'line'
+				});
+				
+				form.on('submit(LAY-attachment-image-imagelist-search-btn)', function(data) {
+					table.reload('LAY-attachment-image-imagelist-table', {
+						where: data.field,
+						page: {
+							curr: 1
+						}
+					});
+				});
+				
+				// 上传
+				upload.render({
+					elem: '#attachment-upload-images',
+					url: setter.baseUrl + 'admin/attachment/tplfieldimage',
+					accept: 'images',
+					exits: 'jpg|png|jpeg',
+					acceptMime: 'image/*',
+					size: 2048,
+					number: 1,
+					method: 'post',
+					before: function(obj) {
+						layer.load();
+					},
+					done: function(res, index, upload) {
+						layer.closeAll('loading');
+						table.reload('LAY-attachment-image-imagelist-table', {
+							page: {
+								curr: 1
+							}
+						});
+					},
+					error: function(index, upload){
+						layer.closeAll('loading');
+					}
+				});
+
+				//事件
+				var active = {
+					batchdel: function() {
+						var checkStatus = table.checkStatus('LAY-attachment-image-imagelist-table'),
+							checkData = checkStatus.data;
+						if (checkData.length === 0) {
+							return layer.msg('请选择数据');
+						}
+						var idarr = [];
+						for (var i = 0; i < checkData.length; i++) {
+							idarr.push(checkData[i].id);
+						}
+						layer.confirm('确定删除所选图片吗?', function(index) {
+							admin.req({
+								url: setter.baseUrl + 'admin/attachment/delattachment',
+								data: {
+									idarr: idarr
+								},
+								done: function(res) {
+									table.reload('LAY-attachment-image-imagelist-table');
+									layer.msg('已删除');
+								}
+							});
+							layer.close(index);
+						});
+					}
+				};
+				
+				//监听单元格编辑
+				table.on('edit(LAY-attachment-image-imagelist-table)', function(obj){
+					var id = obj.data.id,
+						field = obj.field,
+						value = obj.value;
+					admin.req({
+						url: setter.baseUrl + 'admin/attachment/fieldattachment',
+						data: {id: id, field: field, value: value},
+						done: function(res) {
+							layer.msg('修改成功');
+						}
+					});
+				});
+				
+				//监听工具条
+				table.on('tool(LAY-attachment-image-imagelist-table)', function(obj) {
+					var data = obj.data;
+					if (obj.event === 'del') {
+						layer.confirm('确定删除此图片吗?', function(index) {
+							admin.req({
+								url: setter.baseUrl + 'admin/attachment/delattachment',
+								data: {
+									idarr: [data.id]
+								},
+								done: function(res) {
+									obj.del();
+									layer.msg('已删除');
+								}
+							});
+							layer.close(index);
+						});
+					} else if (obj.event === 'pic') {
+						layer.photos({
+							photos: '#pic' + data.id,
+							anim: 5,
+						}); 
+					}
+				});
+				
+				$('.attachment-btn').on('click', function(){
+					var type = $(this).data('type');
+					active[type] ? active[type].call(this) : '';
+				});
+			});
+		</script>
+	
+	</body>
+</html>

+ 91 - 0
app/admin/view/broker/brokerdefault.html

@@ -0,0 +1,91 @@
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-header">默认经纪人</div>
+                <div class="layui-card-body" pad15>
+                    <div class="layui-form layui-form-pane" lay-filter="LAY-broker-brokerform-edit">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">当前</label>
+                            <div class="layui-input-block">
+                                <input type="text"
+                                       value="{empty name='broker'}无{else/}{$broker.title} - {$broker.mobile}{/empty}"
+                                       class="layui-input" readonly>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label required">切换经纪人</label>
+                            <div class="layui-input-block">
+                                <div id="broker" class="xm-select-demo"></div>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="LAY-broker-brokerform-edit-submit"
+                                       value="确认提交" class="layui-btn">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+
+    layui.config({
+        base: '/static/echoui/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'form', 'set', 'upload', 'selectN', 'selectM', 'layarea'], function () {
+        var $ = layui.$,
+            setter = layui.setter,
+            admin = layui.admin,
+            form = layui.form;
+        form.render();
+
+        xmSelect.render({
+            el: '#broker',
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            name: 'brokerid',
+            remoteMethod: function(val, cb, show){
+                admin.req({
+                    url: setter.baseAdminUrl + 'broker/brokerajax',
+                    data: { keyword: val},
+                    done: function (res) {
+                        if (res.data.length == 0) {
+                            cb([]);
+                        } else {
+                            var option = [];
+                            var name = '';
+                            $.each(res.data,function(key,val){
+                                name = val.title + ' - ' + val.mobile;
+                                option.push({name:name,value:val.id});
+                            });
+                            cb(option);
+                        }
+                    }
+                });
+            },
+            data: []
+        });
+
+        form.on('submit(LAY-broker-brokerform-edit-submit)', function (obj) {
+            var index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: setter.baseAdminUrl + 'broker/editdefault',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('LAY-broker-brokerlist-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+    });
+</script>

+ 154 - 0
app/admin/view/broker/brokerform.html

@@ -0,0 +1,154 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">经纪人</div>
+				<div class="layui-card-body" pad15>
+					<div class="layui-form layui-form-pane" lay-filter="LAY-broker-brokerform-edit">
+						<input type="hidden" name="id" value="{$broker.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label">关联用户</label>
+							<div class="layui-input-block">
+								<input type="text" name="musermobile" value="{$broker.muser.mobile}" lay-verify="phone" placeholder="请输入关联用户手机号..."
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">关联用户的手机号。关联的用户会自动归属到该经纪人名下,请谨慎修改。个人中心才会出现经纪人管理入口导航。</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">公司/门店</label>
+							<div class="layui-input-block" id="workeragent">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>姓名</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$broker.title}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">手机号</label>
+							<div class="layui-input-block">
+								<input type="text" name="mobile" value="{$broker.mobile}" lay-verify="phone" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">微信号</label>
+							<div class="layui-input-block">
+								<input type="text" name="weixin" value="{$broker.weixin}" placeholder="请输入..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">QQ号</label>
+							<div class="layui-input-block">
+								<input type="text" name="qq" value="{$broker.qq}" placeholder="请输入..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						
+						<div class="layui-form-item" id="LAY-broker-brokerform-edit-areapicker">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>省市区</label>
+							<div class="layui-input-inline">
+								<select name="province" class="province-selector" data-value="{$broker.province}" lay-filter="province-2"
+								 lay-verify="required">
+									<option value="">请选择省</option>
+								</select>
+							</div>
+							<div class="layui-input-inline">
+								<select name="city" class="city-selector" data-value="{$broker.city}" lay-filter="city-2" lay-verify="required">
+									<option value="">请选择市</option>
+								</select>
+							</div>
+							<div class="layui-input-inline">
+								<select name="district" class="district-selector" data-value="{$broker.district}" lay-filter="district-2"
+								 lay-verify="required">
+									<option value="">请选择区</option>
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item" id="formdetails">
+							<label class="layui-form-label">基本介绍</label>
+							<div class="layui-input-block">
+								<textarea name="details" placeholder="请输入..." class="layui-textarea">{$broker.details}</textarea>
+							</div>
+						</div>
+						
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="broker.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="正常|禁用" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">报备权限</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="powerreport" {eq name="broker.powerreport|default=1" value="1"
+								 }checked{/eq} lay-skin="switch" lay-text="是|否" value="1">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-broker-brokerform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload', 'selectN', 'selectM', 'layarea'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload,
+			selectN = layui.selectN,
+			selectM = layui.selectM,
+			layarea = layui.layarea;
+		form.render();
+		
+		layarea.render({
+			elem: '#LAY-broker-brokerform-edit-areapicker',
+			data: {
+                province: '福建省',
+                city: '泉州市',
+                district: '晋江市',
+			}
+		});
+
+		var workeragent = selectN({
+			elem: '#workeragent',
+			search: [true, true],
+			tips: ["请选择劳务公司", "请选择代理门店"],
+			data: {$workerlist|raw},
+			selected: [{$broker['workerid']}, {$broker['agentid']}],
+			field: { idName: 'id', titleName: 'title', childName: 'agent' }
+		});
+
+		form.on('submit(LAY-broker-brokerform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'broker/editbroker',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-broker-brokerlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 228 - 0
app/admin/view/broker/brokerlist.html

@@ -0,0 +1,228 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-broker-brokerlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">名称</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">劳务公司</label>
+					<div class="layui-input-block">
+						<select name="workerid" lay-search>
+							<option value="">全部公司(可搜索)</option>
+							{volist name="workerlist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">正常</option>
+							<option value="2">禁用</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-broker-brokerlist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+				<button class="layui-btn layuiadmin-btn" data-type="default">默认经纪人</button>
+			</div>
+
+			<table id="LAY-broker-brokerlist-table" lay-filter="LAY-broker-brokerlist-table"></table>
+			<script type="text/html" id="muserTpl">
+				{{#  if(d.userid != 0){ }}
+					{{d.muser.realname}} - {{d.muser.mobile}} 
+				{{#  } }}
+			</script>
+			<script type="text/html" id="workertitleTpl">
+				{{d.worker.title}}
+			</script>
+			<script type="text/html" id="agenttitleTpl">
+				{{d.agent.title}}
+			</script>
+			<script type="text/html" id="usercountTpl">
+				{{d.user_count}}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-broker-brokerlist-table',
+			url: setter.baseAdminUrl + 'broker/listbroker',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'title', title: '姓名', edit: 'text' },
+					{ field: 'mobile', title: '手机号' },
+					{ field: 'weixin', title: '微信号', edit: 'text' },
+					{ field: 'qq', title: 'QQ号', edit: 'text' },
+					{ field: 'muser', title: '关联的用户(姓名-手机号)', templet: '#muserTpl', minWidth: 250, align: 'left' },
+					{ field: 'workertitle', title: '劳务公司', templet: '#workertitleTpl' },
+					{ field: 'agenttitle', title: '代理门店', templet: '#agenttitleTpl' },
+					{ field: 'usercount', title: '用户邀请数', templet: '#usercountTpl', width: 100, align: 'center' },
+					{ field: 'status_text', title: '状态', width: 100, align: 'center' },
+					{ field: 'powerreport_text', title: '报备权限', width: 100, align: 'center' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-broker-brokerlist-btn)', function(data) {
+			table.reload('LAY-broker-brokerlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		table.on('edit(LAY-broker-brokerlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'broker/fieldbroker',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-broker-brokerlist-table');
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-broker-brokerlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.prompt({
+					formType: 1,
+					title: '敏感操作,请验证密码'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定删除此经纪人吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'broker/delbroker',
+							data: {
+								password: value,
+								idarr: idarr
+							},
+							done: function(res) {
+								table.reload('LAY-broker-brokerlist-table');
+								layer.msg('已删除');
+							}
+						});
+						layer.close(index);
+					});
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加经纪人',
+					content: 'brokerform.html?id=0',
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			},
+			default: function () {
+				var index = layer.open({
+					type: 2,
+					title: '默认经纪人',
+					content: 'brokerdefault.html',
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-broker-brokerlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.prompt({
+					formType: 1,
+					title: '敏感操作,请验证密码'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定删除此经纪人吗?', function(index) {
+						admin.req({
+							url: setter.baseAdminUrl + 'broker/delbroker',
+							data: {
+								password: value,
+								idarr: [data.id]
+							},
+							done: function(res) {
+								obj.del();
+								layer.msg('已删除');
+							}
+						});
+						layer.close(index);
+					});
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑经纪人',
+					content: 'brokerform.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 114 - 0
app/admin/view/broker/fbrokerform.html

@@ -0,0 +1,114 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">经纪人申请信息</div>
+				<div class="layui-card-body" pad15>
+
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-broker-fbrokerform-edit">
+						<input type="hidden" name="id" value="{$fbroker.id}">
+
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>姓名</label>
+							<div class="layui-input-block">
+								<input type="text" name="realname" value="{$fbroker.realname}" lay-verify="required" placeholder="请输入"
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">手机号</label>
+							<div class="layui-input-block">
+								<input type="text" name="mobile" value="{$fbroker.mobile}" lay-verify="phone" placeholder="请输入" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">当前住址</label>
+							<div class="layui-input-block">
+								<input type="text" name="address" value="{$fbroker.address}" placeholder="请输入" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">身份证号</label>
+							<div class="layui-input-block">
+								<input type="text" name="idcard" value="{$fbroker.idcard}" placeholder="请输入" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">推荐人</label>
+							<div class="layui-input-block">
+								<input type="text" name="recommender" value="{$fbroker.recommender}" placeholder="请输入" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">备注信息</label>
+							<div class="layui-input-block">
+								<input type="text" name="remark" value="{$fbroker.remark}" placeholder="请输入" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="radio" name="status" value="1" title="待处理" {eq name="fbroker.status|default=1" value="1" }checked{/eq}>
+								 <input type="radio" name="status" value="2" title="处理中" {eq name="fbroker.status" value="2" }checked{/eq}>
+								 <input type="radio" name="status" value="3" title="已处理" {eq name="fbroker.status" value="3" }checked{/eq}> </div>
+								 </div> <div class="layui-form-item">
+								<label class="layui-form-label"><span style="color:#f90c05;">*</span>申请时间</label>
+								<div class="layui-input-block">
+									<input type="text" name="createtime" id="createtime" value="{$fbroker.createtime}" lay-verify="required"
+									 placeholder="请选择" autocomplete="off" class="layui-input">
+								</div>
+							</div>
+							<div class="layui-form-item">
+								<div class="layui-input-block">
+									<input type="button" lay-submit lay-filter="LAY-broker-fbrokerform-edit-submit" value="确认提交" class="layui-btn">
+								</div>
+							</div>
+						</div>
+
+
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'laydate', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			laydate = layui.laydate,
+			upload = layui.upload;
+		form.render();
+
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-broker-fbrokerform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'broker/editfbroker',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-broker-fbrokerlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 174 - 0
app/admin/view/broker/fbrokerlist.html

@@ -0,0 +1,174 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-broker-fbrokerlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">姓名/手机号</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">待处理</option>
+							<option value="2">处理中</option>
+							<option value="3">已处理</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-broker-fbrokerlist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+			</div>
+			<table id="LAY-broker-fbrokerlist-table" lay-filter="LAY-broker-fbrokerlist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-broker-fbrokerlist-table',
+			url: setter.baseAdminUrl + 'broker/listfbroker',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'realname', width: 150, title: '姓名', edit: 'text' },
+					{ field: 'mobile', width: 150, title: '手机号', edit: 'text' },
+					{ field: 'address', minWidth: 250, title: '现住地址', edit: 'text' },
+					{ field: 'idcard', minWidth: 200, title: '身份证号', edit: 'text' },
+					{ field: 'recommender', width: 150, title: '推荐人', edit: 'text' },
+					{ field: 'remark', minWidth: 250, title: '备注', edit: 'text' },
+					{ field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-broker-fbrokerlist-btn)', function(data) {
+			table.reload('LAY-broker-fbrokerlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		table.on('edit(LAY-broker-fbrokerlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'broker/fieldfbroker',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-broker-fbrokerlist-table');
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-broker-fbrokerlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除此申请记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'broker/delfbroker',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-broker-fbrokerlist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加申请记录',
+					content: 'fbrokerform.html?id=0',
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-broker-fbrokerlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此申请记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'broker/delfbroker',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑申请记录',
+					content: 'fbrokerform.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 105 - 0
app/admin/view/coach/coachform.html

@@ -0,0 +1,105 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">辅导培训信息</div>
+				<div class="layui-card-body" pad15>
+					<div class="layui-form layui-form-pane" lay-filter="LAY-coach-coachform-edit">
+						<input type="hidden" name="id" value="{$coach.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$coach.title}" lay-verify="required" placeholder="请输入标题" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">详情</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="content" id="content" placeholder="请输入详情" style="display: none"
+								 lay-verify="editcontent">
+											{$coach.content}
+										</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>培训人数</label>
+							<div class="layui-input-block">
+								<input type="number" name="num" value="{$coach.num}" lay-verify="required" placeholder="请输入培训人数" autocomplete="off"
+									   class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>培训时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="coachtime" id="coachtime" value="{$coach.coachtime}" lay-verify="required"
+								 placeholder="请选择培训时间" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">跟进方式</label>
+							<div class="layui-input-block">
+								{volist name="statuslist" id="vo"}
+								<input type="radio" name="status" value="{$key}" title="{$vo}" {eq name="key" value="1" }checked{/eq} />
+								{/volist}
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-coach-coachform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'layedit', 'laydate', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			layedit = layui.layedit,
+			laydate = layui.laydate,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		var content = layedit.build('content', {
+			uploadImage: { url: setter.baseAdminUrl + 'attachment/tplfieldimage', type: 'post' }
+		});
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(content);
+			}
+		});
+		laydate.render({
+			elem: '#coachtime',
+			type: 'date'
+		});
+
+		form.on('submit(LAY-coach-coachform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'coach/editcoach',
+				type: 'post',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-coach-coachlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+	});
+</script>

+ 170 - 0
app/admin/view/coach/coachlist.html

@@ -0,0 +1,170 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-coach-coachlist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">标题</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							{volist name="statuslist" id="vo"}
+							<option value="{$key}">{$vo}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">门店</label>
+					<div class="layui-input-block" id="agentid">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-coach-coachlist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+			</div>
+			<table id="LAY-coach-coachlist-table" lay-filter="LAY-coach-coachlist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+			<script type="text/html" id="agentTpl">
+				{{d.agent.title}}
+			</script>
+		</div>
+
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table', 'selectN'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			selectN = layui.selectN,
+			table = layui.table;
+		form.render();
+
+		var agentbroker = selectN({
+			elem: '#agentid',
+			search: [true],
+			tips: ["请选择代理门店(可搜索)"],
+			data: {$agentlist|raw},
+			selected: [0],
+			field: { idName: 'id', titleName: 'title'}
+		});
+
+		//列表
+		table.render({
+			elem: '#LAY-coach-coachlist-table',
+			url: setter.baseAdminUrl + 'coach/listcoach',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'agent', title: '门店', align: 'center', toolbar: '#agentTpl' },
+					{ field: 'title', title: '标题' },
+					{ field: 'num', width: 100, title: '参加人数' },
+					{ field: 'status_text', width: 100, title: '状态', minWidth: 80, align: 'center' },
+					{ field: 'coachtime', width: 200, title: '培训时间' , sort: true },
+					{ field: 'createtime', width: 200, title: '提交时间', sort: true },
+					{ title: '操作', width: 200, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//监听搜索
+		form.on('submit(LAY-coach-coachlist-search-btn)', function(data) {
+			table.reload('LAY-coach-coachlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		//事件
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-coach-coachlist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('只能删除等审核的数据,确定删除所选辅导培训吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'coach/delcoach',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-coach-coachlist-table');
+							layer.msg('处理完成');
+						}
+					});
+					layer.close(index);
+				});
+			},
+		};
+
+		//监听工具条
+		table.on('tool(LAY-coach-coachlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('只能删除等审核的数据,确定删除此辅助培训吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'coach/delcoach',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							table.reload('LAY-coach-coachlist-table');
+							layer.msg('处理完成');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑辅助培训',
+					content: 'coachform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 77 - 0
app/admin/view/comjobs/cateform.html

@@ -0,0 +1,77 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">类型信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-comjobs-cateform-edit">
+						<input type="hidden" name="id" value="{$cate.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>类型名称</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$cate.title}" lay-verify="required" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>上级</label>
+							<div class="layui-input-block">
+								<select name="pid" lay-search lay-verify="required">
+									<option value="0" {$cate.pid==0 ? 'selected' : '' }>顶级</option>
+									{volist name="catelist" id="vo"}
+									<option value="{$vo.id}" {$cate.pid==$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$cate.priority|default=0}" lay-verify="required" placeholder="请输入排序值(倒序,值越大越靠前)"
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-comjobs-cateform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			upload = layui.upload;
+		form.render();
+
+		form.on('submit(LAY-comjobs-cateform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'comjobs/editcate',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-comjobs-catelist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+	});
+</script>

+ 113 - 0
app/admin/view/comjobs/catelist.html

@@ -0,0 +1,113 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-card-header layuiadmin-card-header-auto">
+			<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+		</div>
+		<div class="layui-card-body">
+			<table id="LAY-comjobs-catelist-table" lay-filter="LAY-comjobs-catelist-table"></table>
+			<script type="text/html" id="pidTpl">
+				{{d.pid == 0 ? '顶级' : d.pcate.title}}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-comjobs-catelist-table',
+			url: setter.baseAdminUrl + 'comjobs/listcate',
+			cols: [
+				[
+					{ field: 'id', width: 120, title: '表ID', sort: true },
+					{ field: 'pid', title: '上级名称', toolbar: '#pidTpl'},
+					{ field: 'priority', width: 120, title: '排序', sort: true, edit: 'text' },
+					{ field: 'title', title: '分类名称', edit: 'text' },
+					{ title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		//事件
+		var active = {
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加岗位类型',
+					content: 'cateform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		//监听单元格编辑
+		table.on('edit(LAY-comjobs-catelist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'comjobs/fieldcate',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-comjobs-catelist-table');
+				}
+			});
+		});
+
+		//监听工具条
+		table.on('tool(LAY-comjobs-catelist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此岗位类型吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'comjobs/delcate',
+						data: {
+							id: data.id
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑岗位类型',
+					content: 'cateform.html?id=' + data.id,
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+	});
+</script>

+ 479 - 0
app/admin/view/comjobs/comjobsform.html

@@ -0,0 +1,479 @@
+<style type="text/css">
+	.amap-sug-result{
+		z-index:999999999;
+	}
+	#pickerInput{
+		z-index: 999999;
+		position: absolute;
+		right: 30px;
+		top: 20px;
+		width: 200px;
+	}
+</style>
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">招聘信息</div>
+				<div class="layui-card-body" pad15>
+
+					<div class="layui-form layui-form-pane" lay-filter="LAY-comjobs-comjobsform-edit">
+						<input type="hidden" name="id" value="{$comjobs.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>劳务公司</label>
+							<div class="layui-input-block">
+								<select name="workerid" lay-search lay-verify="required">
+									<option value="">请选择劳务公司(可搜索)...</option>
+									{volist name="workerlist" id="vo"}
+									<option value="{$vo.id}" {$comjobs.workerid==$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>招聘标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$comjobs.title}" lay-verify="required" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item" id="video-box">
+							<input type="hidden" id="old_video" value="{$comjobs.video}" name="old_video"/>
+							<input type="hidden" id="new_video" value="" name="new_video"/>
+
+							<label class="layui-form-label">小视频</label>
+							<div class="layui-input-inline">
+								<button type="submit" class="layui-btn"  id="add_video" ><i class="layui-icon"></i>选择视频</button>
+							</div>
+							<video id="videoid" width="320" height="240" controls="controls" >
+
+								<source id="show_video"  src="{$comjobs.video}" type="video/mp4" />
+							</video>
+
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>岗位类型</label>
+							<div class="layui-input-block">
+								<select name="cateid" lay-search lay-verify="required">
+									<option value="">请选择岗位类型(可搜索)...</option>
+									{volist name="catelist" id="vo"}
+									<option value="{$vo.id}" {$comjobs.cateid==$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item" id="LAY-comjobs-comjobsform-edit-areapicker">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>省市区</label>
+							<div class="layui-input-inline">
+								<select name="province" class="province-selector" data-value="{$comjobs.province}" lay-filter="province-2"
+								 lay-verify="required">
+									<option value="">请选择省</option>
+								</select>
+							</div>
+							<div class="layui-input-inline">
+								<select name="city" class="city-selector" data-value="{$comjobs.city}" lay-filter="city-2" lay-verify="required">
+									<option value="">请选择市</option>
+								</select>
+							</div>
+							<div class="layui-input-inline">
+								<select name="district" class="district-selector" data-value="{$comjobs.district}" lay-filter="district-2"
+								 lay-verify="required">
+									<option value="">请选择区</option>
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>详细地址</label>
+							<div class="layui-input-block">
+								<input type="text" name="address" value="{$comjobs.address}" lay-verify="required" placeholder="请输入..."
+									   autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>经纬度</label>
+							<div class="layui-input-inline">
+								<input type="text" name="longitude" value="{$comjobs.longitude}" lay-verify="required" placeholder="经度"
+									   autocomplete="off" class="layui-input">
+							</div>
+							<div class="layui-input-inline">
+								<input type="text" name="latitude" value="{$comjobs.latitude}" lay-verify="required" placeholder="纬度"
+									   autocomplete="off" class="layui-input">
+							</div>
+							<div id="maplocation" style="width:500px;height:500px;display: none;">
+								<input id="pickerInput" class="layui-input" placeholder="输入关键字选取地点"/>
+							</div>
+							<button style="float: left;" type="button" class="layui-btn" id="layuiadmin-map-lnglat">选择地理位置</button>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">招聘标签</label>
+							<div class="layui-input-block">
+								{volist name="welfarelist" id="vo"}
+								<input type="checkbox" name="tags[]" value="{$vo.name}" title="{$vo.name}"
+									   {if condition="!$comjobs->isEmpty() && in_array($vo['name'],$comjobs['tags'])"}
+									   checked
+									   {/if}
+								/>
+								{/volist}
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">任职要求</label>
+							<div class="layui-input-block">
+								<textarea name="requirement" placeholder="请输入..." rows="6" class="layui-textarea">{$comjobs.requirement}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">职位详情</label>
+							<div class="layui-input-block">
+								<textarea name="comdetails" placeholder="请输入..." rows="6" class="layui-textarea">{$comjobs.comdetails}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">环境照片</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="picall" data-amount="9">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 最佳尺寸:750px*375px </div>
+									<div class="layui-upload-list echo-attachment-image-list" id="picall">
+										{volist name="comjobs.picall" id="vo"}
+										<div>
+											<input type="hidden" name="picall[]" value="{$vo}">
+											<img src="{$vo}"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button>
+										</div>
+										{/volist}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">企业介绍</label>
+							<div class="layui-input-block">
+								<textarea name="companydetails" placeholder="请输入..." rows="6" class="layui-textarea">{$comjobs.companydetails}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">招聘类型</label>
+							<div class="layui-input-block">
+								<input type="radio" name="recruitment_cate" value="1" title="普通招聘" {eq name="comjobs.recruitment_cate|default=1" value="1"}checked{/eq}>
+								<input type="radio" name="recruitment_cate" value="2" title="悬赏聘" {eq name="comjobs.recruitment_cate" value="2"}checked{/eq}>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">返佣金额</label>
+							<div class="layui-input-block">
+								<input type="text" name="retmoney" value="{$comjobs.retmoney}" placeholder="请输入...."
+									   autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">招聘人数</label>
+							<div class="layui-input-block">
+								<input type="number" name="recruit_num" value="{$comjobs.recruit_num|default=1}" placeholder="请输入...."
+									   autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>招工年龄</label>
+							<div class="layui-input-block">
+								<input type="text" name="agegroup" value="{$comjobs.agegroup|default=''}" placeholder="请输入...."
+									   autocomplete="off" class="layui-input" lay-verify="required">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">学历</label>
+							<div class="layui-input-block">
+								<select name="education">
+									<option value="">请选择学历...</option>
+									{volist name="educationlist" id="vo"}
+									<option value="{$vo.name}" {$comjobs.education==$vo.name ? 'selected' : '' }>{$vo.name}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">用工时间</label>
+							<div class="layui-input-block">
+								{volist name="emptimelist" id="vo"}
+								<input type="checkbox" name="emp_time[]" value="{$vo.name}" title="{$vo.name}"
+									   {if condition="!$comjobs->isEmpty() && !empty($comjobs['emp_time']) && in_array($vo['name'],$comjobs['emp_time'])"}
+									   checked
+									   {/if}
+								/>
+								{/volist}
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">薪资类型</label>
+							<div class="layui-input-block">
+								<input type="radio" name="wtype" value="1" title="按月" {eq name="comjobs.wtype|default=1" value="1"}checked{/eq}>
+								<input type="radio" name="wtype" value="2" title="按时" {eq name="comjobs.wtype" value="2"}checked{/eq}>
+								<input type="radio" name="wtype" value="3" title="按件" {eq name="comjobs.wtype" value="3"}checked{/eq}>
+								<input type="radio" name="wtype" value="4" title="按项目" {eq name="comjobs.wtype" value="4"}checked{/eq}>
+								<input type="radio" name="wtype" value="5" title="其他" {eq name="comjobs.wtype" value="5"}checked{/eq}>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">薪酬</label>
+							<div class="layui-input-block">
+								<input type="text" name="zwagall" value="{$comjobs.zwagall}" placeholder="请输入...."
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>咨询电话</label>
+							<div class="layui-input-block">
+								<input type="text" name="telephone" value="{$comjobs.telephone}" lay-verify="required" placeholder="请输入..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">补充说明</label>
+							<div class="layui-input-block">
+								<textarea name="remark" placeholder="请输入..." class="layui-textarea">{$comjobs.remark}</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="radio" name="status" value="1" title="待修改" {eq name="comjobs.status|default=1" value="1"}checked{/eq}>
+								<input type="radio" name="status" value="2" title="待审核" {eq name="comjobs.status" value="2"}checked{/eq}>
+								<input type="radio" name="status" value="3" title="已上架" {eq name="comjobs.status" value="3"}checked{/eq}>
+								<input type="radio" name="status" value="4" title="已停招" {eq name="comjobs.status" value="4"}checked{/eq}>
+								<input type="radio" name="status" value="5" title="已下架" {eq name="comjobs.status" value="5"}checked{/eq}>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">急聘</label>
+							<div class="layui-input-block">
+								<input type="radio" name="is_worry" value="0" title="否" {eq name="comjobs.is_worry|default=0" value="0"}checked{/eq}>
+								<input type="radio" name="is_worry" value="1" title="是" {eq name="comjobs.is_worry" value="1"}checked{/eq}>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">推荐</label>
+							<div class="layui-input-block">
+								<select name="priority">
+									<option value="0" {$comjobs.priority===0 ? 'selected' : '' }>不推荐</option>
+									<option value="1" {$comjobs.priority===1 ? 'selected' : '' }>推荐一</option>
+									<option value="2" {$comjobs.priority===2 ? 'selected' : '' }>推荐二</option>
+									<option value="3" {$comjobs.priority===3 ? 'selected' : '' }>推荐三</option>
+									<option value="4" {$comjobs.priority===4 ? 'selected' : '' }>推荐四</option>
+									<option value="5" {$comjobs.priority===5 ? 'selected' : '' }>推荐五</option>
+									<option value="6" {$comjobs.priority===6 ? 'selected' : '' }>推荐六</option>
+									<option value="7" {$comjobs.priority===7 ? 'selected' : '' }>推荐七</option>
+									<option value="8" {$comjobs.priority===8 ? 'selected' : '' }>推荐八</option>
+									<option value="9" {$comjobs.priority===9 ? 'selected' : '' }>推荐九</option>
+								</select>
+								<div class="layui-form-mid layui-word-aux">推荐值值越大越靠前</div>
+							</div>
+						</div>
+						
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>更新时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="updatetime" id="updatetime" value="{$comjobs.updatetime}" lay-verify="required"
+								 placeholder="请选择..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>创建时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="createtime" id="createtime" value="{$comjobs.createtime}" lay-verify="required"
+								 placeholder="请选择..." autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">浏览量</label>
+							<div class="layui-input-block">
+								<input type="text" name="volume" value="{$comjobs.volume|default=0}" lay-verify="number" placeholder="请输入..."
+								 autocomplete="off" class="layui-input">
+							</div>
+						</div>
+
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-comjobs-comjobsform-edit-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'layedit', 'laydate', 'upload', 'inputTags', 'layarea'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			layedit = layui.layedit,
+			laydate = layui.laydate,
+			form = layui.form,
+			inputTags = layui.inputTags,
+			upload = layui.upload,
+			layarea = layui.layarea;
+
+		var video_time;
+
+		form.render();
+
+		inputTags.render({
+			elem: '#inputTags',
+			content: {:json_encode($comjobs.tags)} == null ? [] : {:json_encode($comjobs.tags)},
+			aldaBtn: true,
+			count: 6,
+			done: function(value) {}
+		});
+		
+		layarea.render({
+			elem: '#LAY-comjobs-comjobsform-edit-areapicker',
+			data: {
+                province: '福建省',
+                city: '泉州市',
+                district: '晋江市',
+			}
+		});
+
+		laydate.render({
+			elem: '#enddate',
+			type: 'date',
+			format: 'yyyy-MM-dd'
+		});
+		laydate.render({
+			elem: '#updatetime',
+			type: 'datetime'
+		});
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		upload.render({
+			elem: '#add_video'
+			,url: setter.baseWorkerUrl + 'comjobs/upload_video'  //改成您自己的上传接口
+			,accept: 'video' //视频
+			,done: function(res){
+				var src = res.data.src;
+				sourceDom = $("<source src=\""+ src +"\">");
+				// $("#video-box video").append(sourceDom);
+				document.getElementById("videoid").src=src ;
+				document.getElementById("videoid").play();
+
+				var timer = setTimeout(function(){
+					video_time = document.getElementById("videoid").duration;//视频时长
+					if(Math.ceil(video_time) > 15){
+						layer.msg('上传视频不能超过15秒', {icon: 2});
+						$("#add_video").css('cssText','background-color:#e81313');
+					}else{
+						layer.msg('上传成功');
+						$("#add_video").css('cssText','background-color:#009688');
+						$("#new_video").val(src);
+
+					}
+					clearTimeout(timer);
+				},1000);
+
+			}
+		});
+		var map = new AMap.Map('maplocation', {
+			center:[118.551494,24.781674],//地图中心位置
+			zoom: 12,
+		});
+		$('#layuiadmin-map-lnglat').on('click', function() {
+			var index = layer.open({
+				type: 1,
+				title: '点击获取地址坐标',
+				area: ['500px', '550px'],
+				content: $('#maplocation'),
+				success: function() {
+					//var map = new AMap.Map("maplocation", { resizeEnable: true });
+					map.on('click', function(e) {
+						$('input[name="longitude"]').val(e.lnglat.getLng());
+						$('input[name="latitude"]').val(e.lnglat.getLat());
+						layer.close(index);
+					});
+				}
+			});
+		});
+
+		var auto = new AMap.Autocomplete({ input: "pickerInput" });
+		var placeSearch = new AMap.PlaceSearch({ map: map });
+		window.select = function (e) {
+			console.log(e);
+			placeSearch.setCity(e.poi.adcode);
+			placeSearch.search(e.poi.name);
+		};
+		AMap.event.addListener(auto, "select", select);
+		form.on('submit(LAY-comjobs-comjobsform-edit-submit)', function(obj) {
+
+			if(video_time)
+			{
+				if(Math.ceil(video_time) >15)
+				{
+					layer.msg('视频不能超过15秒');
+					return false;
+				}
+			}
+
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'comjobs/editcomjobs',
+				data: obj.field,
+				type: 'post',
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-comjobs-comjobslist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		}); 
+		
+		
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+			accept: 'images',
+			exits: 'jpg|png|jpeg',
+			acceptMime: 'image/*',
+			size: 2048,
+			number: 1,
+			method: 'post',
+			before: function(obj) {
+				var item = this.item;
+				upload_input = $(item).data('input');
+				upload_amount = $(item).data('amount');
+				layer.load();
+			},
+			done: function(res, index, upload) {
+				layer.closeAll('loading');
+				var html = "";
+				if (upload_amount == 1) {
+					html += '<div> <input type="hidden" name="' + upload_input + '" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src + '"></div>';
+					$("#" + upload_input).html(html);
+				} else {
+					html += '<div> <input type="hidden" name="' + upload_input + '[]" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src +
+						'"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).append(html);
+				}
+			},
+			error: function(index, upload) {
+				layer.closeAll('loading');
+			}
+		});
+		
+		
+	});
+</script>

+ 260 - 0
app/admin/view/comjobs/comjobslist.html

@@ -0,0 +1,260 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-comjobs-comjobslist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">岗位标题</label>
+					<div class="layui-input-block">
+						<input type="text" name="keywords" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">劳务公司</label>
+					<div class="layui-input-block">
+						<select name="workerid" lay-search>
+							<option value="">全部劳务公司(可搜索)</option>
+							{volist name="workerlist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">岗位类型</label>
+					<div class="layui-input-block">
+						<select name="cateid" lay-search>
+							<option value="">全部岗位类型(可搜索)</option>
+							{volist name="catelist" id="vo"}
+							<option value="{$vo['id']}">{$vo['title']}</option>
+							{/volist}
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">薪资类型</label>
+					<div class="layui-input-block">
+						<select name="wtype">
+							<option value="">全部类型</option>
+							<option value="1">按月</option>
+							<option value="2">按时</option>
+							<option value="3">按件</option>
+							<option value="4">按项目</option>
+							<option value="5">其他</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">状态</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">待修改</option>
+							<option value="2">待审核</option>
+							<option value="3">已上架</option>
+							<option value="4">已停招</option>
+							<option value="5">已下架</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">创建时间</label>
+					<div class="layui-input-block">
+						<input type="text" name="daterange" id="daterange" placeholder="请输入" autocomplete="off" class="layui-input">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-comjobs-comjobslist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+
+			<table id="LAY-comjobs-comjobslist-table" lay-filter="LAY-comjobs-comjobslist-table"></table>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="report"><i class="layui-icon layui-icon-report"></i>代报名</a>
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="syn"><i class="layui-icon layui-icon-edit"></i>同步到人社</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'laydate', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			laydate = layui.laydate,
+			table = layui.table;
+		form.render();
+		
+		laydate.render({
+			elem: '#daterange',
+			type: 'datetime',
+			range: '~'
+		});
+
+		table.render({
+			elem: '#LAY-comjobs-comjobslist-table',
+			url: setter.baseAdminUrl + 'comjobs/listcomjobs',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'priority', width: 100, title: '排序ID', sort: true, edit: 'text' }, 
+					{ field: 'title', title: '岗位标题', minWidth: 300, edit: 'text' },
+					{ field: 'workerid', title: '劳务公司', minWidth: 240, toolbar: '<div>{{d.worker.title}}</div>' },
+					{ field: 'cateid', title: '岗位类型', width: 120, toolbar: '<div>{{d.comjobsCate.title}}</div>' },
+					{ field: 'province', title: '省', width: 100 },
+					{ field: 'city', title: '市', width: 100 },
+					{ field: 'district', title: '区县', width: 100 },
+					
+					{ field: 'agegroup', title: '招工年龄', edit: 'text', width: 120 },
+					{ field: 'enddate', title: '截止日期', edit: 'text', width: 120 },
+					{ field: 'wtype_text', title: '薪资类型', align: 'center', width: 100 },
+					{ field: 'zwagall', title: '综合月薪', edit: 'text' },
+					{ field: 'telephone', title: '咨询电话', edit: 'text' },
+					{ field: 'remark', title: '补充说明', minWidth: 240, edit: 'text' },
+					{ field: 'status_text', title: '状态', width: 80, align: 'center' },
+					{ field: 'volume', title: '浏览量', edit: 'text', width: 100, align: 'right' },
+					{ field: 'updatetime', title: '更新时间', width: 170 },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 350, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			toolbar: true,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-comjobs-comjobslist-btn)', function(data) {
+			table.reload('LAY-comjobs-comjobslist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		table.on('edit(LAY-comjobs-comjobslist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'comjobs/fieldcomjobs',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					// layui.table.reload('LAY-comjobs-comjobslist-table');
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-comjobs-comjobslist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除此招聘信息吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'comjobs/delcomjobs',
+						data: {
+							password: value,
+							idarr: idarr
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					table.reload('LAY-comjobs-comjobslist-table');
+					layer.msg('已删除');
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加招聘信息',
+					content: 'comjobsform.html?id=0',
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-comjobs-comjobslist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此招聘信息吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'comjobs/delcomjobs',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑招聘信息',
+					content: 'comjobsform.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'syn') {
+				layer.confirm('确定同步此招聘信息吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'comjobs/synRenshe?id=' + data.id,
+						done: function(res) {
+							layer.msg('已同步');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'report') {
+				var index = layer.open({
+					type: 2,
+					title: '代报名',
+					content: 'comjobsreport.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 96 - 0
app/admin/view/comjobs/comjobsreport.html

@@ -0,0 +1,96 @@
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-header">代报名</div>
+                <div class="layui-card-body" pad15>
+                    <div class="layui-form layui-form-pane" lay-filter="LAY-broker-brokerform-edit">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">岗位信息</label>
+                            <div class="layui-input-block">
+                                <input type="text"
+                                       value="{$comjobs.worker.title} - {$comjobs.title}"
+                                       class="layui-input" readonly>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>姓名</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="realname" placeholder="请输入姓名" autocomplete="off" lay-verify="required"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>手机号</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="mobile" placeholder="请输入手机号" lay-verify="required|phone" autocomplete="off"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>身份证号</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="idcard" placeholder="请输入身份证号" lay-verify="required|identity" autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>预计到达时间</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="arrivetime" id="arrivetime" lay-verify="required" placeholder="请选择..."
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">备注信息</label>
+                            <div class="layui-input-block">
+                                <textarea name="remark" placeholder="请输入..." class="layui-textarea"></textarea>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="LAY-broker-brokerform-edit-submit"
+                                       value="确认提交" class="layui-btn">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+
+    layui.config({
+        base: '/static/echoui/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'form', 'set', 'laydate'], function () {
+        var $ = layui.$,
+            setter = layui.setter,
+            admin = layui.admin,
+            laydate = layui.laydate,
+            form = layui.form;
+        form.render();
+
+        laydate.render({
+            elem: '#arrivetime',
+            type: 'date',
+            format: 'yyyy-MM-dd'
+        });
+
+        form.on('submit(LAY-broker-brokerform-edit-submit)', function (obj) {
+            var index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: setter.baseAdminUrl + 'comjobs/submitreport',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layer.close(index);
+                }
+            });
+        });
+    });
+</script>

+ 192 - 0
app/admin/view/comjobs/loglist.html

@@ -0,0 +1,192 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto" lay-filter="LAY-comjobs-loglist-search">
+			<div class="layui-form-item">
+				<div class="layui-inline">
+					<label class="layui-form-label">公司/招聘</label>
+					<div class="layui-input-block" id="workercomjobs">
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">公司反馈</label>
+					<div class="layui-input-block">
+						<select name="status">
+							<option value="">全部状态</option>
+							<option value="1">未跟进</option>
+							<option value="2">未面试</option>
+							<option value="3">面试通过</option>
+							<option value="4">面试未通过</option>
+							<option value="5">用户放弃</option>
+							<option value="6">已入职</option>
+							<option value="7">已离职</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<button class="layui-btn" lay-submit lay-filter="LAY-comjobs-loglist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+					<button class="layui-btn" lay-submit lay-filter="LAY-comjobs-loglist-export-btn">
+						导出
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="batchdel">删除</button>
+			</div>
+
+			<table id="LAY-comjobs-loglist-table" lay-filter="LAY-comjobs-loglist-table"></table>
+			<script type="text/html" id="useravatarTpl">
+				{{#  if(d.user!=null && d.user.avatar != ''){ }}
+				<div id="pic{{d.id}}" lay-event="pic">
+					<img style="width: 100%; height: 100%;" src="{{d.user.avatar}}">
+				</div>
+				{{#  } }}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table', 'selectN', 'selectM'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table,
+			selectN = layui.selectN,
+			selectM = layui.selectM;
+		form.render();
+
+		var workercomjobs = selectN({
+			elem: '#workercomjobs',
+			search: [true, true],
+			tips: ["请选择劳务公司(可搜索)", "请选择招聘信息(可搜索)"],
+			data: {$workerlist|raw},
+			selected: [0, 0],
+			field: { idName: 'id', titleName: 'title', childName: 'comjobs' }
+		});
+
+		table.render({
+			elem: '#LAY-comjobs-loglist-table',
+			url: setter.baseAdminUrl + 'comjobs/listlog',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'useravatar', width: 60, title: '头像', templet: '#useravatarTpl' },
+					{ field: 'usernickname', title: '昵称', width: 150, templet: '<div>{{d.user.nickname||""}}</div>' },
+					{ field: 'userrealname', title: '姓名', width: 150, templet: '<div>{{d.user.realname||""}}</div>' },
+					{ field: 'usermobile', title: '手机号', width: 150, templet: '<div>{{d.user.mobile||""}}</div>' },
+					{ field: 'workerid', title: '劳务公司', toolbar: '<div>{{d.worker.title||""}}</div>' },
+					{ field: 'comjobsid', title: '招聘标题', width: 200, toolbar: '<div>{{d.comjobs.title||""}}</div>' },
+					{ field: 'status_text', title: '公司反馈', minWidth: 150, align: 'center' },
+					{ field: 'remark', title: '反馈备注(点击编辑)', width: 300, edit: 'text' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 100, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 200,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-comjobs-loglist-search-btn)', function(data) {
+			table.reload('LAY-comjobs-loglist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+		form.on('submit(LAY-comjobs-loglist-export-btn)', function(data) {
+			var url = setter.baseAdminUrl + 'comjobs/exportlog?';
+			for (var item in data.field) {
+				url = url + '&' + item + '=' + data.field[item];
+			}
+			window.location.href = url;
+		});
+
+		table.on('edit(LAY-comjobs-loglist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.baseAdminUrl + 'comjobs/fieldlog',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-comjobs-loglist-table');
+				}
+			});
+		});
+
+		var active = {
+			batchdel: function() {
+				var checkStatus = table.checkStatus('LAY-comjobs-loglist-table'),
+					checkData = checkStatus.data; //得到选中的数据
+				if (checkData.length === 0) {
+					return layer.msg('请选择数据');
+				}
+				var idarr = [];
+				for (var i = 0; i < checkData.length; i++) {
+					idarr.push(checkData[i].id);
+				}
+				layer.confirm('确定删除此报名记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'comjobs/dellog',
+						data: {
+							idarr: idarr
+						},
+						done: function(res) {
+							table.reload('LAY-comjobs-loglist-table');
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			}
+		};
+
+		table.on('tool(LAY-comjobs-loglist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'del') {
+				layer.confirm('确定删除此报名记录吗?', function(index) {
+					admin.req({
+						url: setter.baseAdminUrl + 'comjobs/dellog',
+						data: {
+							idarr: [data.id]
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					layer.close(index);
+				});
+			} else if (obj.event === 'pic') {
+				layer.photos({
+					photos: '#pic' + data.id,
+					anim: 5,
+				});
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác