Ver Fonte

就业合伙人

linwu há 1 dia atrás
pai
commit
e6941ab02c
45 ficheiros alterados com 3627 adições e 62 exclusões
  1. 18 49
      app/ExceptionHandle.php
  2. 5 2
      app/admin/view/login/login.html
  3. 37 5
      app/agent/controller/Broker.php
  4. 218 0
      app/agent/controller/Partner.php
  5. 25 0
      app/agent/view/broker/brokerform.html
  6. 11 0
      app/agent/view/broker/brokerlist.html
  7. 6 0
      app/agent/view/index.html
  8. 5 2
      app/agent/view/login/login.html
  9. 65 0
      app/agent/view/partner/below.html
  10. 45 0
      app/agent/view/partner/incomelist.html
  11. 125 0
      app/agent/view/partner/index.html
  12. 59 0
      app/agent/view/partner/transferform.html
  13. 2 2
      app/common.php
  14. 9 0
      app/common/model/Broker.php
  15. 1 0
      app/partner/.htaccess
  16. 123 0
      app/partner/BaseController.php
  17. 17 0
      app/partner/Request.php
  18. 15 0
      app/partner/common.php
  19. 9 0
      app/partner/config/view.php
  20. 82 0
      app/partner/controller/Attachment.php
  21. 326 0
      app/partner/controller/Broker.php
  22. 51 0
      app/partner/controller/Home.php
  23. 10 0
      app/partner/controller/Index.php
  24. 50 0
      app/partner/controller/Login.php
  25. 39 0
      app/partner/controller/Partner.php
  26. 298 0
      app/partner/controller/User.php
  27. 27 0
      app/partner/event.php
  28. 12 0
      app/partner/middleware.php
  29. 17 0
      app/partner/provider.php
  30. 224 0
      app/partner/view/broker/brokerform.html
  31. 238 0
      app/partner/view/broker/brokerlist.html
  32. 39 0
      app/partner/view/broker/incomelist.html
  33. 59 0
      app/partner/view/broker/transferform.html
  34. 229 0
      app/partner/view/home/console.html
  35. 133 0
      app/partner/view/index.html
  36. 3 0
      app/partner/view/layout.html
  37. 81 0
      app/partner/view/login/login.html
  38. 70 0
      app/partner/view/partner/mypassword.html
  39. 3 0
      app/partner/view/public/footer.html
  40. 19 0
      app/partner/view/public/header.html
  41. 112 0
      app/partner/view/user/follow.html
  42. 452 0
      app/partner/view/user/userform.html
  43. 229 0
      app/partner/view/user/userlist.html
  44. 5 2
      app/worker/view/login/login.html
  45. 24 0
      public/partner.php

+ 18 - 49
app/ExceptionHandle.php

@@ -1,68 +1,37 @@
 <?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;
+use think\Response;
+use think\exception\HttpException;
 
 /**
  * 应用异常处理类
  */
 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
     {
-        // 添加自定义异常处理机制
+        // 调试模式
+        if ($request->isAjax()) {
+            if ($e instanceof HttpResponseException) {
+                return $e->getResponse();
+            } elseif ($e instanceof HttpException) {
+                if (env('app_debug')) {
+                    return json(['code' => $e->getStatusCode(), 'msg' => $e->getMessage()], $e->getStatusCode());
+                }
+            } else {
+                if (env('app_debug')) {
+                    return json(['code' => 500, 'msg' => $e->getMessage(), 'trace' => $e->getTrace()], 500);
+                }
+            }
+
+            return json(['code' => 500, 'msg' => '服务器升级中,请稍后重试~~'], 500);
+        }
 
-        // 其他错误交给系统处理
         return parent::render($request, $e);
     }
 }

+ 5 - 2
app/admin/view/login/login.html

@@ -30,12 +30,15 @@
 				<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-login-login-submit">登 入</button>
 			</div>
 			<div class="layui-row layui-col-space10">
-				<div class="layui-col-md6" style="text-align:center;">
+				<div class="layui-col-md4" style="text-align:center;">
 					<a href="/worker.php">劳务公司</a>
 				</div>
-				<div class="layui-col-md6" style="text-align:center;">
+				<div class="layui-col-md4" style="text-align:center;">
 					<a href="/agent.php">门店</a>
 				</div>
+				<div class="layui-col-md4" style="text-align:center;">
+					<a href="/partner.php">就业合伙人</a>
+				</div>
 			</div>
 		</div>
 	</div>

+ 37 - 5
app/agent/controller/Broker.php

