linwu hace 6 meses
padre
commit
55939fdc7a
Se han modificado 35 ficheros con 2505 adiciones y 6 borrados
  1. 322 0
      app/admin/controller/Human.php
  2. 2 2
      app/admin/controller/Talent.php
  3. 1 1
      app/admin/view/company/info.html
  4. 177 0
      app/admin/view/human/enterprise_apply.html
  5. 115 0
      app/admin/view/human/enterprise_form.html
  6. 167 0
      app/admin/view/human/enterprise_list.html
  7. 176 0
      app/admin/view/human/institution_apply.html
  8. 115 0
      app/admin/view/human/institution_form.html
  9. 167 0
      app/admin/view/human/institution_list.html
  10. 0 2
      app/common.php
  11. 29 0
      app/common/model/HumanEnterpriseApplyModel.php
  12. 24 0
      app/common/model/HumanEnterpriseModel.php
  13. 25 0
      app/common/model/HumanInstitutionApplyModel.php
  14. 28 0
      app/common/model/HumanInstitutionModel.php
  15. 21 0
      app/common/validate/HumanEnterpriseApplyValidate.php
  16. 23 0
      app/common/validate/HumanEnterpriseValidate.php
  17. 21 0
      app/common/validate/HumanInstitutionApplyValidate.php
  18. 23 0
      app/common/validate/HumanInstitutionValidate.php
  19. 0 1
      app/mobile/common.php
  20. 233 0
      app/mobile/controller/Human.php
  21. 10 0
      app/mobile/controller/Login.php
  22. 74 0
      app/mobile/view/human/enterprise_detail.html
  23. 139 0
      app/mobile/view/human/enterprise_form.html
  24. 125 0
      app/mobile/view/human/enterprise_list.html
  25. 46 0
      app/mobile/view/human/index.html
  26. 76 0
      app/mobile/view/human/institution_detail.html
  27. 93 0
      app/mobile/view/human/institution_form.html
  28. 135 0
      app/mobile/view/human/institution_list.html
  29. 57 0
      app/mobile/view/human/tips.html
  30. 29 0
      app/mobile/view/public/base_human.html
  31. 16 0
      app/mobile/view/public/meta_header_human.html
  32. BIN
      public/static/common/exl/human_enterprise.xls
  33. BIN
      public/static/common/exl/human_institution.xls
  34. 36 0
      public/static/mobile/css/icon.css
  35. BIN
      public/static/mobile/images/wechat_qrcode.png

+ 322 - 0
app/admin/controller/Human.php

@@ -0,0 +1,322 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\AdminBaseController;
+use app\common\model\HumanEnterpriseApplyModel;
+use app\common\model\HumanEnterpriseModel;
+use app\common\model\HumanInstitutionApplyModel;
+use app\common\model\HumanInstitutionModel;
+use app\common\validate\HumanEnterpriseValidate;
+use app\common\validate\HumanInstitutionValidate;
+use think\exception\ValidateException;
+
+class Human extends AdminBaseController
+{
+
+    /**
+     * 机构报名
+     */
+    public function institutionApply()
+    {
+        return view('', [
+            'status_list' => HumanInstitutionApplyModel::STATUS,
+        ]);
+    }
+
+    public function listInstitutionApply()
+    {
+        $map   = $this->dealEqualInput(['status'], $this->dealLikeInput(['name']));
+        $list  = HumanInstitutionApplyModel::where($map)
+            ->order(['status' => 'asc'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->append(['status_text'])
+            ->select();
+        $count = HumanInstitutionApplyModel::where($map)->count();
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    public function statusInstitutionApply()
+    {
+        $id_arr = input('id_arr/a');
+        $status = input('status', 1);
+        HumanInstitutionApplyModel::update(['status' => $status], ['id' => $id_arr]);
+        ajax_return();
+    }
+
+    /**
+     * 企业报名
+     */
+    public function enterpriseApply()
+    {
+        return view('', [
+            'status_list' => HumanEnterpriseApplyModel::STATUS,
+        ]);
+    }
+
+    public function listEnterpriseApply()
+    {
+        $map   = $this->dealEqualInput(['status'], $this->dealLikeInput(['name']));
+        $list  = HumanEnterpriseApplyModel::where($map)
+            ->order(['status' => 'asc'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->append(['status_text'])
+            ->select();
+        $count = HumanEnterpriseApplyModel::where($map)->count();
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    public function statusEnterpriseApply()
+    {
+        $id_arr = input('id_arr/a');
+        $status = input('status', 1);
+        HumanEnterpriseApplyModel::update(['status' => $status], ['id' => $id_arr]);
+        ajax_return();
+    }
+
+    /**
+     * 机构列表
+     */
+    public function institutionList()
+    {
+        return view('', [
+            'status_list' => HumanInstitutionModel::STATUS,
+        ]);
+    }
+
+    public function listInstitution()
+    {
+        $map   = $this->dealEqualInput(['status'], $this->dealLikeInput(['name']));
+        $list  = HumanInstitutionModel::where($map)
+            ->order(['priority' => 'desc', 'update_time' => 'desc'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->append(['status_text'])
+            ->select();
+        $count = HumanInstitutionModel::where($map)->count();
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    public function delInstitution()
+    {
+        $id_arr = input('id_arr/a');
+        HumanInstitutionModel::destroy($id_arr);
+        ajax_return();
+    }
+
+    /**
+     * 编辑
+     */
+    public function institutionForm()
+    {
+        $id   = input('id/d, 0');
+        $info = HumanInstitutionModel::find($id);
+
+        return view('', [
+            'info'           => $info,
+            'status_list'    => HumanInstitutionModel::STATUS,
+            'cooperate_list' => HumanInstitutionModel::COOPERATE,
+        ]);
+    }
+
+    public function editInstitution()
+    {
+        $data = input('post.');
+        try {
+            validate(HumanInstitutionValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            ajax_return(1, $e->getError());
+        }
+
+        if (empty($data['cooperate'])) {
+            $data['cooperate'] = [];
+        } else {
+            $data['cooperate'] = array_values($data['cooperate']);
+        }
+        if (empty($data['id'])) {
+            HumanInstitutionModel::create($data);
+        } else {
+            HumanInstitutionModel::update($data, ['id' => $data['id']]);
+        }
+
+        ajax_return();
+    }
+
+    public function importInstitution()
+    {
+        return view('public/import', [
+            'url'           => url('human/importInstitutionPost'),
+            'last_table'    => 'lay-human-institutionList-table',
+            'template_file' => '/static/common/exl/human_institution.xls',
+        ]);
+    }
+
+    public function importInstitutionPost()
+    {
+        $file_url = input('file_url/s', "");
+        if (!file_exists($file_url)) {
+            ajax_return(1, '文件不存在');
+        }
+
+        //初始化数据
+        $data = ['name', 'tel', 'address', 'introduction', 'cooperate', 'join', 'join_mobile'];
+        $list = import_exl($file_url, $data, 1);
+        if (empty($list)) {
+            ajax_return(1, '请上传有数据的文件');
+        }
+        $empty_check = [
+            'name'    => '企业名称',
+            'tel'     => '联系电话',
+            'address' => '企业地址',
+        ];
+
+
+        //错误判断
+        $time = time();
+        foreach ($list as $k => $v) {
+            foreach ($empty_check as $key => $value) {
+                if (empty($v[$key])) {
+                    ajax_return(1, '第' . ($k + 2) . '行的' . $value . '不能为空');
+                }
+            }
+            $cooperate = explode(',', $v['cooperate']);
+            if (!empty($cooperate)) {
+                foreach ($cooperate as $c) {
+                    if (!in_array($c, HumanInstitutionModel::COOPERATE)) {
+                        ajax_return(1, '第' . ($k + 2) . '行的业务范围(' . $c . ')不在业务范围列表中');
+                    }
+                }
+            }
+
+            $list[$k]['cooperate']   = $cooperate;
+            $list[$k]['priority']    = 255;
+            $list[$k]['create_time'] = $list[$k]['update_time'] = $time;
+        }
+        
+        HumanInstitutionModel::insertAll($list);
+
+        ajax_return(0);
+    }
+
+    /**
+     * 企业列表
+     */
+    public function enterpriseList()
+    {
+        return view('', [
+            'status_list' => HumanEnterpriseModel::STATUS,
+        ]);
+    }
+
+    public function listEnterprise()
+    {
+        $map   = $this->dealEqualInput(['status'], $this->dealLikeInput(['name']));
+        $list  = HumanEnterpriseModel::where($map)
+            ->order(['priority' => 'desc', 'update_time' => 'desc'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->append(['status_text'])
+            ->select();
+        $count = HumanEnterpriseModel::where($map)->count();
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    public function delEnterprise()
+    {
+        $id_arr = input('id_arr/a');
+        HumanEnterpriseModel::destroy($id_arr);
+        ajax_return();
+    }
+
+    /**
+     * 编辑
+     */
+    public function enterpriseForm()
+    {
+        $id   = input('id/d, 0');
+        $info = HumanEnterpriseModel::find($id);
+
+        return view('', [
+            'info'        => $info,
+            'status_list' => HumanEnterpriseModel::STATUS,
+        ]);
+    }
+
+    public function editEnterprise()
+    {
+        $data = input('post.');
+        try {
+            validate(HumanEnterpriseValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            ajax_return(1, $e->getError());
+        }
+
+        if (empty($data['id'])) {
+            HumanEnterpriseModel::create($data);
+        } else {
+            HumanEnterpriseModel::update($data, ['id' => $data['id']]);
+        }
+
+        ajax_return();
+    }
+
+    public function importEnterprise()
+    {
+        return view('public/import', [
+            'url'           => url('human/importEnterprisePost'),
+            'last_table'    => 'lay-human-enterpriseList-table',
+            'template_file' => '/static/common/exl/human_enterprise.xls',
+        ]);
+    }
+
+    public function importEnterprisePost()
+    {
+        $file_url = input('file_url/s', "");
+        if (!file_exists($file_url)) {
+            ajax_return(1, '文件不存在');
+        }
+
+        //初始化数据
+        $data = ['name', 'capital', 'tel', 'address', 'introduction', 'join', 'join_mobile'];
+        $list = import_exl($file_url, $data, 1);
+        if (empty($list)) {
+            ajax_return(1, '请上传有数据的文件');
+        }
+        $empty_check = [
+            'name'    => '企业名称',
+            'capital' => '注册资本',
+            'tel'     => '联系电话',
+            'address' => '企业地址',
+        ];
+
+
+        //错误判断
+        $time = time();
+        foreach ($list as $k => $v) {
+            foreach ($empty_check as $key => $value) {
+                if (empty($v[$key])) {
+                    return ajax_return(1, '第' . ($k + 2) . '行的' . $value . '不能为空');
+                }
+            }
+            $list[$k]['priority']    = 255;
+            $list[$k]['create_time'] = $list[$k]['update_time'] = $time;
+        }
+
+        HumanEnterpriseModel::insertAll($list);
+        ajax_return(0);
+    }
+}

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

@@ -6,8 +6,8 @@ use app\admin\AdminBaseController;
 use app\common\model\TalentUserModel;
 use app\common\model\TalentWorkModel;
 use app\common\validate\TalentUserValidate;
-use think\App;
 use think\exception\ValidateException;
+use think\facade\Validate;
 
 class Talent extends AdminBaseController
 {
@@ -143,7 +143,7 @@ class Talent extends AdminBaseController
         $mobile_check_list = TalentUserModel::where('mobile', 'in', $mobile_list)->column('mobile');
 
         //错误判断
-        $validate = \think\facade\Validate::rule('mobile', 'mobile');
+        $validate = Validate::rule('mobile', 'mobile');
         $time     = time();
         foreach ($list as $k => $v) {
             foreach ($empty_check as $key => $value) {

+ 1 - 1
app/admin/view/company/info.html

@@ -294,7 +294,7 @@
                                 <tr>
                                     <td onclick="copyMobileUrl('https://www.jucai.gov.cn/ST3IXxKlOa4eGEv0eTw0CfORI9444Mgj');">后台网址:https://www.jucai.gov.cn/ST3IXxKlOa4eGEv0eTw0CfORI9444Mgj</td>
                                     <td onclick="copyMobileUrl('jjhc');">用户名:jjhc</td>
-                                    <td onclick="copyMobileUrl('DZwY&W9tT%1uFnkQ');">密码:DZwY&W9tT%1uFnkQ</td>
+                                    <td onclick="copyMobileUrl('SDlxJg#GgXr6cW%M');">密码:SDlxJg#GgXr6cW%M</td>
                                 </tr>
                             </tbody>
                         </table>

+ 177 - 0
app/admin/view/human/enterprise_apply.html

@@ -0,0 +1,177 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane  layui-card-header layuiadmin-card-header-auto">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">企业名称</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            {volist name="status_list" id="v"}
+                            <option value="{$key}">{$v}</option>
+                            {/volist}
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <button class="layui-btn layuiadmin-btn layui-btn-normal" data-type="pass">审核通过</button>
+            <button class="layui-btn layuiadmin-btn layui-btn-danger" data-type="disabled">审核不通过</button>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="pass">
+                    <i class="layui-icon layui-icon-edit"></i>审核通过
+                </a>
+                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disabled">
+                    <i class="layui-icon layui-icon-delete"></i>审核不通过
+                </a>
+            </script>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'admin', 'form', 'table'], function () {
+        const $ = layui.$;
+        const admin = layui.admin;
+        const form = layui.form;
+        const table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#{$lay_table}',
+            url: "{:url('human/listEnterpriseApply')}",
+            cols: [
+                [
+                    {type: 'checkbox', fixed: 'left'},
+                    {field: 'name', title: '企业名称', width: 160},
+                    {field: 'join', title: '参会人', width: 100},
+                    {field: 'join_mobile', title: '参会手机号', width: 160},
+                    {field: 'wechat', title: '微信号', width: 160},
+                    {field: 'cooperate', title: '希望合作的业务', width: 200},
+                    {field: 'suggestion', title: '对本次活动想说的话'},
+                    {field: 'status_text', title: '状态', width: 100, align: 'center'},
+                    {field: 'create_time', title: '申请时间', width: 160, align: 'center'},
+                    {title: '操作', width: 220, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //事件
+        const active = {
+            pass: function () {
+                const check_data = table.checkStatus('{$lay_table}').data; //得到选中的数据
+                if (check_data.length === 0) {
+                    return layer.msg('请选择数据');
+                }
+                const id_arr = [];
+                for (let i = 0; i < check_data.length; i++) {
+                    id_arr.push(check_data[i].id);
+                }
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusEnterpriseApply')}",
+                        data: {
+                            id_arr: id_arr,
+                            status: 2,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            },
+            disabled: function () {
+                const check_data = table.checkStatus('{$lay_table}').data; //得到选中的数据
+                if (check_data.length === 0) {
+                    return layer.msg('请选择数据');
+                }
+                const id_arr = [];
+                for (let i = 0; i < check_data.length; i++) {
+                    id_arr.push(check_data[i].id);
+                }
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusEnterpriseApply')}",
+                        data: {
+                            id_arr: id_arr,
+                            status: 3,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            }
+        };
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'pass') {
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusEnterpriseApply')}",
+                        data: {
+                            id_arr: [data.id],
+                            status: 2,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'disabled') {
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusEnterpriseApply')}",
+                        data: {
+                            id_arr: [data.id],
+                            status: 3,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            }
+        });
+
+        $('.layui-btn.layuiadmin-btn').on('click', function () {
+            const type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+    });
+</script>

+ 115 - 0
app/admin/view/human/enterprise_form.html

@@ -0,0 +1,115 @@
+<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_table}">
+                        <input type="hidden" name="id" value="{:array_get($info,'id')}">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>企业名称</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="name" value="{:array_get($info,'name')}" 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="capital" value="{:array_get($info,'capital')}" 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="tel" value="{:array_get($info,'tel')}" 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="address" value="{:array_get($info,'address')}" lay-verify="required"
+                                       placeholder="请输入企业地址" autocomplete="off"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">企业简介</label>
+                            <div class="layui-input-block">
+                                <textarea name="introduction" placeholder="请输入企业简介" class="layui-textarea">{:array_get($info,'introduction')}</textarea>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">参会人</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="join" value="{:array_get($info,'join')}"
+                                       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="join_mobile" value="{:array_get($info,'join_mobile')}"
+                                       placeholder="请输入参会手机号" autocomplete="off"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="priority" value="{:array_get($info,'priority',255)}"
+                                       lay-verify="required|number" placeholder="请输入排序"
+                                       autocomplete="off" class="layui-input">
+                                <div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+                            </div>
+                        </div>
+                        <div class="layui-form-item" pane>
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>状态</label>
+                            <div class="layui-input-block">
+                                {volist name="status_list" id="v"}
+                                <input type="radio" name="status" value="{$key}" title="{$v}" {eq name=":array_get($info,'status',1)" value="$key" }checked{/eq}>
+                                {/volist}
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="{$lay_btn}" value="确认提交" class="layui-btn">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'form'], function () {
+        const admin = layui.admin;
+        const form = layui.form;
+        form.render();
+
+        form.on('submit({$lay_btn})', function (obj) {
+            const index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: "{:url('human/editEnterprise')}",
+                type: 'post',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('lay-human-enterpriseList-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+
+    });
+</script>

+ 167 - 0
app/admin/view/human/enterprise_list.html

@@ -0,0 +1,167 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane  layui-card-header layuiadmin-card-header-auto">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">企业名称</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            {volist name="status_list" id="v"}
+                            <option value="{$key}">{$v}</option>
+                            {/volist}
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <button class="layui-btn layuiadmin-btn layui-btn-danger" data-type="del">删除</button>
+            <button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+            <button class="layui-btn layuiadmin-btn" data-type="import">批量导入</button>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">
+                    <i class="layui-icon layui-icon-edit"></i>编辑
+                </a>
+                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">
+                    <i class="layui-icon layui-icon-delete"></i>删除
+                </a>
+            </script>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'admin', 'form', 'table'], function () {
+        const $ = layui.$;
+        const admin = layui.admin;
+        const form = layui.form;
+        const table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#{$lay_table}',
+            url: "{:url('human/listEnterprise')}",
+            cols: [
+                [
+                    {type: 'checkbox', fixed: 'left'},
+                    {field: 'name', title: '企业名称', width: 160},
+                    {field: 'capital', title: '注册资本', width: 160},
+                    {field: 'tel', title: '联系电话', width: 160},
+                    {field: 'address', title: '企业地址'},
+                    {field: 'join', title: '参会人', width: 100},
+                    {field: 'join_mobile', title: '参会手机号', width: 160},
+                    {field: 'status_text', title: '状态', width: 100, align: 'center'},
+                    {field: 'priority', title: '排序', width: 100, align: 'center'},
+                    {title: '操作', width: 220, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //事件
+        const active = {
+            del: function () {
+                const check_data = table.checkStatus('{$lay_table}').data; //得到选中的数据
+                if (check_data.length === 0) {
+                    return layer.msg('请选择数据');
+                }
+                const id_arr = [];
+                for (let i = 0; i < check_data.length; i++) {
+                    id_arr.push(check_data[i].id);
+                }
+                layer.confirm('确定删除吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/delEnterprise')}",
+                        data: {
+                            id_arr: id_arr
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            },
+            add: function () {
+                const index = layer.open({
+                    type: 2,
+                    title: '添加企业',
+                    content: "{:url('human/enterpriseForm')}",
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            },
+            import: function() {
+                layer.open({
+                    type: 2,
+                    title: '批量导入',
+                    content: "{:url('human/importEnterprise')}",
+                    maxmin: true,
+                    area: ['750px', '300px']
+                });
+            },
+        };
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'del') {
+                layer.confirm('确定删除吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/delEnterprise')}",
+                        data: {
+                            id_arr: [data.id]
+                        },
+                        done: function (res) {
+                            layui.table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'edit') {
+                const index = layer.open({
+                    type: 2,
+                    title: '编辑企业',
+                    content: "{:url('human/enterpriseForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+
+        $('.layui-btn.layuiadmin-btn').on('click', function () {
+            const type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+    });
+</script>

+ 176 - 0
app/admin/view/human/institution_apply.html

@@ -0,0 +1,176 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane  layui-card-header layuiadmin-card-header-auto">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">机构名称</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            {volist name="status_list" id="v"}
+                            <option value="{$key}">{$v}</option>
+                            {/volist}
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <button class="layui-btn layuiadmin-btn layui-btn-normal" data-type="pass">审核通过</button>
+            <button class="layui-btn layuiadmin-btn layui-btn-danger" data-type="disabled">审核不通过</button>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="pass">
+                    <i class="layui-icon layui-icon-edit"></i>审核通过
+                </a>
+                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disabled">
+                    <i class="layui-icon layui-icon-delete"></i>审核不通过
+                </a>
+            </script>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'admin', 'form', 'table'], function () {
+        const $ = layui.$;
+        const admin = layui.admin;
+        const form = layui.form;
+        const table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#{$lay_table}',
+            url: "{:url('human/listInstitutionApply')}",
+            cols: [
+                [
+                    {type: 'checkbox', fixed: 'left'},
+                    {field: 'name', title: '机构名称', width: 160},
+                    {field: 'join', title: '参会人', width: 100},
+                    {field: 'join_mobile', title: '参会手机号', width: 160},
+                    {field: 'wechat', title: '微信号', width: 160},
+                    {field: 'suggestion', title: '对本次活动想说的话'},
+                    {field: 'status_text', title: '状态', width: 100, align: 'center'},
+                    {field: 'create_time', title: '申请时间', width: 160, align: 'center'},
+                    {title: '操作', width: 220, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //事件
+        const active = {
+            pass: function () {
+                const check_data = table.checkStatus('{$lay_table}').data; //得到选中的数据
+                if (check_data.length === 0) {
+                    return layer.msg('请选择数据');
+                }
+                const id_arr = [];
+                for (let i = 0; i < check_data.length; i++) {
+                    id_arr.push(check_data[i].id);
+                }
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusInstitutionApply')}",
+                        data: {
+                            id_arr: id_arr,
+                            status: 2,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            },
+            disabled: function () {
+                const check_data = table.checkStatus('{$lay_table}').data; //得到选中的数据
+                if (check_data.length === 0) {
+                    return layer.msg('请选择数据');
+                }
+                const id_arr = [];
+                for (let i = 0; i < check_data.length; i++) {
+                    id_arr.push(check_data[i].id);
+                }
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusInstitutionApply')}",
+                        data: {
+                            id_arr: id_arr,
+                            status: 3,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            }
+        };
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'pass') {
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusInstitutionApply')}",
+                        data: {
+                            id_arr: [data.id],
+                            status: 2,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'disabled') {
+                layer.confirm('确定此操作吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/statusInstitutionApply')}",
+                        data: {
+                            id_arr: [data.id],
+                            status: 3,
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            }
+        });
+
+        $('.layui-btn.layuiadmin-btn').on('click', function () {
+            const type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+    });
+</script>

+ 115 - 0
app/admin/view/human/institution_form.html

@@ -0,0 +1,115 @@
+<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_table}">
+                        <input type="hidden" name="id" value="{:array_get($info,'id')}">
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>机构名称</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="name" value="{:array_get($info,'name')}" 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="tel" value="{:array_get($info,'tel')}" 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="address" value="{:array_get($info,'address')}" lay-verify="required"
+                                       placeholder="请输入机构地址" autocomplete="off"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">机构简介</label>
+                            <div class="layui-input-block">
+                                <textarea name="introduction" placeholder="请输入机构简介" class="layui-textarea">{:array_get($info,'introduction')}</textarea>
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">业务范围</label>
+                            <div class="layui-input-block">
+                                {volist name="cooperate_list" id="v"}
+                                <input type="checkbox" name="cooperate[]" title="{$v}" value="{$v}" {if condition="in_array($v,array_get($info,'cooperate',[]))"}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="join" value="{:array_get($info,'join')}"
+                                       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="join_mobile" value="{:array_get($info,'join_mobile')}"
+                                       placeholder="请输入参会手机号" autocomplete="off"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="priority" value="{:array_get($info,'priority',255)}"
+                                       lay-verify="required|number" placeholder="请输入排序"
+                                       autocomplete="off" class="layui-input">
+                                <div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+                            </div>
+                        </div>
+                        <div class="layui-form-item" pane>
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>状态</label>
+                            <div class="layui-input-block">
+                                {volist name="status_list" id="v"}
+                                <input type="radio" name="status" value="{$key}" title="{$v}" {eq name=":array_get($info,'status',1)" value="$key" }checked{/eq}>
+                                {/volist}
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="{$lay_btn}" value="确认提交" class="layui-btn">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'form'], function () {
+        const admin = layui.admin;
+        const form = layui.form;
+        form.render();
+
+        form.on('submit({$lay_btn})', function (obj) {
+            const index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: "{:url('human/editInstitution')}",
+                type: 'post',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('lay-human-institutionList-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+
+    });
+</script>

+ 167 - 0
app/admin/view/human/institution_list.html

@@ -0,0 +1,167 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane  layui-card-header layuiadmin-card-header-auto">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">机构名称</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="name" placeholder="请输入" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            {volist name="status_list" id="v"}
+                            <option value="{$key}">{$v}</option>
+                            {/volist}
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <button class="layui-btn layuiadmin-btn layui-btn-danger" data-type="del">删除</button>
+            <button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+            <button class="layui-btn layuiadmin-btn" data-type="import">批量导入</button>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">
+                    <i class="layui-icon layui-icon-edit"></i>编辑
+                </a>
+                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">
+                    <i class="layui-icon layui-icon-delete"></i>删除
+                </a>
+            </script>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'admin', 'form', 'table'], function () {
+        const $ = layui.$;
+        const admin = layui.admin;
+        const form = layui.form;
+        const table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#{$lay_table}',
+            url: "{:url('human/listInstitution')}",
+            cols: [
+                [
+                    {type: 'checkbox', fixed: 'left'},
+                    {field: 'name', title: '机构名称', width: 160},
+                    {field: 'tel', title: '联系电话', width: 160},
+                    {field: 'address', title: '机构地址'},
+                    {field: 'cooperate', title: '业务范围', width: 160},
+                    {field: 'join', title: '参会人', width: 100},
+                    {field: 'join_mobile', title: '参会手机号', width: 160},
+                    {field: 'status_text', title: '状态', width: 100, align: 'center'},
+                    {field: 'priority', title: '排序', width: 100, align: 'center'},
+                    {title: '操作', width: 220, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //事件
+        const active = {
+            del: function () {
+                const check_data = table.checkStatus('{$lay_table}').data; //得到选中的数据
+                if (check_data.length === 0) {
+                    return layer.msg('请选择数据');
+                }
+                const id_arr = [];
+                for (let i = 0; i < check_data.length; i++) {
+                    id_arr.push(check_data[i].id);
+                }
+                layer.confirm('确定删除吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/delInstitution')}",
+                        data: {
+                            id_arr: id_arr
+                        },
+                        done: function (res) {
+                            table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            },
+            add: function () {
+                const index = layer.open({
+                    type: 2,
+                    title: '添加机构',
+                    content: "{:url('human/institutionForm')}",
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            },
+            import: function() {
+                layer.open({
+                    type: 2,
+                    title: '批量导入',
+                    content: "{:url('human/importInstitution')}",
+                    maxmin: true,
+                    area: ['750px', '300px']
+                });
+            },
+        };
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'del') {
+                layer.confirm('确定删除吗?', function (index) {
+                    admin.req({
+                        url: "{:url('human/delInstitution')}",
+                        data: {
+                            id_arr: [data.id]
+                        },
+                        done: function (res) {
+                            layui.table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'edit') {
+                const index = layer.open({
+                    type: 2,
+                    title: '编辑机构',
+                    content: "{:url('human/institutionForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+
+        $('.layui-btn.layuiadmin-btn').on('click', function () {
+            const type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+    });
+</script>

+ 0 - 2
app/common.php

@@ -109,8 +109,6 @@ function import_exl($file = '', $cell = [], $crop = 0, $sheet = 0)
                 }
                 if (!empty($cell[$_column])) {
                     $data[$_row][$cell[$_column]] = $cellValue;
-                } else {
-                    $data[$_row][] = $cellValue;
                 }
             }
         }

+ 29 - 0
app/common/model/HumanEnterpriseApplyModel.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace app\common\model;
+
+class HumanEnterpriseApplyModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'human_enterprise_apply';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+
+    protected $type = [
+        'cooperate' => 'array',
+    ];
+
+    // 常量
+    const STATUS = [1 => '待审核', 2 => '审核通过', 3 => '审核不通过'];
+
+    const STATUS_WAIT = 1;
+    const STATUS_PASS = 2;
+    const STATUS_DISABLED = 3;
+
+    public function getStatusTextAttr($value, $data)
+    {
+        return self::STATUS[$data['status']];
+    }
+
+}

+ 24 - 0
app/common/model/HumanEnterpriseModel.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\common\model;
+
+class HumanEnterpriseModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'human_enterprise';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+
+    // 常量
+    const STATUS = [1 => '显示', 2 => '隐藏'];
+
+    const STATUS_SHOW = 1;
+    const STATUS_HIDE = 2;
+
+    public function getStatusTextAttr($value, $data)
+    {
+        return self::STATUS[$data['status']];
+    }
+
+}

+ 25 - 0
app/common/model/HumanInstitutionApplyModel.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace app\common\model;
+
+class HumanInstitutionApplyModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'human_institution_apply';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+
+    // 常量
+    const STATUS = [1 => '待审核', 2 => '审核通过', 3 => '审核不通过'];
+
+    const STATUS_WAIT = 1;
+    const STATUS_PASS = 2;
+    const STATUS_DISABLED = 3;
+
+    public function getStatusTextAttr($value, $data)
+    {
+        return self::STATUS[$data['status']];
+    }
+
+}

+ 28 - 0
app/common/model/HumanInstitutionModel.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace app\common\model;
+
+class HumanInstitutionModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'human_institution';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+    protected $type = [
+        'cooperate' => 'array',
+    ];
+
+    // 常量
+    const STATUS = [1 => '显示', 2 => '隐藏'];
+    const COOPERATE = ['管理软件', '管理咨询', '管理培训', '灵活用工', '招聘外包', '人才猎聘', '背景调查', '其他'];
+
+    const STATUS_SHOW = 1;
+    const STATUS_HIDE = 2;
+
+    public function getStatusTextAttr($value, $data)
+    {
+        return self::STATUS[$data['status']];
+    }
+
+}

+ 21 - 0
app/common/validate/HumanEnterpriseApplyValidate.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace app\common\validate;
+
+use think\Validate;
+
+class HumanEnterpriseApplyValidate extends Validate
+{
+    protected $rule = [
+        'name'        => 'require',
+        'join'        => 'require',
+        'join_mobile' => 'require|mobile',
+    ];
+
+    protected $message = [
+        'name'        => '企业名称不能为空',
+        'join'        => '姓名不能为空',
+        'join_mobile' => '手机号格式错误',
+    ];
+
+}

+ 23 - 0
app/common/validate/HumanEnterpriseValidate.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\common\validate;
+
+use think\Validate;
+
+class HumanEnterpriseValidate extends Validate
+{
+    protected $rule = [
+        'name'         => 'require',
+        'tel'          => 'require',
+        'address'      => 'require',
+        'introduction' => 'require',
+    ];
+
+    protected $message = [
+        'name'         => '企业名称不能为空',
+        'tel'          => '联系电话不能为空',
+        'address'      => '企业地址不能为空',
+        'introduction' => '企业简介不能为空',
+    ];
+
+}

+ 21 - 0
app/common/validate/HumanInstitutionApplyValidate.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace app\common\validate;
+
+use think\Validate;
+
+class HumanInstitutionApplyValidate extends Validate
+{
+    protected $rule = [
+        'name'        => 'require',
+        'join'        => 'require',
+        'join_mobile' => 'require|mobile',
+    ];
+
+    protected $message = [
+        'name'        => '机构名称不能为空',
+        'join'        => '姓名不能为空',
+        'join_mobile' => '手机号格式错误',
+    ];
+
+}

+ 23 - 0
app/common/validate/HumanInstitutionValidate.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\common\validate;
+
+use think\Validate;
+
+class HumanInstitutionValidate extends Validate
+{
+    protected $rule = [
+        'name'         => 'require',
+        'tel'          => 'require',
+        'address'      => 'require',
+        'introduction' => 'require',
+    ];
+
+    protected $message = [
+        'name'         => '机构名称不能为空',
+        'tel'          => '联系电话不能为空',
+        'address'      => '机构地址不能为空',
+        'introduction' => '机构简介不能为空',
+    ];
+
+}

+ 0 - 1
app/mobile/common.php

@@ -48,4 +48,3 @@ function get_soldier()
     $soldier = \app\common\model\SoldierModel::find($id);
     return $soldier;
 }
-

+ 233 - 0
app/mobile/controller/Human.php

@@ -0,0 +1,233 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\HumanEnterpriseApplyModel;
+use app\common\model\HumanEnterpriseModel;
+use app\common\model\HumanInstitutionApplyModel;
+use app\common\model\HumanInstitutionModel;
+use app\common\validate\HumanEnterpriseApplyValidate;
+use app\common\validate\HumanInstitutionApplyValidate;
+use app\mobile\MobileBaseController;
+use think\exception\ValidateException;
+
+class Human extends MobileBaseController
+{
+    protected function initialize()
+    {
+        $open_id = session('mobile.human.open_id');
+        if (empty($open_id)) {
+            return redirect('https://www.jucai.gov.cn/api/auth/wechat_auth?url=' . urlencode(url('/mobile/login/humanLogin')));
+        }
+    }
+
+    /**
+     * 表单
+     */
+    public function index()
+    {
+        $this->_formValidate();
+        return view();
+    }
+
+    public function institutionForm()
+    {
+        $this->_formValidate();
+
+        return view();
+    }
+
+    public function institutionFormPost()
+    {
+        $data = input('post.');
+
+        try {
+            validate(HumanInstitutionApplyValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            ajax_return(1, $e->getError());
+        }
+
+        $data['open_id'] = session('mobile.human.open_id');
+        HumanInstitutionApplyModel::create($data);
+
+        ajax_return();
+    }
+
+    public function enterpriseForm()
+    {
+        return view('', [
+            'cooperate_list' => json_encode(HumanInstitutionModel::COOPERATE),
+        ]);
+    }
+
+    public function enterpriseFormPost()
+    {
+        $data = input('post.');
+
+        try {
+            validate(HumanEnterpriseApplyValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            ajax_return(1, $e->getError());
+        }
+
+        $data['open_id'] = session('mobile.human.open_id');
+        HumanEnterpriseApplyModel::create($data);
+
+        ajax_return();
+    }
+
+    public function tips()
+    {
+        $open_id = session('mobile.human.open_id');
+        $msg     = '';
+
+        $institution = HumanInstitutionApplyModel::where('open_id', $open_id)->find();
+        $enterprise  = HumanEnterpriseApplyModel::where('open_id', $open_id)->find();
+        if (empty($institution) && empty($enterprise)) {
+            return redirect(url('human/index'));
+        }
+
+        if (!empty($institution)) {
+            if ($institution['status'] != HumanInstitutionApplyModel::STATUS_PASS) {
+                $msg = HumanInstitutionApplyModel::STATUS[$institution['status']];
+            } else {
+                return redirect(url('human/enterpriseList'));
+            }
+        }
+
+        if (!empty($enterprise)) {
+            if ($enterprise['status'] != HumanEnterpriseApplyModel::STATUS_PASS) {
+                $msg = HumanEnterpriseApplyModel::STATUS[$institution['status']];
+            } else {
+                return redirect(url('human/institutionList'));
+            }
+        }
+
+        return view('', ['msg' => $msg]);
+    }
+
+    /**
+     * 列表
+     */
+    public function institutionList()
+    {
+        $this->_listValidate();
+
+        $cooperate_list = [['text' => '业务范围', 'value' => '']];
+        foreach (HumanInstitutionModel::COOPERATE as $cooperate) {
+            $cooperate_list[] = ['text' => $cooperate, 'value' => $cooperate];
+        }
+        return view('', [
+            'cooperate_list' => json_encode($cooperate_list),
+        ]);
+    }
+
+    public function listInstitution()
+    {
+        $where   = $this->dealLikeInput(['name', 'cooperate']);
+        $where[] = ['status', '=', HumanInstitutionModel::STATUS_SHOW];
+
+        $list = HumanInstitutionModel::where($where)
+            ->order(['priority' => 'desc'])
+            ->limit(input('limit', 10))
+            ->page(input('page', 1))
+            ->select();
+
+        ajax_success($list);
+    }
+
+    public function institutionDetail()
+    {
+        $this->_listValidate();
+
+        $id = input('id');
+        empty($id) && jump('该机构不存在或已删除');
+
+        $info = HumanInstitutionModel::find($id);
+        empty($info) && jump('该机构不存在或已删除');
+
+        return view('', ['info' => $info]);
+    }
+
+    public function enterpriseList()
+    {
+        $this->_listValidate();
+
+        return view();
+    }
+
+    public function listEnterprise()
+    {
+        $where   = $this->dealLikeInput(['name']);
+        $where[] = ['status', '=', HumanEnterpriseModel::STATUS_SHOW];
+
+        $list = HumanEnterpriseModel::where($where)
+            ->order(['priority' => 'desc'])
+            ->limit(input('limit', 10))
+            ->page(input('page', 1))
+            ->select();
+
+        ajax_success($list);
+    }
+
+    public function enterpriseDetail()
+    {
+        $this->_listValidate();
+
+        $id = input('id');
+        empty($id) && jump('该企业不存在或已删除');
+
+        $info = HumanEnterpriseModel::find($id);
+        empty($info) && jump('该企业不存在或已删除');
+
+        return view('', ['info' => $info]);
+    }
+
+    private function _formValidate()
+    {
+        $open_id = session('mobile.human.open_id');
+
+        $institution = HumanInstitutionApplyModel::where('open_id', $open_id)->find();
+        $enterprise  = HumanEnterpriseApplyModel::where('open_id', $open_id)->find();
+
+        if (!empty($institution)) {
+            if ($institution['status'] != HumanInstitutionApplyModel::STATUS_PASS) {
+                return redirect(url('human/tips'));
+            } else {
+                return redirect(url('human/enterpriseList'));
+            }
+        }
+
+        if (!empty($enterprise)) {
+            if ($enterprise['status'] != HumanEnterpriseApplyModel::STATUS_PASS) {
+                return redirect(url('human/tips'));
+            } else {
+                return redirect(url('human/institutionList'));
+            }
+        }
+    }
+
+    private function _listValidate()
+    {
+        $open_id = session('mobile.human.open_id');
+
+        $institution = HumanInstitutionApplyModel::where('open_id', $open_id)->find();
+        $enterprise  = HumanEnterpriseApplyModel::where('open_id', $open_id)->find();
+        if (empty($institution) && empty($enterprise)) {
+            return redirect(url('human/index'));
+        }
+
+        if (!empty($institution)) {
+            if ($institution['status'] != HumanInstitutionApplyModel::STATUS_PASS) {
+                return redirect(url('human/tips'));
+            }
+        }
+
+        if (!empty($enterprise)) {
+            if ($enterprise['status'] != HumanEnterpriseApplyModel::STATUS_PASS) {
+                return redirect(url('human/tips'));
+            }
+        }
+
+    }
+}

+ 10 - 0
app/mobile/controller/Login.php

@@ -2,6 +2,7 @@
 
 namespace app\mobile\controller;
 
+use app\common\model\HumanEnterpriseApplyModel;
 use app\common\model\UserModel;
 use app\mobile\MobileBaseController;
 
@@ -64,4 +65,13 @@ class Login extends MobileBaseController
         session('mobile.user.id', null);
         return '退出';
     }
+
+    public function humanLogin()
+    {
+        $param   = input('param.');
+
+        session('mobile.human.open_id',$param['openid']);
+
+        return redirect(url('human/index'));
+    }
 }

+ 74 - 0
app/mobile/view/human/enterprise_detail.html

@@ -0,0 +1,74 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .content-box {background: white;width:100%;padding:10px 5%;}
+    .title {display: flex;flex-direction: row;align-items: center;font-size:16px;font-weight: bold;}
+    .tel {font-size:14px;margin-top:10px;border-bottom:1px solid #ddd;padding-bottom: 10px;}
+    .join {display: flex;flex-direction: row;align-items: center;color:#777;font-size:14px;margin-top:10px;}
+    .join .flex-1{flex:1;}
+    .join .mobile{display: flex;flex-direction: row;align-items: center;}
+    .address {color:#777;font-size:14px;margin-top:10px;}
+    .introduction-title {display: flex;flex-direction: row;align-items: center;margin-top:10px;border-top:1px solid #ddd;padding-top:10px;}
+    .introduction-content {font-size:14px;margin-top:10px; white-space: pre-wrap;color:#666;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">企业详情</span>
+    </template>
+</van-nav-bar>
+
+<div class="content-box">
+    <div class="title">
+        <div style="width: 6px; height: 6px; background: #dd4250; border-radius: 50%; margin-right: 11px;"><span></span></div>
+        <div>{{info.name}}</div>
+    </div>
+    <div class="tel" @click.stop="call(info.tel)">
+        <van-icon name="phone" color=" #dd4250"></van-icon>
+        {{info.tel}}
+    </div>
+    <div class="join" v-if="info.join">
+        <div class="flex-1">参会人:{{info.join}}</div>
+        <div class="flex-1 mobile" v-if="info.join_mobile" @click.stop="call(info.tel)">
+            <van-icon name="phone" color=" #dd4250"></van-icon>
+            {{info.join_mobile}}
+        </div>
+    </div>
+    <div class="address" v-if="info.capital">
+        注册资本:{{info.capital}}
+    </div>
+    <div class="address">
+        企业地址:{{info.address}}
+    </div>
+    <div class="introduction">
+        <div class="introduction-title">
+            <div style="width: 6px; height: 6px; background: #dd4250; border-radius: 50%; margin-right: 11px;"><span></span></div>
+            <div>企业简介</div>
+        </div>
+        <div class="introduction-content">{{info.introduction}}</div>
+    </div>
+</div>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.info = {$info};
+        
+        base.onBack = () => {
+            history.back();
+        };
+        
+        return base;
+    }
+</script>
+{/block}

+ 139 - 0
app/mobile/view/human/enterprise_form.html

@@ -0,0 +1,139 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .btn_search_item{background:#f2f6ff;display:inline-block;border-radius:5px;line-height:35px;height:35px;text-align:center;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;position:relative;font-size:13px;width:100%;color:#666;margin-bottom:10px;}
+    .btn_search_item.active{color:var(--blue);}
+    .btn_search_icon{position:absolute;bottom:-3px;right:-3px;font-size:30px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">企业报名</span>
+    </template>
+</van-nav-bar>
+<van-form @submit="onSubmit">
+    <van-cell-group>
+        <van-field
+                v-model="form.name"
+                required
+                type="text"
+                label="企业名称"
+                placeholder="请输入企业名称"
+                :rules="[{ required: true, message: '请输入企业名称' }]"
+        ></van-field>
+        <van-field
+                v-model="form.join"
+                required
+                type="text"
+                label="姓名"
+                placeholder="请输入姓名"
+                :rules="[{ required: true, message: '请输入姓名' }]"
+        ></van-field>
+        <van-field
+                v-model="form.join_mobile"
+                required
+                type="mobile"
+                label="手机号"
+                placeholder="请输入手机号"
+                :rules="[{ required: true, message: '请输入手机号' }]"
+        ></van-field>
+        <van-field
+                v-model="form.wechat"
+                type="text"
+                label="微信号"
+                placeholder="请输入微信号"
+        ></van-field>
+        <van-field name="form.cooperate" label="希望合作的业务">
+            <template #input>
+                <van-row :gutter="10">
+                    <van-col span="8" v-for="(item) in cooperate_list">
+                        <div :class="{btn_search_item:true,active: in_array(item,form.cooperate)}"
+                             @click="selectAnimal(item)">
+                            {{item}}
+                            <van-icon v-if="in_array(item,form.cooperate)"
+                                      class="iconfont icon-gouxuan-youxiajiaogouxuan btn_search_icon text-blue"></van-icon>
+                        </div>
+                    </van-col>
+                </van-row>
+            </template>
+        </van-field>
+        <van-cell-group>
+            <van-field
+                    v-model="form.suggestion"
+                    rows="3"
+                    autosize
+                    label="活动建议"
+                    type="textarea"
+                    placeholder="请输入对本次活动想说的话"
+            ></van-field>
+        </van-cell-group>
+    </van-cell-group>
+    <div style="margin: 16px;">
+        <van-button round block type="primary" native-type="submit">
+            提交
+        </van-button>
+    </div>
+</van-form>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.cooperate_list = {$cooperate_list};
+        base.selectAnimal = (value) => {
+            if (base.in_array(value,base.form.cooperate)) {
+                base.removeByVal(base.form.cooperate,value);
+            } else {
+                base.form.cooperate.push(value);
+            }
+            console.log(base.form.cooperate);
+        }
+        base.in_array = (search,array) => {
+            for(let i in array){
+                if(array[i] == search){
+                    return true;
+                }
+            }
+            return false;
+        };
+        base.removeByVal = (arrylist , val) => {
+            for(let i = 0; i < arrylist .length; i++) {
+                if(arrylist[i] == val) {
+                    arrylist .splice(i, 1);
+                    break;
+                }
+            }
+        }
+
+        base.form = Vue.reactive({
+            cooperate: []
+        });
+        base.onBack = () => {
+            location.href = "{:url('human/index')}";
+        };
+
+        //表单提交
+        base.onSubmit = () => {
+            postJson('/human/enterpriseFormPost',base.form).then(() => {
+                vant.showDialog({
+                    title: '提示',
+                    message: '报名成功',
+                }).then(() => {
+                    location.href = "{:url('human/tips')}";
+                });
+            });
+        };
+
+        return base;
+    }
+</script>
+{/block}

+ 125 - 0
app/mobile/view/human/enterprise_list.html

@@ -0,0 +1,125 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .lw-list {width:90%;margin:0 auto;}
+    .lw-item {background: #fff;box-shadow: 0 4px 8px 1px rgba(0,0,0,.03);border-radius: 6px;padding: 13px 8px;margin-top:10px;}
+    .lw-item .title {display: flex;flex-direction: row;align-items: center;font-size:16px;font-weight: bold;}
+    .lw-item .tel {font-size:14px;margin-top:10px;border-bottom:1px solid #ddd;padding-bottom: 10px;}
+    .lw-item .join {display: flex;flex-direction: row;align-items: center;color:#777;font-size:14px;margin-top:10px;}
+    .lw-item .join .flex-1{flex:1;}
+    .lw-item .join .mobile{display: flex;flex-direction: row;align-items: center;}
+    .lw-item .address {color:#777;font-size:14px;margin-top:10px;}
+</style>
+{/block}
+{block name="body"}
+<van-sticky>
+    <van-nav-bar
+            class="nav-theme"
+            :fixed="true"
+            :placeholder="true"
+    >
+        <template #title>
+            <span class="text-white">企业列表</span>
+        </template>
+    </van-nav-bar>
+    <van-search v-model="keyword" placeholder="请输入企业名称" @search="onRefresh"></van-search>
+</van-sticky>
+
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model:loading="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onList"
+    >
+        <div class="lw-list">
+            <div class="lw-item" v-for="item in list" @click="toDetail(item.id)">
+                <div class="title">
+                    <div style="width: 6px; height: 6px; background: #dd4250; border-radius: 50%; margin-right: 11px;"><span></span></div>
+                    <div>{{item.name}}</div>
+                </div>
+                <div class="tel" @click.stop="call(item.tel)">
+                    <van-icon name="phone" color=" #dd4250"></van-icon>
+                    {{item.tel}}
+                </div>
+                <div class="join" v-if="item.join">
+                    <div class="flex-1">参会人:{{item.join}}</div>
+                    <div class="flex-1 mobile" v-if="item.join_mobile" @click.stop="call(item.tel)">
+                        <van-icon name="phone" color=" #dd4250"></van-icon>
+                        {{item.join_mobile}}
+                    </div>
+                </div>
+                <div class="address" v-if="item.capital">
+                    注册资本:{{item.capital}}
+                </div>
+                <div class="address">
+                    企业地址:{{item.address}}
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active">
+    <van-tabbar-item icon="home-o">企业列表</van-tabbar-item>
+    <van-tabbar-item icon="friends-o" @click="toInstitution">机构列表</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.active = Vue.ref(0);
+
+        //搜索
+        base.keyword = Vue.ref('');
+
+        //列表
+        base.page = Vue.ref(1);
+        base.loading = Vue.ref(false);
+        base.finished = Vue.ref(false);
+        base.refreshing = Vue.ref(false);
+        base.list = Vue.reactive([]);
+        base.onList = () => {
+            let param = {};
+            param.page = base.page.value;
+            param.name = base.keyword.value;
+            base.page.value++;
+
+            postJson("human/listEnterprise", param).then( ({data}) => {
+                base.loading.value = false;
+                if (base.refreshing.value) base.refreshing.value = false;
+                if (data.length === 0) {
+                    base.finished.value = true;
+                } else {
+                    base.list.push(...data);
+                }
+            });
+
+        };
+        base.onRefresh = () => {
+            base.list = Vue.reactive([]);
+            base.page.value = 1;
+            base.loading.value = true;
+            base.finished.value = false;
+
+            base.onList();
+        };
+
+        base.call = (tel) => {
+            location.href = "tel://" + tel;
+        };
+
+        base.toDetail = (id) => {
+            location.href = "{:url('human/enterpriseDetail')}?id=" + id;
+        };
+
+        base.toInstitution = () => {
+            location.href = "{:url('human/institutionList')}";
+        };
+
+        return base;
+    }
+</script>
+{/block}

+ 46 - 0
app/mobile/view/human/index.html

@@ -0,0 +1,46 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .title-box {padding-top:20px;}
+    .title {text-align: center;}
+    .btn-box {width:80%;margin:0 auto;padding-top:20px;}
+    .btn-box .van-button {margin-top:50px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+>
+    <template #title>
+        <span class="text-white">首页</span>
+    </template>
+</van-nav-bar>
+<div class="title-box">
+    <h3 class="title">民营经济与人力资源服务发展大会</h3>
+    <h3 class="title">暨人力资源服务供需对接会</h3>
+</div>
+<div class="btn-box">
+    <van-button type="primary" size="large" block @click="toEnterprise">企业报名</van-button>
+    <van-button type="primary" size="large" block @click="toInstitution">机构报名</van-button>
+</div>
+
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.toEnterprise = () => {
+            location.href = "{:url('human/enterpriseForm')}";
+        };
+        base.toInstitution = () => {
+            location.href = "{:url('human/institutionForm')}";
+        };
+
+
+        return base;
+    }
+</script>
+{/block}

+ 76 - 0
app/mobile/view/human/institution_detail.html

@@ -0,0 +1,76 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .content-box {background: white;width:100%;padding:10px 5%;}
+    .title {display: flex;flex-direction: row;align-items: center;font-size:16px;font-weight: bold;}
+    .tel {font-size:14px;margin-top:10px;border-bottom:1px solid #ddd;padding-bottom: 10px;}
+    .join {display: flex;flex-direction: row;align-items: center;color:#777;font-size:14px;margin-top:10px;}
+    .join .flex-1{flex:1;}
+    .join .mobile{display: flex;flex-direction: row;align-items: center;}
+    .address {color:#777;font-size:14px;margin-top:10px;}
+    .tags {margin-top:10px;}
+    .tags .van-tag{margin-right:5px;}
+    .introduction-title {display: flex;flex-direction: row;align-items: center;margin-top:10px;border-top:1px solid #ddd;padding-top:10px;}
+    .introduction-content {font-size:14px;margin-top:10px; white-space: pre-wrap;color:#666;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">机构详情</span>
+    </template>
+</van-nav-bar>
+
+<div class="content-box">
+    <div class="title">
+        <div style="width: 6px; height: 6px; background: #dd4250; border-radius: 50%; margin-right: 11px;"><span></span></div>
+        <div>{{info.name}}</div>
+    </div>
+    <div class="tel" @click.stop="call(info.tel)">
+        <van-icon name="phone" color=" #dd4250"></van-icon>
+        {{info.tel}}
+    </div>
+    <div class="tags">
+        <van-tag type="primary" v-for="tag in info.cooperate" size="medium">{{tag}}</van-tag>
+    </div>
+    <div class="join" v-if="info.join">
+        <div class="flex-1">参会人:{{info.join}}</div>
+        <div class="flex-1 mobile" v-if="info.join_mobile" @click.stop="call(info.tel)">
+            <van-icon name="phone" color=" #dd4250"></van-icon>
+            {{info.join_mobile}}
+        </div>
+    </div>
+    <div class="address">
+        机构地址:{{info.address}}
+    </div>
+    <div class="introduction">
+        <div class="introduction-title">
+            <div style="width: 6px; height: 6px; background: #dd4250; border-radius: 50%; margin-right: 11px;"><span></span></div>
+            <div>机构简介</div>
+        </div>
+        <div class="introduction-content">{{info.introduction}}</div>
+    </div>
+</div>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.info = {$info};
+        
+        base.onBack = () => {
+            history.back();
+        };
+        
+        return base;
+    }
+</script>
+{/block}

+ 93 - 0
app/mobile/view/human/institution_form.html

@@ -0,0 +1,93 @@
+{extend name="public/base_human"/}
+{block name="css"}
+
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">机构报名</span>
+    </template>
+</van-nav-bar>
+<van-form @submit="onSubmit">
+    <van-cell-group>
+        <van-field
+                v-model="form.name"
+                required
+                type="text"
+                label="机构名称"
+                placeholder="请输入机构名称"
+                :rules="[{ required: true, message: '请输入机构名称' }]"
+        ></van-field>
+        <van-field
+                v-model="form.join"
+                required
+                type="text"
+                label="姓名"
+                placeholder="请输入姓名"
+                :rules="[{ required: true, message: '请输入姓名' }]"
+        ></van-field>
+        <van-field
+                v-model="form.join_mobile"
+                required
+                type="mobile"
+                label="手机号"
+                placeholder="请输入手机号"
+                :rules="[{ required: true, message: '请输入手机号' }]"
+        ></van-field>
+        <van-field
+                v-model="form.wechat"
+                type="text"
+                label="微信号"
+                placeholder="请输入微信号"
+        ></van-field>
+        <van-cell-group>
+            <van-field
+                    v-model="form.suggestion"
+                    rows="3"
+                    autosize
+                    label="活动建议"
+                    type="textarea"
+                    placeholder="请输入对本次活动想说的话"
+            ></van-field>
+        </van-cell-group>
+    </van-cell-group>
+    <div style="margin: 16px;">
+        <van-button round block type="primary" native-type="submit">
+            提交
+        </van-button>
+    </div>
+</van-form>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.form = Vue.reactive({});
+        base.onBack = () => {
+            location.href = "{:url('human/index')}";
+        };
+
+        //表单提交
+        base.onSubmit = () => {
+            postJson('/human/institutionFormPost',base.form).then(() => {
+                vant.showDialog({
+                    title: '提示',
+                    message: '报名成功',
+                }).then(() => {
+                    location.href = "{:url('human/tips')}";
+                });
+            });
+        };
+
+        return base;
+    }
+</script>
+{/block}

+ 135 - 0
app/mobile/view/human/institution_list.html

@@ -0,0 +1,135 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .lw-list {width:90%;margin:0 auto;}
+    .lw-item {background: #fff;box-shadow: 0 4px 8px 1px rgba(0,0,0,.03);border-radius: 6px;padding: 13px 8px;margin-top:10px;}
+    .lw-item .title {display: flex;flex-direction: row;align-items: center;font-size:16px;font-weight: bold;}
+    .lw-item .tel {font-size:14px;margin-top:10px;border-bottom:1px solid #ddd;padding-bottom: 10px;}
+    .lw-item .join {display: flex;flex-direction: row;align-items: center;color:#777;font-size:14px;margin-top:10px;}
+    .lw-item .join .flex-1{flex:1;}
+    .lw-item .join .mobile{display: flex;flex-direction: row;align-items: center;}
+    .lw-item .address {color:#777;font-size:14px;margin-top:10px;}
+    .lw-item .tags {margin-top:10px;}
+    .lw-item .tags .van-tag{margin-right:5px;}
+</style>
+{/block}
+{block name="body"}
+<van-sticky>
+    <van-nav-bar
+            class="nav-theme"
+            :fixed="true"
+            :placeholder="true"
+    >
+        <template #title>
+            <span class="text-white">机构列表</span>
+        </template>
+    </van-nav-bar>
+
+    <van-search v-model="keyword" placeholder="请输入机构名称" @search="onRefresh"></van-search>
+
+    <van-dropdown-menu >
+        <van-dropdown-item v-model="cooperate" :options="cooperate_list" @change="onRefresh"></van-dropdown-item>
+    </van-dropdown-menu>
+</van-sticky>
+
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model:loading="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onList"
+    >
+        <div class="lw-list">
+            <div class="lw-item" v-for="item in list" @click="toDetail(item.id)">
+                <div class="title">
+                    <div style="width: 6px; height: 6px; background: #dd4250; border-radius: 50%; margin-right: 11px;"><span></span></div>
+                    <div>{{item.name}}</div>
+                </div>
+                <div class="tel" @click.stop="call(item.tel)">
+                    <van-icon name="phone" color=" #dd4250"></van-icon>
+                    {{item.tel}}
+                </div>
+                <div class="tags">
+                    <van-tag type="primary" v-for="tag in item.cooperate" size="medium">{{tag}}</van-tag>
+                </div>
+                <div class="join" v-if="item.join">
+                    <div class="flex-1">参会人:{{item.join}}</div>
+                    <div class="flex-1 mobile" v-if="item.join_mobile" @click.stop="call(item.tel)">
+                        <van-icon name="phone" color=" #dd4250"></van-icon>
+                        {{item.join_mobile}}
+                    </div>
+                </div>
+                <div class="address">
+                    机构地址:{{item.address}}
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active">
+    <van-tabbar-item icon="home-o" @click="toEnterprise">企业列表</van-tabbar-item>
+    <van-tabbar-item icon="friends-o">机构列表</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.active = Vue.ref(1);
+
+        //搜索
+        base.keyword = Vue.ref('');
+        base.cooperate = Vue.ref('');
+        base.cooperate_list = Vue.reactive({$cooperate_list});
+
+        //列表
+        base.page = Vue.ref(1);
+        base.loading = Vue.ref(false);
+        base.finished = Vue.ref(false);
+        base.refreshing = Vue.ref(false);
+        base.list = Vue.reactive([]);
+        base.onList = () => {
+            let param = {};
+            param.page = base.page.value;
+            param.name = base.keyword.value;
+            param.cooperate = base.cooperate.value;
+            base.page.value++;
+
+            postJson("human/listInstitution", param).then( ({data}) => {
+                base.loading.value = false;
+                if (base.refreshing.value) base.refreshing.value = false;
+                if (data.length === 0) {
+                    base.finished.value = true;
+                } else {
+                    base.list.push(...data);
+                }
+            });
+
+        };
+        base.onRefresh = () => {
+            base.list = Vue.reactive([]);
+            base.page.value = 1;
+            base.loading.value = true;
+            base.finished.value = false;
+
+            base.onList();
+        };
+
+        base.call = (tel) => {
+            location.href = "tel://" + tel;
+        };
+
+        base.toDetail = (id) => {
+            location.href = "{:url('human/institutionDetail')}?id=" + id;
+        };
+
+        base.toEnterprise = () => {
+            location.href = "{:url('human/enterpriseList')}";
+        };
+
+        return base;
+    }
+</script>
+{/block}

+ 57 - 0
app/mobile/view/human/tips.html

@@ -0,0 +1,57 @@
+{extend name="public/base_human"/}
+{block name="css"}
+<style>
+    .icon{
+        text-align:center;
+        margin-top:50px;
+    }
+
+    .msg{
+        text-align:center;
+        margin:0;
+        padding:0;
+        font-size:24px;
+    }
+
+    .tips{
+        text-align:center;
+        margin-top:50px;
+        font-size:14px;
+        color:#aaa;
+    }
+
+    .tips .num{
+        color:#FF589B;
+    }
+
+    .wechat {
+        width: 80%;
+        display: block;
+        margin: 0 auto;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+>
+    <template #title>
+        <span class="text-white">提示</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<h3 class="msg">{$msg}</h3>
+<p class="tips">如有疑问,请加下方工作人员微信</p>
+<img src="/static/mobile/images/wechat_qrcode.png" class="wechat" alt="">
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        return base;
+    }
+</script>
+{/block}

+ 29 - 0
app/mobile/view/public/base_human.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="zh-cn">
+<head>
+    {include file="public/meta_header_human"/}
+    {block name="meta"}{/block}
+    {block name="css"}{/block}
+</head>
+<body>
+<div id="app">
+    {block name="body"}{/block}
+</div>
+{block name="script"}{/block}
+<script>
+    const vue3 = {
+        setup() {
+            return v_setup();
+        }
+    };
+
+    const app = Vue.createApp(vue3)
+        .use(vant)
+        .use(vant.Lazyload);
+</script>
+{block name="vue"}{/block}
+<script>
+    app.mount('#app');
+</script>
+</body>
+</html>

+ 16 - 0
app/mobile/view/public/meta_header_human.html

@@ -0,0 +1,16 @@
+<meta charset="utf-8">
+<title>民营经济与人力资源服务发展大会</title>
+<meta name="renderer" content="webkit">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"/>
+<meta name="apple-mobile-web-app-capable" content="yes" />
+<meta name="apple-mobile-web-app-status-bar-style" content="black" />
+<link rel="stylesheet" href="__MCSS__/vant4.6.min.css">
+<link rel="stylesheet" href="__MCSS__/style.css">
+<link rel="stylesheet" href="__MCSS__/icon.css">
+<script src="__COMMON_JS__/vue3.3.4.min.js"></script>
+<script src="__MJS__/vant4.6.min.js"></script>
+<script src="__COMMON_JS__/axios1.4.min.js"></script>
+<script>
+    const baseUrl = "{:url('/')}";
+</script>
+<script src="__MJS__/axios_instance.js"></script>

BIN
public/static/common/exl/human_enterprise.xls


BIN
public/static/common/exl/human_institution.xls


+ 36 - 0
public/static/mobile/css/icon.css

@@ -0,0 +1,36 @@
+@font-face {font-family: "iconfont";
+    src: url('//at.alicdn.com/t/font_2460086_zet1plo524k.eot?t=1619586764671'); /* IE9 */
+    src: url('//at.alicdn.com/t/font_2460086_zet1plo524k.eot?t=1619586764671#iefix') format('embedded-opentype'), /* IE6-IE8 */
+    url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAScAAsAAAAACUAAAARPAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDQAqFIIRiATYCJAMYCw4ABCAFhG0HcRspCMiemjzBbGABBQCAzMCjENT3Y7r3PgTBJQpQokOLKipCx0gqStmp8dWpkRn+Pe0lGdMZGezczczal9RZOag7EF+Qvyakd/4DTABc7n6KbNGP02yMTQXI7fg/OGa65g0sb20Dm1Jl0rRwVMEDGlBE/FODPPC/MP4DPMOFCbwPgbSmUEg7v6gKmPCEZQK6ihgKmLhMfAxBktoYsjduIuuAoWT4QEcB4Fv/e/1AdGACJkQIa4/7PAHIfBo/78N0/3WgSUUAcXkO4HYIHBgBeOgR6rrAzNQIJv1JGFgD381Jxp7Gz2KfrXne9x8AXIysR4q0iMyK+/IPLzAOShFUWcRulWHsxDIHwjOGA49nrChevQY5MPz3mXCsiyUKKfMLgBrCjpJGnBjP3I2wrKAvOkubHbt338w1W4Fzpz31+sE4F6gMc3M93WzRRatdV3H8bY8Hx7WG9YMhzmXHTl64f99sop927o1mqgWQsjQ812wZ2rrSvnqzbtOK2iqZ79I71t75GOicne2mFJQV4LiBhUNhwArL612GHHdcwQWnlpdVVFXUVlSWZ9yuqbF3dvaegeeEL+3q79WH1AA8yJDuHdHzPq9t2mzRRW2rf1RmIV+80F1nP6wNnkpTkYh47WopKkHVPFRMZqmmQn7IpY9EKvYkOIZ4sdxLsn3EYA8ZYNrlYzH/0XnPgApMLkHKkbDKnm8y3xUTYHrw/8+8vIuXLt4AWXVL60fTsrJqy8NWVdr4PMsjVucP7N+fZ3XEMg/Oq7K8bAVSTiTS1gpIBcs2EilASKCMJ9tah76ZNaLd3WijmcTnukbU9Rq/deGlHr+8l3tvz872zsoejRmF8xASZZYvo1mOXgW4hl6+HET+c0HDBMlBctGUC2x8LpLT4lplsa+N/CdAlyxGoZFjfnNOdm3R06cdqqDgbp5DgABZsgRhOYy5BfQBvP5uNDiH6QB46TA7nfTU7UPT6fuxp1jrWxAgXPf9PNJqmfrVhOcB+DthOQqCcjA60bmgJrX4pDHEZ2MQ/2VfqWCM8VvAIr1UdiBkMV/ZLsM5UgMni6/sSVmaWuoESNIlvoFJaICT1EJ67AiCjDFESQtIGyo4nFGhhFGcAgYWA0jRCTB5P+AUjSE99jEEdW8hKgYYpJ0C2zMzOoEIz1FCSg0FRHs3IeKzclqyqnGjsAIyGimldEp1Yg1UqkRRIio80pstgHKoLGODSstEq9U0QStZGZEPj0GplCU6lKwY8tXhQrW6Izkigg77pnA+KwO4DSWIogYJENp1I4jwseRodbAa7vv9ChBDQ4qijKn44a4BKamIRidECReZAlmgkqeq2JbJKlqMaGpqNC+iKbFkCPnogKRiikXoCJ8lBvGphRPmSHRIFkHV6LSq8Po1sqU8BKQJnxUDk5NXUFSCeKTYblZjTFNyoUYU5cywmi4NJQ/r1u0iSixpWJ8cfxTLmXYRDJNreVaQkgMAAA==') format('woff2'),
+    url('//at.alicdn.com/t/font_2460086_zet1plo524k.woff?t=1619586764671') format('woff'),
+    url('//at.alicdn.com/t/font_2460086_zet1plo524k.ttf?t=1619586764671') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+    url('//at.alicdn.com/t/font_2460086_zet1plo524k.svg?t=1619586764671#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+    font-family: "iconfont" !important;
+    font-size: 16px;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-haoyou:before {
+    content: "\e607";
+}
+
+.icon-fanhui1:before {
+    content: "\e68e";
+}
+
+.icon-gouxuan-youxiajiaogouxuan:before {
+    content: "\e77c";
+}
+
+.icon-xingbie-nv:before {
+    content: "\e633";
+}
+
+.icon-xingbie-nan:before {
+    content: "\e634";
+}

BIN
public/static/mobile/images/wechat_qrcode.png