linwu hai 7 meses
pai
achega
e263a1cac6
Modificáronse 39 ficheiros con 2737 adicións e 71 borrados
  1. 150 0
      app/admin/controller/Api.php
  2. 98 0
      app/admin/controller/OddJob.php
  3. 40 0
      app/admin/controller/Recruit.php
  4. 45 0
      app/admin/controller/Talent.php
  5. 11 62
      app/admin/view/home/console.html
  6. 110 0
      app/admin/view/odd_job/company.html
  7. 117 0
      app/admin/view/odd_job/job.html
  8. 131 0
      app/admin/view/odd_job/user.html
  9. 78 0
      app/admin/view/recruit/index.html
  10. 340 0
      app/admin/view/talent/index.html
  11. 25 0
      app/common/model/SettingModel.php
  12. 9 0
      app/common/model/TalentModel.php
  13. 14 0
      app/common/model/jucai/RecruitAppointInfoModel.php
  14. 14 0
      app/common/model/jucai/RecruitModel.php
  15. 14 0
      app/common/model/jucai/RecruitPostModel.php
  16. 41 0
      app/common/model/odd_job/BrokerModel.php
  17. 61 0
      app/common/model/odd_job/JobModel.php
  18. 21 0
      app/common/model/odd_job/RensheCodeModel.php
  19. 66 0
      app/common/model/odd_job/UserModel.php
  20. 29 0
      app/common/model/odd_job/WorkerModel.php
  21. 1 1
      config/app.php
  22. 56 0
      config/database.php
  23. 0 8
      public/.htaccess
  24. 511 0
      public/bi/css/index.css
  25. 62 0
      public/bi/fonts/icomoon.css
  26. BIN=BIN
      public/bi/fonts/icomoon.eot
  27. 22 0
      public/bi/fonts/icomoon.svg
  28. BIN=BIN
      public/bi/fonts/icomoon.ttf
  29. BIN=BIN
      public/bi/fonts/icomoon.woff
  30. BIN=BIN
      public/bi/images/border.png
  31. BIN=BIN
      public/bi/images/line.png
  32. BIN=BIN
      public/bi/images/logo.png
  33. BIN=BIN
      public/bi/images/logo1.png
  34. BIN=BIN
      public/bi/images/logob.png
  35. BIN=BIN
      public/bi/images/rect.png
  36. 223 0
      public/bi/index.html
  37. 5 0
      public/bi/js/350582.json
  38. 442 0
      public/bi/js/index.js
  39. 1 0
      public/bi/js/jquery.min.js

+ 150 - 0
app/admin/controller/Api.php

@@ -0,0 +1,150 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\BaseController;
+use app\common\model\jucai\RecruitAppointInfoModel;
+use app\common\model\jucai\RecruitModel;
+use app\common\model\jucai\RecruitPostModel;
+use app\common\model\odd_job\BrokerModel;
+use app\common\model\odd_job\JobModel;
+use app\common\model\odd_job\RensheCodeModel;
+use app\common\model\odd_job\UserModel;
+use app\common\model\odd_job\WorkerModel;
+use app\common\model\SettingModel;
+
+class Api extends BaseController
+{
+    public function talent()
+    {
+        $system = SettingModel::getConfigValue(SettingModel::TALENT);
+        $res    = [
+            'talent_level'     => [
+                ['name' => '第一层次', 'count' => $system['talent_level_1']],
+                ['name' => '第二层次', 'count' => $system['talent_level_2']],
+                ['name' => '第三层次', 'count' => $system['talent_level_3']],
+                ['name' => '第四层次', 'count' => $system['talent_level_4']],
+                ['name' => '第五层次', 'count' => $system['talent_level_5']],
+                ['name' => '第六层次', 'count' => $system['talent_level_6']],
+                ['name' => '第七层次', 'count' => $system['talent_level_7']],
+            ],
+            'talent_industry'  => [
+                ['name' => '贸易/进出口', 'count' => $system['talent_industry_trade']],
+                ['name' => '消费品(食/饮/烟酒)', 'count' => $system['talent_industry_goods']],
+                ['name' => '服装/纺织/皮革', 'count' => $system['talent_industry_clothing']],
+                ['name' => '制药/生物工程', 'count' => $system['talent_industry_drug']],
+                ['name' => '医疗设备/器械', 'count' => $system['talent_industry_medical']],
+                ['name' => '酒店/旅游', 'count' => $system['talent_industry_hotel']],
+                ['name' => '交通/运输/物流', 'count' => $system['talent_industry_traffic']],
+                ['name' => '其他', 'count' => $system['talent_industry_other']],
+            ],
+            'talent_age'       => [
+                ['name' => '30岁以下', 'count' => $system['talent_age_1']],
+                ['name' => '30-39岁', 'count' => $system['talent_age_2']],
+                ['name' => '40-49岁', 'count' => $system['talent_age_3']],
+                ['name' => '50岁以上', 'count' => $system['talent_age_4']],
+            ],
+            'talent_education' => [
+                ['name' => '硕士', 'count' => $system['talent_education_1']],
+                ['name' => '博士', 'count' => $system['talent_education_2']],
+                ['name' => '博士后', 'count' => $system['talent_education_3']],
+            ],
+            'total_count'      => [
+                ['name' => '硕博人才数', 'count' => $system['talent_total']],
+            ],
+        ];
+
+        return json($res);
+    }
+
+    public function odd_job()
+    {
+        $res = [];
+
+        //街道数据
+        $comjobs_community = JobModel::field("count(community),community")->group('community')->column('count(community)', 'community');
+        $community         = RensheCodeModel::getList('community')->toArray();
+        $broker_town       = BrokerModel::field("count(town),town")->group('town')->column('count(town)', 'town');
+        foreach ($community as &$v) {
+            if (!empty($comjobs_community[$v['code']])) {
+                $v['count'] = $comjobs_community[$v['code']];
+            } else {
+                $v['count'] = 0;
+            }
+            if (!empty($broker_town[$v['name']])) {
+                $v['broker_count'] = $broker_town[$v['name']];
+            } else {
+                $v['broker_count'] = 0;
+            }
+            unset($v);
+        }
+        $community[]      = [
+            'id'           => 0,
+            'name'         => '其他',
+            'code'         => '',
+            'count'        => $comjobs_community[''] ?? 0,
+            'broker_count' => $broker_town[''] ?? 0,
+        ];
+        $res['community'] = $community;
+
+        //数量统计
+        $comjobs_map          = [];
+        $comjobs_map[]        = ['createtime', '<=', time()];
+        $comjobs_map[]        = ['status', 'in', '3,4'];
+        $res['company_total'] = WorkerModel::where('status', 'in', '4,5')->count();
+        $res['comjobs_total'] = JobModel::where($comjobs_map)->count();
+        $res['user_total']    = UserModel::count();
+
+        return json($res);
+    }
+
+    public function recruit()
+    {
+        $data = [];
+
+        //招考数据
+        $data['recruit_count'] = RecruitModel::count();
+        $data['recruit_post']  = RecruitPostModel::count();
+        $data['recruit_apply'] = RecruitAppointInfoModel::count();
+
+        //学历和年龄
+        $recruit_apply_data = RecruitAppointInfoModel::field(['birthday', 'education'])->select();
+        $recruit_education  = [
+            '专科' => ['name' => '专科', 'count' => 0],
+            '本科' => ['name' => '本科', 'count' => 0],
+            '硕士' => ['name' => '硕士', 'count' => 0],
+            '博士' => ['name' => '博士', 'count' => 0],
+            '其他' => ['name' => '其他', 'count' => 0],
+        ];
+        $recruit_age        = [
+            '30岁及以下' => ['name' => '30岁及以下', 'count' => 0],
+            '30到35岁' => ['name' => '30到35岁', 'count' => 0],
+            '35到40岁' => ['name' => '35到40岁', 'count' => 0],
+            '40岁以上'  => ['name' => '40岁以上', 'count' => 0],
+        ];
+        $year               = date('Y');
+        foreach ($recruit_apply_data as $v) {
+            if (!empty($recruit_education[$v['education']])) {
+                $recruit_education[$v['education']]['count']++;
+            } else {
+                $recruit_education['其他']['count']++;
+            }
+
+            $birth = mb_substr($v['birthday'], 0, 4);
+            if ($birth >= ($year - 30)) {
+                $recruit_age['30岁及以下']['count']++;
+            } elseif ($birth >= ($year - 35) && $birth < ($year - 30)) {
+                $recruit_age['30到35岁']['count']++;
+            } elseif ($birth >= ($year - 40) && $birth < ($year - 35)) {
+                $recruit_age['35到40岁']['count']++;
+            } else {
+                $recruit_age['40岁以上']['count']++;
+            }
+        }
+
+        $data['recruit_education'] = array_values($recruit_education);
+        $data['recruit_age']       = array_values($recruit_age);
+
+        return json($data);
+    }
+}