@@ -26,19 +26,29 @@ class Broker extends BaseController
     public function brokerForm()
     {
         $id       = input('id/d, 0');
-        $broker   = BrokerModel::findOrEmpty($id);
+        $broker   = BrokerModel::with(['muser'])->findOrEmpty($id);
         $agent    = $this->access_agent;
         $townlist = file_get_contents(root_path('public/static/jscss') . 'village.json');
+
+        $agentid = $this->access_agent['id'];
+        $partner = BrokerModel::where([
+            ['agentid', '=', $agentid],
+            ['is_partner', '=', 1],
+            ['id', '<>', $id],
+        ])->select();
+
         return view('broker/brokerform', [
             'agent'    => $agent,
             'broker'   => $broker,
             'townlist' => $townlist,
+            'partner'  => $partner,
         ]);
     }
 
     public function editBroker()
     {
         $agent = $this->access_agent;
+        $id    = input('id/d');
         $data  = [
             'workerid'    => $agent['workerid'],
             'agentid'     => $agent['id'],
@@ -55,9 +65,16 @@ class Broker extends BaseController
             'status'      => input('status/d') == 1 ? 1 : 2,
             'latitude'    => input('latitude/f', 0),
             'longitude'   => input('longitude/f', 0),
-            'type'        => input('type/s', ""),
+            'type'        => input('type/f', 1),
+            'is_partner'  => input('is_partner/f', 2),
+            'pid'         => input('pid/f', 0),
         ];
 
+        //就业合伙人
+        if ($data['is_partner'] == 1) {
+            $data['pid'] = 0;
+        }
+
         if (empty($data['latitude']) || empty($data['longitude'])) {
             exit(json_encode([
                 'code' => 1,
@@ -77,9 +94,10 @@ class Broker extends BaseController
         $data['town']    = $townvillage[0];
         $data['village'] = $townvillage[1];
 
+        $password = input('password/s', "");
         if (empty($id)) {
-            $id    = input('id/d');
-            $vdata = [
+            $data['password'] = empty($password) ? md5("123456789") : md5($password);
+            $vdata            = [
                 'id'     => $id,
                 'mobile' => input('mobile/s'),
             ];
@@ -114,6 +132,9 @@ class Broker extends BaseController
 
             event('brokerAdd', $broker);
         } else {
+            if (!empty($password)) {
+                $data['password'] = md5($password);
+            }
             $broker = BrokerModel::find($id);
             $broker->save($data);
         }
@@ -180,7 +201,18 @@ class Broker extends BaseController
         if (!empty($status)) {
             $map[] = ['status', '=', $status];
         }
-        $list  = BrokerModel::with(['agent', 'muser'])->withCount(['user'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text', 'powerreport_text', 'type_text'])->select();
+        $is_partner = input('is_partner/d');
+        if (!empty($is_partner)) {
+            $map[] = ['is_partner', '=', $is_partner];
+        }
+        $list  = BrokerModel::with(['agent', 'muser'])
+            ->withCount(['user'])
+            ->where($map)
+            ->order('id', 'DESC')
+            ->limit($limit)
+            ->page($page)
+            ->append(['status_text', 'powerreport_text', 'type_text', 'is_partner_text'])
+            ->select();
         $count = BrokerModel::where($map)->count();
         if ($count == 0) {
             exit(json_encode([

+ 218 - 0
app/agent/controller/Partner.php

@@ -0,0 +1,218 @@
+<?php
+
+namespace app\agent\controller;
+
+use app\agent\BaseController;
+use app\common\model\Broker as BrokerModel;
+use app\common\model\BrokerIncome as BrokerIncomeModel;
+use app\common\model\User as UserModel;
+
+class Partner extends BaseController
+{
+
+    public function index()
+    {
+        return view('partner/index');
+    }
+
+    public function listPartner()
+    {
+        $agentid  = $this->access_agent['id'];
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $map[]    = ['agentid', '=', $agentid];
+        $map[]    = ['is_partner', '=', 1];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list  = BrokerModel::with(['agent', 'muser'])
+            ->withCount(['user'])
+            ->where($map)
+            ->order('id', 'DESC')
+            ->limit($limit)
+            ->page($page)
+            ->append(['status_text'])
+            ->select();
+        $count = BrokerModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        foreach ($list as $v) {
+            $broker_ids = BrokerModel::where('pid', $v['id'])->column('id');
+            if (empty($broker_ids)) {
+                $broker_ids = [$v['id']];
+            } else {
+                $broker_ids[] = $v['id'];
+            }
+            $v['group_income']       = BrokerModel::whereIn('id', $broker_ids)->sum('income');
+            $v['group_income_total'] = BrokerModel::whereIn('id', $broker_ids)->sum('income_total');
+            $v['user_count']         = UserModel::whereIn('brokerid', $broker_ids)->count();
+            $v['below_count']       = BrokerModel::where('pid', $v['id'])->count();
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function transferFrom()
+    {
+        $broker_id   = input('broker_id/d, 0');
+        $agentid     = $this->access_agent['id'];
+        $broker_list = BrokerModel::where('agentid', $agentid)
+            ->where('id', '<>', $broker_id)
+            ->where('is_partner', '1')
+            ->select();
+        return view('partner/transferform', [
+            'origin_broker_id' => $broker_id,
+            'broker_list'      => $broker_list,
+        ]);
+    }
+
+    public function edittransfer()
+    {
+        $origin_broker_id = input('origin_broker_id/d, 0');
+        $broker_id        = input('broker_id/d, 0');
+        if (empty($origin_broker_id) || empty($broker_id)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "参数错误",
+            ]));
+        }
+        if ($origin_broker_id == $broker_id) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "不可以转移给自己",
+            ]));
+        }
+
+        $origin_broker = BrokerModel::where('id', $origin_broker_id)->find();
+        $broker        = BrokerModel::where('id', $broker_id)->find();
+        if (empty($origin_broker) || empty($broker)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "参数错误",
+            ]));
+        }
+        if ($origin_broker['agentid'] != $broker['agentid']) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "只有相同门店的经纪人才可以转移",
+            ]));
+        }
+
+        BrokerModel::where('pid', $origin_broker_id)->update(['pid' => $broker_id]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function incomeList()
+    {
+        $brokerid = input('id');
+        if (empty($brokerid)) {
+            exit("未查询到数据");
+        }
+
+        return view('partner/incomelist', [
+            'brokerid' => $brokerid,
+        ]);
+    }
+
+    public function listIncome()
+    {
+        $brokerid = input('brokerid');
+        if (empty($brokerid)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+
+        $limit      = input('limit/d', 20);
+        $page       = input('page/d', 1);
+        $broker_ids = BrokerModel::where('pid', $brokerid)->column('id');
+        if (empty($broker_ids)) {
+            $broker_ids = [$brokerid];
+        } else {
+            $broker_ids[] = $brokerid;
+        }
+        $map   = [
+            ['brokerid', 'in', $broker_ids],
+        ];
+        $list  = BrokerIncomeModel::with(['broker'])->where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text', 'powerreport_text'])->select();
+        $count = BrokerIncomeModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function below()
+    {
+        $brokerid = input('broker_id');
+        if (empty($brokerid)) {
+            exit("未查询到数据");
+        }
+        $agent = $this->access_agent;
+        return view('partner/below', [
+            'brokerid' => $brokerid,
+            'agent'    => $agent,
+        ]);
+    }
+
+    public function listbelow()
+    {
+        $brokerid = input('broker_id');
+        if (empty($brokerid)) {
+            exit("未查询到数据");
+        }
+
+        $agentid  = $this->access_agent['id'];
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $map[]    = ['agentid', '=', $agentid];
+        $map[]    = ['pid', '=', $brokerid];
+        $list  = BrokerModel::with(['agent', 'muser'])
+            ->withCount(['user'])
+            ->where($map)
+            ->order('id', 'DESC')
+            ->limit($limit)
+            ->page($page)
+            ->append(['status_text', 'powerreport_text', 'type_text', 'is_partner_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,
+        ]));
+    }
+}

+ 25 - 0
app/agent/view/broker/brokerform.html

@@ -33,6 +33,17 @@
 								<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="pid" lay-search lay-verify="required">
+									<option value="0">请选择归属的就业合伙人(可搜索)</option>
+									{volist name="partner" id="vo"}
+										<option value="{$vo['id']}" {$broker.pid==$vo.id ? 'selected' : '' }>{$vo['title']}({$vo['mobile']})</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">
@@ -67,6 +78,13 @@
 								<input type="radio" name="type" value="3" title="省外经纪人" {eq name="broker.type" value="3" }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_partner" value="1" title="是" {eq name="broker.is_partner" value="1" }checked{/eq} />
+								<input type="radio" name="is_partner" value="2" title="否" {eq name="broker.is_partner|default=2" value="2" }checked{/eq} />
+							</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">
@@ -134,6 +152,13 @@
 								 }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="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-broker-brokerform-edit-submit" value="确认提交" class="layui-btn">

+ 11 - 0
app/agent/view/broker/brokerlist.html

@@ -18,6 +18,16 @@
 						</select>
 					</div>
 				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">就业合伙人</label>
+					<div class="layui-input-block">
+						<select name="is_partner">
+							<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>
@@ -86,6 +96,7 @@
 					{ field: 'income_total', title: '总收益', width: 120 },
 					{ field: 'muser', title: '关联的用户(姓名-手机号)', templet: '#muserTpl', minWidth: 250, align: 'left' },
 					{ field: 'type_text', title: '类型', width: 100, align: 'center' },
+					{ field: 'is_partner_text', title: '就业合伙人', width: 100, align: 'center' },
 					{ field: 'address', title: '镇街', templet: '#address' },
 					{ field: 'region', title: '区域' },
 					{ field: 'agenttitle', title: '代理门店', templet: '#agenttitleTpl' },

+ 6 - 0
app/agent/view/index.html

@@ -83,6 +83,12 @@
 							<cite>经纪人管理</cite>
 						</a>
 					</li>
+					<li data-name="broker" class="layui-nav-item">
+						<a lay-href="{:url('/partner/index')}" lay-tips="就业合伙人">
+							<i class="layui-icon layui-icon-engine"></i>
+							<cite>就业合伙人</cite>
+						</a>
+					</li>
 					<li data-name="comjobs_report" class="layui-nav-item">
 						<a lay-href="{:url('/comjobs/report')}" lay-tips="悬赏报备管理">
 							<i class="layui-icon layui-icon-user"></i>

+ 5 - 2
app/agent/view/login/login.html

@@ -30,12 +30,15 @@
 				<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-login-login-submit">登 入</button>
 			</div>
 			<div class="layui-row layui-col-space10">
-				<div class="layui-col-md6" style="text-align:center;">
+				<div class="layui-col-md4" style="text-align:center;">
 					<a href="/admin.php">总后台</a>
 				</div>
-				<div class="layui-col-md6" style="text-align:center;">
+				<div class="layui-col-md4" style="text-align:center;">
 					<a href="/worker.php">劳务公司</a>
 				</div>
+				<div class="layui-col-md4" style="text-align:center;">
+					<a href="/partner.php">就业合伙人</a>
+				</div>
 			</div>
 		</div>
 	</div>

+ 65 - 0
app/agent/view/partner/below.html

@@ -0,0 +1,65 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<table id="LAY-broker-brokerlist-table" lay-filter="LAY-broker-brokerlist-table"></table>
+			<script type="text/html" id="address">
+				{{d.town}} - {{d.village}}
+			</script>
+			<script type="text/html" id="muserTpl">
+				{{#  if(d.userid != 0){ }}
+					{{d.muser.realname}} - {{d.muser.mobile}} 
+				{{#  } }}
+			</script>
+			<script type="text/html" id="agenttitleTpl">
+				{{d.agent.title}}
+			</script>
+			<script type="text/html" id="usercountTpl">
+				{{d.user_count}}
+			</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.baseAgentUrl + 'partner/listbelow?broker_id={$brokerid}',
+			cols: [
+				[
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'title', title: '姓名' },
+					{ field: 'mobile', title: '手机号' },
+					{ field: 'income', title: '收益', width: 120 },
+					{ field: 'income_total', title: '总收益', width: 120 },
+					{ field: 'muser', title: '关联的用户(姓名-手机号)', templet: '#muserTpl', minWidth: 250, align: 'left' },
+					{ field: 'type_text', title: '类型', width: 100, align: 'center' },
+					{ field: 'is_partner_text', title: '就业合伙人', width: 100, align: 'center' },
+					{ field: 'address', title: '镇街', templet: '#address' },
+					{ field: 'region', title: '区域' },
+					{ field: 'usercount', title: '用户邀请数', templet: '#usercountTpl', width: 100, align: 'center' },
+					{ field: 'weixin', title: '微信号'},
+					{ field: 'qq', title: 'QQ号' },
+					{ field: 'status_text', title: '状态', width: 80, align: 'center' },
+					{ field: 'powerreport_text', title: '报备权限', width: 100, align: 'center' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+	});
+</script>

+ 45 - 0
app/agent/view/partner/incomelist.html

@@ -0,0 +1,45 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<table id="LAY-broker-incomelist-table" lay-filter="LAY-broker-brokerlist-table"></table>
+			<script type="text/html" id="brokerTpl">
+				{{#  if(d.brokerid != 0){ }}
+				{{d.broker.title}} - {{d.broker.mobile}}
+				{{#  } }}
+			</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-incomelist-table',
+			url: setter.baseAgentUrl + 'partner/listincome?brokerid={$brokerid}',
+			cols: [
+				[
+					{ field: 'broker', title: '用户(姓名-手机号)', templet: '#brokerTpl'},
+					{ field: 'title', title: '标题' },
+					{ field: 'value', title: '收益', width: 120 },
+					{ field: 'remark', title: '备注' },
+					{ field: 'createtime', title: '时间'},
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+	});
+</script>

+ 125 - 0
app/agent/view/partner/index.html

@@ -0,0 +1,125 @@
+<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-partner-partnerlist-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-partner-partnerlist-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<table id="LAY-partner-partnerlist-table" lay-filter="LAY-partner-partnerlist-table"></table>
+			<script type="text/html" id="address">
+				{{d.town}} - {{d.village}}
+			</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-xs" lay-event="income"><i class="layui-icon layui-icon-table"></i>收益明细</a>
+				<a class="layui-btn layui-btn-xs" lay-event="below"><i class="layui-icon layui-icon-spread-left"></i>下线列表</a>
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="transfer"><i class="layui-icon layui-icon-spread-left"></i>下线转移</a>
+			</script>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set', 'table'], function() {
+		setter = layui.setter;
+		form = layui.form;
+		table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-partner-partnerlist-table',
+			url: setter.baseAgentUrl + 'partner/listpartner',
+			cols: [
+				[
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'title', title: '姓名', width: 80 },
+					{ field: 'mobile', title: '手机号', width: 120 },
+					{ field: 'below_count', title: '下线人数', width: 100 },
+					{ field: 'group_income', title: '小组收益', width: 100 },
+					{ field: 'group_income_total', title: '小组总收益', width: 120 },
+					{ field: 'muser', title: '关联的用户(姓名-手机号)', templet: '#muserTpl', minWidth: 250, align: 'left' },
+					{ field: 'address', title: '镇街', templet: '#address' },
+					{ field: 'region', title: '区域', width: 120 },
+					{ field: 'user_count', title: '小组用户邀请数', width: 150, align: 'center' },
+					{ field: 'status_text', title: '状态', width: 80, align: 'center' },
+					{ title: '操作', width: 300, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 10,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-partner-partnerlist-btn)', function(data) {
+			table.reload('LAY-partner-partnerlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+
+		table.on('tool(LAY-partner-partnerlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'income') {
+				index = layer.open({
+					type: 2,
+					title: '收益明细',
+					content: 'incomelist.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'transfer') {
+				var index = layer.open({
+					type: 2,
+					title: '转移下线',
+					content: 'transferfrom.html?broker_id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'below') {
+				var index = layer.open({
+					type: 2,
+					title: '下线列表',
+					content: 'below.html?broker_id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			}
+		});
+	});
+</script>

+ 59 - 0
app/agent/view/partner/transferform.html

@@ -0,0 +1,59 @@
+<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-transferform-edit">
+                        <input type="hidden" name="origin_broker_id" value="{$origin_broker_id}">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">对方名称</label>
+                            <div class="layui-input-block" id="broker_id">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="LAY-broker-transferform-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', 'layarea'], function () {
+        var $ = layui.$, setter = layui.setter, admin = layui.admin, selectN = layui.selectN,form = layui.form;
+        form.render();
+
+        var workeragent = selectN({
+            elem: '#broker_id',
+            search: [true],
+            tips: ["请选择对方姓名"],
+            data: {$broker_list|raw},
+            field: { idName: 'id', titleName: 'title'}
+        });
+
+        form.on('submit(LAY-broker-transferform-edit-submit)', function (obj) {
+            var index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: setter.baseAgentUrl + 'partner/edittransfer',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('LAY-partner-partnerlist-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+    });
+</script>

+ 2 - 2
app/common.php

@@ -27,7 +27,7 @@ function array_get($array, $key, $default = null)
     }
 
     foreach (explode('.', $key) as $segment) {
-        if (is_array($array) && array_key_exists($segment, $array)) {
+        if (!empty($array[$segment])) {
             $array = $array[$segment];
         } else {
             return $default;
@@ -88,7 +88,7 @@ function image_copy_text($dst_path, $text, $font, $size, $picwith, $x, $y, $red,
     $black = imagecolorallocate($dst, $red, $grn, $blu);//字体颜色0x00, 0x00, 0x00
     imagefttext($dst, $size, 0, $x, $y, $black, $font, $text);
     //输出图片
-    list($dst_w, $dst_h, $dst_type) = getimagesize($dst_path);
+    [$dst_w, $dst_h, $dst_type] = getimagesize($dst_path);
     switch ($dst_type) {
         case 1://GIF
             header('Content-Type: image/gif');

+ 9 - 0
app/common/model/Broker.php

@@ -8,6 +8,7 @@ use think\model\concern\SoftDelete;
 class Broker extends Model
 {
     use SoftDelete;
+
     protected $deleteTime = 'deletetime';
     protected $defaultSoftDelete = 0;
 
@@ -38,6 +39,9 @@ class Broker extends Model
         'latitude'     => 'float',
         'longitude'    => 'float',
         'type'         => 'tinyint',
+        'is_partner'   => 'tinyint',
+        'password'     => 'string',
+        'pid'   => 'int',
     ];
 
     // 设置字段自动转换类型
@@ -63,6 +67,11 @@ class Broker extends Model
         return $status[$data['type']];
     }
 
+    public function getIsPartnerTextAttr($value, $data)
+    {
+        $status = [1 => '是', 2 => '否'];
+        return $status[$data['is_partner']];
+    }
 
     // 关联User
     public function muser()

+ 1 - 0
app/partner/.htaccess

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

+ 123 - 0
app/partner/BaseController.php

@@ -0,0 +1,123 @@
+<?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\partner;
+
+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_partner = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param  App  $app  应用对象
+     */
+    public function __construct(App $app)
+    {
+        $this->app     = $app;
+        $this->request = $this->app->request;
+
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {
+		// 验证登陆信息
+		$has_access_partner = Session::has('access_partner');
+		if ( $has_access_partner ) {
+			$this->access_partner = Session::get('access_partner');
+		}else{
+			echo '<script language="javascript" type="text/javascript"> top.location.href="/partner.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);
+    }
+
+}

+ 17 - 0
app/partner/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\partner;
+
+class Request extends \think\Request
+{
+
+}

+ 15 - 0
app/partner/common.php

@@ -0,0 +1,15 @@
+<?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>
+// +----------------------------------------------------------------------
+
+// 应用公共文件
+
+
+

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

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

+ 82 - 0
app/partner/controller/Attachment.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace app\partner\controller;
+
+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([
+                'code' => 0,
+                'msg'  => "",
+                'data' => [
+                    'src'   => request()->domain() . "/attachment/" . str_replace("\\", "/", $savename),
+                    'path'  => "./attachment/" . str_replace("\\", "/", $savename),
+                    'title' => $filename,
+                ],
+            ]));
+        } else {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "上传失败,请稍后重试",
+            ]));
+        }
+    }
+
+    // 图片上传
+    public function tplFieldImage()
+    {
+        $this->validateExt(['jpg', 'png', 'jpeg']);
+        $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([
+                'code' => 0,
+                'msg'  => "",
+                'data' => [
+                    'src'   => request()->domain() . "/attachment/" . str_replace("\\", "/", $savename),
+                    'title' => $filename,
+                ],
+            ]));
+        } else {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "上传失败,请稍后重试",
+            ]));
+        }
+    }
+
+    public function validateExt($ext_arr)
+    {
+        $ext = pathinfo($_FILES['file']['name'])['extension'];
+        if (!in_array($ext, $ext_arr)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "文件格式不正确",
+            ]));
+        }
+    }
+
+}

+ 326 - 0
app/partner/controller/Broker.php

@@ -0,0 +1,326 @@
+<?php
+
+namespace app\partner\controller;
+
+use app\partner\BaseController;
+use app\common\model\UserPart as UserPartModel;
+use app\common\model\Broker as BrokerModel;
+use app\common\model\User as UserModel;
+use app\common\model\BrokerIncome as BrokerIncomeModel;
+
+use app\common\service\IncomeService;
+use app\common\validate\Broker as BrokerValidate;
+use think\exception\ValidateException;
+
+class Broker extends BaseController
+{
+
+    public function brokerList()
+    {
+        return view('broker/brokerlist');
+    }
+
+    public function brokerForm()
+    {
+        $id       = input('id/d, 0');
+        $broker   = BrokerModel::with(['muser'])->findOrEmpty($id);
+        $townlist = file_get_contents(root_path('public/static/jscss') . 'village.json');
+
+        return view('broker/brokerform', [
+            'broker'   => $broker,
+            'townlist' => $townlist,
+        ]);
+    }
+
+    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', ""),
+            'region'      => input('region/s', ""),
+            'details'     => input('details/s', ""),
+            'powerreport' => input('powerreport/d', 0) == 1 ? 1 : 2,
+            'status'      => input('status/d') == 1 ? 1 : 2,
+            'latitude'    => input('latitude/f', 0),
+            'longitude'   => input('longitude/f', 0),
+            'type'        => input('type/f', 1),
+        ];
+
+        if (empty($data['latitude']) || empty($data['longitude'])) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => '请选择地理位置',
+            ]));
+        }
+
+        //镇街
+        $townvillage = input('townvillage');
+        if (empty($townvillage)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => '请选择镇街',
+            ]));
+        }
+        $townvillage     = explode(',', $townvillage);
+        $data['town']    = $townvillage[0];
+        $data['village'] = $townvillage[1];
+
+        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'  => "关联的用户不存在。",
+                ]));
+            }
+
+            $broker_user = BrokerModel::where('userid', $muser->id)->find();
+            if (!empty($broker_user)) {
+                exit(json_encode([
+                    'code' => 1,
+                    'msg'  => "该用户已是经纪人。",
+                ]));
+            }
+
+            $data['userid']     = $muser->id;
+            $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()
+    {
+        $idarr      = input('idarr/a');
+        $user_check = UserModel::whereIn('brokerid', $idarr)->find();
+        if (!empty($user_check)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "该经纪人还有下线,请先转移再删除",
+            ]));
+        }
+        $broker = BrokerModel::whereIn('id', $idarr)->select();
+        $result = $broker->delete();
+        if ($result) {
+            exit(json_encode([
+                'code' => 0,
+                'msg'  => "",
+            ]));
+        }
+        exit(json_encode([
+            'code' => 1,
+            'msg'  => "删除失败,请稍后重试",
+        ]));
+    }
+
+    public function listBroker()
+    {
+        $partner_id  = $this->access_partner['id'];
+        $limit    = input('limit/d', 20);
+        $page     = input('page/d', 1);
+        $map      = [];
+        $map[]    = ['pid|id', '=', $partner_id];
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['title', 'like', '%' . $keywords . '%'];
+        }
+        $status = input('status/d');
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+        $list  = BrokerModel::with(['agent', 'muser'])
+            ->withCount(['user'])
+            ->where($map)
+            ->order('id', 'DESC')
+            ->limit($limit)
+            ->page($page)
+            ->append(['status_text', 'powerreport_text', 'type_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 transferFrom()
+    {
+        $broker_id   = input('broker_id/d, 0');
+        $partner_id     = $this->access_partner['id'];
+        $broker_list = BrokerModel::where('pid|id', $partner_id)->select();
+        return view('broker/transferform', [
+            'origin_broker_id' => $broker_id,
+            'broker_list'      => $broker_list,
+        ]);
+    }
+
+    public function edittransfer()
+    {
+        $origin_broker_id = input('origin_broker_id/d, 0');
+        $broker_id        = input('broker_id/d, 0');
+        if (empty($origin_broker_id) || empty($broker_id)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "参数错误",
+            ]));
+        }
+        if ($origin_broker_id == $broker_id) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "不可以转移给自己",
+            ]));
+        }
+
+        $origin_broker = BrokerModel::where('id', $origin_broker_id)->find();
+        $broker        = BrokerModel::where('id', $broker_id)->find();
+        if (empty($origin_broker) || empty($broker)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "参数错误",
+            ]));
+        }
+        if ($origin_broker['agentid'] != $broker['agentid']) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "只有相同门店的经纪人才可以转移",
+            ]));
+        }
+
+        UserModel::where('brokerid', $origin_broker_id)->update(['brokerid' => $broker_id]);
+        UserPartModel::where('puserid', $origin_broker['userid'])->update(['puserid' => $broker['userid']]);
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function incomeList()
+    {
+        $brokerid = input('brokerid');
+        if (empty($brokerid)) {
+            exit("未查询到数据");
+        }
+
+        return view('broker/incomelist', [
+            'brokerid' => $brokerid,
+        ]);
+    }
+
+    public function listIncome()
+    {
+        $brokerid = input('brokerid');
+        if (empty($brokerid)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+
+        $limit = input('limit/d', 20);
+        $page  = input('page/d', 1);
+        $map   = [
+            ['brokerid', '=', $brokerid],
+        ];
+        $list  = BrokerIncomeModel::where($map)->order('id', 'DESC')->limit($limit)->page($page)->append(['status_text', 'powerreport_text'])->select();
+        $count = BrokerIncomeModel::where($map)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function settleIncome()
+    {
+        $brokerid = input('brokerid');
+        $value    = input('value');
+
+        if (empty($brokerid) || $value <= 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "参数错误",
+            ]));
+        }
+
+        $broker = BrokerModel::find($brokerid);
+        if (empty($broker)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        if ($broker['income'] < $value) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "经纪人收益不足",
+            ]));
+        }
+
+        $incomeService = new IncomeService();
+        $incomeService->add($brokerid, -$value, '门店结算', '门店与经纪人线下结算');
+
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+}

+ 51 - 0
app/partner/controller/Home.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace app\partner\controller;
+
+use app\partner\BaseController;
+
+use app\common\model\User as UserModel;
+use app\common\model\Broker as BrokerModel;
+
+
+class Home extends BaseController
+{
+
+    public function index()
+    {
+        return view('index', [
+            'access_partner' => session('access_partner'),
+        ]);
+    }
+
+    public function console()
+    {
+
+        $partnerid   = $this->access_partner['id'];
+        $brokerids = BrokerModel::where('pid|id', '=', $partnerid)->column('id');
+
+        $stime = strtotime(date("Y-m-d"), time());
+
+        $tuserCount = UserModel::whereIn('brokerid', $brokerids)->where('brokerid', '<>', 0)->where('createtime', 'between', [$stime, $stime + 86400])->count();
+        $yuserCount = UserModel::whereIn('brokerid', $brokerids)->where('brokerid', '<>', 0)->where('createtime', 'between', [$stime - 86400, $stime])->count();
+
+        $userCount   = UserModel::whereIn('brokerid', $brokerids)->where('brokerid', '<>', 0)->count();
+        $brokerCount = BrokerModel::where('pid', '=', $partnerid)->count();
+
+        $partnerIncome = BrokerModel::whereIn('id',$brokerids)->sum('income');
+        $partnerIncomeTotal = BrokerModel::whereIn('id',$brokerids)->sum('income_total');
+
+
+        return view('home/console', [
+            'tuserCount'  => $tuserCount,
+            'yuserCount'  => $yuserCount,
+            'userCount'   => $userCount,
+            'brokerCount' => $brokerCount,
+            'partnerIncome' => $partnerIncome,
+            'partnerIncomeTotal' => $partnerIncomeTotal,
+            'partner'     => $this->access_partner,
+        ]);
+    }
+
+
+}

+ 10 - 0
app/partner/controller/Index.php

@@ -0,0 +1,10 @@
+<?php
+namespace app\partner\controller;
+
+class Index
+{
+	public function index()
+	{
+		return redirect('/partner.php/home');
+	}
+}

+ 50 - 0
app/partner/controller/Login.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\partner\controller;
+
+use app\common\model\Broker as BrokerModel;
+
+class Login
+{
+    public function index()
+    {
+        return view('login/login', [
+            'domain' => request()->domain(),
+        ]);
+    }
+
+
+    public function login()
+    {
+//        if (!captcha_check(input('vercode'))) {
+//            exit(json_encode([
+//                'code' => 1,
+//                'msg'  => "验证码错误。",
+//            ]));
+//        }
+        $partneradmin = BrokerModel::where('mobile', input('mobile'))->where('is_partner', 1)->findOrEmpty()->toArray();
+        if (empty($partneradmin) || $partneradmin['password'] != md5(input('password'))) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "账号密码不正确。",
+            ]));
+        }
+        if ($partneradmin['status'] == 2) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "该账号已被禁用,如有疑问请联系系统管理员。",
+            ]));
+        }
+        session('access_partner', $partneradmin);
+        echo json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]);
+    }
+
+    public function logout()
+    {
+        session(null);
+        return redirect(url('/login/index'));
+    }
+}

+ 39 - 0
app/partner/controller/Partner.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace app\partner\controller;
+
+use app\partner\BaseController;
+use app\common\model\Broker as BrokerModel;
+
+class Partner extends BaseController
+{
+    public function myPassword()
+    {
+        return view('partner/mypassword');
+    }
+
+    public function editMyPassword()
+    {
+        $partner       = $this->access_partner;
+        $oldpassword = input('oldpassword');
+        if ($partner['password'] !== md5($oldpassword)) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "当前密码不正确。",
+            ]));
+        }
+        $password   = input('password');
+        $repassword = input('repassword');
+        if ($password !== $repassword) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "两次输入的新密码不一致。",
+            ]));
+        }
+        BrokerModel::update(['password' => md5($password)], ['id' => $partner['id']]);
+        session('access_partner', null);
+        echo json_encode([
+            'code' => 0,
+        ]);
+    }
+}

+ 298 - 0
app/partner/controller/User.php

@@ -0,0 +1,298 @@
+<?php
+
+namespace app\partner\controller;
+
+use app\common\model\ComjobsCate;
+use app\common\model\RensheCode;
+use app\common\model\UserTags;
+use app\common\model\UserWill;
+use app\partner\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\Broker as BrokerModel;
+
+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 userList()
+    {
+        $partner_id = $this->access_partner['id'];
+        $groupslist = UserGroupsModel::order(['isdefault' => 'desc', 'id' => 'asc'])->select();
+        $brokerlist = BrokerModel::where('pid|id', '=', $partner_id)->order(['id' => 'desc'])->select();
+        return view('user/userlist', [
+            'groupslist' => $groupslist,
+            'brokerlist' => $brokerlist,
+        ]);
+    }
+
+    public function userForm()
+    {
+        $partner_id    = $this->access_partner['id'];
+        $brokerlist    = BrokerModel::where('pid|id',  $partner_id)->order(['id' => 'desc'])->select();
+        $brokeridarr = $brokerlist->column('id');
+        $id            = input('id/d', 0);
+        $user          = UserModel::whereIn('brokerid', $brokeridarr)->findOrEmpty($id);
+        $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 = ComjobsCate::select();
+        return view('user/userform', [
+            'brokerlist'    => $brokerlist,
+            'groupslist'    => $groupslist,
+            'user'          => $user,
+            'willlist'      => $willlist,
+            'usertags'      => $usertags,
+            'emptimelist'   => $emptimelist,
+            'communitylist' => $communitylist,
+            'comlist'       => $comlist,
+        ]);
+    }
+
+    public function fieldUser()
+    {
+        $partner_id     = $this->access_partner['id'];
+        $brokeridarr = BrokerModel::where('pid|id', '=', $partner_id)->column('id');
+        $id          = input('id/d', 0);
+        $user        = UserModel::whereIn('brokerid', $brokeridarr)->findOrEmpty($id);
+        if ($user->isEmpty()) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "信息不存在",
+            ]));
+        } else {
+            $user->save([
+                input('field/s') => input('value/s'),
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function listUser()
+    {
+        $partner_id  = $this->access_partner['id'];
+        $limit       = input('limit', 20);
+        $page        = input('page', 1);
+        $map         = [];
+        $brokeridarr = BrokerModel::where('pid', '=', $partner_id)->column('id');
+        if (!empty($brokeridarr)) {
+            $map[] = ['brokerid', 'in', $brokeridarr];
+        } else {
+            $map[] = ['brokerid', '=', -1];
+        }
+        $keywords = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['nickname|realname|mobile', 'like', '%' . $keywords . '%', 'or'];
+        }
+        $groupsid = input('groupsid/d');
+        if (!empty($groupsid)) {
+            $map[] = ['groupsid', '=', $groupsid];
+        }
+        $brokerid = input('brokerid/d');
+        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];
+        }
+        $list  = UserModel::with(['userGroups', 'broker'])->where($map)->order('id', 'desc')->limit($limit)->page($page)->append(['status_text', 'isvip_text', 'authstatus_text', 'followstatus_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()
+    {
+        $agentid     = $this->access_agent['id'];
+        $map         = [];
+        $brokeridarr = BrokerModel::where('agentid', '=', $agentid)->column('id');
+        $map[]       = ['brokerid', 'in', $brokeridarr];
+        $map[]       = ['brokerid', '<>', 0];
+        $keywords    = input('keywords/s');
+        if (!empty($keywords)) {
+            $map[] = ['nickname|realname|mobile', 'like', '%' . $keywords . '%', 'or'];
+        }
+        $groupsid = input('groupsid/d');
+        if (!empty($groupsid)) {
+            $map[] = ['groupsid', '=', $groupsid];
+        }
+        $brokerid = input('brokerid/d');
+        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'])->where($map)->order('id', 'desc')->append(['status_text', 'isvip_text', 'authstatus_text', 'followstatus_text'])->select()->toArray();
+        $xlsCell = [
+            ['id', '表ID'],
+            ['nickname', '昵称'],
+            ['realname', '姓名'],
+            ['mobile', '手机号'],
+            ['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.title', '经纪人'],
+            ['createtime', '注册时间'],
+        ];
+        export_excel("系统用户", $xlsCell, $xlsData);
+    }
+
+    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(),
+            ]));
+        }
+        $data     = [
+            'groupsid'       => input('groupsid/d', 0),
+            'brokerid'       => input('brokerid/d', 0),
+            'nickname'       => input('nickname/s', ""),
+            'avatar'         => input('avatar/s', ""),
+            'realname'       => input('realname/s', ""),
+            'mobile'         => $mobile,
+            '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'        => input('address/s', ""),
+            'education'      => input('education/s', ""),
+            'jobintention'   => input('jobintention/s', ""),
+            'workexperience' => input('workexperience/s', ""),
+            'eduexperience'  => input('eduexperience/s', ""),
+            'followstatus'   => input('followstatus/d', 1),
+            'bankcard'       => input('bankcard/a', []),
+            'skill_cert'     => array_values(input('skill_cert/a', [])),
+        ];
+        $password = input('password/s');
+        if (empty($id)) {
+            $data['integral']   = 0;
+            $data['inttotal']   = 0;
+            $data['createtime'] = time();
+            $user               = UserModel::create($data);
+            $auths              = 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;
+            $user       = UserModel::update($data);
+            $adata      = ['identifier' => $mobile];
+            if (!empty($password)) {
+                $adata['password'] = md5($password);
+            }
+            UserAuthsModel::update($adata, ['userid' => $id, 'identitytype' => 'mobile']);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+
+}

+ 27 - 0
app/partner/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/partner/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,
+];

+ 17 - 0
app/partner/provider.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>
+// +----------------------------------------------------------------------
+
+use app\partner\Request;
+
+// 容器Provider定义文件
+return [
+    'think\Request'          => Request::class,
+];

+ 224 - 0
app/partner/view/broker/brokerform.html

@@ -0,0 +1,224 @@
+<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-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="{:array_get($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"><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" pane>
+							<label class="layui-form-label">类型</label>
+							<div class="layui-input-block">
+								<input type="radio" name="type" value="1" title="经纪人" {eq name="broker.type|default=1" value="1" }checked{/eq} />
+								<input type="radio" name="type" value="2" title="红色合伙人" {eq name="broker.type" value="2" }checked{/eq} />
+								<input type="radio" name="type" value="3" title="省外经纪人" {eq name="broker.type" value="3" }checked{/eq} />
+							</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">
+							<label class="layui-form-label">镇街/村社区</label>
+							<div class="layui-input-block" id="townvillage">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">区域</label>
+							<div class="layui-input-block">
+								<input type="text" name="region" value="{$broker.region}" 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="{$broker.longitude}" lay-verify="required" placeholder="经度"
+									   autocomplete="off" class="layui-input">
+							</div>
+							<div class="layui-input-inline">
+								<input type="text" name="latitude" value="{$broker.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 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 townvillage = selectN({
+			elem: '#townvillage',
+			search: [true, true],
+			tips: ["请选择镇街", "请选择村社区"],
+			data: {$townlist|raw},
+			selected: ['{$broker['town']}', '{$broker['village']}'],
+			field: { idName: 'name', titleName: 'name', childName: 'child' }
+		});
+
+		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-broker-brokerform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.basePartnerUrl + '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>

+ 238 - 0
app/partner/view/broker/brokerlist.html

@@ -0,0 +1,238 @@
+<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="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>
+			</div>
+
+			<table id="LAY-broker-brokerlist-table" lay-filter="LAY-broker-brokerlist-table"></table>
+			<script type="text/html" id="address">
+				{{d.town}} - {{d.village}}
+			</script>
+			<script type="text/html" id="muserTpl">
+				{{#  if(d.userid != 0){ }}
+					{{d.muser.realname}} - {{d.muser.mobile}} 
+				{{#  } }}
+			</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-xs" lay-event="income"><i class="layui-icon layui-icon-table"></i>收益明细</a>
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="transfer"><i class="layui-icon layui-icon-spread-left"></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>
+	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.basePartnerUrl + 'broker/listbroker',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'title', title: '姓名', edit: 'text' },
+					{ field: 'mobile', title: '手机号' },
+					{ field: 'income', title: '收益', width: 120 },
+					{ field: 'income_total', title: '总收益', width: 120 },
+					{ field: 'muser', title: '关联的用户(姓名-手机号)', templet: '#muserTpl', minWidth: 250, align: 'left' },
+					{ field: 'type_text', title: '类型', width: 100, align: 'center' },
+					{ field: 'address', title: '镇街', templet: '#address' },
+					{ field: 'region', title: '区域' },
+					{ field: 'agenttitle', title: '代理门店', templet: '#agenttitleTpl' },
+					{ field: 'usercount', title: '用户邀请数', templet: '#usercountTpl', width: 100, align: 'center' },
+					{ field: 'weixin', title: '微信号', edit: 'text' },
+					{ field: 'qq', title: 'QQ号', edit: 'text' },
+					{ field: 'status_text', title: '状态', width: 80, align: 'center' },
+					{ field: 'powerreport_text', title: '报备权限', width: 100, align: 'center' },
+					{ field: 'createtime', title: '创建时间', width: 170 },
+					{ title: '操作', width: 420, 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.basePartnerUrl + '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.confirm('确定删除此经纪人吗?', function(index) {
+					admin.req({
+						url: setter.basePartnerUrl + 'broker/delbroker',
+						data: {
+							password: value,
+							idarr: idarr
+						},
+						done: function(res) {
+							obj.del();
+							layer.msg('已删除');
+						}
+					});
+					table.reload('LAY-broker-brokerlist-table');
+					layer.msg('已删除');
+				});
+			},
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加经纪人',
+					content: 'brokerform.html?id=0',
+					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.confirm('确定删除此经纪人吗?', function(index) {
+					admin.req({
+						url: setter.basePartnerUrl + 'broker/delbroker',
+						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: 'brokerform.html?id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'transfer') {
+				var index = layer.open({
+					type: 2,
+					title: '转移下线',
+					content: 'transferfrom.html?broker_id=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'income') {
+				index = layer.open({
+					type: 2,
+					title: '收益明细',
+					content: 'incomelist.html?brokerid=' + data.id,
+					maxmin: true,
+					area: ['750px', '480px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'settle') {
+				layer.prompt({
+					formType: 0,
+					title: '请输入要结算的金额'
+				}, function(value, index) {
+					layer.close(index);
+					layer.confirm('确定要结算吗?', function(index) {
+						admin.req({
+							url: setter.basePartnerUrl + 'broker/settleIncome',
+							data: {
+								value: value,
+								brokerid: data.id
+							},
+							done: function(res) {
+								table.reload('LAY-broker-brokerlist-table');
+							}
+						});
+						layer.close(index);
+					});
+				});
+			}
+		});
+
+		$('.layui-btn.layuiadmin-btn').on('click', function() {
+			var type = $(this).data('type');
+			active[type] ? active[type].call(this) : '';
+		});
+
+	});
+</script>

+ 39 - 0
app/partner/view/broker/incomelist.html

@@ -0,0 +1,39 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-body">
+			<table id="LAY-broker-incomelist-table" lay-filter="LAY-broker-brokerlist-table"></table>
+		</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-incomelist-table',
+			url: setter.basePartnerUrl + 'broker/listincome?brokerid={$brokerid}',
+			cols: [
+				[
+					{ field: 'title', title: '标题' },
+					{ field: 'value', title: '收益', width: 120 },
+					{ field: 'remark', title: '备注' },
+					{ field: 'createtime', title: '时间'},
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 150,
+			text: '对不起,加载出现异常!'
+		});
+	});
+</script>

+ 59 - 0
app/partner/view/broker/transferform.html

@@ -0,0 +1,59 @@
+<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-transferform-edit">
+                        <input type="hidden" name="origin_broker_id" value="{$origin_broker_id}">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">对方名称</label>
+                            <div class="layui-input-block" id="broker_id">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="LAY-broker-transferform-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', 'layarea'], function () {
+        var $ = layui.$, setter = layui.setter, admin = layui.admin, selectN = layui.selectN,form = layui.form;
+        form.render();
+
+        var workeragent = selectN({
+            elem: '#broker_id',
+            search: [true],
+            tips: ["请选择对方姓名"],
+            data: {$broker_list|raw},
+            field: { idName: 'id', titleName: 'title'}
+        });
+
+        form.on('submit(LAY-broker-transferform-edit-submit)', function (obj) {
+            var index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: setter.basePartnerUrl + 'broker/edittransfer',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('LAY-broker-brokerlist-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+    });
+</script>

+ 229 - 0
app/partner/view/home/console.html

@@ -0,0 +1,229 @@
+<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">
+					<div class="layui-carousel layadmin-carousel layadmin-backlog">
+						<div carousel-item>
+							<ul class="layui-row layui-col-space10">
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>今日新增用户</h3>
+										<p><cite>{$tuserCount}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>昨日新增用户</h3>
+										<p><cite>{$yuserCount}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>累计用户</h3>
+										<p><cite>{$userCount}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>经纪人</h3>
+										<p><cite>{$brokerCount}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>个人当前收入(元)</h3>
+										<p><cite>{$partner.income}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>个人总收入(元)</h3>
+										<p><cite>{$partner.income_total}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>小组当前收入(元)</h3>
+										<p><cite>{$partnerIncome}</cite></p>
+									</a>
+								</li>
+								<li class="layui-col-xs3">
+									<a href="javascript:;" class="layadmin-backlog-body">
+										<h3>小组总收入(元)</h3>
+										<p><cite>{$partnerIncomeTotal}</cite></p>
+									</a>
+								</li>
+							</ul>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+
+
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">数据概览</div>
+				<div class="layui-card-body">
+					<div class="layui-carousel layadmin-carousel layadmin-dataview" data-anim="fade" lay-filter="LAY-index-dataview">
+						<div carousel-item id="LAY-index-dataview">
+							<div><i class="layui-icon layui-icon-loading1 layadmin-loading"></i></div>
+						</div>
+					</div>
+				</div>
+			</div>
+
+		</div>
+
+
+
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'admin', 'carousel', 'echarts'], function() {
+		var $ = layui.$,
+			admin = layui.admin,
+			carousel = layui.carousel,
+			element = layui.element,
+			echarts = layui.echarts,
+			device = layui.device();
+		//轮播切换
+		$('.layadmin-carousel').each(function() {
+			var othis = $(this);
+			carousel.render({
+				elem: this,
+				width: '100%',
+				arrow: 'none',
+				interval: othis.data('interval'),
+				autoplay: othis.data('autoplay') === true,
+				trigger: (device.ios || device.android) ? 'click' : 'hover',
+				anim: othis.data('anim')
+			});
+		});
+		element.render('progress');
+
+
+
+
+
+		var echartsApp = [],
+			options = [
+				/*//最近一周报备趋势
+				{
+					title: {
+						text: '最近一月报备趋势',
+						x: 'center',
+						textStyle: {
+							fontSize: 14
+						}
+					},
+					tooltip: { //提示框
+						trigger: 'axis',
+						formatter: "{b}<br>新增报备:{c}"
+					},
+					xAxis: [{ //X轴
+						type: 'category',
+						data: {$entrynamearr|raw|default="[]"}
+					}],
+					yAxis: [{ //Y轴
+						type: 'value'
+					}],
+					series: [{ //内容
+						type: 'line',
+						data: {$entryvaluearr|raw|default="[]"}
+					}]
+				},
+
+				//报备信息分布
+				{
+					title: {
+						text: '报备信息分布',
+						x: 'center',
+						textStyle: {
+							fontSize: 14
+						}
+					},
+					tooltip: {
+						trigger: 'item',
+						formatter: "{a} <br/>{b} : {c} ({d}%)"
+					},
+					legend: {
+						orient: 'vertical',
+						x: 'left',
+						data: {$entryfnamearr|raw|default="[]"}
+					},
+					series: [{
+						name: '报备工厂',
+						type: 'pie',
+						radius: '55%',
+						center: ['50%', '50%'],
+						data: {$entryfvaluearr|raw|default="[]"}
+					}]
+				},*/
+
+				//新增的用户量
+				{
+					title: {
+						text: '最近一月新增的用户量',
+						x: 'center',
+						textStyle: {
+							fontSize: 14
+						}
+					},
+					tooltip: { //提示框
+						trigger: 'axis',
+						formatter: "{b}<br>新增用户:{c}"
+					},
+					xAxis: [{ //X轴
+						type: 'category',
+						data: {$usernamearr|raw|default="[]"}
+					}],
+					yAxis: [{ //Y轴
+						type: 'value'
+					}],
+					series: [{ //内容
+						type: 'line',
+						data: {$uservaluearr|raw|default="[]"}
+					}]
+				}
+			],
+			elemDataView = $('#LAY-index-dataview').children('div'),
+			renderDataView = function(index) {
+				echartsApp[index] = echarts.init(elemDataView[index], layui.echartsTheme);
+				echartsApp[index].setOption(options[index]);
+				//window.onresize = echartsApp[index].resize;
+				admin.resize(function() {
+					echartsApp[index].resize();
+				});
+			};
+		//没找到DOM,终止执行
+		if (!elemDataView[0]) return;
+		renderDataView(0);
+
+		//监听数据概览轮播
+		var carouselIndex = 0;
+		carousel.on('change(LAY-index-dataview)', function(obj) {
+			renderDataView(carouselIndex = obj.index);
+		});
+
+		//监听侧边伸缩
+		layui.admin.on('side', function() {
+			setTimeout(function() {
+				renderDataView(carouselIndex);
+			}, 300);
+		});
+
+		//监听路由
+		layui.admin.on('hash(tab)', function() {
+			layui.router().path.join('') || renderDataView(carouselIndex);
+		});
+
+	});
+</script>

+ 133 - 0
app/partner/view/index.html

@@ -0,0 +1,133 @@
+<div id="LAY_app">
+	<div class="layui-layout layui-layout-admin">
+		<div class="layui-header">
+			<!-- 头部区域 -->
+			<ul class="layui-nav layui-layout-left">
+				<li class="layui-nav-item layadmin-flexible" lay-unselect>
+					<a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
+						<i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item" lay-unselect>
+					<a href="javascript:;" layadmin-event="refresh" title="刷新">
+						<i class="layui-icon layui-icon-refresh-3"></i>
+					</a>
+				</li>
+			</ul>
+			<ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
+				<li class="layui-nav-item layui-hide-xs" lay-unselect>
+					<a href="javascript:;" layadmin-event="theme">
+						<i class="layui-icon layui-icon-theme"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item layui-hide-xs" lay-unselect>
+					<a href="javascript:;" layadmin-event="note">
+						<i class="layui-icon layui-icon-note"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item" lay-unselect>
+					<a href="javascript:;">
+						<cite>{$access_partner['title']}【{$access_partner['mobile']}】</cite>
+					</a>
+					<dl class="layui-nav-child">
+						<dd style="text-align: center;"><a lay-href="{:url('/partner/mypassword')}">修改密码</a></dd>
+						<hr>
+						<dd style="text-align: center;"><a href="{:url('/login/logout')}">退出</a></dd>
+					</dl>
+				</li>
+				<li class="layui-nav-item layui-hide-xs" lay-unselect>
+					<a href="javascript:;" layadmin-event="fullscreen">
+						<i class="layui-icon layui-icon-screen-full"></i>
+					</a>
+				</li>
+				<li class="layui-nav-item layui-hide-xs" lay-unselect>
+					<a href="javascript:;" layadmin-event="about"><i class="layui-icon layui-icon-more-vertical"></i></a>
+				</li>
+				<li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-unselect>
+					<a href="javascript:;" layadmin-event="more"><i class="layui-icon layui-icon-more-vertical"></i></a>
+				</li>
+			</ul>
+		</div>
+
+		<!-- 侧边菜单 -->
+		<div class="layui-side layui-side-menu">
+			<div class="layui-side-scroll">
+				<div class="layui-logo">
+					<span>就业合伙人管理中心</span>
+				</div>
+
+				<ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" lay-filter="layadmin-system-side-menu">
+
+					<li data-name="home" class="layui-nav-item">
+						<a lay-href="{:url('/home/console')}" lay-tips="首页">
+							<i class="layui-icon layui-icon-home"></i>
+							<cite>首页</cite>
+						</a>
+					</li>
+
+					<li data-name="user" class="layui-nav-item">
+						<a lay-href="{:url('/user/userlist')}" lay-tips="用户管理">
+							<i class="layui-icon layui-icon-user"></i>
+							<cite>用户管理</cite>
+						</a>
+					</li>
+					<li data-name="broker" class="layui-nav-item">
+						<a lay-href="{:url('/broker/brokerlist')}" lay-tips="经纪人管理">
+							<i class="layui-icon layui-icon-engine"></i>
+							<cite>经纪人管理</cite>
+						</a>
+					</li>
+					<li data-name="mypassword" class="layui-nav-item">
+						<a lay-href="{:url('/partner/mypassword')}" lay-tips="修改密码">
+							<i class="layui-icon layui-icon-util"></i>
+							<cite>修改密码</cite>
+						</a>
+					</li>
+
+				</ul>
+			</div>
+		</div>
+
+		<!-- 页面标签 -->
+		<div class="layadmin-pagetabs" id="LAY_app_tabs">
+			<div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
+			<div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
+			<div class="layui-icon layadmin-tabs-control layui-icon-down">
+				<ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
+					<li class="layui-nav-item" lay-unselect>
+						<a href="javascript:;"></a>
+						<dl class="layui-nav-child layui-anim-fadein">
+							<dd layadmin-event="closeThisTabs"><a href="javascript:;">关闭当前标签页</a></dd>
+							<dd layadmin-event="closeOtherTabs"><a href="javascript:;">关闭其它标签页</a></dd>
+							<dd layadmin-event="closeAllTabs"><a href="javascript:;">关闭全部标签页</a></dd>
+						</dl>
+					</li>
+				</ul>
+			</div>
+			<div class="layui-tab" lay-unauto lay-allowClose="true" lay-filter="layadmin-layout-tabs">
+				<ul class="layui-tab-title" id="LAY_app_tabsheader">
+					<li lay-id="{:url('/home/console')}" lay-attr="{:url('/home/console')}" class="layui-this"><i class="layui-icon layui-icon-home"></i></li>
+				</ul>
+			</div>
+		</div>
+
+
+		<!-- 主体内容 -->
+		<div class="layui-body" id="LAY_app_body">
+			<div class="layadmin-tabsbody-item layui-show">
+				<iframe src="{:url('/home/console')}" frameborder="0" class="layadmin-iframe"></iframe>
+			</div>
+		</div>
+
+		<!-- 辅助元素,一般用于移动设备下遮罩 -->
+		<div class="layadmin-body-shade" layadmin-event="shade"></div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use('index');
+</script>

+ 3 - 0
app/partner/view/layout.html

@@ -0,0 +1,3 @@
+{include file="public/header" /}
+ {__CONTENT__}
+{include file="public/footer" /}

+ 81 - 0
app/partner/view/login/login.html

@@ -0,0 +1,81 @@
+<div class="layadmin-user-login layadmin-user-display-show" id="LAY-login-login" style="display: none;">
+	<div class="layadmin-user-login-main">
+		<div class="layadmin-user-login-box layadmin-user-login-header">
+			<h2>蓝领招聘 - 就业合伙人</h2>
+			<p>蓝领招聘管理一站式解决方案</p>
+		</div>
+		<div class="layadmin-user-login-box layadmin-user-login-body layui-form">
+			<div class="layui-form-item">
+				<label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-login-login-username"></label>
+				<input type="text" name="mobile" id="LAY-login-login-adminname" lay-verify="required" placeholder="手机号" class="layui-input">
+			</div>
+			<div class="layui-form-item">
+				<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-login-login-password"></label>
+				<input type="password" name="password" id="LAY-login-login-password" lay-verify="required" placeholder="登录密码" class="layui-input">
+			</div>
+			<div class="layui-form-item">
+				<div class="layui-row">
+					<div class="layui-col-xs7">
+						<label class="layadmin-user-login-icon layui-icon layui-icon-vercode" for="LAY-login-login-vercode"></label>
+						<input type="text" name="vercode" id="LAY-login-login-vercode" lay-verify="required" placeholder="图形验证码" class="layui-input">
+					</div>
+					<div class="layui-col-xs5">
+						<div style="margin-left: 10px;" class="echoui-login-captcha">
+							{:captcha_img()}
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="layui-form-item">
+				<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-login-login-submit">登 入</button>
+			</div>
+			<div class="layui-row layui-col-space10">
+				<div class="layui-col-md4" style="text-align:center;">
+					<a href="/admin.php">总后台</a>
+				</div>
+				<div class="layui-col-md4" style="text-align:center;">
+					<a href="/worker.php">劳务公司</a>
+				</div>
+				<div class="layui-col-md4" style="text-align:center;">
+					<a href="/agent.php">门店</a>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<div class="layui-trans layadmin-user-login-footer">
+		<p>© 2019 - 2020 <a href="{$domain}" target="_blank">{$_SERVER['HTTP_HOST']}</a></p>
+		<p> &nbsp; </p>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/'
+	}).extend({
+		index: 'lib/index'
+	}).use(['index', 'user'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			router = layui.router(),
+			search = router.search;
+		form.render();
+
+		form.on('submit(LAY-login-login-submit)', function(obj) {
+			admin.req({
+				url: setter.basePartnerUrl + 'login/login',
+				data: obj.field,
+				success: function(res) {
+					if (res.code == 0) {
+						location.href = setter.basePartnerUrl + 'home';
+					} else {
+						$('.echoui-login-captcha img').click();
+					}
+				}
+			});
+
+		});
+	});
+</script>

+ 70 - 0
app/partner/view/partner/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-agent-mypassword-form">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>当前密码</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-agent-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-agent-mypassword-form-submit)', function(obj) {
+			admin.req({
+				url: setter.baseAgentUrl + 'agent/editmypassword',
+				data: obj.field,
+				done: function(res) {
+					layer.msg('密码修改成功,请重新登录。', {
+						icon: 1,
+						time: 1000
+					}, function() {
+						top.location.href = setter.baseAgentUrl + 'login';
+					});
+				}
+			});
+
+		});
+	});
+</script>

+ 3 - 0
app/partner/view/public/footer.html

@@ -0,0 +1,3 @@
+
+	</body>
+</html>

+ 19 - 0
app/partner/view/public/header.html

@@ -0,0 +1,19 @@
+<!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">
+		<link rel="stylesheet" href="/static/echoui/style/login.css" media="all">
+		<link rel="stylesheet" href="/static/jscss/echoui.css" media="all">
+		<script src="/static/echoui/layui/layui.js"></script>
+		 
+		<script src="/static/jscss/echoui.js"></script>
+		<script src="https://webapi.amap.com/maps?v=1.4.15&key={$Think.AMAP_KEY}&plugin=AMap.Autocomplete,AMap.PlaceSearch"></script>
+	</head>
+	<body>
+	

+ 112 - 0
app/partner/view/user/follow.html

@@ -0,0 +1,112 @@
+<div class="layui-fluid">
+	<div class="layui-card">
+		<div class="layui-card-header">用户跟进信息</div>
+		<div class="layui-card-body">
+
+			<div class="layui-form layui-form-pane" lay-filter="LAY-user-follow-edit">
+				<input type="hidden" name="userid" value="{$user.id}">
+				<div class="layui-form-item">
+					<label class="layui-form-label">用户信息</label>
+					<div class="layui-input-block">
+						<input type="text" name="userinfo" value="{$user.nickname} - {$user.mobile}" readonly class="layui-input layui-disabled">
+					</div>
+				</div>
+				<div class="layui-form-item" pane>
+					<label class="layui-form-label">跟进方式</label>
+					<div class="layui-input-block">
+						<input type="radio" name="ftype" value="电话" title="电话" checked />
+						<input type="radio" name="ftype" value="微信/QQ" title="微信/QQ" />
+						<input type="radio" name="ftype" value="其他" title="其他" />
+					</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="remark" lay-verify="required" placeholder="请输入..." class="layui-textarea"></textarea>
+					</div>
+				</div>
+				<div class="layui-form-item" pane>
+					<label class="layui-form-label">跟进状态</label>
+					<div class="layui-input-block">
+						<input type="radio" name="followstatus" value="1" title="未跟进" {eq name="user.followstatus|default=1" value="1" }checked{/eq} />
+						<input type="radio" name="followstatus" value="2" title="未面试" {eq name="user.followstatus" value="2" }checked{/eq} />
+						<input type="radio" name="followstatus" value="3" title="面试通过" {eq name="user.followstatus" value="3" }checked{/eq} />
+						<input type="radio" name="followstatus" value="4" title="面试未通过" {eq name="user.followstatus" value="4" }checked{/eq} />
+						<input type="radio" name="followstatus" value="5" title="用户放弃" {eq name="user.followstatus" value="5" }checked{/eq} />
+						<input type="radio" name="followstatus" value="6" title="已入职" {eq name="user.followstatus" value="6" }checked{/eq} />
+						<input type="radio" name="followstatus" value="7" title="已离职" {eq name="user.followstatus" value="7" }checked{/eq} />
+					</div>
+				</div>
+				<div class="layui-form-item">
+					<div class="layui-input-block">
+						<input type="button" lay-submit lay-filter="LAY-user-follow-edit-submit" value="确认" class="layui-btn">
+					</div>
+				</div>
+			</div>
+
+			<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
+				<legend>以往跟进记录</legend>
+			</fieldset>
+			<ul class="layui-timeline">
+				{volist name="followlist" 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.createtime} 【{$vo.ftype}】
+						</h3>
+						<p>{$vo.remark}</p>
+					</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">已加载完 ( 最多显示最近100条跟进记录 )</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(LAY-user-follow-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.basePartnerUrl + 'user/editfollow',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					var findex = parent.layer.open({
+						type: 2,
+						title: '用户【{$user.nickname} - {$user.mobile}】跟进记录',
+						content: 'follow.html?userid={$user.id}',
+						maxmin: true,
+						area: ['750px', '550px']
+					});
+					parent.layui.table.reload('LAY-user-userlist-table');
+					parent.layer.close(index);
+					parent.layer.full(findex);
+				}
+			});
+		});
+
+	});
+</script>

+ 452 - 0
app/partner/view/user/userform.html

@@ -0,0 +1,452 @@
+<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-user-userform-edit">
+						<input type="hidden" name="id" value="{$user.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>用户组</label>
+							<div class="layui-input-block">
+								<select name="groupsid" lay-verify="required">
+									<option value="">请选择用户组</option>
+									{volist name="groupslist" id="vo"}
+									<option value="{$vo.id}" {$user.groupsid===$vo.id ? 'selected' : '' }>{$vo.title}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">经纪人</label>
+							<div class="layui-input-block">
+								<select name="brokerid" lay-search>
+									<option value="">全部经纪人(可搜索)</option>
+									{volist name="brokerlist" id="vo"}
+									<option value="{$vo['id']}" {$user.brokerid==$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="nickname" value="{$user.nickname}" 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="avatar" data-amount="1">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 最佳尺寸:320px*320px </div>
+									<div class="layui-upload-list echo-attachment-image-list" id="avatar">
+										{notempty name="user.avatar"}
+										<div>
+											<input type="hidden" name="avatar" value="{$user.avatar}">
+											<img src="{$user.avatar}">
+										</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="realname" value="{$user.realname}" 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="mobile" value="{$user.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="password" value="" 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="user.status|default=1" value="1" }checked{/eq} />
+								<input type="radio" name="status" value="2" title="已通过" {eq name="user.status" value="2" }checked{/eq} />
+								<input type="radio" name="status" value="3" title="未通过" {eq name="user.status" value="3" }checked{/eq} />
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">是否VIP</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="isvip" {eq name="user.isvip|default=1" value="2" }checked{/eq}
+								 lay-skin="switch" lay-text="是|否" value="2">
+							</div>
+						</div>
+
+						<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
+							<legend>银行卡信息</legend>
+						</fieldset>
+						<div class="layui-form-item">
+							<label class="layui-form-label">开户行名</label>
+							<div class="layui-input-block">
+								<input type="text" name="bankcard[openbank]" value="<?php empty($user['bankcard']) ? '' : $user['bankcard']['openbank']?>" 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="bankcard[account]" value="<?php empty($user['bankcard']) ? '' : $user['bankcard']['account']?>" 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="bankcard[number]" value="<?php empty($user['bankcard']) ? '' : $user['bankcard']['number']?>" placeholder="请输入..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+
+						<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
+							<legend>认证信息</legend>
+						</fieldset>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">实名认证</label>
+							<div class="layui-input-block">
+								<input type="radio" name="authstatus" value="1" title="待认证" {eq name="user.authstatus|default=1" value="1" }checked{/eq} />
+								<input type="radio" name="authstatus" value="2" title="待审核" {eq name="user.authstatus" value="2" }checked{/eq} />
+								<input type="radio" name="authstatus" value="3" title="已认证" {eq name="user.authstatus" value="3" }checked{/eq} />
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">认证备注</label>
+							<div class="layui-input-block">
+								<input type="text" name="authremark" value="{$user.authremark}" 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="idcardzpic" data-amount="1">上传图片</button>
+									<div class="layui-upload-list echo-attachment-image-list" id="idcardzpic">
+										{notempty name="user.idcardzpic"}
+										<div>
+											<input type="hidden" name="idcardzpic" value="{$user.idcardzpic}">
+											<img src="{$user.idcardzpic}">
+										</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="idcardfpic" data-amount="1">上传图片</button>
+									<div class="layui-upload-list echo-attachment-image-list" id="idcardfpic">
+										{notempty name="user.idcardfpic"}
+										<div>
+											<input type="hidden" name="idcardfpic" value="{$user.idcardfpic}">
+											<img src="{$user.idcardfpic}">
+										</div>
+										{/notempty}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">身份证号</label>
+							<div class="layui-input-block">
+								<input type="text" name="idcard" value="{$user.idcard}" 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="gender" value="1" title="男" {eq name="user.gender|default=1" value="1" }checked{/eq} />
+								<input type="radio" name="gender" value="2" title="女" {eq name="user.gender" 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="birthday" id="birthday" value="{$user.birthday}" placeholder="请选择..." autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+
+						<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
+							<legend>简历信息</legend>
+						</fieldset>
+						<div class="layui-form-item">
+							<label class="layui-form-label">求职意向</label>
+							<div class="layui-input-block">
+								<!--<textarea name="jobintention" placeholder="请输入求职意向" class="layui-textarea">{$user.jobintention}</textarea>-->
+								<select name="jobintention" lay-search lay-filter="jobintention">
+									<option value="">全部企业(可搜索)</option>
+									{volist name="willlist" id="vo"}
+									<option value="{$vo['id']}" {if $user.jobintention == $vo.id}selected{/if}>{$vo['title']}</option>
+									{/volist}
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item emp_time_form" {if condition="!empty($user) && $user['jobintention']==1"}style="display:none"{/if}>
+							<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="!$user->isEmpty() && !empty($user['emp_time']) && in_array($vo['name'],$user['emp_time'])"}
+									   checked
+									   {/if}
+								/>
+								{/volist}
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">上班地点</label>
+							<div class="layui-input-block">
+								{volist name="communitylist" id="vo"}
+								<input type="checkbox" name="work_place[]" value="{$vo.name}" title="{$vo.name}"
+									   {if condition="!$user->isEmpty() && !empty($user['work_place']) && in_array($vo['name'],$user['work_place'])"}
+									   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" lay-filter="com_cate_type" name="com_cate_type" value="1" title="选择项方式" {eq name="user.com_cate_type|default=1" value="1" }checked{/eq} />
+								<input type="radio" lay-filter="com_cate_type" name="com_cate_type" value="2" title="手工填写方式" {eq name="user.com_cate_type" value="2" }checked{/eq} />
+							</div>
+						</div>
+						<div class="layui-form-item com_cate_form" {if condition="!empty($user) && $user['com_cate_type']==2"}style="display:none"{/if}>
+							<label class="layui-form-label">岗位类型</label>
+							<div class="layui-input-block">
+								{volist name="comlist" id="vo"}
+								<input type="checkbox" name="com_cate[]" value="{$vo.title}" title="{$vo.title}"
+									   {if condition="!$user->isEmpty() && !empty($user['com_cate']) && in_array($vo['title'],$user['com_cate'])"}
+									   checked
+									   {/if}
+								/>
+								{/volist}
+							</div>
+						</div>
+						<div class="layui-form-item com_cate_other_form" {if condition="!empty($user) && $user['com_cate_type']==1"}style="display:none"{/if}>
+							<label class="layui-form-label">岗位类型</label>
+							<div class="layui-input-block">
+								<input type="text" name="com_cate_other" value="{$user.com_cate_other}" placeholder="请输入岗位类型" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item user_tags_form">
+							<label class="layui-form-label">用户标签</label>
+							<div class="layui-input-block">
+								{volist name="usertags" id="vo"}
+								<input type="checkbox" name="user_tags[]" value="{$vo.name}" title="{$vo.name}"
+									   {if condition="!$user->isEmpty() && !empty($user['user_tags']) && in_array($vo['name'],$user['user_tags'])"}
+									   checked
+									   {/if}
+								/>
+								{/volist}
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">现居住地</label>
+							<div class="layui-input-block">
+								<input type="text" name="address" value="{$user.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="education" value="{$user.education}" placeholder="请输入学历" autocomplete="off" class="layui-input">-->
+								<select name="education" lay-search>
+									<option value="">全部(可搜索)</option>
+									<option value="1" {eq name="user.education" value="1"}selected{/eq}>初中及以下</option>
+									<option value="2" {eq name="user.education" value="2"}selected{/eq}>高中</option>
+									<option value="3" {eq name="user.education" value="3"}selected{/eq}>中技</option>
+									<option value="4" {eq name="user.education" value="4"}selected{/eq}>中专</option>
+									<option value="5" {eq name="user.education" value="5"}selected{/eq}>大专</option>
+									<option value="6" {eq name="user.education" value="6"}selected{/eq}>本科</option>
+									<option value="7" {eq name="user.education" value="7"}selected{/eq}>硕士</option>
+									<option value="8" {eq name="user.education" value="8"}selected{/eq}>博士</option>
+								</select>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">工作经验</label>
+							<div class="layui-input-block">
+								<!--<textarea name="workexperience" placeholder="请输入工作经验" class="layui-textarea">{$user.workexperience}</textarea>-->
+								<select name="workexperience" lay-search>
+									<option value="">全部(可搜索)</option>
+									<option value="1" {eq name="user.workexperience" value="1"}selected{/eq}>无经验</option>
+									<option value="2" {eq name="user.workexperience" value="2"}selected{/eq}>一年以下</option>
+									<option value="3" {eq name="user.workexperience" value="3"}selected{/eq}>1-3年</option>
+									<option value="4" {eq name="user.workexperience" value="4"}selected{/eq}>3-5年</option>
+									<option value="5" {eq name="user.workexperience" value="5"}selected{/eq}>5-10年</option>
+									<option value="6" {eq name="user.workexperience" value="6"}selected{/eq}>10年以上</option>
+								</select>
+
+							</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="skill_cert" data-amount="9">上传图片</button>
+									<div class="layui-upload-list echo-attachment-image-list" id="skill_cert">
+										{volist name="user.skill_cert" id="vo"}
+										<div>
+											<input type="hidden" name="skill_cert[]" 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="eduexperience" placeholder="请输入..." class="layui-textarea">{$user.eduexperience}</textarea>
+							</div>
+						</div>
+
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">跟进状态</label>
+							<div class="layui-input-block">
+								<input type="radio" name="followstatus" value="1" title="未跟进" {eq name="user.followstatus|default=1" value="1" }checked{/eq} />
+								<input type="radio" name="followstatus" value="2" title="未面试" {eq name="user.followstatus" value="2" }checked{/eq} />
+								<input type="radio" name="followstatus" value="3" title="面试通过" {eq name="user.followstatus" value="3" }checked{/eq} />
+								<input type="radio" name="followstatus" value="4" title="面试未通过" {eq name="user.followstatus" value="4" }checked{/eq} />
+								<input type="radio" name="followstatus" value="5" title="用户放弃" {eq name="user.followstatus" value="5" }checked{/eq} />
+								<input type="radio" name="followstatus" value="6" title="已入职" {eq name="user.followstatus" value="6" }checked{/eq} />
+								<input type="radio" name="followstatus" value="7" title="已离职" {eq name="user.followstatus" value="7" }checked{/eq} />
+							</div>
+						</div>
+
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-user-userform-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', 'laydate', 'selectN', 'selectM'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			laydate = layui.laydate,
+			upload = layui.upload,
+			selectN = layui.selectN,
+			selectM = layui.selectM;
+		form.render();
+
+		laydate.render({
+			elem: '#birthday',
+			type: 'date'
+		});
+		laydate.render({
+			elem: '#createtime',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-user-userform-edit-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAgentUrl + 'user/edituser',
+				type: 'post',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-user-userlist-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+
+		form.on('radio(com_cate_type)', function(data){
+			if (data.value==1) {
+				$('.com_cate_other_form').hide();
+				$('.com_cate_form').show();
+			} else {
+				$('.com_cate_form').hide();
+				$('.com_cate_other_form').show();
+			}
+		});
+
+		form.on('select(jobintention)', function(data){
+			if (data.value==1) {
+				$('.emp_time_form').hide();
+			} else {
+				$('.emp_time_form').show();
+			}
+		});
+
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAgentUrl + '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>

+ 229 - 0
app/partner/view/user/userlist.html

@@ -0,0 +1,229 @@
+<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-user-userlist-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="groupsid" lay-search>
+							<option value="">全部用户组(可搜索)</option>
+							{volist name="groupslist" 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="brokerid" lay-search>
+							<option value="">全部经纪人(可搜索)</option>
+							{volist name="brokerlist" 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>
+							<option value="3">未通过</option>
+						</select>
+					</div>
+				</div>
+				<div class="layui-inline">
+					<label class="layui-form-label">实名认证</label>
+					<div class="layui-input-block">
+						<select name="authstatus">
+							<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="followstatus">
+							<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-user-userlist-search-btn">
+						<i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+					</button>
+					<button class="layui-btn" lay-submit lay-filter="LAY-user-userlist-export-btn">
+						导出
+					</button>
+				</div>
+			</div>
+		</div>
+
+		<div class="layui-card-body">
+			<div style="padding-bottom: 10px;">
+				<button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+			</div>
+			<table id="LAY-user-userlist-table" lay-filter="LAY-user-userlist-table"></table>
+			<script type="text/html" id="avatarTpl">
+				{{#  if(d.avatar != ''){ }}
+				<div id="pic{{d.id}}" lay-event="pic">
+					<img style="width: 100%; height: 100%;" src="{{d.avatar}}">
+				</div>
+				{{#  } }}
+			</script>
+			<script type="text/html" id="groupsidTpl">
+				{{d.groupsid == 0 ? '' : d.userGroups.title}}
+			</script>
+			<script type="text/html" id="brokeridTpl">
+				{{d.brokerid == 0 ? '' : d.broker.title}}
+			</script>
+			<script type="text/html" id="setTpl">
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="follow"><i class="layui-icon layui-icon-engine"></i>跟进</a>
+				<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><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', 'table'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			table = layui.table;
+		form.render();
+
+		table.render({
+			elem: '#LAY-user-userlist-table',
+			url: setter.basePartnerUrl + 'user/listuser',
+			cols: [
+				[
+					{ type: 'checkbox', fixed: 'left' },
+					{ field: 'id', width: 80, title: '表ID', sort: true },
+					{ field: 'avatar', width: 60, title: '头像', templet: '#avatarTpl' },
+					{ field: 'nickname', title: '昵称', edit: 'text' },
+					{ field: 'realname', title: '姓名', edit: 'text' },
+					{ field: 'mobile', title: '手机号' },
+					{ field: 'status_text', title: '状态', minWidth: 100, align: 'center' },
+					{ field: 'isvip_text', title: '是否VIP', minWidth: 100, align: 'center' },
+					{ field: 'authstatus_text', title: '实名认证', minWidth: 100, align: 'center' },
+					{ field: 'groupsid', title: '用户组', templet: '#groupsidTpl' },
+					{ field: 'brokerid', title: '经纪人', templet: '#brokeridTpl' },
+					{ field: 'createtime', title: '注册时间', width: 170, sort: true },
+					{ field: 'followstatus_text', title: '跟进状态', minWidth: 150, align: 'center' },
+					{ title: '操作', minWidth: 220, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+				]
+			],
+			page: true,
+			limit: 50,
+			cellMinWidth: 200,
+			text: '对不起,加载出现异常!'
+		});
+
+		form.on('submit(LAY-user-userlist-search-btn)', function(data) {
+			table.reload('LAY-user-userlist-table', {
+				where: data.field,
+				page: {
+					curr: 1
+				}
+			});
+		});
+		form.on('submit(LAY-user-userlist-export-btn)', function(data) {
+			var url = setter.basePartnerUrl + 'user/exportuser?';
+			for (var item in data.field) {
+				url = url + '&' + item + '=' + data.field[item];
+			}
+			window.location.href = url;
+		});
+
+		//监听单元格编辑
+		table.on('edit(LAY-user-userlist-table)', function(obj) {
+			var id = obj.data.id,
+				field = obj.field,
+				value = obj.value;
+			admin.req({
+				url: setter.basePartnerUrl + 'user/fielduser',
+				data: { id: id, field: field, value: value },
+				done: function(res) {
+					layer.msg('修改成功');
+					layui.table.reload('LAY-user-userlist-table');
+				}
+			});
+		});
+
+		var active = {
+			add: function() {
+				var index = layer.open({
+					type: 2,
+					title: '添加用户',
+					content: 'userform.html?id=0',
+					maxmin: true,
+					area: ['550px', '550px']
+				});
+				layer.full(index);
+			}
+		};
+
+		table.on('tool(LAY-user-userlist-table)', function(obj) {
+			var data = obj.data;
+			if (obj.event === 'follow') {
+				var index = layer.open({
+					type: 2,
+					title: '用户【' + data.nickname + ' - ' + data.mobile + '】跟进记录',
+					content: 'follow.html?userid=' + data.id,
+					maxmin: true,
+					area: ['750px', '550px']
+				});
+				layer.full(index);
+			} else if (obj.event === 'edit') {
+				var index = layer.open({
+					type: 2,
+					title: '编辑用户',
+					content: 'userform.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>
+
+</body>
+</html>

+ 5 - 2
app/worker/view/login/login.html

@@ -22,12 +22,15 @@
 				<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="LAY-login-login-submit">登 入</button>
 			</div>
 			<div class="layui-row layui-col-space10">
-				<div class="layui-col-md6" style="text-align:center;">
+				<div class="layui-col-md4" style="text-align:center;">
 					<a href="/admin.php">总后台</a>
 				</div>
-				<div class="layui-col-md6" style="text-align:center;">
+				<div class="layui-col-md4" style="text-align:center;">
 					<a href="/agent.php">门店</a>
 				</div>
+				<div class="layui-col-md4" style="text-align:center;">
+					<a href="/partner.php">就业合伙人</a>
+				</div>
 			</div>
 		</div>
 	</div>

+ 24 - 0
public/partner.php

@@ -0,0 +1,24 @@
+<?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>
+// +----------------------------------------------------------------------
+
+// [ 应用入口文件 ]
+namespace think;
+
+require __DIR__ . '/../vendor/autoload.php';
+
+// 执行HTTP应用并响应
+$http = (new App())->http;
+
+$response = $http->run();
+
+$response->send();
+
+$http->end($response);