+ 98 - 0
app/admin/controller/OddJob.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\AdminBaseController;
+use app\common\model\odd_job\JobModel;
+use app\common\model\odd_job\UserModel;
+use app\common\model\odd_job\WorkerModel;
+
+class OddJob extends AdminBaseController
+{
+
+    /**
+     * 公司
+     */
+    public function company()
+    {
+        return view();
+    }
+
+    public function listCompany()
+    {
+        $map = $this->dealEqualInput(['status','wtype'],$this->dealLikeInput(['title']));
+
+        $list  = WorkerModel::where($map)
+            ->order(['priority'=>'desc','id' => 'desc'])
+            ->append(['wtype_text', 'status_text'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->select();
+        $count = WorkerModel::where($map)->count();
+
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    /**
+     * 岗位
+     */
+    public function job()
+    {
+        return view();
+    }
+
+    public function listJob()
+    {
+        $map = $this->dealEqualInput(['status','wtype'],$this->dealLikeInput(['title']));
+
+        $list  = JobModel::with(['worker'])
+            ->where($map)
+            ->order(['updatetime'=>'desc'])
+            ->append(['wtype_text', 'status_text'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->select();
+        $count = JobModel::where($map)->count();
+
+        $list = $list->toArray();
+        foreach ($list as $k => $v) {
+            if (!empty($v['company_name'])) {
+                $list[$k]['worker']['title'] = $v['company_name'];
+            }
+        }
+
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    /**
+     * 求职者
+     */
+    public function user()
+    {
+        return view();
+    }
+
+    public function listUser()
+    {
+        $map = $this->dealEqualInput(['status','authstatus','followstatus'],$this->dealLikeInput(['keywords'=>'nickname|realname|mobile']));
+
+        $list  = UserModel::where($map)
+            ->order(['id'=>'desc'])
+            ->append(['status_text', 'authstatus_text','followstatus_text','education_text','worker_text'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->select();
+        $count = UserModel::where($map)->count();
+
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+}

+ 40 - 0
app/admin/controller/Recruit.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\AdminBaseController;
+use app\common\model\jucai\RecruitAppointInfoModel;
+use app\common\model\jucai\RecruitModel;
+
+class Recruit extends AdminBaseController
+{
+
+    /**
+     * 列表
+     */
+    public function index()
+    {
+        return view();
+    }
+
+    public function listRecruit()
+    {
+        $map = $this->dealLikeInput(['name']);
+
+        $list  = RecruitModel::where($map)
+            ->order(['id' => 'desc'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->select();
+        $count = RecruitModel::where($map)->count();
+
+        foreach ($list as $v) {
+            $v['apply_count'] = RecruitAppointInfoModel::where('recruit_id',$v['id'])->count();
+        }
+
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+}

+ 45 - 0
app/admin/controller/Talent.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\AdminBaseController;
+use app\common\model\SettingModel;
+
+class Talent extends AdminBaseController
+{
+
+    /**
+     * 列表
+     */
+    public function index()
+    {
+        $system = SettingModel::getConfigValue(SettingModel::TALENT);
+        return view('', [
+            'system' => $system,
+        ]);
+    }
+
+    public function editTalent()
+    {
+        $data = $this->_post(SettingModel::TALENT);
+        SettingModel::setConfigValue($data);
+        ajax_return();
+    }
+
+    /**
+     * 获取数据
+     * @param array $param 要获取的数据
+     * @return array
+     */
+    public function _post(array $param)
+    {
+        $res = [];
+        foreach ($param as $v) {
+            if (input($v) === '0' || !empty(input($v))) {
+                $res[$v] = input($v);
+            }
+        }
+
+        return $res;
+    }
+}

+ 11 - 62
app/admin/view/home/console.html

@@ -1,71 +1,20 @@
 <div class="layui-fluid">
 	<div class="layui-row layui-col-space15">
-		<div class="layui-col-md4">
-			<div class="layui-card">
-				<div class="layui-card-header">
-					今日新增用户
-					<span class="layui-badge layui-bg-blue layuiadmin-badge">日</span>
-				</div>
-				<div class="layui-card-body layuiadmin-card-list">
-					<p class="layuiadmin-big-font">{$user_count['today']}</p>
-					<p>
-						昨日
-						<span class="layuiadmin-span-color">{$user_count['yesterday']}<i class="layui-inline layui-icon layui-icon-user"></i></span>
-					</p>
-				</div>
-			</div>
-		</div>
-		<div class="layui-col-md4">
-			<div class="layui-card">
-				<div class="layui-card-header">
-					本周新增用户
-					<span class="layui-badge layui-bg-blue layuiadmin-badge">周</span>
-				</div>
-				<div class="layui-card-body layuiadmin-card-list">
-					<p class="layuiadmin-big-font">{$user_count['week']}</p>
-					<p>
-						本月
-						<span class="layuiadmin-span-color">{$user_count['month']} <i class="layui-inline layui-icon layui-icon-user"></i></span>
-					</p>
-				</div>
-			</div>
-		</div>
-		<div class="layui-col-md4">
+		<div class="layui-col-md6">
 			<div class="layui-card">
 				<div class="layui-card-header">
-					用户总数
-					<span class="layui-badge layui-bg-green layuiadmin-badge">总</span>
-				</div>
-				<div class="layui-card-body layuiadmin-card-list">
-					<p class="layuiadmin-big-font">{$user_count['total']}</p>
-					<p>
-						当前时间
-						<span class="layuiadmin-span-color">{:date('Y-m-d H:i:s')} <i class="layui-inline layui-icon layui-icon-time"></i></span>
-					</p>
+					快捷入口
 				</div>
-			</div>
-		</div>
-		<div class="layui-col-md6">
-			<div class="layui-card">
-				<div class="layui-card-header">意见反馈</div>
 				<div class="layui-card-body">
-					<ul class="layuiadmin-card-status layuiadmin-home2-usernote">
-						{if condition="$feedback->isEmpty()"}
-							<li>
-								<h3>暂无更多数据</h3>
-								<p>所有意见反馈均已处理</p>
-							</li>
-						{else/}
-							{volist name="feedback" id="v"}
-								<li>
-									<h3>{$v.name}</h3>
-									<p>{$v.content}</p>
-									<span>{$v.create_time}</span>
-									<a href="javascript:;" data-id="{$v.id}" class="layui-btn layui-btn-xs layuiadmin-reply deal-feedback">标记为已读</a>
-								</li>
-							{/volist}
-						{/if}
-					</ul>
+					<div class="layui-row layui-col-space10">
+						<div class="layui-col-xs12 layui-col-sm4">
+							<div class="layuiadmin-card-text">
+								<div class="layui-text-top"><i class="layui-icon layui-icon-water"></i><a href="/bi" target="_blank">大数据看板</a></div>
+								<p class="layui-text-center">打开后,按F11进入全屏模式进行观看,效果更佳。</p>
+								<p class="layui-text-bottom"><span>智能大数据</span></p>
+							</div>
+						</div>
+					</div>
 				</div>
 			</div>
 		</div>

+ 110 - 0
app/admin/view/odd_job/company.html

@@ -0,0 +1,110 @@
+<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="title" 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="wtype">
+                            <option value="">全部类型</option>
+                            <option value="1">个人雇主</option>
+                            <option value="2">企业雇主</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            <option value="1">待审核</option>
+                            <option value="2">未通过</option>
+                            <option value="3">被禁用</option>
+                            <option value="4">升级审核</option>
+                            <option value="5">正常中</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <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-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+
+            </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('odd_job/listCompany')}",
+            cols: [
+                [
+                    { field: 'id', width: 100, title: 'ID', sort: true },
+                    { field: 'priority', width: 100, title: '排序ID', edit: 'text', sort: true },
+                    { field: 'title', title: '公司名称', edit: 'text' },
+                    { field: 'wtype_text', title: '公司类型', edit: 'text' },
+                    { field: 'realname', title: '姓名', width: 150, edit: 'text' },
+                    { field: 'mobile', title: '手机号', width: 150, edit: 'text' },
+                    { field: 'weixin', title: '微信号', width: 150, edit: 'text' },
+                    { field: 'province', title: '省' },
+                    { field: 'city', title: '市' },
+                    { field: 'district', title: '区县' },
+                    { field: 'address', width: 200, title: '详细地址', hide: 'true', edit: 'text' },
+                    { field: 'status_text', title: '状态', width: 100, align: 'center' },
+                    { field: 'createtime', title: '创建时间', width: 170, hide: true },
+                    { title: '操作', width: 100, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+                ]
+            ],
+            page: true,
+            limit: 10,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'detail') {
+                const index = layer.open({
+                    type: 2,
+                    title: '详情',
+                    content: "{:url('recruit/noticeForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+    });
+</script>

+ 117 - 0
app/admin/view/odd_job/job.html

@@ -0,0 +1,117 @@
+<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="title" 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="wtype">
+                            <option value="">全部类型</option>
+                            <option value="1">按月</option>
+                            <option value="2">按时</option>
+                            <option value="3">按件</option>
+                            <option value="4">按项目</option>
+                            <option value="5">其他</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            <option value="1">待修改</option>
+                            <option value="2">待审核</option>
+                            <option value="3">已上架</option>
+                            <option value="4">已停招</option>
+                            <option value="5">已下架</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <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-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+
+            </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('odd_job/listJob')}",
+            cols: [
+                [
+                    { field: 'id', width: 80, title: '表ID', sort: true },
+                    { field: 'title', title: '岗位标题', minWidth: 300,},
+                    { field: 'workerid', title: '劳务公司', minWidth: 240, toolbar: '<div>{{d.worker.title}}</div>' },
+                    { field: 'province', title: '省', width: 100 },
+                    { field: 'city', title: '市', width: 100 },
+                    { field: 'district', title: '区县', width: 100 },
+
+                    { field: 'agegroup', title: '招工年龄', width: 120 },
+                    { field: 'enddate', title: '截止日期', width: 120 },
+                    { field: 'wtype_text', title: '薪资类型', align: 'center', width: 100 },
+                    { field: 'zwagall', title: '综合月薪'},
+                    { field: 'telephone', title: '咨询电话'},
+                    { field: 'remark', title: '补充说明', minWidth: 240},
+                    { field: 'status_text', title: '状态', width: 80, align: 'center' },
+                    { field: 'volume', title: '浏览量', width: 100, align: 'right' },
+                    { field: 'updatetime', title: '更新时间', width: 170 },
+                    { field: 'createtime', title: '创建时间', width: 170 },
+                    { title: '操作', width: 100, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+                ]
+            ],
+            page: true,
+            limit: 10,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'detail') {
+                const index = layer.open({
+                    type: 2,
+                    title: '详情',
+                    content: "{:url('recruit/noticeForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+    });
+</script>

+ 131 - 0
app/admin/view/odd_job/user.html

@@ -0,0 +1,131 @@
+<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="keywords" placeholder="请输入..." autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            <option value="1">待审核</option>
+                            <option value="2">已通过</option>
+                            <option value="3">未通过</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">实名认证</label>
+                    <div class="layui-input-block">
+                        <select name="authstatus">
+                            <option value="">全部认证状态</option>
+                            <option value="1">待认证</option>
+                            <option value="2">待审核</option>
+                            <option value="3">已认证</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">跟进状态</label>
+                    <div class="layui-input-block">
+                        <select name="followstatus">
+                            <option value="">全部跟进状态</option>
+                            <option value="1">未跟进</option>
+                            <option value="2">未面试</option>
+                            <option value="3">面试通过</option>
+                            <option value="4">面试未通过</option>
+                            <option value="5">用户放弃</option>
+                            <option value="6">已入职</option>
+                            <option value="7">已离职</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="avatarTpl">
+                {{#  if(d.avatar != ''){ }}
+                <div id="pic{{d.id}}" lay-event="pic">
+                    <img style="width: 100%; height: 100%;" src="{{d.avatar}}">
+                </div>
+                {{#  } }}
+            </script>
+            <script type="text/html" id="setTpl">
+
+            </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('odd_job/listUser')}",
+            cols: [
+                [
+                    { field: 'id', width: 80, title: '表ID', sort: true },
+                    { field: 'avatar', width: 60, title: '头像', templet: '#avatarTpl' },
+                    { field: 'nickname', title: '昵称'},
+                    { field: 'realname', title: '姓名'},
+                    { field: 'mobile', title: '手机号' },
+                    { field: 'status_text', title: '状态', minWidth: 80, align: 'center' },
+                    { field: 'authstatus_text', title: '实名认证', minWidth: 100, align: 'center' },
+                    { field: 'education_text', title: '学历', minWidth: 100, align: 'center' },
+                    { field: 'worker_text', title: '工作经验', minWidth: 100, align: 'center' },
+                    { field: 'address', title: '居住地', minWidth: 100, align: 'center' },
+                    { field: 'eduexperience', title: '个人描述', minWidth: 150, align: 'center' },
+                    { field: 'createtime', title: '注册时间', width: 170},
+                    { field: 'followstatus_text', title: '跟进状态', minWidth: 150, align: 'center' },
+                    { title: '操作', minWidth: 100, align: 'center', fixed: 'right', toolbar: '#setTpl' }
+                ]
+            ],
+            page: true,
+            limit: 10,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'detail') {
+                const index = layer.open({
+                    type: 2,
+                    title: '详情',
+                    content: "{:url('recruit/noticeForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+    });
+</script>

+ 78 - 0
app/admin/view/recruit/index.html

@@ -0,0 +1,78 @@
+<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="title" placeholder="请输入" autocomplete="off" class="layui-input">
+                    </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-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setTpl">
+
+            </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('recruit/listRecruit')}",
+            cols: [
+                [
+                    {field: 'name', title: '招考名称'},
+                    {field: 'company', title: '招聘主体', width: 200},
+                    {field: 'apply_count', title: '报名人数', width: 100},
+                    {field: 'apply_start', title: '开始时间', width: 160, align: 'center'},
+                    {title: '操作', width: 150, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 10,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'detail') {
+                const index = layer.open({
+                    type: 2,
+                    title: '详情',
+                    content: "{:url('recruit/noticeForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+    });
+</script>

+ 340 - 0
app/admin/view/talent/index.html

@@ -0,0 +1,340 @@
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md12">
+            <div class="layui-card layui-tab  layui-tab-brief" lay-filter="linktab">
+                <ul class="layui-tab-title">
+                    <li class="layui-this">人才数据大屏</li>
+                </ul>
+                <div class="layui-tab-content">
+                    <div class="layui-form layui-form-pane">
+                        <div class="layui-tab-item layui-show">
+                            <div class="layui-card">
+                                <div class="layui-card-header">人才层次</div>
+                                <div class="layui-card-body" pad15>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第一层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第一层次人才数量"
+                                                   name="talent_level_1"
+                                                   value="{:array_get($system,'talent_level_1')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第二层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第二层次人才数量"
+                                                   name="talent_level_2"
+                                                   value="{:array_get($system,'talent_level_2')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第三层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第三层次人才数量"
+                                                   name="talent_level_3"
+                                                   value="{:array_get($system,'talent_level_3')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第四层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第四层次人才数量"
+                                                   name="talent_level_4"
+                                                   value="{:array_get($system,'talent_level_4')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第五层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第五层次人才数量"
+                                                   name="talent_level_5"
+                                                   value="{:array_get($system,'talent_level_5')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第六层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第六层次人才数量"
+                                                   name="talent_level_6"
+                                                   value="{:array_get($system,'talent_level_6')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>第七层次</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="请输入第七层次人才数量"
+                                                   name="talent_level_7"
+                                                   value="{:array_get($system,'talent_level_7')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-tab-item layui-show">
+                            <div class="layui-card">
+                                <div class="layui-card-header">人才所在行业</div>
+                                <div class="layui-card-body" pad15>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>贸易/进出口</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="贸易/进出口"
+                                                   name="talent_industry_trade"
+                                                   value="{:array_get($system,'talent_industry_trade')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>消费品(食/饮/烟酒)</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="消费品(食/饮/烟酒)"
+                                                   name="talent_industry_goods"
+                                                   value="{:array_get($system,'talent_industry_goods')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>服装/纺织/皮革</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="服装/纺织/皮革"
+                                                   name="talent_industry_clothing"
+                                                   value="{:array_get($system,'talent_industry_clothing')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>制药/生物工程</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="制药/生物工程"
+                                                   name="talent_industry_drug"
+                                                   value="{:array_get($system,'talent_industry_drug')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>医疗设备/器械</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="医疗设备/器械"
+                                                   name="talent_industry_medical"
+                                                   value="{:array_get($system,'talent_industry_medical')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>酒店/旅游</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="酒店/旅游"
+                                                   name="talent_industry_hotel"
+                                                   value="{:array_get($system,'talent_industry_hotel')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>交通/运输/物流</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="交通/运输/物流"
+                                                   name="talent_industry_traffic"
+                                                   value="{:array_get($system,'talent_industry_traffic')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>其他</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="其他"
+                                                   name="talent_industry_other"
+                                                   value="{:array_get($system,'talent_industry_other')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-tab-item layui-show">
+                            <div class="layui-card">
+                                <div class="layui-card-header">人才年龄分布</div>
+                                <div class="layui-card-body" pad15>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>30岁以下</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="30岁以下"
+                                                   name="talent_age_1"
+                                                   value="{:array_get($system,'talent_age_1')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>30-39岁</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="30-39岁"
+                                                   name="talent_age_2"
+                                                   value="{:array_get($system,'talent_age_2')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>40-49岁</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="40-49岁"
+                                                   name="talent_age_3"
+                                                   value="{:array_get($system,'talent_age_3')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>50岁以上</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="50岁以上"
+                                                   name="talent_age_4"
+                                                   value="{:array_get($system,'talent_age_4')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-tab-item layui-show">
+                            <div class="layui-card">
+                                <div class="layui-card-header">人才学历分布</div>
+                                <div class="layui-card-body" pad15>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>硕士</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="硕士"
+                                                   name="talent_education_1"
+                                                   value="{:array_get($system,'talent_education_1')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>博士</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="博士"
+                                                   name="talent_education_2"
+                                                   value="{:array_get($system,'talent_education_2')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>博士后</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="博士后"
+                                                   name="talent_education_3"
+                                                   value="{:array_get($system,'talent_education_3')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-tab-item layui-show">
+                            <div class="layui-card">
+                                <div class="layui-card-header">其他</div>
+                                <div class="layui-card-body" pad15>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label"><span
+                                                style="color:#f90c05;">*</span>人才总人数</label>
+                                        <div class="layui-input-block">
+                                            <input type="number" placeholder="人才总人数"
+                                                   name="talent_total"
+                                                   value="{:array_get($system,'talent_total')}"
+                                                   lay-verify="required"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-tab-item layui-show">
+                            <div class="layui-card">
+                                <div class="layui-form-item">
+                                    <div class="layui-input-block">
+                                        <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">确认修改</button>
+                                    </div>
+                                </div>
+                            </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) {
+            admin.req({
+                url: "{:url('talent/editTalent')}",
+                type: 'post',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {icon: 1});
+                    setTimeout(function () {
+                        location.reload();
+                    },2000);
+                }
+            });
+
+        });
+    });
+</script>

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

@@ -20,6 +20,31 @@ class SettingModel extends BaseModel
     const SMS_TYPE = [
         ['value' => '\\chuanglan\\Chuanglan', 'text' => '创蓝短信'],
     ];
+    const TALENT   = [
+        'talent_level_1',
+        'talent_level_2',
+        'talent_level_3',
+        'talent_level_4',
+        'talent_level_5',
+        'talent_level_6',
+        'talent_level_7',
+        'talent_industry_trade',
+        'talent_industry_goods',
+        'talent_industry_clothing',
+        'talent_industry_drug',
+        'talent_industry_medical',
+        'talent_industry_hotel',
+        'talent_industry_traffic',
+        'talent_industry_other',
+        'talent_age_1',
+        'talent_age_2',
+        'talent_age_3',
+        'talent_age_4',
+        'talent_education_1',
+        'talent_education_2',
+        'talent_education_3',
+        'talent_total',
+    ];
 
     public static function getConfigValue($code)
     {

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

@@ -0,0 +1,9 @@
+<?php
+
+namespace app\common\model;
+
+class TalentModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'talent';
+}

+ 14 - 0
app/common/model/jucai/RecruitAppointInfoModel.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace app\common\model\jucai;
+
+use think\Model;
+
+class RecruitAppointInfoModel extends Model
+{
+    protected $connection = 'jucai';
+
+    //设置表名
+    protected $name = 'recruit_appoint_info';
+
+}

+ 14 - 0
app/common/model/jucai/RecruitModel.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace app\common\model\jucai;
+
+use think\Model;
+
+class RecruitModel extends Model
+{
+    protected $connection = 'jucai';
+
+    //设置表名
+    protected $name = 'recruit';
+
+}

+ 14 - 0
app/common/model/jucai/RecruitPostModel.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace app\common\model\jucai;
+
+use think\Model;
+
+class RecruitPostModel extends Model
+{
+    protected $connection = 'jucai';
+
+    //设置表名
+    protected $name = 'recruit_post';
+
+}

+ 41 - 0
app/common/model/odd_job/BrokerModel.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace app\common\model\odd_job;
+
+use think\Model;
+use think\model\concern\SoftDelete;
+
+class BrokerModel extends Model
+{
+    protected $connection = 'odd_job';
+
+    use SoftDelete;
+    protected $deleteTime = 'deletetime';
+    protected $defaultSoftDelete = 0;
+
+    //设置表名
+    protected $name = 'broker';
+
+    // 设置字段自动转换类型
+    protected $type = [
+        'createtime' => 'timestamp:Y-m-d H:i:s',
+    ];
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $status = [1 => '正常', 2 => '禁用'];
+        return $status[$data['status']];
+    }
+
+    public function getPowerreportTextAttr($value, $data)
+    {
+        $status = [1 => '是', 2 => '否'];
+        return $status[$data['powerreport']];
+    }
+
+    public function getTypeTextAttr($value, $data)
+    {
+        $status = [1 => '经纪人', 2 => '红色合伙人', 3 => '省外经纪人'];
+        return $status[$data['type']];
+    }
+}

+ 61 - 0
app/common/model/odd_job/JobModel.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace app\common\model\odd_job;
+
+use think\Model;
+use think\model\concern\SoftDelete;
+
+class JobModel extends Model
+{
+    protected $connection = 'odd_job';
+
+    use SoftDelete;
+    protected $deleteTime = 'deletetime';
+    protected $defaultSoftDelete = 0;
+
+    //设置表名
+    protected $name = 'comjobs';
+
+    // 设置字段自动转换类型
+    protected $type = [
+        'tags'       => 'json',
+        'picall'     => 'json',
+        'emp_time'   => 'json',
+        'enddate'    => 'timestamp:Y-m-d',
+        'updatetime' => 'timestamp:Y-m-d H:i:s',
+        'createtime' => 'timestamp:Y-m-d H:i:s',
+    ];
+
+    // 设置JSON数据返回数组
+    protected $jsonAssoc = true;
+
+    public function getWtypeTextAttr($value, $data)
+    {
+        $wtype = [1 => '按月', 2 => '按时', 3 => '按件', 4 => '按项目', 5 => '其他'];
+        return $wtype[$data['wtype']];
+    }
+
+    public function getSexTextAttr($value, $data)
+    {
+        $sex = ['不限', '男', '女'];
+        return $sex[$data['sex']];
+    }
+
+    public function getRecruitmentCateTextAttr($value, $data)
+    {
+        $recruitment_cate = [1 => '普通招聘', 2 => '悬赏聘'];
+        return $recruitment_cate[$data['recruitment_cate']];
+    }
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $status = [1 => '待修改', 2 => '待审核', 3 => '已上架', 4 => '已停招', 5 => '已下架'];
+        return $status[$data['status']];
+    }
+
+    // 关联Worker
+    public function worker()
+    {
+        return $this->hasOne(WorkerModel::class, "id", "workerid");
+    }
+}

+ 21 - 0
app/common/model/odd_job/RensheCodeModel.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace app\common\model\odd_job;
+
+use think\Model;
+
+class RensheCodeModel extends Model
+{
+    protected $connection = 'odd_job';
+
+    //设置表名
+    protected $name = 'renshe_code';
+
+    /**
+     * 根据类型获取列表
+     */
+    public static function getList($type)
+    {
+        return self::where('type', $type)->field('id,name,code')->select();
+    }
+}

+ 66 - 0
app/common/model/odd_job/UserModel.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace app\common\model\odd_job;
+
+use think\Model;
+use think\model\concern\SoftDelete;
+
+class UserModel extends Model
+{
+    use SoftDelete;
+    protected $deleteTime = 'deletetime';
+    protected $defaultSoftDelete = 0;
+
+    protected $connection = 'odd_job';
+
+    //设置表名
+    protected $name = 'user';
+
+    // 设置字段自动转换类型
+    protected $type = [
+        'bankcard'   => 'json',
+        'createtime' => 'timestamp:Y-m-d H:i:s',
+        'emp_time'   => 'json',
+        'com_cate'   => 'json',
+        'work_place' => 'json',
+        'user_tags'  => 'json',
+        'skill_cert' => 'json',
+    ];
+    protected $jsonAssoc = true;
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $status = [1 => '待审核', 2 => '已通过', 3 => '未通过'];
+        return $status[$data['status']];
+    }
+
+    public function getIsvipTextAttr($value, $data)
+    {
+        $isvip = [1 => '否', 2 => '是'];
+        return $isvip[$data['isvip']];
+    }
+
+    public function getAuthstatusTextAttr($value, $data)
+    {
+        $authstatus = [1 => '待认证', 2 => '待审核', 3 => '已认证'];
+        return $authstatus[$data['authstatus']];
+    }
+
+    public function getFollowstatusTextAttr($value, $data)
+    {
+        $followstatus = [1 => '未跟进', 2 => '未面试', 3 => '面试通过', 4 => '面试未通过', 5 => '用户放弃', 6 => '已入职', 7 => '已离职'];
+        return $followstatus[$data['followstatus']];
+    }
+
+    public function getEducationTextAttr($value, $data)
+    {
+        $education = ['' => '', 1 => '初中及以下', 2 => '高中', 3 => '中技', 4 => '中专', 5 => '大专', 6 => '本科', 7 => '硕士', 8 => '博士'];
+        return $education[$data['education']];
+    }
+
+    public function getWorkerTextAttr($value, $data)
+    {
+        $experience = ['' => '', 1 => '无经验', 2 => '一年以下', 3 => '1-3年', 4 => '3-5年', 5 => '5-10年', 6 => '10年以上'];
+        return $experience[$data['workexperience']];
+    }
+}

+ 29 - 0
app/common/model/odd_job/WorkerModel.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace app\common\model\odd_job;
+
+use think\Model;
+
+class WorkerModel extends Model
+{
+    protected $connection = 'odd_job';
+
+    //设置表名
+    protected $name = 'worker';
+
+    protected $type = [
+        'createtime' => 'timestamp:Y-m-d H:i:s',
+    ];
+
+    public function getWtypeTextAttr($value, $data)
+    {
+        $wtype = [1 => '个人雇主', 2 => '企业雇主'];
+        return $wtype[$data['wtype']];
+    }
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $status = [1 => '待审核', 2 => '未通过', 3 => '被禁用', 4 => '升级审核', 5 => '正常中'];
+        return $status[$data['status']];
+    }
+}

+ 1 - 1
config/app.php

@@ -13,7 +13,7 @@ return [
     // 自动多应用模式
     'auto_multi_app'   => true,
     // 默认应用
-    'default_app'      => 'mobile',
+    'default_app'      => 'admin',
     // 默认时区
     'default_timezone' => 'Asia/Shanghai',
 

+ 56 - 0
config/database.php

@@ -59,5 +59,61 @@ return [
         ],
 
         // 更多的数据库配置信息
+        'jucai'    =>    [
+            // 数据库类型
+            'type'        => env('database_jucai.type', 'mysql'),
+            // 服务器地址
+            'hostname'    => env('database_jucai.hostname', '127.0.0.1'),
+            // 数据库名
+            'database'    => env('database_jucai.database', ''),
+            // 数据库用户名
+            'username'    => env('database_jucai.username', 'root'),
+            // 数据库密码
+            'password'    => env('database_jucai.password', ''),
+            // 数据库连接端口
+            'hostport'    => env('database_jucai.hostport', '3306'),
+            // 数据库连接参数
+            'params'      => [],
+            // 数据库编码默认采用utf8
+            'charset'     => env('database_jucai.charset', 'utf8mb4'),
+            // 数据库表前缀
+            'prefix'      => env('database_jucai.prefix', ''),
+            // 是否严格检查字段是否存在
+            'fields_strict'   => true,
+            // 是否需要断线重连
+            'break_reconnect' => false,
+            // 监听SQL
+            'trigger_sql'     => env('app_debug', true),
+            // 开启字段缓存
+            'fields_cache'    => false,
+        ],
+        'odd_job'    =>    [
+            // 数据库类型
+            'type'        => env('database_odd_job.type', 'mysql'),
+            // 服务器地址
+            'hostname'    => env('database_odd_job.hostname', '127.0.0.1'),
+            // 数据库名
+            'database'    => env('database_odd_job.database', ''),
+            // 数据库用户名
+            'username'    => env('database_odd_job.username', 'root'),
+            // 数据库密码
+            'password'    => env('database_odd_job.password', ''),
+            // 数据库连接端口
+            'hostport'    => env('database_odd_job.hostport', '3306'),
+            // 数据库连接参数
+            'params'      => [],
+            // 数据库编码默认采用utf8
+            'charset'     => env('database_odd_job.charset', 'utf8mb4'),
+            // 数据库表前缀
+            'prefix'      => env('database_odd_job.prefix', ''),
+            // 是否严格检查字段是否存在
+            'fields_strict'   => true,
+            // 是否需要断线重连
+            'break_reconnect' => false,
+            // 监听SQL
+            'trigger_sql'     => env('app_debug', true),
+            // 开启字段缓存
+            'fields_cache'    => false,
+        ],
     ],
 ];

+ 0 - 8
public/.htaccess

@@ -1,8 +0,0 @@
-<IfModule mod_rewrite.c>
-  Options +FollowSymlinks -Multiviews
-  RewriteEngine On
-
-  RewriteCond %{REQUEST_FILENAME} !-d
-  RewriteCond %{REQUEST_FILENAME} !-f
-  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
-</IfModule>

+ 511 - 0
public/bi/css/index.css

@@ -0,0 +1,511 @@
+body{
+    line-height: 1.15;
+    font-size: 0.5rem;
+    margin: 0;
+    padding: 0;
+    background-repeat: no-repeat;
+    background-position: 0 0 / cover;
+    background-color: #101129;
+}
+*{
+    margin: 0;
+    padding: 0;
+    font-weight: normal;
+}
+ul{
+    list-style: none;
+}
+a{
+    text-decoration: none;
+}
+.viewport {
+    /* 限定大小 */
+    min-width: 1024px;
+    max-width: 1920px;
+    min-height: 780px;
+    margin: 0 auto;
+    background: url(../images/logo1.png) no-repeat 0 0 / contain;
+    display: flex;
+    padding: 3.667rem 0.833rem 0;
+}
+.column{
+    flex: 3;
+    position: relative;
+    margin-top: 3rem;
+}
+.column:nth-child(2){
+    flex: 4;
+    margin-left:0.833rem;
+    margin-right:0.833rem;
+}
+.panel {
+    /* 边框 */
+    box-sizing: border-box;
+    border: 2px solid red;
+    border-image: url(../images/border.png) 51 38 21 132;
+    border-width: 2.125rem 1.583rem 0.875rem 5.5rem;
+    position: relative;
+    margin-bottom: 0.833rem;
+}
+.panel .inner {
+    /* 装内容 */
+    /* height: 60px; */
+    position: absolute;
+    top: -2.125rem;
+    right: -1.583rem;
+    bottom: -0.875rem;
+    left: -5.5rem;
+    padding: 1rem 1.5rem;
+}
+.panel h3{
+    font-size: 0.833rem;
+    color: #fff;
+}
+
+/* 订单 */
+.order {
+  height: 7rem;
+}
+.order .filter {
+  display: flex;
+}
+.order .filter a {
+  display: block;
+  height: 0.75rem;
+  line-height: 1;
+  padding: 0 0.75rem;
+  color: #1950c4;
+  font-size: 0.75rem;
+  border-right: 0.083rem solid #00f2f1;
+}
+.order .filter a:first-child {
+  padding-left: 0;
+}
+.order .filter a:last-child {
+  border-right: none;
+}
+.order .filter a.active {
+  color: #fff;
+  font-size: 0.833rem;
+}
+.order .data {
+  display: flex;
+  margin-top: 0.833rem;
+}
+.order .item {
+  width: 50%;
+  text-align: center;
+}
+.order h4 {
+  font-size: 1.167rem;
+  color: #fff;
+  margin-bottom: 0.417rem;
+}
+.order span {
+  display: block;
+  color: #4c9bfd;
+  font-size: 0.667rem;
+}
+/* ------------------------------------------------------------动画 */
+@keyframes row{
+  0%{}
+  100%{
+    transform: translateY(-50%);
+  }
+}
+/* 调用动画 */
+.monitor .marquee {
+  /* //infinite永久调用动画 */
+  animation: row  10s linear infinite;
+}
+/*鼠标划入 停止动画  */
+.monitor .marquee:hover {
+  animation-play-state: paused;
+}
+/* 点位 */
+.point {
+  height: 14rem;
+}
+.point .chart {
+  display: flex;
+  margin-top: 1rem;
+  justify-content: space-between;
+}
+.point .pie {
+  width: 13rem;
+  height: 10rem;
+  margin-left: -0.4rem;
+}
+.point .data {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  width: 7rem;
+  padding: 1.5rem 1.25rem;
+  box-sizing: border-box;
+  background-image: url(../images/rect.png);
+  background-size: cover;
+}
+.point h4 {
+  margin-bottom: 0.5rem;
+  font-size: 1.167rem;
+  color: #fff;
+}
+.point span {
+  display: block;
+  color: #4c9bfd;
+  font-size: 0.667rem;
+}
+/* 地图  */
+.map {
+  height: 28.8rem;
+  margin-bottom: 0.833rem;
+  display: flex;
+  flex-direction: column;
+}
+.map h3 {
+  line-height: 1;
+  padding: 0.667rem 0;
+  margin: 0;
+  font-size: 0.833rem;
+  color: #fff;
+}
+.map .icon-cube {
+  color: #68d8fe;
+}
+.map .chart {
+  flex: 1;
+  background-color: rgba(255, 255, 255, 0.05);
+}
+.map .geo {
+  width: 100%;
+  height: 100%;
+}
+/* 用户模块 */
+.users {
+  height: 14.167rem;
+  display: flex;
+}
+.users .chart {
+  display: flex;
+  margin-top: 1rem;
+}
+.users .bar {
+  width: 24.5rem;
+  height: 10rem;
+}
+.users .data {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  width: 7rem;
+  padding: 1.5rem 1.25rem;
+  box-sizing: border-box;
+  background-image: url(../images/rect.png);
+  background-size: cover;
+}
+.users h4 {
+  margin-bottom: 0.5rem;
+  font-size: 1.167rem;
+  color: #fff;
+}
+.users span {
+  display: block;
+  color: #4c9bfd;
+  font-size: 0.667rem;
+}
+/* 订单 */
+.order {
+  height: 6.167rem;
+}
+.order .filter {
+  display: flex;
+}
+.order .filter a {
+  display: block;
+  height: 0.75rem;
+  line-height: 1;
+  padding: 0 0.75rem;
+  color: #1950c4;
+  font-size: 0.75rem;
+  border-right: 0.083rem solid #00f2f1;
+}
+.order .filter a:first-child {
+  padding-left: 0;
+}
+.order .filter a:last-child {
+  border-right: none;
+}
+.order .filter a.active {
+  color: #fff;
+  font-size: 0.833rem;
+}
+.order .data {
+  display: flex;
+  margin-top: 0.833rem;
+}
+.order .item {
+  width: 50%;
+}
+.order h4 {
+  font-size: 1.167rem;
+  color: #fff;
+  margin-bottom: 0.417rem;
+}
+.order span {
+  display: block;
+  color: #4c9bfd;
+  font-size: 0.667rem;
+}
+/* 销售区域 */
+.sales {
+  height: 14rem;
+}
+.sales .caption {
+  display: flex;
+  line-height: 1;
+}
+.sales h3 {
+  height: 0.75rem;
+  padding-right: 0.75rem;
+  /* border-right: 0.083rem solid #00f2f1; */
+}
+.sales a {
+  padding: 0.167rem;
+  font-size: 0.667rem;
+  margin: -0.125rem 0 0 0.875rem;
+  border-radius: 0.125rem;
+  color: #0bace6;
+}
+.sales a.active {
+  background-color: #4c9bfd;
+  color: #fff;
+}
+.sales .inner {
+  display: flex;
+  flex-direction: column;
+}
+.sales .chart {
+  flex: 1;
+  padding-top: 0.6rem;
+  position: relative;
+}
+.sales .label {
+  position: absolute;
+  left: 1.75rem;
+  top: 0.75rem;
+  color: #4996f5;
+  font-size: 0.583rem;
+}
+.sales .line {
+  width: 100%;
+  height: 100%;
+}
+/* 渠道区块 */
+.wrap {
+  display: flex;
+}
+.channel,
+.quarter {
+  flex: 1;
+  height: 9.667rem;
+}
+.channel {
+  margin-right: 0.833rem;
+}
+.channel .data {
+  overflow: hidden;
+}
+.channel .item {
+  margin-top: 0.85rem;
+}
+.channel .item:first-child {
+  float: left;
+}
+.channel .item:last-child {
+  float: right;
+}
+.channel h4 {
+  color: #fff;
+  font-size: 1.333rem;
+  margin-bottom: 0.2rem;
+}
+.channel small {
+  font-size: 50%;
+}
+.channel span {
+  display: block;
+  color: #4c9bfd;
+  font-size: 0.583rem;
+}
+/* 季度区块 */
+.quarter .inner {
+  display: flex;
+  flex-direction: column;
+  margin: 0 -0.25rem;
+}
+.quarter .chart {
+  flex: 1;
+  padding-top: 0.75rem;
+}
+.quarter .box {
+  position: relative;
+}
+.quarter .label {
+  transform: translate(-50%, -30%);
+  color: #fff;
+  font-size: 1.25rem;
+  position: absolute;
+  left: 50%;
+  top: 50%;
+}
+.quarter .label small {
+  font-size: 50%;
+}
+.quarter .gauge {
+  height: 3.5rem;
+}
+.quarter .data {
+  display: flex;
+  justify-content: space-between;
+}
+.quarter .item {
+  width: 50%;
+}
+.quarter h4 {
+  color: #fff;
+  font-size: 1rem;
+  margin-bottom: 0.4rem;
+}
+.quarter span {
+  display: block;
+  width: 100%;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  color: #4c9bfd;
+  font-size: 0.583rem;
+}
+/* 排行榜 */
+.top {
+  height: 11.8rem;
+}
+.top .inner {
+  display: flex;
+}
+.top .all {
+  display: flex;
+  flex-direction: column;
+  width: 7rem;
+  color: #4c9bfd;
+  font-size: 0.6rem;
+  vertical-align: middle;
+}
+.top .all ul {
+  padding-left: 0.5rem;
+  margin-top: 0.5rem;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-around;
+}
+.top .all li {
+  overflow: hidden;
+}
+.top .all [class^="icon-"] {
+  font-size: 1.5rem;
+  vertical-align: middle;
+  margin-right: 0.5rem;
+}
+.top .province {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  color: #fff;
+}
+.top .province i {
+  padding: 0 0.5rem;
+  margin-top: 0.208rem;
+  float: right;
+  font-style: normal;
+  font-size: 0.583rem;
+  color: #0bace6;
+}
+.top .province s {
+  display: inline-block;
+  transform: scale(0.8);
+  text-decoration: none;
+}
+.top .province .icon-up {
+  color: #dc3c33;
+}
+.top .province .icon-down {
+  color: #36be90;
+}
+.top .province .data {
+  flex: 1;
+  display: flex;
+  margin-top: 0.6rem;
+}
+.top .province ul {
+  flex: 1;
+  line-height: 1;
+  margin-bottom: 0.25rem;
+}
+.top .province ul li {
+  display: flex;
+  justify-content: space-between;
+}
+.top .province ul span {
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.top .province ul.sup {
+  font-size: 0.583rem;
+}
+.top .province ul.sup li {
+  color: #4995f4;
+  padding: 0.5rem;
+}
+.top .province ul.sup li.active {
+  color: #a3c6f2;
+  background-color: rgba(10, 67, 188, 0.2);
+}
+.top .province ul.sub {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-around;
+  font-size: 0.5rem;
+  background-color: rgba(10, 67, 188, 0.2);
+}
+.top .province ul.sub li {
+  color: #52ffff;
+  padding: 0.417rem 0.6rem;
+}
+.clock {
+  position: absolute;
+  top: -1.5rem;
+  right: 1.667rem;
+  font-size: 0.833rem;
+  color: #0bace6;
+}
+.clock i {
+  margin-right: 5px;
+  font-size: 0.833rem;
+}
+@media screen and (max-width: 1600px) {
+  .top span {
+    transform: scale(0.9);
+  }
+  .top .province ul.sup li {
+    padding: 0.4rem 0.5rem;
+  }
+  .top .province ul.sub li {
+    padding: 0.23rem 0.5rem;
+  }
+  .quarter span {
+    transform: scale(0.9);
+  }
+}

+ 62 - 0
public/bi/fonts/icomoon.css

@@ -0,0 +1,62 @@
+@font-face {
+  font-family: 'icomoon';
+  src:  url('icomoon.eot');
+  src:  url('icomoon.eot#iefix') format('embedded-opentype'),
+    url('icomoon.ttf') format('truetype'),
+    url('icomoon.woff') format('woff'),
+    url('icomoon.svg#icomoon') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'icomoon' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-dot:before {
+  content: "\e900";
+}
+.icon-cup1:before {
+  content: "\e901";
+}
+.icon-cup2:before {
+  content: "\e902";
+}
+.icon-cup3:before {
+  content: "\e903";
+}
+.icon-clock:before {
+  content: "\e904";
+}
+.icon-down:before {
+  content: "\e905";
+}
+.icon-cube:before {
+  content: "\e906";
+}
+.icon-plane:before {
+  content: "\e907";
+}
+.icon-train:before {
+  content: "\e908";
+}
+.icon-bus:before {
+  content: "\e909";
+}
+.icon-bag:before {
+  content: "\e90a";
+}
+.icon-up:before {
+  content: "\e90b";
+}

BIN=BIN
public/bi/fonts/icomoon.eot


+ 22 - 0
public/bi/fonts/icomoon.svg

@@ -0,0 +1,22 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="857.6" descent="-166.4" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe900;" glyph-name="dot" d="M510-44.4v0c-109.2 0-198.8 89.2-198.8 198.8v395.2c0 109.2 89.2 198.8 198.8 198.8v0c109.2 0 198.8-89.2 198.8-198.8v-395.6c0-109.2-89.6-198.4-198.8-198.4z" />
+<glyph unicode="&#xe901;" glyph-name="cup1" d="M824.4 674c0 68.8-56.4 124.8-124.8 124.8h-375.6c-68.8 0-124.8-56.4-124.8-124.8-214 0-187.6 0-187.6-124.8 0-103.2 84.4-187.6 187.6-187.6 8 0 14 1.6 22 1.6 42-122 140.8-232.8 259.2-250v-145.2h-93.6c-17.2 0-31.2-14-31.2-31.2s14-31.2 31.2-31.2h250c17.2 0 31.2 14 31.2 31.2s-14 31.2-31.2 31.2h-93.6v145.2c118.8 17.2 217.2 126.4 259.2 250 6.4 0 14-1.6 22-1.6 103.2 0 187.6 84.4 187.6 187.6-2 124.8 24.8 124.8-187.6 124.8zM199.2 424c-68.8 0-125.2 56-125.2 124.8s1.6 62.4 124.8 62.4l0.4-187.2zM578.8 296h-94.4v202.4c0 29.2-0.8 46.8-2 52.8-1.6 6-5.2 10.4-11.6 13.6s-20.4 4.4-42 4.4h-9.2v44c45.6 10 80 30 103.6 60.4h55.6v-377.6zM824.4 424v187.2c123.6 0 124.8 6.4 124.8-62.4-1.6-68.8-56.4-124.8-124.8-124.8z" />
+<glyph unicode="&#xe902;" glyph-name="cup2" d="M824.4 674c0 68.8-56.4 124.8-124.8 124.8h-375.6c-68.8 0-124.8-56.4-124.8-124.8-214 0-187.6 0-187.6-124.8 0-103.2 84.4-187.6 187.6-187.6 8 0 14 1.6 22 1.6 42-122 140.8-232.8 259.2-250v-145.2h-93.6c-17.2 0-31.2-14-31.2-31.2s14-31.2 31.2-31.2h250c17.2 0 31.2 14 31.2 31.2s-14 31.2-31.2 31.2h-93.6v145.2c118.8 17.2 217.2 126.4 259.2 250 6.4 0 14-1.6 22-1.6 103.2 0 187.6 84.4 187.6 187.6-2 124.8 24.8 124.8-187.6 124.8zM74 548.8c0 68.8 1.6 62.4 124.8 62.4l0.4-187.2c-68.8 0-125.2 56-125.2 124.8zM618 359.2v-63.6h-205.2v53.2c60.8 99.6 96.8 161.2 108.4 184.8s17.2 42 17.2 55.2c0 10-1.6 17.6-5.2 22.8s-8.8 7.6-16 7.6-12.4-2.8-16-8.4c-3.6-5.6-5.2-16.4-5.2-33.2v-35.6h-83.6v14c0 20.8 1.2 37.6 3.2 49.6s7.6 24 16 35.6 19.6 20.4 33.2 26.4 29.6 9.2 48.8 9.2c37.2 0 65.2-9.2 84-27.6 19.2-18.4 28.4-41.6 28.4-70 0-21.6-5.2-44-16-68s-42.4-74.4-94.4-152h102.4zM824.4 424v187.2c123.6 0 124.8 6.4 124.8-62.4-1.6-68.8-56.4-124.8-124.8-124.8z" />
+<glyph unicode="&#xe903;" glyph-name="cup3" d="M824.4 674c0 68.8-56.4 124.8-124.8 124.8h-375.6c-68.8 0-124.8-56.4-124.8-124.8-214 0-187.6 0-187.6-124.8 0-103.2 84.4-187.6 187.6-187.6 8 0 14 1.6 22 1.6 42-122 140.8-232.8 259.2-250v-145.2h-93.6c-17.2 0-31.2-14-31.2-31.2s14-31.2 31.2-31.2h250c17.2 0 31.2 14 31.2 31.2s-14 31.2-31.2 31.2h-93.6v145.2c118.8 17.2 217.2 126.4 259.2 250 6.4 0 14-1.6 22-1.6 103.2 0 187.6 84.4 187.6 187.6-2 124.8 24.8 124.8-187.6 124.8zM74 548.8c0 68.8 1.6 62.4 124.8 62.4l0.4-187.2c-68.8 0-125.2 56-125.2 124.8zM620 337.2c-6.8-16.4-18.4-28.8-35.2-37.6-16.8-8.4-38-12.8-64-12.8-29.6 0-52.8 4.8-69.6 14.8s-28 22-33.2 36.4-8 39.2-8 74.8v29.6h93.2v-60.8c0-16 0.8-26.4 2.8-30.8s6-6.4 12.8-6.4c7.2 0 12 2.8 14.4 8.4s3.6 20 3.6 43.6v26c0 14.4-1.6 24.8-4.8 31.6s-8 10.8-14.4 13.2c-6.4 2-18.4 3.2-36.8 3.6v53.6c22 0 36 0.8 41.2 2.4s9.2 5.2 11.2 11.2c2.4 5.6 3.6 14.8 3.6 26.8v20.8c0 13.2-1.2 21.6-4 26-2.8 4-6.8 6.4-12.4 6.4-6.4 0-10.8-2-13.2-6.4s-3.6-13.6-3.6-28v-30.8h-93.2v32c0 35.6 8 60 24.4 72.4s42.4 18.8 78 18.8c44.4 0 74.8-8.8 90.4-26 16-17.2 23.6-41.6 23.6-72.4 0-20.8-2.8-36-8.4-45.2s-15.6-18-30-25.6c14-4.8 24.8-12.4 31.6-23.6 6.8-10.8 10.4-36.4 10.4-76.4-0.4-30.4-3.6-53.2-10.4-69.6zM824.4 424v187.2c123.6 0 124.8 6.4 124.8-62.4-1.6-68.8-56.4-124.8-124.8-124.8z" />
+<glyph unicode="&#xe904;" glyph-name="clock" d="M502.898 788.907c-245.76 0-443.733-197.973-443.733-443.733s200.249-443.733 443.733-443.733c245.76 0 443.733 197.973 443.733 443.733s-200.249 443.733-443.733 443.733zM791.893 210.916c-6.827-13.653-18.204-20.48-31.858-20.48-4.551 0-9.102 0-13.653 2.276l-261.689 118.329c-11.378 4.551-20.48 18.204-20.48 31.858v245.76c0 18.204 15.929 34.133 34.133 34.133s34.133-15.929 34.133-34.133v-225.28l241.209-109.227c18.204-6.827 25.031-25.031 18.204-43.236z" />
+<glyph unicode="&#xe905;" glyph-name="down" d="M174.56 163.976l288.192-242.864c26.864-22.384 70.512-22.384 97.368 0l288.192 242.864c43.088 36.936 12.312 99.608-48.128 99.608h-110.24v448.8c0 49.248-40.288 89.536-89.536 89.536h-179.072c-49.248 0-89.536-40.288-89.536-89.536v-448.8h-109.12c-61-0.56-91.216-63.232-48.128-99.608z" />
+<glyph unicode="&#xe906;" glyph-name="cube" d="M930.8 632.4c-2 1.2-4.4 2.4-6.4 3.2l-378 219.6c-21.2 12-47.2 12-68.4 0l-384.8-222.8c-21.2-12.4-34.4-34.8-34-59.2l1.2-442.4c0-24.4 12.8-47.2 34-59.2l378.4-219.6c1.6-1.2 3.2-2 4.8-3.2 3.6-2 7.6-3.6 11.6-5.2 0 0 0.4 0 0.4 0 0.4 0 1.2-0.4 1.6-0.4 6.4-2 12.8-3.2 19.6-3.2 0 0 0 0 0 0 0.4 0 0.8 0 0.8 0v0c12 0 23.6 2.8 34 8.8l385.2 222.4c21.2 12.4 34.4 34.8 34 59.2v442.8c0.4 24.4-12.8 47.2-34 59.2zM512.4 716.4l246.4-143.2-248.4-143.2-61.6 36-184.8 107.2 248.4 143.2zM829.2 169.6l-249.2-143.2v285.2l249.2 143.2v-285.2z" />
+<glyph unicode="&#xe907;" glyph-name="plane" d="M937.2 777.6c-22 18.4-53.2 20.8-93.6 7.6s-76.8-36-108.8-68.4l-101.2-101.2-421.6 100.8c-7.2 1.6-13.2 0.8-19.2-5.2l-80.8-81.2c-4.4-4.4-6.4-10-5.6-17.2 1.2-6.8 5.2-12 10.8-15.2l321.6-176.8-164-164-122.8 33.6c-0.8 0.8-2.4 0.8-5.2 0.8-5.6 0-10.8-2-14.4-5.6l-61.2-61.6c-4.8-4.8-6.4-10-5.6-16 0.8-6.8 4-11.2 8.4-14.4l159.6-119.6 119.6-159.6c3.6-4.8 8.8-7.6 15.2-8.4h1.2c5.6 0 10.8 2 14.4 5.6l60.8 60.8c5.6 5.6 6.8 12.8 5.2 19.6l-33.6 122.8 164 164 176.8-321.6c3.2-5.6 6.8-8.8 13.2-10 1.2-0.8 2.4-0.8 4.4-0.8 5.2 0 8.8 1.2 12 4l81.2 60.8c7.2 5.6 9.6 12.8 7.6 20.8l-101.2 440.8 102 102c32.4 32.4 55.2 68.4 68.4 108.8 13.2 40.8 10.8 72-7.6 94z" />
+<glyph unicode="&#xe908;" glyph-name="train" d="M576 237.2v-256h277.2c35.2 0 64-28.8 64-64s-28.8-64-64-64h-682.4c-35.2 0-64 28.8-64 64s28.8 64 64 64h277.2v256h-64c-35.2 0-64 28.8-64 64s28.8 64 64 64h256c35.2 0 64-28.8 64-64s-28.8-64-64-64h-64zM427.6 784c7.2 46.4 50.8 78.4 97.6 71.2 36.8-5.6 65.2-34.4 71.2-71.2 88-16.8 169.2-59.6 232.4-123.2 174.8-174.8 174.8-458.4 0-633.6-24.8-24.8-65.6-24.8-90.4 0s-24.8 65.6 0 90.4v0c124.8 124.8 124.8 327.6 0 452.4s-327.6 124.8-452.4 0-124.8-327.6 0-452.4c0 0 0 0 0 0 24.8-24.8 24.8-65.6 0-90.4s-65.6-24.8-90.4 0c-175.2 174.8-175.2 458.4-0.4 633.6 63.2 63.2 144.4 106.4 232.4 123.2v0z" />
+<glyph unicode="&#xe909;" glyph-name="bus" d="M203.902 20.316c-76.37 13.852-131.4 80.862-131.026 158.354l3.744 479.182c0.748 87.6 72.252 158.354 159.852 158.354h551.058c87.6 0 159.104-70.754 159.852-158.354l3.744-479.182c0.374-69.631-43.8-131.4-110.062-153.114l31.072-53.534c16.846-28.452 7.112-65.138-21.338-81.984s-65.138-7.112-81.984 21.338c0 0.374-0.374 0.374-0.374 0.748l-59.898 103.698c-0.374 0.748-0.748 1.124-1.124 1.872h-366.874c-0.374-0.748-0.748-1.498-1.124-1.872l-59.898-103.698c-16.472-28.826-52.784-38.934-81.61-22.462s-38.934 52.784-22.462 81.61c0 0.374 0.374 0.374 0.374 0.748l28.077 48.292zM452.102 656.354h-279.648c-10.856 0-19.842-8.984-19.842-19.842v0-239.59c0-10.856 8.984-19.842 19.842-19.842v0h279.648c10.856 0 19.842 8.984 19.842 19.842v0 239.59c0 10.856-8.984 19.842-19.842 19.842 0 0 0 0 0 0zM851.544 656.354h-279.648c-10.856 0-19.842-8.984-19.842-19.842v0-239.59c0-10.856 8.984-19.842 19.842-19.842 0 0 0 0 0 0h279.648c10.856 0 19.842 8.984 19.842 19.842v0 239.59c0 10.856-8.984 19.842-19.842 19.842 0 0 0 0 0 0zM731.75 296.97c-32.944 0-59.898-26.954-59.898-59.898s26.954-59.898 59.898-59.898 59.898 26.954 59.898 59.898-26.954 59.898-59.898 59.898zM292.25 296.97c-32.944 0-59.898-26.954-59.898-59.898s26.954-59.898 59.898-59.898 59.898 26.954 59.898 59.898-26.58 59.898-59.898 59.898z" />
+<glyph unicode="&#xe90a;" glyph-name="bag" d="M816.928 591.86h-87.137c0 120.346-97.563 218.028-217.791 218.028s-217.791-97.681-217.791-218.028h-87.137c-47.902 0-86.659-39.26-86.659-87.231l-0.478-523.315c0.109-48.101 39.043-87.067 87.119-87.231h609.844c48.090 0.163 87.028 39.13 87.137 87.222v523.299c-0.109 48.101-39.043 87.067-87.119 87.231h-0.017zM512 722.682c0.034 0 0.079 0 0.119 0 72.12 0 130.585-58.465 130.585-130.585 0-0.084 0-0.168 0-0.252v0.011h-261.406c0 0.069 0 0.153 0 0.237 0 72.12 58.465 130.585 130.585 130.585 0.040 0 0.084 0 0.124 0h-0.006zM512 286.577c-120.228 0-217.791 97.681-217.791 218.077h87.112c0-0.079 0-0.17 0-0.261 0-72.12 58.465-130.585 130.585-130.585 0.040 0 0.084 0 0.124 0h-0.006c0.022 0 0.048 0 0.074 0 72.12 0 130.585 58.465 130.585 130.585 0 0.084 0 0.168 0 0.252v-0.011h87.137c0-120.371-97.588-218.052-217.816-218.052z" />
+<glyph unicode="&#xe90b;" glyph-name="up" d="M848.728 541.856l-288.368 242.696c-26.864 22.392-70.752 22.392-97.616 0l-288.368-242.696c-42.984-36.72-12.536-99.408 48.36-99.408h110.152c0 0 0-0.896 0-0.896v-447.776c0-49.256 40.296-89.552 89.552-89.552h179.112c49.256 0 89.552 40.296 89.552 89.552v447.776c0 0 0 0.896 0 0.896h109.256c60.896 0 91.344 62.688 48.36 99.408z" />
+</font></defs></svg>

BIN=BIN
public/bi/fonts/icomoon.ttf


BIN=BIN
public/bi/fonts/icomoon.woff


BIN=BIN
public/bi/images/border.png


BIN=BIN
public/bi/images/line.png


BIN=BIN
public/bi/images/logo.png


BIN=BIN
public/bi/images/logo1.png


BIN=BIN
public/bi/images/logob.png


BIN=BIN
public/bi/images/rect.png


+ 223 - 0
public/bi/index.html

@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+<html lang="en">
+
+    <head>
+        <meta charset="UTF-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <meta http-equiv="X-UA-Compatible" content="ie=edge">
+        <title>晋江人力大数据智能看板</title>
+        <link rel="stylesheet" href="./css/index.css">
+        <link rel="stylesheet" href="./fonts/icomoon.css">
+    </head>
+
+    <body>
+        <div class="viewport">
+            <div class="column">
+                <!-- 企业数 -->
+                <div class="order panel">
+                    <div class="inner">
+                        <div class="caption">
+                            <h3>平台统计</h3>
+                        </div>
+                        <!-- 数据 -->
+                        <div class="data total_count">
+                            <!--<div class="item">-->
+                                <!--<h4 class="train total_count">0</h4>-->
+                                <!--<span>-->
+                                    <!--<i class="icon-dot" style="color: #ed3f35;"></i>-->
+                                    <!--企业数-->
+                                <!--</span>-->
+                            <!--</div>-->
+                            <!--<div class="item">-->
+                                <!--<h4 class="train_join">0</h4>-->
+                                <!--<span>-->
+                                    <!--<i class="icon-dot" style="color: #eacf19;"></i>-->
+                                    <!--岗位数-->
+                                <!--</span>-->
+                            <!--</div>-->
+                            <div class="item">
+                                <h4 class="train_join">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #9fe6b8;"></i>
+                                    硕士人才数
+                                </span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- 人才层次 -->
+                <div class="users  panel">
+                    <div class="inner">
+                        <h3>人才层次</h3>
+                        <div class="chart">
+                            <div class="bar cate talent_level"></div>
+                            <div class="data">
+                                <div class="item">
+                                    <h4 class="talent_level-total">0</h4>
+                                    <span>
+                                        <i class="icon-dot" style="color: #ed3f35"></i>
+                                        人才总数
+                                    </span>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- 人才分布 -->
+                <div class="top panel">
+                    <div class="inner">
+                        <div class="province">
+                            <h3>人才分布</h3>
+                            <div class="data">
+                                <ul class="sup">
+                                    <li data-type="talent_industry">
+                                        <span>行业分布</span>
+                                    </li>
+                                    <li data-type="talent_age">
+                                        <span>年龄分布</span>
+                                    </li>
+                                    <li data-type="talent_education">
+                                        <span>学历分布</span>
+                                    </li>
+                                </ul>
+                                <ul class="sub">
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="column">
+                <!-- 零工 -->
+                <div class="order panel">
+                    <div class="inner">
+                        <div class="caption">
+                            <h3>零工</h3>
+                        </div>
+                        <div class="data">
+                            <div class="item">
+                                <h4 class="odd_job_number">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #ed3f35;"></i>
+                                    求职者
+                                </span>
+                            </div>
+                            <div class="item">
+                                <h4 class="odd_job_company">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #eacf19;"></i>
+                                    企业
+                                </span>
+                            </div>
+                            <div class="item">
+                                <h4 class="odd_job_job">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #9fe6b8;"></i>
+                                    发布岗位
+                                </span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- 地图 -->
+                <div class="map">
+                    <h3>
+                        <span class="icon-cube"></span>
+                        晋江人力大数据地图
+                    </h3>
+                    <div class="chart">
+                        <div class="geo"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="column">
+                <!-- 订单 -->
+                <div class="order panel">
+                    <div class="inner">
+                        <div class="caption">
+                            <h3>招考</h3>
+                        </div>
+                        <div class="data">
+                            <div class="item">
+                                <h4 class="recruit_count">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #ed3f35;"></i>
+                                    招考场次
+                                </span>
+                            </div>
+                            <div class="item">
+                                <h4 class="recruit_post">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #eacf19;"></i>
+                                    招考岗位
+                                </span>
+                            </div>
+                            <div class="item">
+                                <h4 class="recruit_apply">0</h4>
+                                <span>
+                                    <i class="icon-dot" style="color: #9fe6b8;"></i>
+                                    报名总人数
+                                </span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+               
+                <!--点位-->
+                <div class="point panel">
+                    <div class="inner">
+                        <h3>考生年龄分布</h3>
+                        <div class="chart">
+                            <div class="pie age recruit_age"></div>
+                            <div class="data">
+                                <div class="item">
+                                    <h4 class="age-gt35"></h4>
+                                    <span>
+                                        <i class="icon-dot" style="color: #ed3f35"></i>
+                                        35岁及以下
+                                    </span>
+                                </div>
+                                <div class="item">
+                                    <h4 class="age-lt35"></h4>
+                                    <span>
+                                        <i class="icon-dot" style="color: #eacf19"></i>
+                                        35岁以上
+                                    </span>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!--点位-->
+                <div class="point panel">
+                    <div class="inner">
+                        <h3>考生学历分布</h3>
+                        <div class="chart">
+                            <div class="pie edu recruit_education"></div>
+                            <div class="data">
+                                <div class="item">
+                                    <h4 class="edu-unknown"></h4>
+                                    <span>
+                                        <i class="icon-dot" style="color: #ed3f35"></i>
+                                        未知学历
+                                    </span>
+                                </div>
+                                <div class="item">
+                                    <h4 class="edu-total"></h4>
+                                    <span>
+                                        <i class="icon-dot" style="color: #eacf19"></i>
+                                        学历统计
+                                    </span>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </body>
+    <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script>
+    <script src="https://www.jq22.com/jquery/echarts-4.2.1.min.js"></script>
+    <script src="./js/index.js"></script>
+
+</html>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 5 - 0
public/bi/js/350582.json


+ 442 - 0
public/bi/js/index.js

@@ -0,0 +1,442 @@
+//自调用函数
+(function() {
+	// 1、页面一加载就要知道页面宽度计算
+	var setFont = function() {
+		// 因为要定义变量可能和别的变量相互冲突,污染,所有用自调用函数
+		var html = document.documentElement; // 获取html
+		// 获取宽度
+		var width = html.clientWidth;
+
+		// 判断
+		if (width < 1024) width = 1024
+		if (width > 1920) width = 1920
+		// 设置html的基准值
+		var fontSize = width / 80 + 'px';
+		// 设置给html
+		html.style.fontSize = fontSize;
+	}
+	setFont();
+	// 2、页面改变的时候也需要设置
+	// 尺寸改变事件
+	window.onresize = function() {
+		setFont();
+	}
+})();
+$.get('/admin/api/talent', (res) => {
+	talent_init(res)
+});
+$.get('/admin/api/odd_job', (res) => {
+	odd_init(res)
+});
+$.get('/admin/api/recruit', (res) => {
+	recruit_init(res)
+});
+
+function recruit_init(data) {
+	$('.recruit_count').text(data.recruit_count);
+	$('.recruit_post').text(data.recruit_post);
+	$('.recruit_apply').text(data.recruit_apply);
+	this.pieAge(data);
+	this.pieEdu(data);
+}
+
+function talent_init(data) {
+	this.talent_count(data);
+	this.talent_level(data.talent_level);
+	$('.train_join').text(data.total_count[0].count);
+}
+
+function odd_init(data) {
+	this.geo(data);
+	this.odd_total(data);
+}
+
+//人才分布
+function talent_count(data) {
+	var htmlArr = [];
+	htmlArr['talent_industry'] = '';
+	htmlArr['talent_age'] = '';
+	htmlArr['talent_education'] = '';
+	data.talent_industry.forEach(function (item) {
+		htmlArr['talent_industry'] += `<li><span>${item.name}</span><span>${item.count} <s class="icon-up"></s></span></li>`;
+	});
+	data.talent_age.forEach(function (item) {
+		htmlArr['talent_age'] += `<li><span>${item.name}</span><span>${item.count} <s class="icon-up"></s></span></li>`;
+	});
+	data.talent_education.forEach(function (item) {
+		htmlArr['talent_education'] += `<li><span>${item.name}</span><span>${item.count} <s class="icon-up"></s></span></li>`;
+	});
+	$('.inner').on('mouseenter', '.sup li', function () {
+		$(this).addClass('active').siblings().removeClass('active');
+		//渲染
+		$('.sub').html(htmlArr[$(this).attr('data-type')]);
+	});
+	$('.province .sup li').eq(0).mouseenter();
+	var index = 0;
+	var timer = setInterval(() => {
+		index++;
+		if (index > 2) {
+			index = 0;
+		}
+		$('.sup li').eq(index).mouseenter();
+	}, 2000);
+}
+
+function talent_level(data) {
+	let titleArr = [];
+	let countArr = [];
+	let total = 0;
+	let count = data.length;
+	// 中间省略的数据  准备三项
+	var hiddenItem = {
+		name: '',
+		value: 10,
+		// 柱子颜色
+		itemStyle: {
+			color: '#254065'
+		},
+		// 鼠标经过柱子颜色
+		emphasis: {
+			itemStyle: {
+				color: '#254065'
+			}
+		},
+		// 工具提示隐藏
+		tooltip: {
+			extraCssText: 'opacity:0'
+		}
+	};
+	data.forEach((item, index) => {
+		if (index < 7 || index + 7 >= count) {
+			titleArr.push(item.name)
+			countArr.push(item.count)
+		} else if (count > 12 && index == 7) {
+			//随机三个
+			let arr = []
+			for (let i = 7; i < count - 7; i++) {
+				arr.push(i)
+			}
+			let randomArr = [];
+			while (randomArr.length < 3) {
+				let temp = (Math.random() * arr.length) >> 0;
+				randomArr.push(arr.splice(temp, 1)[0]);
+			}
+			randomArr.forEach((randomIndex) => {
+				titleArr.push(data[randomIndex].name)
+				countArr.push(data[randomIndex].count)
+			})
+		}
+		total += (item.count - 0)
+	});
+	$('.talent_level-total').text(total)
+
+	option = {
+		// 工具提示
+		tooltip: {
+			// 触发类型  经过轴触发axis  经过轴触发item
+			trigger: 'item',
+			// 轴触发提示才有效
+			axisPointer: {
+				// 默认为直线,可选为:'line' 线效果 | 'shadow' 阴影效果
+				type: 'shadow'
+			}
+		},
+		// 图表边界控制
+		grid: {
+			// 距离 上右下左 的距离
+			left: '0',
+			right: '3%',
+			bottom: '3%',
+			top: '5%',
+			// 大小是否包含文本【类似于boxsizing】
+			containLabel: true,
+			//显示边框
+			show: true,
+			//边框颜色
+			borderColor: 'rgba(0, 240, 255, 0.3)'
+		},
+		// 控制x轴
+		xAxis: [{
+			// 使用类目,必须有data属性
+			type: 'category',
+			// 使用 data 中的数据设为刻度文字
+			data: titleArr,
+			// 刻度设置
+			axisTick: {
+				// true意思:图形在刻度中间
+				// false意思:图形在刻度之间
+				alignWithLabel: false,
+				show: false
+			},
+			//文字
+			axisLabel: {
+				color: '#4c9bfd'
+			}
+		}],
+		// 控制y轴
+		yAxis: [{
+			// 使用数据的值设为刻度文字
+			type: 'value',
+			axisTick: {
+				// true意思:图形在刻度中间
+				// false意思:图形在刻度之间
+				alignWithLabel: false,
+				show: false
+			},
+			//文字
+			axisLabel: {
+				color: '#4c9bfd'
+			},
+			splitLine: {
+				lineStyle: {
+					color: 'rgba(0, 240, 255, 0.3)'
+				}
+			},
+		}],
+		// 控制x轴
+		series: [
+
+			{
+				// series配置
+				// 颜色
+				itemStyle: {
+					// 提供的工具函数生成渐变颜色
+					color: new echarts.graphic.LinearGradient(
+						// (x1,y2) 点到点 (x2,y2) 之间进行渐变
+						0, 0, 0, 1,
+						[{
+							offset: 0,
+							color: '#00fffb'
+						}, // 0 起始颜色
+							{
+								offset: 1,
+								color: '#0061ce'
+							} // 1 结束颜色
+						]
+					)
+				},
+				// 图表数据名称
+				name: '层次人数',
+				// 图表类型
+				type: 'bar',
+				// 柱子宽度
+				barWidth: '60%',
+				// 数据
+				data: countArr
+			}
+		]
+	};
+	var myechart = echarts.init($('.talent_level')[0]);
+	myechart.setOption(option);
+}
+
+function pieAge(data) {
+	let recruit_age = data.recruit_age;
+	let gt35 = 0;
+	let lt35 = 0;
+	recruit_age.map((item, index) => {
+		if (item.name == '35到40岁' || item.name == '40岁以上') {
+			gt35 += item.count;
+			//其他数据
+			item.value = item.count;
+		} else {
+			lt35 += item.count;
+			item.value = item.count;
+		}
+		return item;
+	});
+	$('.age-gt35').text(gt35);
+	$('.age-lt35').text(lt35);
+	var myechartAge = echarts.init($('.recruit_age')[0]);
+	option = {
+		// 控制提示
+		tooltip: {
+			// 非轴图形,使用item的意思是放到数据对应图形上触发提示
+			trigger: 'item',
+			// 格式化提示内容:
+			// a 代表图表名称 b 代表数据名称 c 代表数据  d代表  当前数据/总数据的比例
+			formatter: "{a} <br/>{b} : {c} ({d}%)"
+		},
+		// 控制图表
+		series: [{
+			// 图表名称
+			name: '年龄',
+			// 图表类型
+			type: 'pie',
+			// 南丁格尔玫瑰图 有两个圆  内圆半径10%  外圆半径70%
+			// 百分比基于  图表DOM容器的半径
+			radius: ['10%', '70%'],
+			// 图表中心位置 left 50%  top 50% 距离图表DOM容器
+			center: ['50%', '50%'],
+			// 半径模式,另外一种是 area 面积模式
+			roseType: 'radius',
+			// 数据集 value 数据的值 name 数据的名称
+			data: recruit_age,
+			//文字调整
+			label: {
+				fontSize: 10
+			},
+			//引导线
+			labelLine: {
+				length: 8,
+				length2: 10
+			}
+		}],
+		color: ['#006cff', '#9fe6b8', '#32c5e9', '#1d9dff', '#60cda0', '#ed8884', '#ff9f7f', '#0096ff']
+	};
+	myechartAge.setOption(option);
+}
+
+function pieEdu(data) {
+	let eduction = data.recruit_education;
+	let unknown = 0;
+	let total = 0;
+	eduction.map((item, index) => {
+		if (item.name == '其他') {
+			unknown += item.count;
+			eduction.splice(index, 1);
+		} else {
+			total += item.count;
+			item.value = item.count;
+		}
+		return item;
+	});
+	$('.edu-unknown').text(unknown);
+	$('.edu-total').text(total);
+	var myechart = echarts.init($('.recruit_education')[0]);
+	option = {
+		// 控制提示
+		tooltip: {
+			// 非轴图形,使用item的意思是放到数据对应图形上触发提示
+			trigger: 'item',
+			// 格式化提示内容:
+			// a 代表图表名称 b 代表数据名称 c 代表数据  d代表  当前数据/总数据的比例
+			formatter: "{a} <br/>{b} : {c} ({d}%)"
+		},
+		// 控制图表
+		series: [{
+			// 图表名称
+			name: '学历',
+			// 图表类型
+			type: 'pie',
+			// 南丁格尔玫瑰图 有两个圆  内圆半径10%  外圆半径70%
+			// 百分比基于  图表DOM容器的半径
+			radius: ['10%', '70%'],
+			// 图表中心位置 left 50%  top 50% 距离图表DOM容器
+			center: ['50%', '50%'],
+			// 半径模式,另外一种是 area 面积模式
+			roseType: 'radius',
+			// 数据集 value 数据的值 name 数据的名称
+			data: eduction,
+			//文字调整
+			label: {
+				fontSize: 10
+			},
+			//引导线
+			labelLine: {
+				length: 8,
+				length2: 10
+			}
+		}],
+		color: ['#006cff', '#60cda0', '#ed8884', '#ff9f7f', '#0096ff', '#9fe6b8', '#32c5e9', '#1d9dff']
+	};
+	myechart.setOption(option);
+}
+
+function geo(data) {
+	let community = data.community;
+	let other = 0;
+	let max = 0; //最大人数
+	community = community.map((item) => {
+		if (item.name == '其他') {
+			other += item.count;
+		} else if (item.count > max) {
+			max = item.count;
+		}
+		return {
+			name: item.name,
+			value: item.count
+		};
+	});
+	community.push({
+		name: '泉州出口加工区',
+		value: 0
+	});
+	community.push({
+		name: '安平开发区',
+		value: 0
+	});
+	var myecharts = echarts.init($('.map .geo')[0])
+
+	// $.get('https://geo.datav.aliyun.com/areas_v3/bound/350582.json', result => {
+	$.get('js/350582.json', result => {
+		// 注册 echarts 地图
+		echarts.registerMap('jinjiang', result);
+		var option = {
+			backgroundColor: '#080a20',
+			title: {
+				text: '其他地区:' + other + ' (人)',
+				// subtext: '其他地区:' + community[community.length - 1].count,
+				left: 'left',
+				textStyle: {
+					color: '#ffffff'
+				}
+			},
+			tooltip: {
+				trigger: 'item',
+				formatter: '{b}<br/>{c} (人)'
+			},
+			visualMap: {
+				min: 0,
+				max: max,
+				text: ['多', '少'],
+				realtime: true,
+				calculable: true,
+				color: '#fff',
+				inRange: {
+					color: ['#142957', '#0b1c2d']
+				},
+				textStyle: {
+					color: '#fff'
+				}
+			},
+			series: [{
+				type: 'map',
+				map: 'jinjiang',
+				zoom: 1.2,
+				roam: true,
+				coordinateSystem: 'geo',
+				// rippleEffect: {
+				//     brushType: 'stroke'
+				// },
+				symbolSize: function(val, params) {
+					return 8;
+				},
+				label: {
+					show: true,
+					color: '#fff'
+				},
+				itemStyle: {
+					normal: {
+						areaColor: '#142957',
+						borderColor: '#0692a4'
+					}
+				},
+				emphasis: {
+					areaColor: '#0b1c2d'
+				},
+				data: community,
+				nameMap: {
+					'晋江市经济开发区': '经济开发区'
+				}
+			}]
+		};
+		myecharts.setOption(option);
+	})
+}
+
+function odd_total(data) {
+	$('.odd_job_number').text(data.user_total);
+	$('.odd_job_company').text(data.company_total);
+	$('.odd_job_job').text(data.comjobs_total);
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
public/bi/js/jquery.min.js


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio