Browse Source

手机端

linwu 1 year ago
commit
c7496f76d5
93 changed files with 5801 additions and 0 deletions
  1. 1 0
      app/mobile/.htaccess
  2. 157 0
      app/mobile/EmpBaseController.php
  3. 68 0
      app/mobile/ExceptionHandle.php
  4. 17 0
      app/mobile/Request.php
  5. 148 0
      app/mobile/UserBaseController.php
  6. 96 0
      app/mobile/common.php
  7. 15 0
      app/mobile/config/view.php
  8. 85 0
      app/mobile/controller/Com.php
  9. 113 0
      app/mobile/controller/Ejobs.php
  10. 149 0
      app/mobile/controller/Emp.php
  11. 41 0
      app/mobile/controller/Index.php
  12. 190 0
      app/mobile/controller/Jobs.php
  13. 66 0
      app/mobile/controller/Linggong.php
  14. 229 0
      app/mobile/controller/Login.php
  15. 291 0
      app/mobile/controller/My.php
  16. 120 0
      app/mobile/controller/Resume.php
  17. 24 0
      app/mobile/controller/Shop.php
  18. 27 0
      app/mobile/event.php
  19. 12 0
      app/mobile/middleware.php
  20. 19 0
      app/mobile/provider.php
  21. 291 0
      app/mobile/view/ejobs/form.html
  22. 138 0
      app/mobile/view/ejobs/job.html
  23. 206 0
      app/mobile/view/emp/apply.html
  24. 99 0
      app/mobile/view/emp/index.html
  25. 106 0
      app/mobile/view/emp/info.html
  26. 140 0
      app/mobile/view/emp/invite.html
  27. 35 0
      app/mobile/view/index/base.html
  28. 85 0
      app/mobile/view/index/index.html
  29. 200 0
      app/mobile/view/jobs/detail.html
  30. 156 0
      app/mobile/view/jobs/index.html
  31. 122 0
      app/mobile/view/login/emp_register.html
  32. 35 0
      app/mobile/view/login/page.html
  33. 81 0
      app/mobile/view/login/type.html
  34. 43 0
      app/mobile/view/my/about.html
  35. 100 0
      app/mobile/view/my/apply.html
  36. 227 0
      app/mobile/view/my/auth.html
  37. 83 0
      app/mobile/view/my/feedback.html
  38. 96 0
      app/mobile/view/my/index.html
  39. 376 0
      app/mobile/view/my/info.html
  40. 122 0
      app/mobile/view/my/invite.html
  41. 100 0
      app/mobile/view/my/like.html
  42. 107 0
      app/mobile/view/my/train.html
  43. 100 0
      app/mobile/view/my/train_add.html
  44. 15 0
      app/mobile/view/public/base.html
  45. 51 0
      app/mobile/view/public/jump.html
  46. 13 0
      app/mobile/view/public/meta_header.html
  47. 141 0
      app/mobile/view/resume/detail.html
  48. 137 0
      app/mobile/view/resume/index.html
  49. 144 0
      app/mobile/view/shop/index.html
  50. 36 0
      public/static/mobile/css/icon.css
  51. 51 0
      public/static/mobile/css/style.css
  52. 0 0
      public/static/mobile/css/vant.css
  53. BIN
      public/static/mobile/images/default_avatar.jpg
  54. BIN
      public/static/mobile/images/emp/workernav1.png
  55. BIN
      public/static/mobile/images/emp/workernav10.png
  56. BIN
      public/static/mobile/images/emp/workernav11.png
  57. BIN
      public/static/mobile/images/emp/workernav12.png
  58. BIN
      public/static/mobile/images/emp/workernav2.png
  59. BIN
      public/static/mobile/images/emp/workernav3.png
  60. BIN
      public/static/mobile/images/emp/workernav4.png
  61. BIN
      public/static/mobile/images/emp/workernav5.png
  62. BIN
      public/static/mobile/images/emp/workernav6.png
  63. BIN
      public/static/mobile/images/emp/workernav7.png
  64. BIN
      public/static/mobile/images/emp/workernav8.png
  65. BIN
      public/static/mobile/images/emp/workernav9.png
  66. BIN
      public/static/mobile/images/favicon.ico
  67. BIN
      public/static/mobile/images/img_worker.png
  68. BIN
      public/static/mobile/images/my/icon_about.png
  69. BIN
      public/static/mobile/images/my/icon_check.png
  70. 19 0
      public/static/mobile/images/my/icon_cond.svg
  71. BIN
      public/static/mobile/images/my/icon_feedback.png
  72. BIN
      public/static/mobile/images/my/icon_home.png
  73. 24 0
      public/static/mobile/images/my/icon_images.svg
  74. 14 0
      public/static/mobile/images/my/icon_intro.svg
  75. BIN
      public/static/mobile/images/my/icon_like.png
  76. 26 0
      public/static/mobile/images/my/icon_profile.svg
  77. BIN
      public/static/mobile/images/my/icon_ticket.png
  78. BIN
      public/static/mobile/images/my/my_avatar.png
  79. BIN
      public/static/mobile/images/my/myicon01.png
  80. BIN
      public/static/mobile/images/my/myicon02.png
  81. BIN
      public/static/mobile/images/my/myicon03.png
  82. BIN
      public/static/mobile/images/my/myicon04.png
  83. BIN
      public/static/mobile/images/my/ticket.jpg
  84. BIN
      public/static/mobile/images/my/ticket.png
  85. BIN
      public/static/mobile/images/share_tip.png
  86. 48 0
      public/static/mobile/js/component/applyList.js
  87. 48 0
      public/static/mobile/js/component/likeList.js
  88. 43 0
      public/static/mobile/js/component/trainAdd.js
  89. 43 0
      public/static/mobile/js/component/trainList.js
  90. 3 0
      public/static/mobile/js/jquery-1.10.2.min.js
  91. 0 0
      public/static/mobile/js/vant.min.js
  92. 5 0
      public/static/mobile/js/vue.min.js
  93. 24 0
      public/worker.php

+ 1 - 0
app/mobile/.htaccess

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

+ 157 - 0
app/mobile/EmpBaseController.php

@@ -0,0 +1,157 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+namespace app\mobile;
+
+use think\App;
+use think\exception\ValidateException;
+use think\Validate;
+use app\common\model\Worker as WorkerModel;
+
+
+/**
+ * 控制器基础类
+ */
+abstract class EmpBaseController
+{
+    /**
+     * Request实例
+     * @var \think\Request
+     */
+    protected $request;
+    protected $worker;
+
+    /**
+     * 应用实例
+     * @var \think\App
+     */
+    protected $app;
+
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+	
+	/**
+	 * 控制器中间件
+	 * @var array
+	 */
+	protected $access_admin = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param  App  $app  应用对象
+     */
+    public function __construct(App $app)
+    {
+        $this->app     = $app;
+        $this->request = $this->app->request;
+				
+				
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {
+        $userId = get_user_id();
+        $type = get_type();
+
+        if (empty($userId)) {
+            my_redirect('/login/index');
+        }
+
+        if (empty($type)) {
+            my_redirect('/login/type');
+        } elseif ($type == 1) {
+            my_redirect('/index/index');
+        }
+
+        $this->worker = WorkerModel::where('userid',$userId)->find();
+        if (empty($this->worker)) {
+            my_redirect('/login/empRegister');
+        }
+
+        if ($this->worker->status == 1) {
+            $this->jump('等待管理员审核',url('/login/setType').'?type=1');
+        } elseif ($this->worker->status == 2) {
+            my_redirect('/login/empRegister');
+        } elseif ($this->worker->status == 3 || $this->worker->status == 4) {
+            $this->jump('账号异常,请联系管理员',url('/login/setType').'?type=1');
+        }
+	}
+
+    /**
+     * 验证数据
+     * @access protected
+     * @param  array        $data     数据
+     * @param  string|array $validate 验证器名或者验证规则数组
+     * @param  array        $message  提示信息
+     * @param  bool         $batch    是否批量验证
+     * @return array|string|true
+     * @throws ValidateException
+     */
+    protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+    {
+        if (is_array($validate)) {
+            $v = new Validate();
+            $v->rule($validate);
+        } else {
+            if (strpos($validate, '.')) {
+                // 支持场景
+                list($validate, $scene) = explode('.', $validate);
+            }
+            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+            $v     = new $class();
+            if (!empty($scene)) {
+                $v->scene($scene);
+            }
+        }
+
+        $v->message($message);
+
+        // 是否批量验证
+        if ($batch || $this->batchValidate) {
+            $v->batch(true);
+        }
+
+        return $v->failException(true)->check($data);
+    }
+
+    /**
+     * 错误提示
+     */
+    protected function jump($msg = '', $url = null, $wait = 3)
+    {
+        if (is_null($url)) {
+            $url = 'javascript:history.back(-1);';
+        } else {
+            $url = "location.href = '" . url($url) . "'";
+        }
+
+        $result = [
+            'msg'  => $msg,
+            'url'  => $url,
+            'wait' => $wait,
+        ];
+
+        return view('/public/jump', $result);
+    }
+}

+ 68 - 0
app/mobile/ExceptionHandle.php

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

+ 17 - 0
app/mobile/Request.php

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

+ 148 - 0
app/mobile/UserBaseController.php

@@ -0,0 +1,148 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+namespace app\mobile;
+
+use think\App;
+use think\exception\ValidateException;
+use think\Validate;
+use app\common\model\User as UserModel;
+
+/**
+ * 控制器基础类
+ */
+abstract class UserBaseController
+{
+    /**
+     * Request实例
+     * @var \think\Request
+     */
+    protected $request;
+
+    /**
+     * 应用实例
+     * @var \think\App
+     */
+    protected $app;
+    protected $user;
+
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $access_admin = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param  App $app 应用对象
+     */
+    public function __construct(App $app)
+    {
+        $this->app     = $app;
+        $this->request = $this->app->request;
+
+
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {
+        $userId = get_user_id();
+        $type   = get_type();
+
+        if (empty($userId)) {
+            my_redirect('/login/index');
+        }
+
+        if (empty($type)) {
+            my_redirect('/login/type');
+        } elseif ($type == 2) {
+            my_redirect('/emp/index');
+        }
+
+        $this->user = UserModel::where('id',$userId)->find();
+        if ($this->user->is_perfect == 2) {
+            my_redirect('/login/perfect');
+        }
+    }
+
+    /**
+     * 验证数据
+     * @access protected
+     * @param  array $data 数据
+     * @param  string|array $validate 验证器名或者验证规则数组
+     * @param  array $message 提示信息
+     * @param  bool $batch 是否批量验证
+     * @return array|string|true
+     * @throws ValidateException
+     */
+    protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+    {
+        if (is_array($validate)) {
+            $v = new Validate();
+            $v->rule($validate);
+        } else {
+            if (strpos($validate, '.')) {
+                // 支持场景
+                list($validate, $scene) = explode('.', $validate);
+            }
+            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+            $v     = new $class();
+            if (!empty($scene)) {
+                $v->scene($scene);
+            }
+        }
+
+        $v->message($message);
+
+        // 是否批量验证
+        if ($batch || $this->batchValidate) {
+            $v->batch(true);
+        }
+
+        return $v->failException(true)->check($data);
+    }
+
+    /**
+     * 错误提示
+     */
+    protected function jump($msg = '', $url = null, $wait = 3)
+    {
+        if (is_null($url)) {
+            $url = 'javascript:history.back(-1);';
+        } else {
+            $url = "location.href = '" . url($url) . "'";
+        }
+
+        $result = [
+            'msg'  => $msg,
+            'url'  => $url,
+            'wait' => $wait,
+        ];
+
+        return view('/public/jump', $result);
+    }
+}

+ 96 - 0
app/mobile/common.php

@@ -0,0 +1,96 @@
+<?php
+/**
+ * 时间
+ */
+function tranTime($utime)
+{
+    $time = time() - $utime;
+    if ($time < 60) {
+        $str = '刚刚';
+    } elseif ($time < 60 * 60) {
+        $min = floor($time / 60);
+        $str = $min . '分钟前';
+    } elseif ($time < 60 * 60 * 24) {
+        $h   = floor($time / (60 * 60));
+        $str = $h . '小时前';
+    } elseif ($time < 60 * 60 * 24 * 3) {
+        $d = floor($time / (60 * 60 * 24));
+        if ($d == 1) {
+            $str = '昨天';
+        } else {
+            $str = '前天';
+        }
+    } else {
+        $str = date("m-d", $utime);
+    }
+    return $str;
+}
+
+function get_user_id()
+{
+    $sessionUserId = session('user.id');
+    if (empty($sessionUserId)) {
+        return 0;
+    }
+
+    return $sessionUserId;
+}
+
+function get_type()
+{
+    $sessionType = session('user.type');
+    if (empty($sessionType)) {
+        return 0;
+    }
+
+    return $sessionType;
+}
+
+function my_redirect(string $url = '', int $code = 302)
+{
+    throw new \think\exception\HttpResponseException(redirect($url, $code));
+}
+
+function page_result($code = 0, $msg = '', $data = [])
+{
+    $res      = ['code' => $code, 'msg' => $msg, 'data' => $data];
+    $response = \think\Response::create($res, 'json');
+    throw new \think\exception\HttpResponseException($response);
+}
+
+function addPByN($str)
+{
+    $comdetails     = '';
+    $comdetails_arr = explode("\n", $str);
+    foreach ($comdetails_arr as $v) {
+        $comdetails .= "<p>{$v}</p>";
+    }
+    return $comdetails;
+}
+
+function getWorkExperience($type = 'json')
+{
+    $json = '[
+		{id: 1, text: "无经验"},
+		{id: 2, text: "一年以下"},
+		{id: 3, text: "1-3年"},
+		{id: 4, text: "3-5年"},
+		{id: 5, text: "5-10年"},
+		{id: 6, text: "10年以上"}
+	]';
+    return $type == 'json' ? $json : json_decode($json, true);
+}
+function getEducation($type = 'json')
+{
+    $json = '[
+		{id: 1, text: "初中"},
+		{id: 2, text: "高中"},
+		{id: 3, text: "中技"},
+		{id: 4, text: "中专"},
+		{id: 5, text: "大专"},
+		{id: 6, text: "本科"},
+		{id: 7, text: "硕士"},
+		{id: 8, text: "博士"},
+	]';
+    return $type == 'json' ? $json : json_decode($json, true);
+}

+ 15 - 0
app/mobile/config/view.php

@@ -0,0 +1,15 @@
+<?php
+// +----------------------------------------------------------------------
+// | 模板设置
+// +----------------------------------------------------------------------
+
+return [
+    'tpl_replace_string' => [
+        '__STATIC__' => '/static',
+        '__MSTATIC__' => '/static/mobile',
+        '__MCSS__' => '/static/mobile/css',
+        '__MJS__' => '/static/mobile/js',
+        '__MIMG__' => '/static/mobile/images',
+    ],
+    'default_filter' => '',
+];

+ 85 - 0
app/mobile/controller/Com.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\Attachment as AttachmentModel;
+
+class Com
+{
+    /**
+     * 图片上传
+     */
+    public function imageUpload()
+    {
+        $file = input('post.file');
+        $name = input('post.name');
+        $ext  = pathinfo($name)['extension'];
+        if (!in_array($ext, ['jpg', 'jpeg', 'png'])) {
+            $this->error('文件后缀必须为jpg,jpeg,png');
+        }
+
+        if ($file) {
+            //创建目录
+            $upload_dir = public_path() . 'public/attachment/images/' . date('Ymd');
+            if (!is_dir($upload_dir)) {
+                mkdir($upload_dir, '0777', true);
+            }
+
+            //保存文件
+            $file_name = $this->_file_name($ext);
+            $file_path = '/attachment/images/' . $file_name;
+            $is_upload = $this->_base64_image_content($file, $file_path);
+            if (!$is_upload) {
+                page_result(1, "上传失败,请重新上传");
+            }
+
+            $attachment = request()->domain() . $file_path;
+            AttachmentModel::create([
+                'filename'   => $name,
+                'atype'      => 1,
+                'attachment' => $attachment,
+                'createtime' => time(),
+            ]);
+
+            page_result(0, '', ['avatar' => $attachment]);
+        } else {
+            page_result(1, "请上传文件");
+        }
+    }
+
+    private function _file_name($ext)
+    {
+        //生成随机文件名
+        //定义一个包含大小写字母数字的字符串
+        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+        //把字符串分割成数组
+        $newchars = str_split($chars);
+        //打乱数组
+        shuffle($newchars);
+        //从数组中随机取出15个字符
+        $chars_key = array_rand($newchars, 15);
+        //把取出的字符重新组成字符串
+        $fnstr = '';
+        for ($i = 0; $i < 15; $i++) {
+            $fnstr .= $newchars[$chars_key[$i]];
+        }
+        //输出文件名并做MD5加密
+        return md5($fnstr . microtime(true) * 1000) . '.' . $ext;
+    }
+
+    private function _base64_image_content($base64_image_content, $file_url_path)
+    {
+        //匹配出图片的格式
+        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
+            $content   = base64_decode(str_replace($result[1], '', $base64_image_content));
+            $file_path = public_path('') . 'public' . $file_url_path;
+            if (file_put_contents($file_path, $content)) {
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+}

+ 113 - 0
app/mobile/controller/Ejobs.php

@@ -0,0 +1,113 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\mobile\EmpBaseController;
+use app\common\model\Comjobs as ComjobsModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+use app\common\model\ComjobsLog as ComjobsLogModel;
+
+class Ejobs extends EmpBaseController
+{
+    /**
+     * 招聘
+     */
+    public function form()
+    {
+        $workerid  = $this->worker->id;
+        $comjobsid = input('id/d', 0);
+        $comjobs   = ComjobsModel::field([
+            'id', 'title', 'cateid', 'address', 'agegroup', 'tags', 'comdetails', 'requirement',
+            'companydetails', 'wtype', 'zwagall', 'recruit_num', 'telephone', 'remark', 'picall',
+        ])->where('workerid', '=', $workerid)->where('id', '=', $comjobsid)->find();
+        if (empty($comjobs)) {
+            $comjobs = "{cateid:0}";
+        } else {
+            $comjobs->tags = implode(",", $comjobs->tags);
+        }
+        $catelist = ComjobsCateModel::field('title as text,id')->order(['priority' => 'desc', 'id' => 'desc'])->select();
+
+        return view('ejobs/form', [
+            'job'      => $comjobs,
+            'catelist' => $catelist,
+        ]);
+    }
+
+    public function formPost()
+    {
+        $post               = $this->request->post();
+        $post['tags']       = explode(",", $post['tags']);
+        $post['status']     = 2;
+        $post['updatetime'] = time();
+        $post['picall']     = empty($post['picall']) ? [] : $post['picall'];
+        if (empty($post['id'])) {
+            $post['workerid']   = $this->worker->id;
+            $post['sex']        = 2;
+            $post['priority']   = 0;
+            $post['province']   = '福建省';
+            $post['city']       = '泉州市';
+            $post['district']   = '晋江市';
+            $post['bwagall']    = $post['zwagall'];
+            $post['emp_time']   = [];
+            $post['createtime'] = time();
+            ComjobsModel::create($post);
+        } else {
+            ComjobsModel::update($post, ['id' => $post['id'], 'workerid' => $this->worker->id]);
+        }
+
+        page_result(0, "");
+    }
+
+    public function job()
+    {
+        return view('ejobs/job', [
+            'status' => $this->request->get('status', 0),
+        ]);
+    }
+
+    public function listJob()
+    {
+        $page     = input('page/d', 1);
+        $size     = input('size/d', 20);
+
+        $map      = [];
+        $workerid = $this->worker->id;
+        $map[]    = ['workerid', '=', $workerid];
+
+        $status   = input('status/d', 1);
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+
+        $comjobsid = input('comjobsid/d', 0);
+        if (!empty($comjobsid)) {
+            $map[] = ['comjobsid', '=', $comjobsid];
+        }
+
+        $orderby = ['createtime' => 'desc', 'id' => 'desc'];
+        $list    = ComjobsLogModel::with(['comjobs', 'user'])
+            ->where($map)
+            ->append(['status_text'])
+            ->order($orderby)
+            ->page($page)
+            ->limit($size)
+            ->select();
+        page_result(0, "", $list);
+    }
+
+    public function statusJob()
+    {
+        $id   = $this->request->post('id');
+        $info = ComjobsModel::where('id', $id)->where('workerid', $this->worker->id)->find();
+        if (empty($info)) {
+            page_result(1, "岗位不存在");
+        }
+        if ($info['status'] < 3) {
+            page_result(1, "请等待后台审核");
+        }
+
+        $info->status = $this->request->post('status');
+        $info->save();
+        page_result(0, "");
+    }
+}

+ 149 - 0
app/mobile/controller/Emp.php

@@ -0,0 +1,149 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\mobile\EmpBaseController;
+use app\common\model\WorkerLog as WorkerLogModel;
+use app\common\model\ResumeInvite as ResumeInviteModel;
+use app\common\model\ComJobs as ComJobsModel;
+use app\common\model\ComjobsLog as ComjobsLogModel;
+
+class Emp extends EmpBaseController
+{
+    public function index()
+    {
+        $workerid              = $this->worker->id;
+        $countobj              = [];
+        $countobj['yesterday'] = WorkerLogModel::where('workerid', '=', $workerid)->whereDay('createtime', 'yesterday')->sum('ltotal');
+        $countobj['today']     = WorkerLogModel::where('workerid', '=', $workerid)->whereDay('createtime')->sum('ltotal');
+        $countobj['total']     = WorkerLogModel::where('workerid', '=', $workerid)->group('userid')->count();
+        return view('emp/index', [
+            'worker'   => $this->worker,
+            'countobj' => json_encode($countobj),
+        ]);
+    }
+
+    /**
+     * 个人信息
+     */
+    public function info()
+    {
+        return view('emp/info', [
+            'worker' => $this->worker->visible(['tilpic', 'title', 'realname', 'mobile', 'address', 'details']),
+        ]);
+    }
+
+    public function infoPost()
+    {
+        $form = input('param.');
+        foreach ($form as $k => $v) {
+            $this->worker->$k = $v;
+        }
+
+        $this->worker->save();
+        page_result(0, '操作成功');
+    }
+
+    /**
+     * 我的邀请
+     */
+    public function invite()
+    {
+        return view('emp/invite', [
+            'status' => $this->request->get('status', 0),
+        ]);
+    }
+
+    public function listInvite()
+    {
+        $page     = input('page/d', 1);
+        $size     = input('size/d', 20);
+        $status   = input('status/d', 0);
+        $map      = [];
+        $workerid = $this->worker->id;
+        $map[]    = ['workerid', '=', $workerid];
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+
+        $list = ResumeInviteModel::with(['user'])
+            ->where($map)
+            ->page($page)
+            ->limit($size)
+            ->append(['status_text'])
+            ->select();
+
+        page_result(0, "", $list);
+    }
+
+    /**
+     * 岗位报名
+     */
+    public function apply()
+    {
+        $comjobs = ComJobsModel::field(['title as text', 'id as value'])->where('workerid', $this->worker->id)->where('status', '>', 2)->select()->toArray();
+        array_unshift($comjobs, ['text' => '全部岗位', 'value' => 0]);
+        return view('emp/apply', [
+            'comjobs'   => json_encode($comjobs),
+            'status'    => $this->request->get('status', 0),
+            'comjobsid' => $this->request->get('comjobsid', 0),
+        ]);
+    }
+
+    public function listApply()
+    {
+        $page = input('page/d', 1);
+        $size = input('size/d', 20);
+
+        $map      = [];
+        $workerid = $this->worker->id;
+        $map[]    = ['workerid', '=', $workerid];
+
+        $status = input('status/d', 0);
+        if (!empty($status)) {
+            $map[] = ['status', '=', $status];
+        }
+
+        $comjobsid = input('comjobsid/d', 0);
+        if (!empty($comjobsid)) {
+            $map[] = ['comjobsid', '=', $comjobsid];
+        }
+
+        $list = ComjobsLogModel::with(['comjobs', 'user'])
+            ->where($map)
+            ->page($page)
+            ->limit($size)
+            ->order(['createtime' => 'desc', 'id' => 'desc'])
+            ->append(['status_text'])
+            ->select();
+
+        page_result(0, "", $list);
+    }
+
+    public function delApply()
+    {
+        $workerid   = $this->worker->id;
+        $logid      = input('id/d', 0);
+        $comjobslog = ComjobsLogModel::where(['workerid' => $workerid])->findOrEmpty($logid);
+        if ($comjobslog->isEmpty()) {
+            page_result(1, "报名记录信息不存在。");
+        }
+        $comjobslog->delete();
+        page_result(0, "");
+    }
+
+    public function statusApply()
+    {
+        $logid      = input('id/d', 0);
+        $workerid   = $this->worker->id;
+        $comjobslog = ComjobsLogModel::where(['workerid' => $workerid])->findOrEmpty($logid);
+        if ($comjobslog->isEmpty()) {
+            page_result(1, "报名记录信息不存在。");
+        }
+
+        $status = input('status/d', 1);
+        $comjobslog->save(['status' => $status]);
+
+        page_result(0, "");
+    }
+}

+ 41 - 0
app/mobile/controller/Index.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\Slide as SlideModel;
+use app\common\model\Navigation as NavigationModel;
+use app\common\model\Comjobs as ComjobsModel;
+use app\mobile\UserBaseController;
+
+class Index extends UserBaseController
+{
+    public function index()
+    {
+        //轮播图
+        $slide = SlideModel::where('pagetab', '=', 'index')->order(['priority' => 'desc', 'id' => 'desc'])->limit(10)->select();
+        //导航
+        $navigation = NavigationModel::where('pagetab', '=', 'index')->order(['priority' => 'desc', 'id' => 'desc'])->select();
+
+        //列表
+        $map   = [];
+        $map[] = ['createtime', '<=', time()];
+        $map[] = ['priority', '>', 0];
+        $map[] = ['status', 'in', '3,4'];
+        $list  = ComjobsModel::with(['worker'])->where($map)->order(['status' => 'asc', 'priority' => 'desc', 'updatetime' => 'desc', 'id' => 'desc'])->limit(10)->select();
+        foreach ($list as $v) {
+            $tags = [];
+            foreach ($v['tags'] as $tag) {
+                $tags = array_merge($tags,explode(',',$tag));
+            }
+            $v['tags'] = $tags;
+            $v['worker_name'] = $v['company_name'] ?: $v['worker']['title'];
+        }
+
+        return view('index/index', [
+                'slide'      => $slide,
+                'navigation' => $navigation,
+                'list'       => $list,
+            ]
+        );
+    }
+}

+ 190 - 0
app/mobile/controller/Jobs.php

@@ -0,0 +1,190 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\Comjobs as ComjobsModel;
+use app\common\model\ComjobsStar as ComjobsStarModel;
+use app\common\model\Worker as WorkerModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+use app\common\model\ComjobsLog as ComjobsLogModel;
+use app\common\model\UserFollow as UserFollowModel;
+use app\common\model\WorkerLog as WorkerLogModel;
+use app\mobile\UserBaseController;
+
+class Jobs extends UserBaseController
+{
+    public function index()
+    {
+        //岗位
+        $catelist = ComjobsCateModel::field('id as value, title as text')->order(['priority' => 'desc', 'id' => 'desc'])
+            ->select()->toArray();
+        array_unshift($catelist, ['value' => 0, 'text' => '不限岗位']);
+
+        return view('jobs/index', [
+            'type'     => input('type', 0),
+            'catelist' => json_encode($catelist),
+        ]);
+    }
+
+    /**
+     * 岗位列表
+     */
+    public function listJobs()
+    {
+        $ppage     = input('page/d', 1);
+        $psize     = input('size/d', 10);
+        $map       = [];
+        $map[]     = ['createtime', '<=', time()];
+        $map[]     = ['status', 'in', '3,4'];
+        $searchval = input('searchval/s', "");
+        $whereor   = [];
+        if (!empty($searchval)) {
+            $whereor[] = ['title', 'like', '%' . $searchval . '%'];
+            $lmap      = [];
+            $lmap[]    = ['title', 'like', '%' . $searchval . '%'];
+            $worklike  = WorkerModel::where($lmap)->select();
+
+            $wkids = [];
+            foreach ($worklike as $lk => $v) {
+                $wkids[] = $v["id"];
+            }
+            $whereor[] = ['workerid', 'in', $wkids];
+        }
+        $cateid = input('cateid/s', "");
+        if (!empty($cateid)) {
+            $map[] = ['cateid', '=', $cateid];
+        }
+        $wtype = input('type/d', 0);
+        if ($wtype != 0) {
+            $map[] = ['wtype', '=', $wtype];
+        }
+        $workerid = input('workerid/d', 0);
+        if ($workerid != 0) {
+            $map[] = ['workerid', '=', $workerid];
+        }
+        $orderby = ['status' => 'asc', 'updatetime' => 'desc', 'id' => 'desc'];
+        $list    = ComjobsModel::with(['worker'])->where($map)->where(function ($q) use ($whereor) {
+            $q->whereOr($whereor);
+        })->order($orderby)->append(['wtype_text'])->page($ppage)->limit($psize)->select();
+        foreach ($list as $v) {
+            $tags = [];
+            foreach ($v['tags'] as $tag) {
+                $tags = array_merge($tags, explode(',', $tag));
+            }
+            $v['tags']        = $tags;
+            $v['worker_name'] = $v['company_name'] ?: $v['worker']['title'];
+        }
+
+        page_result(0, "", $list);
+    }
+
+    /**
+     * 详情
+     */
+    public function detail()
+    {
+        $id = input('id', 0);
+        if (empty($id)) {
+            return $this->jump('该岗位不存在或已过期');
+        }
+
+        $job = ComjobsModel::with('worker')->where('status', 'in', '3,4')->where('id', '=', $id)->append(['wtype_text'])->findOrEmpty();
+        if ($job->isEmpty()) {
+            return $this->jump('该岗位不存在或已过期');
+        }
+        $tags = [];
+        foreach ($job['tags'] as $tag) {
+            $tags = array_merge($tags, explode(',', $tag));
+        }
+        $job['tags']           = $tags;
+        $job['worker_name']    = $job['company_name'] ?: $job['worker']['title'];
+        $job['worker_address'] = $job['company_address'] ?: $job['worker']['address'];
+        $job['comdetails']     = addPByN($job['comdetails']);
+        $job['requirement']    = addPByN($job['requirement']);
+        $job['companydetails'] = addPByN($job['companydetails']);
+
+        $job->inc('volume', 1)->update();
+
+        //收藏
+        $user_id = get_user_id();
+        $is_star = ComjobsStarModel::where('userid', $user_id)->where('comjobsid', $id)->find();
+        $star    = empty($is_star) ? 'false' : 'true';
+
+        //报名
+        $is_log = ComjobsLogModel::where(['comjobsid' => $id, 'userid' => $user_id])->find();
+        $log    = empty($is_log) ? 'false' : 'true';
+
+        //浏览记录
+        $workerlog    = WorkerLogModel::where(['workerid' => $job->workerid, 'userid' => $user_id])->whereDay('createtime')->findOrEmpty();
+        if ($workerlog->isEmpty()) {
+            WorkerLogModel::create([
+                'workerid'   => $job->workerid,
+                'userid'     => $user_id,
+                'ltotal'     => 1,
+                'createtime' => date("Y-m-d"),
+            ]);
+        } else {
+            $workerlog->inc('ltotal', 1)->update();
+        }
+
+        return view("jobs/detail", [
+            'job'        => $job,
+            'star'       => $star,
+            'log'        => $log,
+            'is_perfect' => $this->user->is_perfect,
+        ]);
+    }
+
+    /**
+     * 收藏
+     */
+    public function star()
+    {
+        $id      = input('id', 0);
+        $user_id = get_user_id();
+
+        $is_star = ComjobsStarModel::where('userid', $user_id)->where('comjobsid', $id)->find();
+        if (empty($is_star)) {
+            ComjobsStarModel::create(['userid' => $user_id, 'comjobsid' => $id, 'createtime' => time()]);
+        } else {
+            $is_star->delete();
+        }
+
+        page_result(0, "操作成功");
+    }
+
+    /**
+     * 报名
+     */
+    public function apply()
+    {
+        $comjobsid = input('id/d', 0);
+        $comjobs   = ComjobsModel::findOrEmpty($comjobsid);
+        if ($comjobs->isEmpty()) {
+            page_result(1, "招聘信息不存在");
+        }
+        $userid = $this->user->id;
+        $log    = ComjobsLogModel::where(['comjobsid' => $comjobsid, 'userid' => $userid])->findOrEmpty();
+        if ($log->isEmpty()) {
+            $log->save([
+                'workerid'   => $comjobs->workerid,
+                'comjobsid'  => $comjobsid,
+                'userid'     => $userid,
+                'status'     => 1,
+                'remark'     => "",
+                'createtime' => time(),
+            ]);
+            UserFollowModel::create([
+                'userid'     => $userid,
+                'ftype'      => "招聘报名",
+                'fstatus'    => 1,
+                'remark'     => $comjobs->title,
+                'createtime' => time(),
+            ]);
+
+            page_result(0, "恭喜您,报名成功,我们会尽快给您安排面试上班!!!。");
+        } else {
+            page_result(1, "请务重复报名");
+        }
+    }
+}

+ 66 - 0
app/mobile/controller/Linggong.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\Comjobs as ComjobsModel;
+
+class Linggong
+{
+    public function getJob()
+    {
+        $data  = input('post.');
+        $this->_dealJob($data);
+
+        page_result('操作成功');
+    }
+
+    public function getJobs()
+    {
+        $data  = input('post.');
+        foreach ($data as $v) {
+            $this->_dealJob($v);
+        }
+
+        page_result('操作成功');
+    }
+
+    public function _dealJob($data)
+    {
+        $add   = [
+            'third_id'        => $data['id'],
+            'title'           => $data['title'],
+            'cateid'          => $data['cateid'],
+            'province'        => $data['province'],
+            'city'            => $data['city'],
+            'district'        => $data['district'],
+            'agegroup'        => $data['agegroup'],
+            'tags'            => $data['tags'],
+            'requirement'     => $data['requirement'],
+            'comdetails'      => $data['comdetails'],
+            'picall'          => $data['picall'],
+            'companydetails'  => $data['companydetails'],
+            'wtype'           => $data['wtype'],
+            'bwagall'         => $data['bwagall'],
+            'zwagall'         => $data['zwagall'],
+            'telephone'       => $data['telephone'],
+            'remark'          => $data['remark'],
+            'status'          => 3,
+            'num'             => $data['num'],
+            'priority'        => $data['priority'],
+            'updatetime'      => $data['updatetime'],
+            'createtime'      => $data['createtime'],
+            'address'         => $data['address'],
+            'education'       => $data['education'],
+            'emp_time'        => $data['emp_time'] ?: [],
+            'company_name'    => $data['worker']['title'],
+            'company_address' => $data['worker']['address'],
+            'company_mobile'  => $data['worker']['mobile'],
+        ];
+        $check = ComjobsModel::where('third_id', $data['id'])->find();
+        if (empty($check)) {
+            ComjobsModel::create($add);
+        } else {
+            ComjobsModel::update($add, ['id' => $check['id']]);
+        }
+    }
+}

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

@@ -0,0 +1,229 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\User;
+use app\common\model\UserAuths;
+use app\common\model\Sinpage as SinpageModel;
+use app\common\model\User as UserModel;
+use app\common\model\RensheCode as RensheCodeModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+use app\common\model\UserWill as UserWillModel;
+use app\common\model\Worker as WorkerModel;
+
+class Login
+{
+    /**
+     * 登录
+     */
+    public function index()
+    {
+        my_redirect('https://www.jucai.gov.cn/api/auth/wechat_auth?url=' . urlencode(url('/login/wechatBack', [], true, true)));
+    }
+
+    public function login1()
+    {
+        session('user.id', 6);
+        return '登录成功!';
+    }
+
+    /**
+     * 微信回调
+     */
+    public function wechatBack()
+    {
+        $param   = input('param.');
+        $open_id = $param['openid'];
+
+        //登录
+        $auth = UserAuths::where(['identitytype' => 'weixin', 'identifier' => $open_id])->find();
+        if (empty($auth)) {
+            $user = User::create([
+                'username' => $param['nickname'],
+                'avatar'   => $param['headimgurl'],
+            ]);
+            $auth = UserAuths::create([
+                'userid'       => $user['id'],
+                'identitytype' => 'weixin',
+                'identifier'   => $open_id,
+                'logintime'    => time(),
+                'loginip'      => request()->ip(),
+            ]);
+        } else {
+            $auth->logintime = time();
+            $auth->loginip   = request()->ip();
+            $auth->save();
+        }
+
+        session('user.id', $auth['userid']);
+
+        my_redirect('/');
+    }
+
+    public function type()
+    {
+        $user_id = get_user_id();
+        if (empty($user_id)) {
+            my_redirect('/login/index');
+        }
+
+        return view('login/type');
+    }
+
+    public function setType()
+    {
+        $type = input('type') == 2 ? 2 : 1;
+        session('user.type', $type);
+
+        if ($type == 1) {
+            my_redirect('/');
+        } else {
+            my_redirect('/emp/index');
+        }
+    }
+
+    public function sinPage()
+    {
+        $field   = input('field/s');
+        $sinpage = SinpageModel::where(1)->find();
+        $data    = [];
+        if ($field == "aboutus") {
+            $data = [
+                'pagetil' => '关于我们',
+                'pagecon' => $sinpage->aboutus,
+            ];
+        } elseif ($field == "privacy") {
+            $data = [
+                'pagetil' => '隐私政策',
+                'pagecon' => $sinpage->privacy,
+            ];
+        } elseif ($field == "service") {
+            $data = [
+                'pagetil' => '用户协议',
+                'pagecon' => $sinpage->service,
+            ];
+        } elseif ($field == "contact") {
+            $data = [
+                'pagetil' => '联系客服',
+                'pagecon' => $sinpage->contact,
+            ];
+        } elseif ($field == "wxmp") {
+            $data = [
+                'pagetil' => '嵌入公众号说明',
+                'pagecon' => $sinpage->wxmp,
+            ];
+        } else {
+            $data = [
+                'pagetil' => '关于我们',
+                'pagecon' => $sinpage->aboutus,
+            ];
+        }
+
+        $pagecon = explode("\n", $data['pagecon']);
+        $str     = '';
+        foreach ($pagecon as $con) {
+            $str .= "<p>{$con}</p>";
+        }
+        $data['pagecon'] = $str;
+        return view('/login/page', $data);
+    }
+
+    public function perfect()
+    {
+        $user_id     = get_user_id();
+        $info        = UserModel::where('id', $user_id)->find();
+        $catelist    = ComjobsCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        $userwill    = UserWillModel::field('title as text,id')->select();
+        $emptime     = RensheCodeModel::getList('emp_time');
+        $community   = RensheCodeModel::getList('community')->toArray();
+        $community[] = ['name' => '不限'];
+        return view('my/info', [
+            'info'           => $info,
+            'catelist'       => $catelist,
+            'userwill'       => $userwill,
+            'emptime'        => $emptime,
+            'community'      => json_encode($community),
+            'workexperience' => getWorkExperience(),
+            'education'      => getEducation(),
+            'type'           => 1,
+            'url'            => url('/login/infoPost'),
+        ]);
+    }
+
+    public function infoPost()
+    {
+        $user_id = get_user_id();
+        $info    = UserModel::where('id', $user_id)->find();
+        $form    = input('param.');
+        foreach ($form as $k => $v) {
+            $info->$k = $v;
+        }
+
+        $info->is_perfect = 1;
+        $info->save();
+        page_result(0, '操作成功');
+    }
+
+    /**
+     * 雇主注册
+     */
+    public function empRegister()
+    {
+        $user_id = get_user_id();
+        $worker  = WorkerModel::field(['id', 'realname', 'mobile', 'address', 'title', 'details', 'picone', 'remark','status'])->where('userid', $user_id)->find();
+        if (empty($worker)) {
+            $worker = json_encode(['id' => 0, 'realname' => '', 'mobile' => '', 'address' => '', 'title' => '', 'details' => '', 'picone' => '', 'remark' => '']);
+        }
+
+        if ($worker->status == 1) {
+            return $this->_jump('等待管理员审核', url('/login/setType') . '?type=1');
+        } elseif ($worker->status == 3 || $worker->status == 4) {
+            return $this->_jump('账号异常,请联系管理员', url('/login/setType') . '?type=1');
+        } elseif ($worker->status == 5) {
+            my_redirect(url('/emp/index'));
+        }
+
+        return view('login/emp_register', ['worker' => $worker]);
+    }
+
+    public function empRegisterPost()
+    {
+        $data           = input('post.');
+        $data['status'] = 1;
+
+        if ($data['id']) {
+            WorkerModel::update($data);
+        } else {
+            $user_id            = get_user_id();
+            $data['userid']     = $user_id;
+            $data['wtype']      = 2;
+            $data['ftitle']     = $data['title'];
+            $data['province']   = '福建省';
+            $data['city']       = '泉州市';
+            $data['district']   = '晋江市';
+            $data['createitme'] = time();
+            WorkerModel::create($data);
+        }
+        page_result();
+    }
+
+    /**
+     * 错误提示
+     */
+    private function _jump($msg = '', $url = null, $wait = 3)
+    {
+        if (is_null($url)) {
+            $url = 'javascript:history.back(-1);';
+        } else {
+            $url = "location.href = '" . url($url) . "'";
+        }
+
+        $result = [
+            'msg'  => $msg,
+            'url'  => $url,
+            'wait' => $wait,
+        ];
+
+        return view('/public/jump', $result);
+    }
+}

+ 291 - 0
app/mobile/controller/My.php

@@ -0,0 +1,291 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\Config as ConfigModel;
+use app\common\model\RensheCode as RensheCodeModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+use app\common\model\UserWill as UserWillModel;
+use app\common\model\Feedback as FeedbackModel;
+use app\common\model\TrainJoin as TrainJoinModel;
+use app\common\model\Train as TrainModel;
+use app\common\model\ComjobsStar as ComjobsStarModel;
+use app\common\model\ComjobsLog as ComjobsLogModel;
+use app\common\model\ResumeInvite as ResumeInviteModel;
+use app\common\model\Worker as WorkerModel;
+use app\mobile\UserBaseController;
+
+class My extends UserBaseController
+{
+    public function index()
+    {
+        $worker = WorkerModel::where('userid', $this->user->id)->find();
+        return view('my/index', [
+                'worker' => $worker ?? 'false',
+            ]
+        );
+    }
+
+    /**
+     * 基本信息
+     */
+    public function info()
+    {
+        $catelist    = ComjobsCateModel::order(['priority' => 'desc', 'id' => 'desc'])->select();
+        $userwill    = UserWillModel::field('title as text,id')->select();
+        $emptime     = RensheCodeModel::getList('emp_time');
+        $community   = RensheCodeModel::getList('community')->toArray();
+        $community[] = ['name' => '不限'];
+        return view('my/info', [
+            'info'           => $this->user,
+            'catelist'       => $catelist,
+            'userwill'       => $userwill,
+            'emptime'        => $emptime,
+            'community'      => json_encode($community),
+            'workexperience' => getWorkExperience(),
+            'education'      => getEducation(),
+            'type'           => 0,
+            'url'            => url('/my/infoPost'),
+        ]);
+    }
+
+    public function infoPost()
+    {
+        $form = input('param.');
+        foreach ($form as $k => $v) {
+            $this->user->$k = $v;
+        }
+
+        $this->user->is_perfect = 1;
+        $this->user->save();
+        page_result(0, '操作成功');
+    }
+
+    /**
+     * 实名认证
+     */
+    public function auth()
+    {
+        $user = $this->user->visible(['realname', 'idcard', 'gender', 'birthday', 'idcardzpic', 'idcardfpic', 'authstatus', 'authremark']);
+        return view('my/auth', ['user' => $user]);
+    }
+
+    public function authPost()
+    {
+        $form = input('param.');
+        foreach ($form as $k => $v) {
+            $this->user->$k = $v;
+        }
+
+        $this->user->authstatus = 2;
+        $this->user->authremark = '';
+        $this->user->save();
+        page_result(0, '操作成功');
+    }
+
+    /**
+     * 意见反馈
+     */
+    public function feedback()
+    {
+        return view('my/feedback');
+    }
+
+    public function feedbackPost()
+    {
+        $param               = input('param.');
+        $param['createtime'] = time();
+        $param['userid']     = get_user_id();
+        FeedbackModel::create($param);
+        page_result(0, "提交成功");
+    }
+
+    /**
+     * 培训意愿
+     */
+    public function train()
+    {
+        $post = ConfigModel::getConfigValue('train_post');
+        return view('my/train', [
+            'post' => $post,
+        ]);
+    }
+
+    public function listTrain()
+    {
+        $page   = input('page/d', 1);
+        $size   = input('size/d', 10);
+        $userid = get_user_id();
+        $map    = [
+            ['status', '=', 1],
+            ['user_id', '=', $userid],
+        ];
+        $list   = TrainJoinModel::with(['train'])->where($map)->order(['id' => 'desc'])->page($page)->limit($size)->select();
+        page_result(0, "", $list);
+    }
+
+    public function trainAdd()
+    {
+        return view('my/train_add');
+    }
+
+    public function trainAddList()
+    {
+        $page = input('page/d', 1);
+        $size = input('size/d', 10);
+        $list = TrainModel::where('status', 1)->order(['priority' => 'asc', 'id' => 'desc'])->page($page)->limit($size)->select();
+        page_result(0, "", $list);
+    }
+
+    public function trainAddPost()
+    {
+        $train_id = input('id/d', 0);
+        $userid   = get_user_id();
+        if (empty($train_id)) {
+            page_result(1, "信息不存在");
+        }
+
+        $check = TrainJoinModel::where('train_id', $train_id)->where('user_id', $userid)->find();
+        if (!empty($check)) {
+            page_result(1, "请不要重复报名!");
+        }
+
+        TrainJoinModel::create([
+            'train_id'    => $train_id,
+            'user_id'     => $userid,
+            'create_time' => time(),
+        ]);
+
+        page_result(0, "恭喜您已报名成功!具体开班时间视报名人数而定,会有老师统一通知。");
+    }
+
+    public function trainCancel()
+    {
+        $userid = get_user_id();
+        $id     = input('id/d', 0);
+        $info   = TrainJoinModel::where('id', $id)->where('user_id', $userid)->find();
+        if (empty($info)) {
+            page_result(1, "信息不存在");
+        }
+
+        $info->delete();
+        page_result(0, "操作完成");
+    }
+
+    /**
+     * 收藏
+     */
+    public function like()
+    {
+        return view('my/like');
+    }
+
+    public function listLike()
+    {
+        $page   = input('page/d', 1);
+        $size   = input('size/d', 10);
+        $userid = get_user_id();
+        $map[]  = ['userid', '=', $userid];
+        $list   = ComjobsStarModel::with(['comjobs.worker'])->where($map)->order(['createtime' => 'desc', 'id' => 'desc'])->append(['comjobs.wtype_text'])->page($page)->limit($size)->select();
+        foreach ($list as $v) {
+            $v['comjobs']['worker_name'] = $v['comjobs']['company_name'] ?: $v['comjobs']['worker']['title'];
+        }
+        page_result(0, "", $list);
+    }
+
+    public function likeCancel()
+    {
+        $starid = input('id/d', 0);
+        $userid = get_user_id();
+        $star   = ComjobsStarModel::where(['id' => $starid, 'userid' => $userid])->find();
+        if (empty($star)) {
+            page_result(1, "关注信息不存在或已被删除。");
+        }
+        $star->delete();
+        page_result(0, "");
+    }
+
+    /**
+     * 报名
+     */
+    public function apply()
+    {
+        return view('my/apply');
+    }
+
+    public function listApply()
+    {
+        $page   = input('page/d', 1);
+        $size   = input('size/d', 10);
+        $userid = get_user_id();
+        $map[]  = ['userid', '=', $userid];
+        $list   = ComjobsLogModel::with(['comjobs.worker'])
+            ->where($map)
+            ->order(['createtime' => 'desc', 'id' => 'desc'])
+            ->append(['comjobs.wtype_text', 'status_text'])
+            ->page($page)
+            ->limit($size)
+            ->select();
+        foreach ($list as $v) {
+            $v['comjobs']['worker_name'] = $v['comjobs']['company_name'] ?: $v['comjobs']['worker']['title'];
+        }
+        page_result(0, "", $list);
+    }
+
+    public function cancelApply()
+    {
+        $logid  = input('id/d', 0);
+        $userid = get_user_id();
+        $log    = ComjobsLogModel::where(['id' => $logid, 'userid' => $userid])->find();
+        if (empty($log)) {
+            page_result(1, "报名记录信息不存在或已被删除。");
+        }
+        $log->delete();
+        page_result(0, "");
+    }
+
+    /**
+     * 收到的邀请
+     */
+    public function invite()
+    {
+        return view('my/invite');
+    }
+
+    public function listInvite()
+    {
+        $page   = input('page/d', 1);
+        $size   = input('size/d', 10);
+        $userid = get_user_id();
+        $list   = ResumeInviteModel::with(['worker'])->where('userid', $userid)->page($page)->limit($size)->append(['status_text'])->select();
+
+        page_result(0, "", $list);
+    }
+
+    public function setInviteStatus()
+    {
+        $id     = input('id/d', 0);
+        $status = input('status/d', 0);
+        if (empty($id) || empty($status)) {
+            page_result(1, "参数错误");
+        }
+
+        $info = ResumeInviteModel::where('id', $id)->find();
+        if ($info['status'] != 1) {
+            page_result(1, "请勿重复操作");
+        }
+
+        $info->status = $status;
+        $info->save();
+
+        page_result(0, "操作成功", $info);
+    }
+
+    /**
+     * 关于我们
+     */
+    public function about()
+    {
+        return view('my/about');
+    }
+}

+ 120 - 0
app/mobile/controller/Resume.php

@@ -0,0 +1,120 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\mobile\EmpBaseController;
+use app\common\model\User as UserModel;
+use app\common\model\ComjobsCate as ComjobsCateModel;
+use app\common\model\UserWill as UserWillModel;
+use app\common\model\ResumeInvite as ResumeInviteModel;
+
+class Resume extends EmpBaseController
+{
+    /**
+     * 列表
+     */
+    public function index()
+    {
+        $catelist = ComjobsCateModel::field('id as value, title as text')->order(['priority' => 'desc', 'id' => 'desc'])
+            ->select()->toArray();
+        array_unshift($catelist, ['value' => 0, 'text' => '不限岗位']);
+
+        $userwill = UserWillModel::field('id as value, title as text')->select()->toArray();
+        array_unshift($userwill, ['value' => 0, 'text' => '不限意向']);
+
+        return view('resume/index', [
+            'catelist' => json_encode($catelist),
+            'userwill' => json_encode($userwill),
+        ]);
+    }
+
+    public function list()
+    {
+        $page = input('page/d', 1);
+        $size = input('size/d', 20);
+
+        $model = new UserModel();
+        $model = $model->where('status', 2)->where('authstatus', '=', 3);
+
+        $jobintention = input('jobintention/d', 0);
+        if (!empty($jobintention)) {
+            $model = $model->where('jobintention', $jobintention);
+        }
+        $cateid = input('cateid/d', 0);
+        if (!empty($cateid)) {
+            $cate_name = ComjobsCateModel::where('id', $cateid)->value('title');
+            if (!empty($cate_name)) {
+                $model->whereRaw("json_contains(com_cate,CONCAT('\"',:name,'\"'))", ['name' => $cate_name]);
+            }
+        }
+
+        $list = $model->page($page)->limit($size)->append(['jobintention_text', 'education_text', 'worker_text'])->select();
+        $year  = date('Y');
+        foreach ($list as $v) {
+            if (!empty($v['birthday'])) {
+                $v['age'] = $year - date('Y', strtotime($v['birthday']));
+            } else {
+                $v['age'] = 0;
+            }
+        }
+
+        page_result(0, "", $list);
+    }
+
+    /**
+     * 详情
+     */
+    public function detail()
+    {
+        //简历信息
+        $id = input('id/d', 0);
+        if (empty($id)) {
+            return $this->jump('简历不存在');
+        }
+
+        $info = UserModel::where('id', $id)->find();
+        if ($info->isEmpty()) {
+            return $this->jump('简历不存在');
+        }
+
+        if ($info->status != 2 || $info->authstatus != 3) {
+            return $this->jump('简历未通过系统验证');
+        }
+
+        $info->append(['jobintention_text', 'education_text', 'worker_text']);
+        $info->volume++;
+        $info->save();
+        $info['eduexperience']    = addPByN($info['eduexperience']);
+
+        //邀请记录
+        $workerid = $this->worker->id;
+        $invite   = ResumeInviteModel::where('userid', $id)->where('workerid', $workerid)->find();
+
+        return view('resume/detail', [
+            'info'   => $info,
+            'invite' => $invite ? 'true' : 'false',
+        ]);
+    }
+
+    /**
+     * 发出邀请
+     */
+    public function invite()
+    {
+        $userid   = input('id/d', 0);
+        $workerid = $this->worker->id;
+
+        $check = ResumeInviteModel::where('workerid', $workerid)->where('userid', $userid)->find();
+        if (!empty($check)) {
+            page_result(1, "请勿重复邀请");
+        }
+
+        ResumeInviteModel::create([
+            'workerid'   => $workerid,
+            'userid'     => $userid,
+            'createtime' => time(),
+        ]);
+
+        page_result(0, "邀请成功");
+    }
+}

+ 24 - 0
app/mobile/controller/Shop.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\Worker as WorkerModel;
+use app\mobile\UserBaseController;
+
+class Shop extends UserBaseController
+{
+    /**
+     * 微店
+     */
+    public function index()
+    {
+        $id     = input('id', 0);
+        $worker = WorkerModel::where('id', $id)->find();
+        if (empty($worker)) {
+            return $this->jump('该店铺不存在');
+        }
+
+        $worker['details']    = addPByN($worker['details']);
+        return view('shop/index', ['worker' => $worker]);
+    }
+}

+ 27 - 0
app/mobile/event.php

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

+ 12 - 0
app/mobile/middleware.php

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

+ 19 - 0
app/mobile/provider.php

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

+ 291 - 0
app/mobile/view/ejobs/form.html

@@ -0,0 +1,291 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+    .sub-title{padding:10px 20px;font-size:14px;color:#aaa;}
+    .wrapper {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        height: 100%;
+    }
+    .img-block{
+        position:relative;
+    }
+    .img-block img{
+        z-index: 99;
+        max-width: 100%;
+        height: auto;
+        object-fit: cover;
+    }
+    .van-uploader__wrapper {justify-content:space-between;}
+    .van-uploader__wrapper .van-uploader__preview {margin-top:10px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">招聘</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="sub-title">基本信息</div>
+<van-cell-group>
+    <van-field v-model="job.title" required label="岗位标题" placeholder="比如:郑州富士康招聘普工"></van-field>
+    <van-field :value="cate_text" required readonly label="岗位类型" placeholder="请选择岗位类型" @click="cate_show = true"></van-field>
+    <van-popup :value="cate_show" position="bottom">
+        <van-picker
+                title="岗位类型"
+                show-toolbar
+                :columns="catelist"
+                @confirm="onCateConfirm"
+                @cancel="cate_show = false"
+                :default-index="cate_index"
+        ></van-picker>
+    </van-popup>
+    <van-field v-model="job.address" required label="工作地点" placeholder="请输入工作地点"></van-field>
+    <van-field v-model="job.agegroup" required label="招工年龄" placeholder="比如:18-35岁"></van-field>
+    <van-field v-model="job.tags" label="招聘标签" placeholder="比如:包住宿,高工资"></van-field>
+    <van-field
+            v-model="job.comdetails"
+            rows="2"
+            autosize
+            label="职位详情"
+            type="textarea"
+            placeholder="请输入职位详情"
+    ></van-field>
+    <van-field
+            v-model="job.requirement"
+            rows="2"
+            autosize
+            label="任职要求"
+            type="textarea"
+            placeholder="请输入任职要求"
+    ></van-field>
+    <van-field
+            v-model="job.companydetails"
+            rows="2"
+            autosize
+            label="企业介绍"
+            type="textarea"
+            placeholder="请输入企业介绍"
+    ></van-field>
+</van-cell-group>
+<div class="sub-title">详细信息</div>
+<van-cell-group>
+    <van-field :value="wtype_text" readonly required label="薪资类型" placeholder="请选择薪资类型" @click="wtype_show = true"></van-field>
+    <van-popup :value="wtype_show" position="bottom">
+        <van-picker
+                title="薪资类型"
+                show-toolbar
+                :columns="wtype"
+                @confirm="onWtypeConfirm"
+                @cancel="wtype_show = false"
+                :default-index="wtype_index"
+        ></van-picker>
+    </van-popup>
+    <van-field v-model="job.zwagall" required label="薪酬(元)" type="digit" placeholder="请输入薪酬"></van-field>
+    <van-field v-model="job.recruit_num" required label="招聘人数" type="digit" placeholder="请输入招聘人数"></van-field>
+    <van-field v-model="job.telephone" label="手机号" type="tel" placeholder="请输入手机号"></van-field>
+    <van-field
+            v-model="job.remark"
+            rows="2"
+            autosize
+            label="补充说明"
+            type="textarea"
+            placeholder="请输入补充说明"
+    ></van-field>
+    <van-uploader
+            accept="image/*"
+            :after-read="afterRead"
+            preview-size='25vw'
+            :disabled="isUploading?true:false"
+            multiple
+    >
+
+        <van-field label="环境照片" readonly value="点击上传"></van-field>
+    </van-uploader>
+    <div class="van-uploader__wrapper" v-if="job.picall && job.picall.length > 0" style="padding:0 15px;">
+        <div class="van-uploader__preview" v-for="(src,index) in job.picall">
+            <div class="van-image van-uploader__preview-image">
+                <img :src="src" class="van-image__img" style="object-fit: cover;" @click="showPicall(index)">
+            </div>
+            <div class="van-uploader__preview-delete" @click.stop="deletePicall(index)">
+                <i class="van-icon van-icon-cross van-uploader__preview-delete-icon"><!----></i>
+            </div>
+        </div>
+    </div>
+</van-cell-group>
+<div style="margin: 16px;">
+    <van-button block type="info" @click="onSubmit">提交审核</van-button>
+</div>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                job: {$job},
+                cate_show: false,
+                catelist: {$catelist},
+                wtype_show: false,
+                wtype: ['按月', '按时', '按件', '按项目', '其他'],
+                isUploading: false,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onCateConfirm(value) {
+                this.$set(this.job, 'cateid', value.id);
+                this.cate_show = false;
+            },
+            onWtypeConfirm(value, index) {
+                this.$set(this.job, 'wtype', index + 1);
+                this.wtype_show = false;
+            },
+            deletePicall (index) {
+                let picall = this.job.picall;
+                picall.splice(index,1);
+                this.$set(this.job, 'picall', picall);
+            },
+            showPicall (index) {
+                vant.ImagePreview({
+                    images: this.job.picall,
+                    startPosition: index,
+                });
+            },
+            afterRead (file) {
+                if (!(file instanceof Array)) {
+                    file = [file];
+                }
+
+                this.isUploading = true;
+                for (let i = 0; i < file.length; i++) {
+                    file[i].status = 'uploading';
+                    file[i].message = '上传中...';
+                    //添加上传状态,避免用户在上传未完成时点击提交按钮
+                    let self = this;
+                    $.post("{:url('/com/imageUpload')}", {file: file[i].content, name: file[i].file.name}, function (json) {
+                        file[i].status = '';
+                        file[i].message = '';
+                        let flag = true;
+                        for (let i = 0; i < file.length; i++) {
+                            if (file[i].status !== '') {
+                                flag = false
+                            }
+                        }
+                        if (flag) {
+                            self.isUploading = false;
+                        }
+                        if (json.code == 0) {
+                            let picall = self.job.picall ? self.job.picall : [];
+                            picall.push(json.data.avatar);
+                            self.$set(self.job, 'picall', picall);
+                        } else {
+                            self.handleDelete(file[i].file.name)
+                            self.$toast(json.msg);
+                        }
+                    }, 'json');
+                }
+            },
+            isEmpty(value) {
+                if (value === undefined || value === null) {
+                    return true;
+                } else if (typeof (value) === 'number') {
+                    return value === 0;
+                } else if (typeof (value) === 'object') {
+                    if (Array.isArray(value) && !value.length) {
+                        return true;
+                    }
+
+                    if (typeof value === 'object') {
+                        for (item in value) {
+                            if (value.hasOwnProperty(item)) {
+                                return false;
+                            }
+                        }
+                        return true;
+                    }
+                } else if (typeof (value) === 'string' && value.trim().length === 0) {
+                    return true;
+                }
+
+                return false;
+            },
+            onSubmit() {
+                const fields = [
+                    {key: 'title', tip: '请输入岗位标题'},
+                    {key: 'cateid', tip: '请选择岗位类型'},
+                    {key: 'address', tip: '请输入工作地点'},
+                    {key: 'agegroup', tip: '请输入招工年龄'},
+                    {key: 'wtype', tip: '请选择薪资类型'},
+                    {key: 'zwagall', tip: '请输入薪酬'},
+                    {key: 'recruit_num', tip: '请输入招聘人数'},
+                ];
+                for (let i = 0; i < fields.length; i++) {
+                    if (this.isEmpty(this.job[fields[i].key])) {
+                        this.$toast(fields[i].tip);
+                        return false;
+                    }
+                }
+
+                let self = this;
+                $.post("{:url('/ejobs/formPost')}", this.job, function (json) {
+                    if (json.code == 0) {
+                        location.href = "{:url('/emp/index')}";
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+        },
+        computed: {
+            cate_text() {
+                let res = '';
+                const _this = this;
+                this.catelist.some(function (v) {
+                    if (_this.job.cateid == v.id) {
+                        res = v.text;
+                        return true;
+                    }
+                });
+                return res;
+            },
+            cate_index() {
+                let index = 0;
+                const _this = this;
+                this.catelist.some(function (v, i) {
+                    if (_this.job.cateid == v.id) {
+                        index = i;
+                        return true;
+                    }
+                });
+                return index;
+            },
+            wtype_text() {
+                let text = '';
+                if (this.job.wtype !== undefined) {
+                    text = this.wtype[this.job.wtype - 1];
+                }
+                return text;
+            },
+            wtype_index() {
+                let index = 0;
+                if (this.job.wtype !== undefined) {
+                    index = this.job.wtype - 1;
+                }
+                return index;
+            }
+        }
+    });
+</script>
+{/block}

+ 138 - 0
app/mobile/view/ejobs/job.html

@@ -0,0 +1,138 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">我的招聘</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-tabs v-model="status" @click="onTab">
+    <van-tab title="全部" :name="0"></van-tab>
+    <van-tab title="待审核" :name="2"></van-tab>
+    <van-tab title="已上架" :name="3"></van-tab>
+    <van-tab title="已停招" :name="4"></van-tab>
+    <van-tab title="已下架" :name="5"></van-tab>
+</van-tabs>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list">
+                <div class="job-flex" style="border-bottom:1px solid #eee;">
+                    <div class="job-flex-left salary">
+                        {{item.status_text}}
+                    </div>
+                    <div class="job-flex-right"></div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left job-title">{{item.title}}</div>
+                    <div class="job-flex-right salary">{{item.zwagall}}({{item.wtype_text}})</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left">
+                        <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in item.tags">{{tag}}</van-tag>
+                    </div>
+                    <div class="job-flex-right num">{{item.recruit_num}}名</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="btn-box">
+                        <van-button type="info" plain round size="small" @click="onStatus(item.id,3)" v-if="item.status == 5">上架岗位</van-button>
+                        <van-button type="danger" plain round size="small" @click="onStatus(item.id,5)" v-if="item.status == 3">下架岗位</van-button>
+                        <van-button type="info" plain round size="small" @click="toEdit(item.id)">编辑岗位</van-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                status: {$status},
+                list: [],
+
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                location.href = "{:url('/emp/index')}";
+            },
+            onTab(status) {
+                location.href = "{:url('/ejobs/job')}?status=" + status;
+            },
+            toEdit(id) {
+                location.href = "{:url('/ejobs/form')}?id=" + id;
+            },
+            onStatus(id,status) {
+                const self = this;
+                $.post("{:url('/ejobs/statusJob')}", {id:id,status:status}, function (json) {
+                    if (json.code == 0) {
+                        self.onRefresh();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page:this.page,status:this.status};
+                this.page++;
+
+                $.post("{:url('/ejobs/listJob')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 206 - 0
app/mobile/view/emp/apply.html

@@ -0,0 +1,206 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+    .lw-list {display:flex;margin-top:10px;padding-bottom:10px;border-bottom:2px solid #f8f9fb;}
+    .lw-list .avatar{width:45px;height:45px;}
+    .lw-list .content {margin-left:10px;font-size:14px;}
+    .lw-list .content .name{color:#e54d42;}
+    .lw-list .content .time{font-size:12px;color:#aaaaaa;margin-top:5px;}
+    .box-border {border-bottom:1px solid #eee;padding-bottom:5px;}
+    .plr-10 {padding-left:10px;padding-right:10px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">报名记录</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-dropdown-menu>
+    <van-dropdown-item v-model="form.comjobsid" :options="comjobs_list" @change="onSearch"></van-dropdown-item>
+    <van-dropdown-item v-model="form.status" :options="status_list" @change="onSearch"></van-dropdown-item>
+</van-dropdown-menu>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list" style="padding:15px 0;">
+                <div class="job-flex box-border plr-10">
+                    <div class="job-flex-left job-title">{{item.comjobs.title}}</div>
+                    <div class="job-flex-right salary">{{item.status_text}}</div>
+                </div>
+                <div class="lw-list plr-10">
+                    <img :src="item.user.avatar ? item.user.avatar : '__MIMG__/default_avatar.jpg'" class="avatar">
+                    <div class="content">
+                        <div class="name">{{item.user.realname ? item.user.realname : item.user.nickname}}</div>
+                        <div class="time">{{item.createtime}}</div>
+                    </div>
+                </div>
+                <div class="job-flex margin-top-10 plr-10">
+                    <div class="btn-box">
+                        <van-button type="danger" plain round size="small" @click="onDel(item.id)">删除记录</van-button>
+                        <van-button type="info" plain round size="small" @click="onStatus(item.id,item.status)">更改状态</van-button>
+                        <van-button type="info" plain round size="small" @click="onTel(item.user.mobile)">拔打电话</van-button>
+                        <van-button type="info" plain round size="small" @click="toResume(item.user.id)">查看简历</van-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+<van-popup v-model="status_show" position="bottom">
+    <van-picker
+            title="更改状态"
+            show-toolbar
+            :columns="status_plist"
+            @confirm="onStatusConfirm"
+            @cancel="status_show = false"
+            :default-index="status_index"
+    ></van-picker>
+</van-popup>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                form: {
+                    status: {$status},
+                    comjobsid: {$comjobsid},
+                },
+                status_list: [
+                    {text:"全部状态",value:0},
+                    {text:"未跟进",value:1},
+                    {text:"未面试",value:2},
+                    {text:"面试通过",value:3},
+                    {text:"面试未通过",value:4},
+                    {text:"用户放弃",value:5},
+                    {text:"已入职",value:6},
+                    {text:"已离职",value:7},
+                ],
+                comjobs_list: {$comjobs},
+                list: [],
+
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+
+                status_plist: [
+                    {text:"未跟进",value:1},
+                    {text:"未面试",value:2},
+                    {text:"面试通过",value:3},
+                    {text:"面试未通过",value:4},
+                    {text:"用户放弃",value:5},
+                    {text:"已入职",value:6},
+                    {text:"已离职",value:7},
+                ],
+                status_show: false,
+                status_id: 0,
+                status_index: 0,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onSearch() {
+                this.onRefresh();
+            },
+            onTel(mobile) {
+                if (!mobile) {
+                    this.$toast('对方未留电话!');
+                    return false;
+                }
+                location.href = 'tel://' + mobile;
+            },
+            onDel(id) {
+                const self = this;
+                this.$dialog.confirm({
+                    title: '提示',
+                    message: '删除后不可恢复,确定要删除吗?',
+                }).then(() => {
+                    $.post("{:url('/emp/delApply')}", {id:id}, function (json) {
+                        if (json.code == 0) {
+                            self.onRefresh();
+                        } else {
+                            self.$toast(json.msg);
+                        }
+                    }, 'json');
+                })
+
+            },
+            toResume(id) {
+                location.href = "{:url('/resume/detail')}?id=" + id
+            },
+            onStatus(id,status) {
+                this.status_id = id;
+                this.status_index = status - 1;
+                this.status_show = true;
+                console.log(this.status_index);
+            },
+            onStatusConfirm(value) {
+                this.status_show = false;
+                const self = this;
+                $.post("{:url('/emp/statusApply')}", {id:this.status_id,status:value.value}, function (json) {
+                    if (json.code == 0) {
+                        self.onRefresh();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = this.form;
+                param.page = this.page;
+                this.page++;
+
+                $.post("{:url('/emp/listApply')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 99 - 0
app/mobile/view/emp/index.html

@@ -0,0 +1,99 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+        .header {display:flex;box-sizing:border-box;padding:10px 20px;align-items:center;justify-content:center;flex-direction:column;position:relative;}
+        .header .image {width:85px;height:85px;border-radius:50px;}
+        .header .title {margin-top:10px;}
+        .header .van-icon {margin-left:auto;font-size:20px;}
+        .count-obj {display:flex;align-items:center;justify-content:space-around;margin-top:10px;}
+        .count-obj .count-item {display:flex;flex-direction:column;justify-content:center;align-items:center;}
+        .count-obj .count-item .num {font-size:24px;color:#333;}
+        .count-obj .count-item .tip {font-size:14px;color:#aaa;}
+        .base-info {box-sizing:border-box;padding:10px 20px;}
+        .base-info .van-grid-item__icon .van-icon__image {width:45px;height:45px;}
+        .base-info .van-grid-item__text {font-size:14px;}
+        .sub-title {padding:10px 20px;font-size:14px;color:#aaa;}
+        .other-info {background:white;}
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            class="bg-pink"
+            fixed="true"
+    >
+        <template #title>
+            <span class="text-white">首页</span>
+        </template>
+    </van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="header">
+    <img class="image" :src="header_img" @click="location.href = '{:url('/emp/info')}'">
+    <span class="title" @click="location.href = '{:url('/emp/info')}'">{{worker.title}}</span>
+</div>
+<div class="count-obj">
+    <div class="count-item">
+        <span class="num">{{countobj.yesterday}}</span>
+        <span class="tip">昨日浏览</span>
+    </div>
+    <div class="count-item">
+        <span class="num">{{countobj.today}}</span>
+        <span class="tip">今日浏览</span>
+    </div>
+    <div class="count-item">
+        <span class="num">{{countobj.total}}</span>
+        <span class="tip">累计访客</span>
+    </div>
+</div>
+<div class="base-info">
+    <van-grid :border="false" :column-num="2">
+        <van-grid-item icon="__MIMG__/my/myicon01.png" text="发布招聘" url="{:url('/Ejobs/form')}"></van-grid-item>
+        <van-grid-item icon="__MIMG__/my/myicon04.png" text="我要求职" url="{:url('/login/setType')}?type=1"></van-grid-item>
+    </van-grid>
+</div>
+<div class="sub-title">其他功能</div>
+<div class="other-info">
+    <van-grid :border="false" :column-num="3">
+        <van-grid-item icon="__MIMG__/emp/workernav1.png" text="我的招聘" url="{:url('/ejobs/job')}"></van-grid-item>
+        <van-grid-item icon="__MIMG__/emp/workernav8.png" text="我的邀请" url="{:url('/emp/invite')}"></van-grid-item>
+        <van-grid-item icon="__MIMG__/emp/workernav6.png" text="报名记录" url="{:url('/emp/apply')}"></van-grid-item>
+    </van-grid>
+</div>
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active" active-color="#FF589B" @change="onTabChange">
+    <van-tabbar-item icon="wap-home-o">首页</van-tabbar-item>
+    <van-tabbar-item icon="description">简历</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    active: 0,
+                    worker: {$worker},
+                    countobj: {$countobj},
+                };
+            },
+            methods: {
+                onBack() {
+                    history.back();
+                },
+                onTabChange(index) {
+                    const url = ["{:url('/emp/index')}","{:url('/resume/index')}"];
+                    location.href = url[index];
+                },
+            },
+            computed: {
+                header_img() {
+                    const default_img = "__MSTATIC__/images/img_worker.png";
+                    if (this.worker.tilpic) {
+                        return this.worker.tilpic;
+                    }
+                    return default_img;
+                }
+            },
+        });
+    </script>
+{/block}

+ 106 - 0
app/mobile/view/emp/info.html

@@ -0,0 +1,106 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+        .uploader-box{width:120px;height:120px;margin:0 auto;}
+        .uploader-box .van-image__img{border-radius:50%;}
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            class="bg-pink"
+            fixed="true"
+            left-text="返回"
+            left-arrow
+            @click-left="onBack"
+    >
+        <template #title>
+            <span class="text-white">首页</span>
+        </template>
+    </van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="uploader-box">
+    <van-uploader :max-count="1" :after-read="uploadHead">
+        <van-image style="width:80%;display:block;margin:20px auto 0 auto;" :src="head_image"></van-image>
+    </van-uploader>
+</div>
+<van-cell-group style="margin-top:10px;">
+    <van-field :value="worker.title" label="公司名称" readonly></van-field>
+    <p style="padding-left:16px;color:#aaa;font-size:14px;">公司名称不可修改</p>
+</van-cell-group>
+<van-cell-group style="margin-top:10px;">
+    <van-field v-model="worker.realname" required label="姓名" placeholder="请输入姓名"></van-field>
+    <van-field v-model="worker.mobile" required label="手机号" placeholder="请输入手机号"></van-field>
+    <van-field v-model="worker.address" required label="地址" placeholder="请输入地址"></van-field>
+    <van-field
+            v-model="worker.details"
+            rows="1"
+            autosize
+            label="公司介绍"
+            type="textarea"
+            placeholder="请输入公司介绍"
+    ></van-field>
+</van-cell-group>
+<div style="margin: 16px;">
+    <van-button block type="info" @click="onSubmit">确定</van-button>
+</div>
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    worker: {$worker},
+                };
+            },
+            methods: {
+                onBack() {
+                    history.back();
+                },
+                uploadHead(file) {
+                    let self = this;
+                    $.post("{:url('/com/imageUpload')}", {file: file.content, name: file.file.name}, function (json) {
+                        if (json.code == 0) {
+                            self.worker.tilpic = json.data.avatar
+                            self.$forceUpdate();
+                        } else {
+                            self.$toast(json.msg);
+                        }
+                    }, 'json')
+                },
+                onSubmit() {
+                    const fields = [
+                        {key: 'realname', tip: '请输入姓名'},
+                        {key: 'mobile', tip: '请输入电话'},
+                        {key: 'address', tip: '请输入地址'},
+                    ];
+                    for (let i = 0; i < fields.length; i++) {
+                        if (!this.worker[fields[i].key] || this.worker[fields[i].key].trim() === '') {
+                            this.$toast(fields[i].tip);
+                            return false;
+                        }
+                    }
+
+                    let self = this;
+                    $.post("{:url('/emp/infoPost')}", this.worker, function (json) {
+                        if (json.code == 0) {
+                            location.href = "{:url('/emp/index')}";
+                        } else {
+                            self.$toast(json.msg);
+                        }
+                    }, 'json')
+                },
+            },
+            computed: {
+                head_image() {
+                    const default_img = "__MSTATIC__/images/img_worker.png";
+                    if (this.worker.tilpic) {
+                        return this.worker.tilpic;
+                    }
+                    return default_img;
+                },
+            },
+        });
+    </script>
+{/block}

+ 140 - 0
app/mobile/view/emp/invite.html

@@ -0,0 +1,140 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">我的邀请</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-tabs v-model="status" @click="onTab">
+    <van-tab title="全部" :name="0"></van-tab>
+    <van-tab title="邀请中" :name="1"></van-tab>
+    <van-tab title="邀请成功" :name="2"></van-tab>
+    <van-tab title="拒绝邀请" :name="3"></van-tab>
+</van-tabs>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list">
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left job-title">{{item.user.realname ? item.user.realname : item.user.nickname}}</div>
+                    <div class="job-flex-right salary">{{item.status_text}}</div>
+                </div>
+                <div class="job-flex margin-top-10" v-if="item.user.com_cate.length > 0">
+                    <div class="job-flex-left">
+                        <van-tag type="primary" size="medium" v-for="tag in item.user.com_cate">{{tag}}</van-tag>
+                    </div>
+                    <div class="job-flex-right num"></div>
+                </div>
+                <div class="job-flex margin-top-10" v-if="item.user.emp_time.length > 0">
+                    <div class="job-flex-left">
+                        <van-tag color="#FF589B" size="medium" v-for="tag in item.user.emp_time">{{tag}}</van-tag>
+                    </div>
+                    <div class="job-flex-right num"></div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="btn-box">
+                        <van-button type="info" plain round size="small" @click="onTel(item.user.mobile)">拔打电话</van-button>
+                        <van-button type="info" plain round size="small" @click="toResume(item.user.id)">查看简历</van-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                status: {$status},
+                list: [],
+
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                location.href = "{:url('/emp/index')}";
+            },
+            onTab(status) {
+                location.href = "{:url('/emp/invite')}?status=" + status;
+            },
+            onTel(mobile) {
+                if (!mobile) {
+                    this.$toast('对方未留电话!');
+                    return false;
+                }
+                location.href = 'tel://' + mobile;
+            },
+            onStatus(id,status) {
+                const self = this;
+                $.post("{:url('/ejobs/statusJob')}", {id:id,status:status}, function (json) {
+                    if (json.code == 0) {
+                        self.onRefresh();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page:this.page,status:this.status};
+                this.page++;
+
+                $.post("{:url('/emp/listInvite')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 35 - 0
app/mobile/view/index/base.html

@@ -0,0 +1,35 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">首页</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {};
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+        },
+    });
+</script>
+{/block}

+ 85 - 0
app/mobile/view/index/index.html

@@ -0,0 +1,85 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .my-swipe {background:white;}
+    .my-swipe .van-swipe-item img{width:100%;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+>
+    <template #title>
+        <span class="text-white">首页</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
+    <van-swipe-item v-for="item in slide">
+        <img :src="item.tilpic" alt="">
+    </van-swipe-item>
+</van-swipe>
+<van-grid :border="false">
+    <van-grid-item v-for="item in navigation" @click="onNav(item.tilurl)" :icon="item.tilpic" :text="item.title"></van-grid-item>
+</van-grid>
+<div class="sub_title">推荐职位</div>
+<div class="job-box">
+    <div class="job-item" v-for="item in list" @click="goDetail(item.id)">
+        <div class="job-flex">
+            <div class="job-flex-left job-title">{{item.title}}</div>
+            <div class="job-flex-right salary">{{item.zwagall}}</div>
+        </div>
+        <div class="job-flex margin-top-10">
+            <div class="job-flex-left">
+                <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in item.tags">{{tag}}</van-tag>
+            </div>
+            <div class="job-flex-right num">{{item.recruit_num}}名</div>
+        </div>
+        <div class="job-flex margin-top-10">
+            <div class="job-flex-left">
+                {{item.worker_name}}
+            </div>
+            <div class="job-flex-right">
+                浏览量:{{item.volume}}
+            </div>
+        </div>
+    </div>
+</div>
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active" active-color="#FF589B" @change="onTabChange">
+    <van-tabbar-item icon="wap-home-o">首页</van-tabbar-item>
+    <van-tabbar-item icon="description">招聘</van-tabbar-item>
+    <van-tabbar-item icon="user-circle-o">我的</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                active: 0,
+                slide: {$slide},
+                navigation: {$navigation},
+                list: {$list},
+            };
+        },
+        methods: {
+            onTabChange(index) {
+                const url = ["{:url('/')}","{:url('/jobs/index')}","{:url('/my/index')}"];
+                location.href = url[index];
+            },
+            goDetail(id) {
+                location.href = "{:url('/jobs/detail')}?id=" + id;
+            },
+            onNav(url) {
+                if (url) {
+                    location.href = url;
+                }
+                return false;
+            }
+        },
+    });
+</script>
+{/block}

+ 200 - 0
app/mobile/view/jobs/detail.html

@@ -0,0 +1,200 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">岗位</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="job-item" style="width:100%;margin:0;">
+    <div class="job-flex">
+        <div class="job-flex-left job-title">{{job.title}}</div>
+        <div class="job-flex-right salary">{{job.zwagall}}({{job.wtype_text}})</div>
+    </div>
+    <div class="job-flex margin-top-10">
+        <div class="job-flex-left">
+            <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in job.tags">{{tag}}</van-tag>
+        </div>
+        <div class="job-flex-right num">{{job.recruit_num}}名</div>
+    </div>
+    <div class="job-flex margin-top-10">
+        <div class="job-flex-left">
+            {{job.worker_name}}
+        </div>
+        <div class="job-flex-right">
+            浏览量:{{job.volume}}
+        </div>
+    </div>
+    <div class="job-flex margin-top-10" v-if="job.third_id > 0">
+        <div class="job-flex-left salary" style="max-width:100%;">
+            本数据来源于:晋江人力小程序
+        </div>
+        <div class="job-flex-right">
+        </div>
+    </div>
+</div>
+<div class="content-box margin-top-10">
+    <div class="title"><span class="mark"></span>职位详情</div>
+    <div class="item" v-html="job.comdetails"></div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>任职要求</div>
+    <div class="item" v-html="job.requirement"></div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>企业介绍</div>
+    <div class="item" v-html="job.companydetails"></div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>环境图片</div>
+    <van-row>
+        <van-col span="8" v-for="(img,index) in job.picall">
+            <van-image
+                    fit="cover"
+                    width="30vw"
+                    height="30vw"
+                    :src="img"
+                    @click="onPreview(index)"
+            ></van-image>
+        </van-col>
+    </van-row>
+</div>
+<div class="content-box">
+    <div class="company" style="padding-top:10px;" @click="toWorker">
+        <img :src="img_worker">
+        <div class="company-right">
+            <div class="company-name">福建省晋江人力资本有限公司</div>
+            <div class="company-address">泉州市 晋江市 晋江市梅岭街道世纪大道990号泉州(晋江)国际人才港</div>
+        </div>
+    </div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>服务流程</div>
+    <div class="item">
+        <img style="width:100%;" src="__STATIC__/images/applet/detaillc.png" alt="">
+    </div>
+</div>
+<div style="width:100%;height:50px;"></div>
+<div class="fix-footer">
+    <van-row>
+        <van-col span="4">
+            <div class="icon-box" @click="onShowToggle">
+                <van-icon name="share-o" size="25"></van-icon>
+                <span>分享</span>
+            </div>
+        </van-col>
+        <van-col span="4">
+            <div class="icon-box" @click="onStar">
+                <van-icon :name="is_star" size="25" color="#FF589B"></van-icon>
+                <span>收藏</span>
+            </div>
+        </van-col>
+        <van-col span="16">
+            <div class="button" @click="onApply" v-if="job.third_id == 0 && !log">
+                报名
+            </div>
+            <div class="button" @click="onMobile" v-if="job.third_id > 0 || log">
+                联系对方
+            </div>
+        </van-col>
+    </van-row>
+</div>
+<div class="share-box" v-show="show_share" @click="onShowToggle">
+    <img src="__MIMG__/share_tip.png">
+</div>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                job: {$job},
+                star: {$star},
+                log: {$log},
+                is_click: false,
+                show_share: false,
+                is_perfect: {$is_perfect},
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onPreview(index) {
+                vant.ImagePreview({images: this.job.picall, startPosition: index});
+            },
+            toWorker() {
+                if (this.job.worker) {
+                    location.href = "{:url('/shop/index')}?id=" + this.job.workerid;
+                }
+                return false;
+            },
+            onStar() {
+                if (this.is_click) {
+                    return false;
+                }
+                this.is_click = true;
+                const _this = this;
+                $.post("{:url('/jobs/star')}", {id: this.job.id}, function (json) {
+                    _this.star = !_this.star;
+                    _this.is_click = false;
+                }, 'json');
+            },
+            onShowToggle() {
+                this.show_share = !this.show_share;
+            },
+            onMobile() {
+                const mobile = this.job.third_id > 0 ? this.job.company_mobile : this.job.worker.mobile;
+                if (mobile) {
+                    window.location.href = 'tel://' + mobile
+                } else {
+                    _this.$toast('对方暂未设置电话');
+                }
+            },
+            onApply() {
+                if (this.is_perfect == 2) {
+                    location.href = "{:url('/my/info')}";
+                }
+                if (this.is_click) {
+                    return false;
+                }
+                this.is_click = true;
+                const _this = this;
+                $.post("{:url('/jobs/apply')}", {id: this.job.id}, function (json) {
+                    _this.$toast(json.msg);
+                    _this.is_click = false;
+                    if (json.code == 0) {
+                        _this.log = true;
+                    }
+                }, 'json');
+            },
+        },
+        computed: {
+            img_worker() {
+                const default_img = "__MSTATIC__/images/img_worker.png";
+                if (this.job.worker && this.job.worker.tilpic) {
+                    return this.job.worker.tilpic;
+                }
+                return default_img;
+            },
+            is_star() {
+                return this.star ? 'star' : 'star-o';
+            },
+        },
+    });
+</script>
+{/block}

+ 156 - 0
app/mobile/view/jobs/index.html

@@ -0,0 +1,156 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+>
+    <template #title>
+        <span class="text-white">招聘</span>
+    </template>
+</van-nav-bar>
+
+<div style="position: fixed;top: 46px;width: 100%;z-index: 100;background:white;box-sizing:border-box;">
+    <van-search v-model="form.searchval" @search="onSearch" placeholder="请输入岗位名称"></van-search>
+</div>
+<!--筛选-->
+<van-dropdown-menu style="position: fixed;top: 102px;width: 100%;z-index: 100;">
+    <van-dropdown-item v-model="form.type" :options="type_option" @change="onTypeChange"></van-dropdown-item>
+    <van-dropdown-item v-model="form.cateid" :options="cate_option" @change="onCateChange"></van-dropdown-item>
+</van-dropdown-menu>
+<div style="width:100%;height:150px;"></div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list" @click="goDetail(item.id)">
+                <div class="job-flex">
+                    <div class="job-flex-left job-title">{{item.title}}</div>
+                    <div class="job-flex-right salary">{{item.zwagall}}({{item.wtype_text}})</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left">
+                        <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in item.tags">{{tag}}</van-tag>
+                    </div>
+                    <div class="job-flex-right num">{{item.recruit_num}}名</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left">
+                        {{item.worker_name}}
+                    </div>
+                    <div class="job-flex-right">
+                        浏览量:{{item.volume}}
+                    </div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active" active-color="#FF589B" @change="onTabChange">
+    <van-tabbar-item icon="wap-home-o">首页</van-tabbar-item>
+    <van-tabbar-item icon="description">招聘</van-tabbar-item>
+    <van-tabbar-item icon="user-circle-o">我的</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                active: 1,
+                value: '',
+                list: [],
+                type_option: [
+                    {text: '不限类型', value: 0},
+                    {text: '按月', value: 1},
+                    {text: '按时', value: 2},
+                    {text: '按件', value: 3},
+                    {text: '按项目', value: 4},
+                    {text: '其他', value: 5},
+                ],
+                cate_option: {$catelist},
+                form: {
+                    searchval: '',
+                    type: {$type},
+                    cateid: 0,
+                },
+
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        created() {
+
+        },
+        methods: {
+            onSearch(value) {
+                this.form.searchval = value;
+                this.onRefresh();
+            },
+            onTypeChange(value) {
+                this.form.type = value;
+                this.onRefresh();
+            },
+            onCateChange(value) {
+                this.form.cateid = value;
+                this.onRefresh();
+            },
+            onTabChange(index) {
+                const url = ["{:url('/')}", "{:url('/jobs/index')}", "{:url('/my/index')}"];
+                location.href = url[index];
+            },
+            goDetail(id) {
+                location.href = "{:url('/jobs/detail')}?id=" + id;
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = this.form;
+                param.page = this.page;
+                this.page++;
+
+                $.post("{:url('/jobs/listJobs')}", this.form, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 122 - 0
app/mobile/view/login/emp_register.html

@@ -0,0 +1,122 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+        .uploader-box{
+            width:120px;
+            height:120px;
+            margin:0 auto;
+        }
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            class="bg-pink"
+            fixed="true"
+            left-text="返回"
+            left-arrow
+            @click-left="onBack"
+    >
+        <template #title>
+            <span class="text-white">雇主注册</span>
+        </template>
+    </van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+
+<van-cell-group>
+<van-field v-model="form.realname" required label="姓名" placeholder="请输入姓名"></van-field>
+<van-field v-model="form.mobile" required label="电话" placeholder="请输入电话"></van-field>
+<van-field v-model="form.address" required label="地址" placeholder="请输入地址"></van-field>
+</van-cell-group>
+<van-cell-group style="margin-top:10px;">
+    <van-field v-model="form.title" required label="公司名称" placeholder="请输入公司名称"></van-field>
+    <van-field
+            v-model="form.details"
+            rows="1"
+            autosize
+            label="公司介绍"
+            type="textarea"
+            placeholder="请输入公司介绍"
+    ></van-field>
+</van-cell-group>
+<van-cell-group style="margin-top:10px;">
+    <van-field label="营业执照" required readonly></van-field>
+    <div class="uploader-box">
+        <van-uploader :max-count="1" :after-read="uploadPic">
+            <van-image style="width:80%;display:block;margin:20px auto 0 auto;" :src="pic_image"></van-image>
+        </van-uploader>
+    </div>
+</van-cell-group>
+<div style="margin: 16px;">
+    <div style="margin: 16px;" class="tip">
+        <div v-if="form.status==2" class="text-red">
+            <p>审核已拒绝。</p>
+            <p>审核备注:{{form.remark}}</p>
+        </div>
+    </div>
+    <van-button block type="info" @click="onSubmit">提交审核</van-button>
+</div>
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    form: {$worker},
+                };
+            },
+            methods: {
+                onBack() {
+                    console.log(1);
+                    location.href = "{:url('/login/setType')}?type=1";
+                },
+                uploadPic(file) {
+                    let self = this;
+                    $.post("{:url('/com/imageUpload')}", {file: file.content, name: file.file.name}, function (json) {
+                        if (json.code == 0) {
+                            self.form.picone = json.data.avatar
+                            self.$forceUpdate();
+                        } else {
+                            self.$toast(json.msg);
+                        }
+                    }, 'json')
+                },
+                onSubmit() {
+                    const fields = [
+                        {key: 'realname', tip: '请输入姓名'},
+                        {key: 'mobile', tip: '请输入电话'},
+                        {key: 'address', tip: '请输入地址'},
+                        {key: 'title', tip: '请输入公司名称'},
+                        {key: 'picone', tip: '请上传营业执照'},
+                    ];
+                    for (let i = 0; i < fields.length; i++) {
+                        if (this.form[fields[i].key].trim() === '') {
+                            this.$toast(fields[i].tip);
+                            return false;
+                        }
+                    }
+
+                    let self = this;
+                    $.post("{:url('/login/empRegisterPost')}", this.form, function (json) {
+                        if (json.code == 0) {
+                            self.$dialog.alert({
+                                title: '标题',
+                                message: '提交成功,等待管理员审核',
+                            }).then(() => {
+                                location.href = "{:url('/login/setType')}?type=1";
+                            });
+                        } else {
+                            self.$toast(json.msg);
+                        }
+                    }, 'json')
+                },
+            },
+            computed: {
+                pic_image() {
+                    return this.form.picone ? this.form.picone : '__MIMG__/my/my_avatar.png';
+                },
+            }
+        });
+    </script>
+{/block}

+ 35 - 0
app/mobile/view/login/page.html

@@ -0,0 +1,35 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .content p {padding:0;margin:0;text-indent:2em;}
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            left-text="返回"
+            left-arrow
+            @click-left="onBack"
+    >
+        <template #title>{$pagetil}</template>
+    </van-nav-bar>
+<div class="content" style="width:100%;">
+    {$pagecon}
+</div>
+
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    onBack() {
+                        history.back();
+                    },
+                };
+            },
+            methods: {
+            },
+        });
+    </script>
+{/block}

+ 81 - 0
app/mobile/view/login/type.html

@@ -0,0 +1,81 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .homepage{ height: 100vh; background-repeat: no-repeat; background-size: 100%; background-position: bottom center;  }
+        .homepage img{ width: 100%; }
+        .homepage img.homebg{ width: 100%; position: fixed; bottom: 0; }
+        .padding {padding-top:10px;}
+        .text-center {text-align:center;}
+        .agreement {width:90vw;box-sizing:border-box;padding:10px;}
+        .agreement .agreement-title {padding-top:5px;text-align:center;font-size:16px;font-weight:bold;}
+        .agreement .agreement-content {padding:10px 0;}
+        .agreement .agreement-content p {font-size:14px;text-indent:2em;}
+        .agreement .agreement-content p a {color:#e54d42;}
+        .agreement-footer {border-top:1px solid #eee;text-align:center;padding-top:10px;}
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            class="bg-pink"
+            fixed="true"
+    >
+        <template #title>
+            <span class="text-white">选择身份</span>
+        </template>
+    </van-nav-bar>
+
+    <div class="bg-white homepage">
+        <div>
+            <div class="" @click="setType(2)">
+                <div style="padding-top:50px;"></div>
+                <img style="width: 100%;" src="__STATIC__/images/head1.png" />
+                <div class="padding text-center text-blue">我要招聘</div>
+            </div>
+            <div class="" @click="setType(1)">
+                <img mode="widthFix" style="width: 100%; position: fixed; left: 0; bottom: 80px;" src="__STATIC__/images/head2.png" />
+                <div class="padding text-center text-blue" style="width: 100%; position: fixed; left: 0; bottom: 40px;">我要求职</div>
+            </div>
+        </div>
+    </div>
+    <van-popup v-model="show">
+        <div class="agreement">
+            <div class="agreement-title">服务协议和隐私政策</div>
+            <div class="agreement-content">
+                <p>请你务必审慎阅读、充分理解“用户服务协议”和“隐私政策”各条款,包括但不限于:为了向你提供即时招聘讯息、内容分享等服务,我们需要收集你的设备信息、操作日志等个人信息。</p>
+                <p>你可阅读
+                    <a href="{:url('/login/sinpage')}?field=service">《用户服务协议》</a>
+                    和<a href="{:url('/login/sinpage')}?field=privacy">《隐私政策》</a>
+                    了解详细信息,如你同意,请点击“我同意”开始接受我们等服务。</p>
+            </div>
+            <div class="agreement-footer" @click="onAgree">
+                我同意
+            </div>
+        </div>
+    </van-popup>
+{/block}
+{block name="script"}
+    <script>
+        var _this;
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    type: 0,
+                    show: false,
+                };
+            },
+            created: function() {
+                _this = this;
+            },
+            methods: {
+                setType(type){
+                    _this.type = type;
+                    _this.show = true;
+                },
+                onAgree() {
+                    location.href = "{:url('/login/settype')}?type=" + _this.type;
+                }
+            },
+        });
+    </script>
+{/block}

+ 43 - 0
app/mobile/view/my/about.html

@@ -0,0 +1,43 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            class="bg-pink"
+            fixed="true"
+            left-text="返回"
+            left-arrow
+            @click-left="onBack"
+    >
+        <template #title>
+            <span class="text-white">关于我们</span>
+        </template>
+    </van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-cell-group>
+    <van-cell title="关于我们" is-link url="{:url('/login/sinpage')}?field=aboutus" size="large"></van-cell>
+    <van-cell title="服务协议" is-link url="{:url('/login/sinpage')}?field=service" size="large"></van-cell>
+    <van-cell title="隐私政策" is-link url="{:url('/login/sinpage')}?field=privacy" size="large"></van-cell>
+    <van-cell title="联系我们" is-link url="{:url('/login/sinpage')}?field=contact" size="large"></van-cell>
+</van-cell-group>
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+
+                };
+            },
+            methods: {
+                onBack() {
+                    history.back();
+                },
+            },
+        });
+    </script>
+{/block}

+ 100 - 0
app/mobile/view/my/apply.html

@@ -0,0 +1,100 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">我的报名</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <like-list :list="list" @cancel="onCancel"></like-list>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script src="__MJS__/component/applyList.js"></script>
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                list: [],
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onCancel(id) {
+                let _this = this;
+                $.post("{:url('/my/cancelApply')}",{id:id},function (json) {
+                    if (json.code == 0) {
+                        _this.onRefresh();
+                    } else {
+                        _this.$toast(json.msg)
+                    }
+                },'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page: this.page};
+                this.page++;
+
+                $.post("{:url('/my/listApply')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 227 - 0
app/mobile/view/my/auth.html

@@ -0,0 +1,227 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+
+    .upload-box{
+        display:flex;
+        box-sizing:border-box;
+        padding:10px 20px;
+        justify-content:space-between;
+        align-items:center;
+    }
+
+    .van-image__error{
+        border:1px solid #aaa;
+    }
+    .tip {font-size:14px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">实名认证</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div v-if="user.authstatus == 1">
+    <div class="upload-box">
+        <van-uploader :max-count="1" :after-read="onUploadZ">
+            <van-image style="width:160px;height:90px;display:block;" :src="this.user.idcardzpic">
+                <template #error>上传身份证(头像页)</template>
+            </van-image>
+        </van-uploader>
+        <van-uploader :max-count="1" :after-read="onUploadF">
+            <van-image style="width:160px;height:90px;display:block;" :src="this.user.idcardfpic">
+                <template #error>上传身份证(国徽页)</template>
+            </van-image>
+        </van-uploader>
+    </div>
+    <van-cell-group style="margin-top:10px;">
+        <van-field v-model="user.realname" required label="姓名" placeholder="请输入姓名"></van-field>
+        <van-field v-model="user.idcard" required label="身份证" placeholder="请输入身份证"></van-field>
+        <van-field :value="gender_text" required label="性别" @click="gender_show = true" placeholder="请选择性别"></van-field>
+        <van-popup v-model="gender_show" position="bottom">
+            <van-picker
+                    title="求职意向"
+                    show-toolbar
+                    :columns="gender"
+                    @confirm="onGenderConfirm"
+                    @cancel="gender_show = false"
+                    :default-index="gender_index"
+            ></van-picker>
+        </van-popup>
+        <van-field :value="user.birthday" required label="出生日期" placeholder="请选择出生日期" @click="birthday_show = true"></van-field>
+        <van-popup v-model="birthday_show" position="bottom">
+            <van-datetime-picker
+                    :value="currentDate"
+                    type="date"
+                    title="出生日期"
+                    :min-date="minDate"
+                    @confirm="onBirthday"
+                    @cancel="birthday_show = false"
+            ></van-datetime-picker>
+        </van-popup>
+        <div style="margin: 16px;">
+            <van-button block type="info" @click="submit">提交</van-button>
+        </div>
+    </van-cell-group>
+</div>
+
+<div v-if="user.authstatus != 1">
+    <div class="upload-box">
+        <van-image style="width:160px;height:90px;display:block;" :src="this.user.idcardzpic">
+            <template #error>上传身份证(头像页)</template>
+        </van-image>
+        <van-image style="width:160px;height:90px;display:block;" :src="this.user.idcardfpic">
+            <template #error>上传身份证(国徽页)</template>
+        </van-image>
+    </div>
+
+    <van-cell-group style="margin-top:10px;">
+        <van-field :value="user.realname" disabled label="姓名" placeholder="请输入姓名"></van-field>
+        <van-field :value="user.idcard" disabled label="身份证" placeholder="请输入身份证"></van-field>
+        <van-field :value="gender_text" disabled label="性别" placeholder="请选择性别"></van-field>
+        <van-field :value="user.birthday" disabled label="出生日期" placeholder="请选择出生日期"></van-field>
+        <div style="margin: 16px;" class="tip">
+            <div v-if="user.authstatus==2" class="text-red">
+                <p>实名认证信息已提交审核,请耐心等待。</p>
+                <p>审核备注:{{user.authremark}}</p>
+            </div>
+            <div v-if="user.authstatus==3" class="text-green">实名认证信息已通过审核。</div>
+        </div>
+    </van-cell-group>
+</div>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                user: {$user},
+                gender_show: false,
+                gender: [{id: 1, text: '男'}, {id: 2, text: '女'}],
+                birthday_show: false,
+                minDate: new Date(1900, 0, 1),
+            };
+        },
+        created(){
+            console.log( new Date(this.user.birthday));
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onUploadZ(file) {
+                let self = this;
+                $.post("{:url('/com/imageUpload')}", {file: file.content, name: file.file.name}, function (json) {
+                    if (json.code == 0) {
+                        self.user.idcardzpic = json.data.avatar
+                        self.$forceUpdate();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+            onUploadF(file) {
+                let self = this;
+                $.post("{:url('/com/imageUpload')}", {file: file.content, name: file.file.name}, function (json) {
+                    if (json.code == 0) {
+                        self.user.idcardfpic = json.data.avatar
+                        self.$forceUpdate();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+            onGenderConfirm(value) {
+                this.user.gender = value.id;
+                this.gender_show = false;
+            },
+            onBirthday(value) {
+                this.user.birthday = `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`;
+                this.birthday_show = false;
+            },
+            isEmpty(value) {
+                if (typeof (value) === 'number') {
+                    return false;
+                } else if (typeof (value) === 'object') {
+                    if (Array.isArray(value) && !value.length) {
+                        return true;
+                    }
+
+                    if (typeof value === 'object') {
+                        for (item in value) {
+                            if (value.hasOwnProperty(item)) {
+                                return false;
+                            }
+                        }
+                        return true;
+                    }
+                } else if (typeof (value) === 'string' && value.trim().length === 0) {
+                    return true;
+                }
+
+                return false;
+            },
+            submit() {
+                const fields = [
+                    {key: 'idcardzpic', tip: '请上传身份证(头像页)'},
+                    {key: 'idcardfpic', tip: '请上传身份证(国徽页)'},
+                    {key: 'realname', tip: '请输入姓名'},
+                    {key: 'idcard', tip: '请输入身份证'},
+                    {key: 'gender', tip: '请选择性别'},
+                    {key: 'birthday', tip: '请选择出生日期'},
+                ];
+                for (let i = 0; i < fields.length; i++) {
+                    if (this.isEmpty(this.user[fields[i].key])) {
+                        this.$toast(fields[i].tip);
+                        return false;
+                    }
+                }
+
+                const self = this;
+                $.post("{:url('/my/authPost')}", this.user, function (json) {
+                    if (json.code == 0) {
+                        history.back();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+        },
+        computed: {
+            gender_text() {
+                if (this.user.gender) {
+                    return this.user.gender == 1 ? '男' : '女';
+                }
+
+                return '';
+            },
+            gender_index() {
+                let index = 0;
+                const _this = this;
+                this.gender.some(function (v, i) {
+                    if (_this.user.gender == v.id) {
+                        index = i;
+                        return true;
+                    }
+                });
+                return index;
+            },
+            currentDate() {
+                return new Date(this.user.birthday);
+            }
+        },
+    });
+</script>
+{/block}

+ 83 - 0
app/mobile/view/my/feedback.html

@@ -0,0 +1,83 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">意见反馈</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-form @submit="onSubmit">
+    <van-cell-group>
+        <van-field v-model="form.name" required label="姓名" placeholder="请输入姓名"></van-field>
+        <van-field v-model="form.mobile" required label="联系方式" placeholder="请输入联系方式"></van-field>
+        <van-field
+                v-model="form.content"
+                rows="2"
+                required
+                autosize
+                label="意见和建议"
+                type="textarea"
+                placeholder="请输入您的意见和建议"
+        ></van-field>
+    </van-cell-group>
+    <div style="margin: 16px;">
+        <van-button block type="info" native-type="submit">提交</van-button>
+    </div>
+</van-form>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                form: {
+                    name: '',
+                    mobile: '',
+                    content: '',
+                }
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onSubmit() {
+                const fields = [
+                    {key: 'name', tip: '请输入姓名'},
+                    {key: 'mobile', tip: '请输入联系方式'},
+                    {key: 'content', tip: '请输入意见和建议'},
+                ];
+                for (let i = 0; i < fields.length; i++) {
+                    if (this.form[fields[i].key].trim() == '') {
+                        this.$toast(fields[i].tip);
+                        return false;
+                    }
+                }
+
+                let self = this;
+                $.post("{:url('/my/feedbackPost')}", this.form, function (json) {
+                    if (json.code == 0) {
+                        history.back();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+        },
+    });
+</script>
+{/block}

+ 96 - 0
app/mobile/view/my/index.html

@@ -0,0 +1,96 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .my-header {background:white;}
+    .my-header .my-box {padding:20px 15px;}
+    .my-header .my-box .my-inner {box-shadow: 3px 3px 4px rgba(26, 26, 26, 0.2);--ShadowSize: 0 1rpx 6rpx;background-color: #ffffff;color: #666666;padding: 25px 15px;display: flex;justify-content: flex-start; align-items: center;border-radius: 3px;}
+    .my-header .my-box .my-inner img {width: 48px;height: 48px;margin-left: 15px;border-radius:50%;}
+    .my-header .my-box .my-inner .my-right {font-size: 16px;padding:5px 15px 0 15px;}
+    .my-header .my-box .my-inner .my-right .my-mobile {font-size:13px;color:#aaa;}
+    .van-grid-item__icon .van-icon__image {width:45px;height:45px;}
+    .van-grid-item__text {font-size:14px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+>
+    <template #title>
+        <span class="text-white">我的</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+
+<div class="my-header">
+    <div class="my-box">
+        <div class="my-inner">
+            <img src="https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83er2NA5CYfklr5iaNZ3rIkjcQNTIwGibwTkLibmqErCndmZOhQIf8JAj4j3nDGu0lYPy6APtgfzh3J57Q/132" alt="">
+            <div class="my-right">
+                <div class="my-name">林武</div>
+                <div class="my-mobile">13313826760</div>
+            </div>
+        </div>
+    </div>
+    <van-grid :border="false">
+        <van-grid-item icon="__MIMG__/my/myicon01.png" text="基本信息" url="{:url('/my/info')}"></van-grid-item>
+        <van-grid-item icon="__MIMG__/my/myicon02.png" text="实名认证" url="{:url('/my/auth')}"></van-grid-item>
+        <van-grid-item icon="__MIMG__/my/myicon03.png" text="我的报名" url="{:url('/my/apply')}"></van-grid-item>
+        <van-grid-item icon="__MIMG__/my/myicon04.png" text="我要招聘" url="{:url('/login/setType')}?type=2"></van-grid-item>
+    </van-grid>
+</div>
+
+<van-cell-group style="margin-top:20px;">
+    <van-cell title="收到的邀请" is-link url="{:url('/my/invite')}" size="large">
+        <template #icon>
+            <img src="__MIMG__/my/icon_cond.svg" class="van-cell__left-icon" style="height:24px;"/>
+        </template>
+    </van-cell>
+    <van-cell title="我的收藏" is-link url="{:url('/my/like')}" size="large">
+        <template #icon>
+            <img src="__MIMG__/my/icon_like.png" class="van-cell__left-icon" style="height:24px;"/>
+        </template>
+    </van-cell>
+    <van-cell title="培训意愿" is-link url="{:url('/my/train')}" size="large">
+        <template #icon>
+            <img src="__MIMG__/my/icon_intro.svg" class="van-cell__left-icon" style="height:24px;"/>
+        </template>
+    </van-cell>
+    <van-cell title="意见反馈" is-link url="{:url('/my/feedback')}" size="large">
+        <template #icon>
+            <img src="__MIMG__/my/icon_feedback.png" class="van-cell__left-icon" style="height:24px;"/>
+        </template>
+    </van-cell>
+    <van-cell title="关于我们" is-link url="{:url('/my/about')}" size="large">
+        <template #icon>
+            <img src="__MIMG__/my/icon_about.png" class="van-cell__left-icon" style="height:24px;"/>
+        </template>
+    </van-cell>
+</van-cell-group>
+
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active" active-color="#FF589B" @change="onTabChange">
+    <van-tabbar-item icon="wap-home-o">首页</van-tabbar-item>
+    <van-tabbar-item icon="description">招聘</van-tabbar-item>
+    <van-tabbar-item icon="user-circle-o">我的</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                active: 2,
+                worker: {$worker},
+            };
+        },
+        methods: {
+            onTabChange(index) {
+                const url = ["{:url('/')}","{:url('/jobs/index')}","{:url('/my/index')}"];
+                location.href = url[index];
+            },
+        },
+    });
+</script>
+{/block}

+ 376 - 0
app/mobile/view/my/info.html

@@ -0,0 +1,376 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+
+    .van-badge__wrapper{
+        text-align:center;
+    }
+
+    .uploader-box{
+        width:120px;
+        height:120px;
+        margin:0 auto;
+    }
+
+    .uploader-box .van-image__img{
+        border-radius:50%;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">基本信息</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="uploader-box">
+    <van-uploader :max-count="1" :after-read="uploadHead">
+        <van-image style="width:80%;display:block;margin:20px auto 0 auto;" :src="head_image"></van-image>
+    </van-uploader>
+</div>
+<van-form @submit="onSubmit">
+    <van-cell-group>
+        <div>
+            <van-field v-model="info.nickname" required label="昵称" placeholder="请输入昵称"></van-field>
+            <van-field :value="info.mobile" disabled label="电话" placeholder="暂无"></van-field>
+        </div>
+        <div style="margin-top:10px;">
+            <van-field :value="info.idcard" label="身份证号" disabled placeholder="暂无"></van-field>
+            <van-field :value="info.realname" disabled label="姓名" placeholder="暂无"></van-field>
+            <van-field :value="gender_text" disabled label="性别" placeholder="暂无"></van-field>
+            <van-field :value="info.birthday" disabled label="出生日期" placeholder="暂无"></van-field>
+        </div>
+    </van-cell-group>
+    <van-cell-group>
+
+    </van-cell-group>
+    <van-cell-group style="margin-top:10px;">
+        <van-field :value="jobintention_text" required label="求职意向" placeholder="请选择求职意向"
+                   @click="jobintention_show = true"></van-field>
+        <van-popup v-model="jobintention_show" position="bottom">
+            <van-picker
+                    title="求职意向"
+                    show-toolbar
+                    :columns="userwill"
+                    @confirm="onUserwillConfirm"
+                    @cancel="jobintention_show = false"
+                    :default-index="jobintention_index"
+            ></van-picker>
+        </van-popup>
+        <van-field v-model="info.address" required label="现居地" placeholder="请输入现居地"></van-field>
+        <van-field :value="com_cate_text" label="岗位类型" placeholder="请选择岗位类型" @click="com_cate_show = true"></van-field>
+        <van-popup v-model="com_cate_show" position="bottom">
+            <div class="van-picker__toolbar">
+                <button type="button" class="van-picker__cancel"></button>
+                <div class="van-ellipsis van-picker__title">岗位类型</div>
+                <button type="button" class="van-picker__confirm" @click="com_cate_show = false">确认</button>
+            </div>
+            <div style="max-height:264px; overflow-y:auto;">
+                <van-checkbox-group ref="checkboxGroup" v-model="info.com_cate">
+                    <van-cell-group>
+                        <van-cell
+                                v-for="(item, index) in catelist"
+                                :key="item.title"
+                                :title="item.title"
+                                clickable
+                        >
+                            <template #right-icon>
+                                <van-checkbox ref="checkboxes" :name="item.title"/>
+                            </template>
+                        </van-cell>
+                    </van-cell-group>
+                </van-checkbox-group>
+            </div>
+        </van-popup>
+        <van-field :value="emp_time_text" label="用工时间" placeholder="请选择用工时间" @click="emp_time_show = true"></van-field>
+        <van-popup v-model="emp_time_show" position="bottom">
+            <div class="van-picker__toolbar">
+                <button type="button" class="van-picker__cancel"></button>
+                <div class="van-ellipsis van-picker__title">用工时间</div>
+                <button type="button" class="van-picker__confirm" @click="emp_time_show = false">确认</button>
+            </div>
+            <div style="max-height:264px; overflow-y:auto;">
+                <van-checkbox-group ref="checkboxGroup" v-model="info.emp_time">
+                    <van-cell-group>
+                        <van-cell
+                                v-for="(item, index) in emp_time"
+                                :key="item.name"
+                                :title="item.name"
+                                clickable
+                        >
+                            <template #right-icon>
+                                <van-checkbox ref="checkboxes" :name="item.name"/>
+                            </template>
+                        </van-cell>
+                    </van-cell-group>
+                </van-checkbox-group>
+            </div>
+        </van-popup>
+        <van-field :value="community_text" label="上班地点" placeholder="请选择上班地点"
+                   @click="community_show = true"></van-field>
+        <van-popup v-model="community_show" position="bottom">
+            <div class="van-picker__toolbar">
+                <button type="button" class="van-picker__cancel"></button>
+                <div class="van-ellipsis van-picker__title">上班地点</div>
+                <button type="button" class="van-picker__confirm" @click="community_show = false">确认</button>
+            </div>
+            <div style="max-height:264px; overflow-y:auto;">
+                <van-checkbox-group ref="checkboxGroup" v-model="info.work_place">
+                    <van-cell-group>
+                        <van-cell
+                                v-for="(item, index) in community"
+                                :key="item.name"
+                                :title="item.name"
+                                clickable
+                        >
+                            <template #right-icon>
+                                <van-checkbox ref="checkboxes" :name="item.name"/>
+                            </template>
+                        </van-cell>
+                    </van-cell-group>
+                </van-checkbox-group>
+            </div>
+        </van-popup>
+    </van-cell-group>
+    <van-cell-group style="margin-top:10px;">
+        <van-field :value="workexperience_text" required label="工作经验" placeholder="请选择工作经验"
+                   @click="workexperience_show = true"></van-field>
+        <van-popup v-model="workexperience_show" position="bottom">
+            <van-picker
+                    title="工作经验"
+                    show-toolbar
+                    :columns="workexperience"
+                    @confirm="onWorkexperienceConfirm"
+                    @cancel="workexperience_show = false"
+                    :default-index="workexperience_index"
+            ></van-picker>
+        </van-popup>
+        <van-field :value="education_text" required label="学历" placeholder="请选择学历"
+                   @click="education_show = true"></van-field>
+        <van-popup v-model="education_show" position="bottom">
+            <van-picker
+                    title="学历"
+                    show-toolbar
+                    :columns="education"
+                    @confirm="onEducationConfirm"
+                    @cancel="education_show = false"
+                    :default-index="education_index"
+            ></van-picker>
+        </van-popup>
+        <van-field
+                v-model="info.eduexperience"
+                rows="1"
+                autosize
+                label="个人描述"
+                type="textarea"
+                placeholder="请输入个人描述"
+        ></van-field>
+    </van-cell-group>
+    <div style="margin: 16px;">
+        <van-button block type="info" native-type="submit">已确认完善信息,返回!</van-button>
+    </div>
+</van-form>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                info: {$info},
+                com_cate_show: false,
+                catelist: {$catelist},
+                jobintention_show: false,
+                userwill: {$userwill},
+                emp_time_show: false,
+                emp_time: {$emptime},
+                community_show: false,
+                community: {$community},
+                workexperience_show: false,
+                workexperience: {$workexperience},
+                education_show: false,
+                education: {$education},
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            uploadHead(file) {
+                let self = this;
+                $.post("{:url('/com/imageUpload')}", {file: file.content, name: file.file.name}, function (json) {
+                    if (json.code == 0) {
+                        self.info.avatar = json.data.avatar
+                        self.$forceUpdate();
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+            onUserwillConfirm(value, index) {
+                this.info.jobintention = value.id;
+                this.jobintention_show = false;
+            },
+            onWorkexperienceConfirm(value) {
+                this.info.workexperience = value.id;
+                this.workexperience_show = false;
+            },
+            onEducationConfirm(value) {
+                this.info.education = value.id;
+                this.education_show = false;
+            },
+            isEmpty(value) {
+                if (typeof (value) === 'number') {
+                    return false;
+                } else if (typeof (value) === 'object') {
+                    if (Array.isArray(value) && !value.length) {
+                        return true;
+                    }
+
+                    if (typeof value === 'object') {
+                        for (item in value) {
+                            if (value.hasOwnProperty(item)) {
+                                return false;
+                            }
+                        }
+                        return true;
+                    }
+                } else if (typeof (value) === 'string' && value.trim().length === 0) {
+                    return true;
+                }
+
+                return false;
+            },
+            getObjByKey(obj,key_arr) {
+                let new_obj = {};
+                key_arr.forEach(function(v){
+                    new_obj[v] = obj[v];
+                });
+                return new_obj;
+            },
+            onSubmit() {
+                const fields = [
+                    {key: 'nickname', tip: '请输入昵称'},
+                    {key: 'jobintention', tip: '请选择求职意向'},
+                    {key: 'address', tip: '请输入现居地'},
+                    {key: 'workexperience', tip: '请选择工作经验'},
+                    {key: 'education', tip: '请选择学历'},
+                ];
+                for (let i = 0; i < fields.length; i++) {
+                    if (this.isEmpty(this.info[fields[i].key])) {
+                        this.$toast(fields[i].tip);
+                        return false;
+                    }
+                }
+                const form = this.getObjByKey(this.info,['nickname','jobintention','address','com_cate','emp_time','work_place','workexperience','education','eduexperience']);
+
+                let self = this;
+                $.post("{$url}", form, function (json) {
+                    if (json.code == 0) {
+                        if ({$type} == 1) {
+                            location.href = "{:url('/')}";
+                        } else {
+                            history.back();
+                        }
+                    } else {
+                        self.$toast(json.msg);
+                    }
+                }, 'json')
+            },
+        },
+        computed: {
+            head_image() {
+                return this.info.avatar ? this.info.avatar : '__MIMG__/my/my_avatar.png';
+            },
+            gender_text() {
+                return this.info.gender == 1 ? '男' : '女';
+            },
+            com_cate_text() {
+                return this.info.com_cate.join(',');
+            },
+            jobintention_text() {
+                let res = '';
+                const _this = this;
+                this.userwill.some(function (v) {
+                    if (_this.info.jobintention == v.id) {
+                        res = v.text;
+                        return true;
+                    }
+                });
+                return res;
+            },
+            jobintention_index() {
+                let index = 0;
+                const _this = this;
+                this.userwill.some(function (v, i) {
+                    if (_this.info.jobintention == v.id) {
+                        index = i;
+                        return true;
+                    }
+                });
+                return index;
+            },
+            emp_time_text() {
+                return this.info.emp_time.join(',');
+            },
+            community_text() {
+                return this.info.work_place.join(',');
+            },
+            workexperience_text() {
+                let str = '';
+                const _this = this;
+                this.workexperience.some(function (v, i) {
+                    if (_this.info.workexperience == v.id) {
+                        str = v.text;
+                        return true;
+                    }
+                });
+                return str;
+            },
+            workexperience_index() {
+                let index = 0;
+                const _this = this;
+                this.workexperience.some(function (v, i) {
+                    if (_this.info.workexperience == v.id) {
+                        index = i;
+                        return true;
+                    }
+                });
+                return index;
+            },
+            education_text() {
+                let str = '';
+                const _this = this;
+                this.education.some(function (v, i) {
+                    if (_this.info.education == v.id) {
+                        str = v.text;
+                        return true;
+                    }
+                });
+                return str;
+            },
+            education_index() {
+                let index = 0;
+                const _this = this;
+                this.education.some(function (v, i) {
+                    if (_this.info.education == v.id) {
+                        index = i;
+                        return true;
+                    }
+                });
+                return index;
+            },
+        },
+    });
+</script>
+{/block}

+ 122 - 0
app/mobile/view/my/invite.html

@@ -0,0 +1,122 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">收到的邀请</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list">
+                <div class="job-flex">
+                    <div class="job-flex-left job-title">{{item.worker.title}}</div>
+                    <div class="job-flex-right salary">{{item.status_text}}</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="btn-box">
+                        <van-button type="info" plain round size="small" v-if="item.status == 1" @click="onSetStatus(item.id,2)">同意邀请</van-button>
+                        <van-button type="danger" plain round size="small" v-if="item.status == 1" @click="onSetStatus(item.id,3)">拒绝邀请</van-button>
+                        <van-button type="default" round size="small" @click="toCompany(item.workerid)">查看公司</van-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                list: [],
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onSetStatus(id,status) {
+                let _this = this;
+                let text = status == 2 ? '接受' : '拒绝';
+                this.$dialog.confirm({
+                    title: '提示',
+                    message: '确定要' + text + '邀请?',
+                }).then(() => {
+                    $.post("{:url('/my/setInviteStatus')}",{id:id,status:status},function (json) {
+                        if (json.code == 0) {
+                            _this.onRefresh();
+                        } else {
+                            _this.$toast(json.msg)
+                        }
+                    },'json');
+                })
+            },
+            toCompany(id) {
+                location.href = "{:url('/shop/index')}?id=" + id;
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page: this.page};
+                this.page++;
+
+                $.post("{:url('/my/listInvite')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 100 - 0
app/mobile/view/my/like.html

@@ -0,0 +1,100 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">我的收藏</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <like-list :list="list" @cancel="onCancel"></like-list>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script src="__MJS__/component/likeList.js"></script>
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                list: [],
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onCancel(id) {
+                let _this = this;
+                $.post("{:url('/my/likeCancel')}",{id:id},function (json) {
+                    if (json.code == 0) {
+                        _this.onRefresh();
+                    } else {
+                        _this.$toast(json.msg)
+                    }
+                },'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page: this.page};
+                this.page++;
+
+                $.post("{:url('/my/listLike')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 107 - 0
app/mobile/view/my/train.html

@@ -0,0 +1,107 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">培训报名列表</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<img src="{$post}" style="width:100%;">
+<div style="margin: 16px;">
+    <van-button block type="primary" @click="toAdd">添加培训意愿</van-button>
+</div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <train-list :list="list" @cancel="onCancel"></train-list>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script src="__MJS__/component/trainList.js"></script>
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                list: [],
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                location.href = "{:url('/my/index')}";
+            },
+            toAdd() {
+                location.href = "{:url('/my/trainAdd')}";
+            },
+            onCancel(id) {
+                let _this = this;
+                $.post("{:url('/my/trainCancel')}",{id:id},function (json) {
+                    if (json.code == 0) {
+                        _this.onRefresh();
+                    } else {
+                        _this.$toast(json.msg)
+                    }
+                },'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page: this.page};
+                this.page++;
+
+                $.post("{:url('/my/listTrain')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 100 - 0
app/mobile/view/my/train_add.html

@@ -0,0 +1,100 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">培训列表</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <train-add :list="list" @add="onAdd"></train-add>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+<script src="__MJS__/component/trainAdd.js"></script>
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                list: [],
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onAdd(id) {
+                let _this = this;
+                $.post("{:url('/my/trainAddPost')}",{id:id},function (json) {
+                    if (json.code == 0) {
+                        location.href = "{:url('/my/train')}";
+                    } else {
+                        _this.$toast(json.msg)
+                    }
+                },'json');
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = {page: this.page};
+                this.page++;
+
+                $.post("{:url('/my/trainAddList')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 15 - 0
app/mobile/view/public/base.html

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="zh-cn">
+<head>
+    {include file="public/meta_header"/}
+    {block name="meta"}{/block}
+    {block name="css"}{/block}
+</head>
+<body class="{$page_class|default=''}">
+<div id="app">
+    {block name="body"}{/block}
+</div>
+{block name="script"}{/block}
+
+</body>
+</html>

+ 51 - 0
app/mobile/view/public/jump.html

@@ -0,0 +1,51 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .icon {text-align:center;margin-top: 50px;}
+        .msg {text-align:center;margin:0;padding:0;font-size:24px;}
+        .tips {text-align:center;margin-top:50px;font-size:14px;color:#aaa;}
+        .tips .num {color:#FF589B;}
+    </style>
+{/block}
+{block name="body"}
+    <van-nav-bar
+            class="bg-pink"
+            fixed="true"
+    >
+        <template #title>
+            <span class="text-white">提示</span>
+        </template>
+    </van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="icon">
+    <van-icon name="warning-o" size="160" color="#FF589B"></van-icon>
+</div>
+<h3 class="msg">{$msg}</h3>
+<p class="tips">还有<span class="num">{{wait}}</span>秒后自动跳转</p>
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    wait: {$wait},
+                };
+            },
+            created() {
+                const _this = this;
+                setInterval(function(){
+                    _this.wait--;
+                    if (_this.wait === 0) {
+                        _this.redirect();
+                    }
+                },1000);
+            },
+            methods: {
+                redirect() {
+                    {$url}
+                },
+            },
+        });
+    </script>
+{/block}

+ 13 - 0
app/mobile/view/public/meta_header.html

@@ -0,0 +1,13 @@
+<meta charset="utf-8">
+<title>妇联就业平台</title>
+<link rel="shortcut icon" href="__MIMG__/favicon.ico" />
+<meta name="renderer" content="webkit">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
+<meta name="apple-mobile-web-app-capable" content="yes" />
+<meta name="apple-mobile-web-app-status-bar-style" content="black" />
+<link rel="stylesheet" href="__MCSS__/vant.css">
+<link rel="stylesheet" href="__MCSS__/icon.css">
+<link rel="stylesheet" href="__MCSS__/style.css">
+<script src="__MJS__/vue.min.js"></script>
+<script src="__MJS__/vant.min.js"></script>
+<script src="__MJS__/jquery-1.10.2.min.js"></script>

+ 141 - 0
app/mobile/view/resume/detail.html

@@ -0,0 +1,141 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{
+        color:white;
+    }
+    .lw-list {display:flex;margin-top:10px;padding-bottom:10px;border-bottom:2px solid #f8f9fb;}
+    .lw-list .avatar{width:45px;height:45px;}
+    .lw-list .content {margin-left:10px;font-size:14px;}
+    .lw-list .content .name{color:#e54d42;}
+    .lw-list .content .tags {margin-top:5px;}
+    .box-border {border-bottom:1px solid #eee;padding-bottom:5px;}
+    .plr-10 {padding-left:10px;padding-right:10px;}
+    .content-box .item {padding-bottom:5px;}
+    .content-box .item .van-tag {margin-top:5px;margin-right:5px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+    <template #title>
+        <span class="text-white">简历</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="job-item" style="width:100%;margin:0;padding-bottom:0;">
+    <div class="lw-list plr-10">
+        <img :src="info.avatar ? info.avatar : '__MIMG__/default_avatar.jpg'" class="avatar">
+        <div class="content">
+            <div class="name">{{info.realname ? info.realname : info.nickname}}</div>
+            <div class="tags">
+                <span>{{info.jobintention_text}}</span>
+            </div>
+        </div>
+    </div>
+    <div class="job-flex plr-10" style="height:40px;">
+        <div class="job-flex-left">
+            <span>{{info.age?item.age+'岁':'年龄未知'}} ·</span>
+            <span>{{info.education_text || '学历未知'}} ·</span>
+            <span>{{info.worker_text || '经验未知'}}</span>
+        </div>
+        <div class="job-flex-right salary">浏览量:{{info.volume}}</div>
+    </div>
+</div>
+<div class="content-box margin-top-10">
+    <div class="title"><span class="mark"></span>意向工种</div>
+    <div class="item">
+        <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in info.com_cate">{{tag}}</van-tag>
+    </div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>用工时间</div>
+    <div class="item">
+        <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in info.emp_time">{{tag}}</van-tag>
+    </div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>个人描述</div>
+    <div class="item" v-html="info.eduexperience"></div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>服务流程</div>
+    <div class="item">
+        <img style="width:100%;" src="__STATIC__/images/applet/detaillc.png" alt="">
+    </div>
+</div>
+<div style="width:100%;height:50px;"></div>
+<div class="fix-footer">
+    <van-row>
+        <van-col span="4">
+            <div class="icon-box" @click="onShowToggle">
+                <van-icon name="share-o" size="25"></van-icon>
+                <span>分享</span>
+            </div>
+        </van-col>
+        <van-col span="20">
+            <div class="button" @click="onInvite" v-if="!invite">
+                发出邀请
+            </div>
+            <div class="button" @click="onMobile" v-if="invite">
+                联系对方
+            </div>
+        </van-col>
+    </van-row>
+</div>
+<div class="share-box" v-show="show_share" @click="onShowToggle">
+    <img src="__MIMG__/share_tip.png">
+</div>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                info: {$info},
+                invite: {$invite},
+                is_click: false,
+                show_share: false,
+            };
+        },
+        methods: {
+            onBack() {
+                history.back();
+            },
+            onShowToggle() {
+                this.show_share = !this.show_share;
+            },
+            onMobile() {
+                if (this.info.mobile) {
+                    window.location.href = 'tel://' + this.info.mobile
+                } else {
+                    _this.$toast('对方暂未设置电话');
+                }
+            },
+            onInvite() {
+                if (this.is_click) {
+                    return false;
+                }
+                this.is_click = true;
+                const _this = this;
+                $.post("{:url('/resume/invite')}", {id: this.info.id}, function (json) {
+                    _this.$toast(json.msg);
+                    _this.is_click = false;
+                    if (json.code == 0) {
+                        _this.invite = true;
+                    }
+                }, 'json');
+            },
+        },
+        computed: {
+
+        },
+    });
+</script>
+{/block}

+ 137 - 0
app/mobile/view/resume/index.html

@@ -0,0 +1,137 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+    .lw-list {display:flex;margin-top:10px;padding-bottom:10px;border-bottom:2px solid #f8f9fb;}
+    .lw-list .avatar{width:45px;height:45px;}
+    .lw-list .content {margin-left:10px;font-size:14px;}
+    .lw-list .content .name{color:#e54d42;}
+    .lw-list .content .tags .van-tag {margin-top:5px;margin-right:5px;}
+    .box-border {border-bottom:1px solid #eee;padding-bottom:5px;}
+    .plr-10 {padding-left:10px;padding-right:10px;}
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+>
+    <template #title>
+        <span class="text-white">简历</span>
+    </template>
+</van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<van-dropdown-menu>
+    <van-dropdown-item v-model="form.jobintention" :options="userwill" @change="onSearch"></van-dropdown-item>
+    <van-dropdown-item v-model="form.cateid" :options="catelist" @change="onSearch"></van-dropdown-item>
+</van-dropdown-menu>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list" style="padding: 15px 0 0 0;" @click="toResume(item.id)">
+                <div class="lw-list plr-10">
+                    <img :src="item.avatar ? item.avatar : '__MIMG__/default_avatar.jpg'" class="avatar">
+                    <div class="content">
+                        <div class="name">{{item.realname ? item.realname : item.nickname}}</div>
+                        <div class="tags">
+                            <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in item.com_cate">{{tag}}</van-tag>
+                        </div>
+                    </div>
+                </div>
+                <div class="job-flex plr-10" style="height:40px;">
+                    <div class="job-flex-left">
+                        <span>{{item.jobintention_text}} ·</span>
+                        <span>{{item.age?item.age+'岁':'年龄未知'}} ·</span>
+                        <span>{{item.education_text || '学历未知'}} ·</span>
+                        <span>{{item.worker_text || '经验未知'}}</span>
+                    </div>
+                    <div class="job-flex-right salary">浏览量:{{item.volume}}</div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+<div style="width:100%;height:50px;"></div>
+<van-tabbar v-model="active" active-color="#FF589B" @change="onTabChange">
+    <van-tabbar-item icon="wap-home-o">首页</van-tabbar-item>
+    <van-tabbar-item icon="description">简历</van-tabbar-item>
+</van-tabbar>
+{/block}
+{block name="script"}
+<script>
+    new Vue({
+        el: '#app',
+        data() {
+            return {
+                active: 1,
+                userwill: {$userwill},
+                catelist: {$catelist},
+                form: {
+                    jobintention: 0,
+                    cateid: 0,
+                },
+
+                list: [],
+                page: 1,
+                loading: false,
+                finished: false,
+                refreshing: false,
+            };
+        },
+        methods: {
+            onTabChange(index) {
+                const url = ["{:url('/emp/index')}","{:url('/resume/index')}"];
+                location.href = url[index];
+            },
+            onSearch() {
+                this.onRefresh();
+            },
+            toResume(id) {
+                location.href = "{:url('/resume/detail')}?id=" + id
+            },
+            //加载
+            onLoad() {
+                //参数
+                let self = this;
+                let param = this.form;
+                param.page = this.page;
+                this.page++;
+
+                $.post("{:url('/resume/list')}", param, function (json) {
+                    //下拉刷新
+                    if (self.refreshing) {
+                        self.refreshing = false;
+                    }
+
+                    // 加载状态结束
+                    self.loading = false;
+
+                    if (json.data.length == 0) {
+                        // 数据全部加载完成
+                        self.finished = true;
+                    } else {
+                        // 增加数据
+                        for (let i = 0; i < json.data.length; i++) {
+                            self.list.push(json.data[i]);
+                        }
+                    }
+                }, 'json');
+            },
+            onRefresh() {
+                // 清空列表数据
+                this.list = [];
+                this.page = 1;
+                this.loading = true;
+                this.finished = false;
+
+                this.onLoad();
+            },
+        },
+    });
+</script>
+{/block}

+ 144 - 0
app/mobile/view/shop/index.html

@@ -0,0 +1,144 @@
+{extend name="public/base"/}
+{block name="css"}
+    <style>
+        .van-nav-bar__text, .van-nav-bar .van-icon{color:white;}
+        .header {width:100%;height:45px;background:var(--pink);}
+        .company-box {width:90%;height:60px;background:white;transform:translate(5%,-30px);display:flex;box-sizing:border-box;padding:5px 10px;align-items:center;}
+        .company-box .company-img {width:45px;height:45px;}
+        .company-box .company-title-box {display:flex;padding:5px 10px;flex-direction:column;}
+        .company-box .company-title {color: #666;font-size:16px;}
+        .company-box .company-address {color: #999;font-size:12px;display:flex;align-items:center;}
+        .company-box .company-address span {margin-left:5px;}
+    </style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="bg-pink"
+        fixed="true"
+        left-text="返回"
+        left-arrow
+        @click-left="onBack"
+>
+        <template #title>
+            <span class="text-white">微店</span>
+        </template>
+    </van-nav-bar>
+<div style="width:100%;height:46px;"></div>
+<div class="header"></div>
+<div class="company-box">
+    <img class="company-img" :src="img_worker">
+    <div class="company-title-box">
+        <div class="company-title">{{worker.title}}</div>
+        <div class="company-address"><van-icon name="location-o" ></van-icon><span>{{worker.address}}</span></div>
+    </div>
+</div>
+<div class="content-box">
+    <div class="title"><span class="mark"></span>企业介绍</div>
+    <div class="item" v-html="worker.details"></div>
+</div>
+<div class="content-box margin-top-10">
+    <div class="title"><span class="mark"></span>招聘推荐</div>
+</div>
+<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+            v-model="loading"
+            :finished="finished"
+            finished-text="没有更多了"
+            @load="onLoad"
+    >
+        <div class="job-box">
+            <div class="job-item" v-for="item in list" @click="goDetail(item.id)">
+                <div class="job-flex">
+                    <div class="job-flex-left job-title">{{item.title}}</div>
+                    <div class="job-flex-right salary">{{item.zwagall}}({{item.wtype_text}})</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left">
+                        <van-tag type="primary" color="#FF589B" size="medium" v-for="tag in item.tags">{{tag}}</van-tag>
+                    </div>
+                    <div class="job-flex-right num">{{item.recruit_num}}名</div>
+                </div>
+                <div class="job-flex margin-top-10">
+                    <div class="job-flex-left">
+                        {{item.worker_name}}
+                    </div>
+                    <div class="job-flex-right">
+                        浏览量:{{item.volume}}
+                    </div>
+                </div>
+            </div>
+        </div>
+    </van-list>
+</van-pull-refresh>
+{/block}
+{block name="script"}
+    <script>
+        new Vue({
+            el: '#app',
+            data() {
+                return {
+                    worker: {$worker},
+
+                    list: [],
+                    page: 1,
+                    loading: false,
+                    finished: false,
+                    refreshing: false,
+                };
+            },
+            methods: {
+                onBack() {
+                    history.back();
+                },
+                //加载
+                onLoad() {
+                    //参数
+                    let self = this;
+                    let param = {page: this.page,workerid:this.worker.id};
+                    this.page++;
+
+                    $.post("{:url('/jobs/listJobs')}", param, function (json) {
+                        //下拉刷新
+                        if (self.refreshing) {
+                            self.refreshing = false;
+                        }
+
+                        // 加载状态结束
+                        self.loading = false;
+
+                        if (json.data.length == 0) {
+                            // 数据全部加载完成
+                            self.finished = true;
+                        } else {
+                            // 增加数据
+                            for (let i = 0; i < json.data.length; i++) {
+                                self.list.push(json.data[i]);
+                            }
+                        }
+                    }, 'json');
+                },
+                onRefresh() {
+                    // 清空列表数据
+                    this.list = [];
+                    this.page = 1;
+                    this.loading = true;
+                    this.finished = false;
+
+                    this.onLoad();
+                },
+                goDetail(id) {
+                    location.href = "{:url('/jobs/detail')}?id=" + id;
+                },
+            },
+            computed: {
+                img_worker() {
+                    const default_img = "__MSTATIC__/images/img_worker.png";
+                    if (this.worker.tilpic) {
+                        return this.worker.tilpic;
+                    }
+                    return default_img;
+                },
+            },
+        });
+    </script>
+{/block}

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

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

+ 51 - 0
public/static/mobile/css/style.css

@@ -0,0 +1,51 @@
+body {
+    --red:#e54d42;
+    --pink:#FF589B;
+    --blue: #0081ff;
+    --green: #39b54a;
+    --white: #ffffff;
+    --gray: #666;
+    background:#f8f9fb;
+    font-family: "Microsoft Yahei",arial,"Hiragino Sans GB","Hiragino Sans GB W3",宋体,simsun;
+    color:#333;
+}
+p, h1, h2, h3, h4, h5, h6, ul, li, dl, dd, dt, form {list-style: none;padding: 0;margin: 0;}
+a:visited {color: #000;text-decoration: none;}
+a:link {color: #000;text-decoration: none;}
+
+.bg-pink {background-color: var(--pink);color: var(--white);}
+.bg-white {background-color:var(--white);}
+.bg_green {background: #13ca87!important;}
+.text-pink{color: var(--pink);}
+.text-blue{color: var(--blue);}
+.text-white{color: var(--white);}
+.text-gray{color: var(--gray);}
+.text-green{color: var(--green);}
+.text-red{color: var(--red);}
+.sub_title {font-weight:bold;font-size:18px;background:white;padding-left:20px;padding-bottom:5px;}
+.job-item {width:95%;border-radius:5px;background:white;margin:10px auto;box-sizing:border-box;padding:15px 10px;}
+.job-item .job-flex{display:flex;justify-content:center;align-items:center;font-size:14px;}
+.job-item .job-flex .job-title {font-weight:bold;font-size:16px;}
+.job-item .job-flex .job-flex-left .van-tag {margin-right:5px;margin-top:5px;}
+.job-item .job-flex .job-flex-right {margin-left:auto;font-size:12px;}
+.job-item .job-flex .num {min-width:20px;}
+.job-item .job-flex .salary {color:#e54d42;max-width:30%;}
+.job-item .job-flex .btn-box {display:flex;justify-content:flex-end;width:100%;}
+.job-item .job-flex .btn-box .van-button {margin-left:10px;}
+.margin-top-10 {margin-top:10px;}
+
+.content-box {background-color: #ffffff;color: #666666;box-sizing:border-box;padding:0 15px;border-bottom: 4px solid #f8f9fb;}
+.content-box .title .mark{width:4px;height:20px;background:var(--pink);display:block;border-radius:10px;margin-right:5px;transform:translate(0,2px);}
+.content-box .title {display: flex;position: relative;align-items: center;min-height: 50px;justify-content: flex-start;}
+.content-box .item p {padding:2px 0;font-size:14px;}
+.content-box .company {display: flex;justify-content: flex-start;padding-bottom:10px;}
+.content-box .company img {width:75px;height:75px;}
+.content-box .company .company-right {margin-left:10px;padding-top:5px;}
+.content-box .company .company-right .company-address {color:#aaa;font-size:14px;margin-top:10px;}
+.fix-footer {position:fixed;left:0;bottom:0;width:100%;height:45px;background:white;text-align:center;}
+.fix-footer .icon-box {display:flex;flex-direction:column;font-size:12px;justify-content:center;align-items:center;height:45px;}
+.fix-footer .icon-box span {color:#aaa;}
+.fix-footer .button {width:100%;height:45px;line-height:45px;background:var(--blue);color:white;}
+
+.share-box {position: fixed;left: 0;top: 0;width: 100vw;height: 100vh;z-index: 100000;background-color: rgba(0, 0, 0, 0.7);}
+.share-box img {width:100%;}

File diff suppressed because it is too large
+ 0 - 0
public/static/mobile/css/vant.css


BIN
public/static/mobile/images/default_avatar.jpg


BIN
public/static/mobile/images/emp/workernav1.png


BIN
public/static/mobile/images/emp/workernav10.png


BIN
public/static/mobile/images/emp/workernav11.png


BIN
public/static/mobile/images/emp/workernav12.png


BIN
public/static/mobile/images/emp/workernav2.png


BIN
public/static/mobile/images/emp/workernav3.png


BIN
public/static/mobile/images/emp/workernav4.png


BIN
public/static/mobile/images/emp/workernav5.png


BIN
public/static/mobile/images/emp/workernav6.png


BIN
public/static/mobile/images/emp/workernav7.png


BIN
public/static/mobile/images/emp/workernav8.png


BIN
public/static/mobile/images/emp/workernav9.png


BIN
public/static/mobile/images/favicon.ico


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


BIN
public/static/mobile/images/my/icon_about.png


BIN
public/static/mobile/images/my/icon_check.png


+ 19 - 0
public/static/mobile/images/my/icon_cond.svg

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g id="择偶要求">
+	<g id="图层_2_x5F_复制">
+		<circle fill="#FF5E33" cx="50" cy="50" r="50"/>
+		<path fill="#FFFFFF" d="M67.001,32.879H32.997v4.137h34.004V32.879z M45.831,41.396H32.997v4.14h12.834V41.396L45.831,41.396z
+			 M32.997,54.137h8.411V50h-8.411V54.137z M67.253,56.296c0-5.94-4.796-10.755-10.711-10.755c-5.916,0-10.711,4.815-10.711,10.755
+			c0,5.94,4.795,10.753,10.711,10.753c2.229,0,4.3-0.684,6.017-1.855L72.582,75.26l2.955-2.967L65.488,62.209
+			C66.604,60.512,67.253,58.479,67.253,56.296L67.253,56.296z M56.542,62.746c-3.545,0-6.428-2.893-6.428-6.45
+			c0-3.56,2.883-6.453,6.428-6.453c3.543,0,6.425,2.894,6.425,6.453C62.967,59.854,60.085,62.746,56.542,62.746z M69.971,24.188
+			H30.03c-3.227,0-5.843,2.626-5.843,5.865v39.895c0,3.239,2.616,5.864,5.843,5.864h15.293V71.51H30.03
+			c-0.86,0-1.559-0.703-1.559-1.563V30.053c0-0.861,0.698-1.563,1.559-1.563h39.941c0.858,0,1.557,0.702,1.557,1.563v15.649h4.285
+			V30.053C75.813,26.814,73.195,24.188,69.971,24.188z"/>
+	</g>
+</g>
+</svg>

BIN
public/static/mobile/images/my/icon_feedback.png


BIN
public/static/mobile/images/my/icon_home.png


+ 24 - 0
public/static/mobile/images/my/icon_images.svg

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g id="相册">
+	<g id="图层_2_x5F_复制_4">
+		<circle fill="#3FD8A5" cx="50" cy="50" r="50"/>
+		<path fill="#FFFFFF" d="M25.822,31.989L25.822,31.989v36.522c0,1.826,1.826,3.652,3.653,3.652h43.827
+			c2.191,0,3.652-1.461,3.652-3.652V31.989c0-1.827-1.826-3.652-3.652-3.652H29.475C27.283,28.336,25.822,29.797,25.822,31.989
+			L25.822,31.989L25.822,31.989z M22.17,31.989L22.17,31.989c0-4.018,3.287-7.305,7.305-7.305h43.827
+			c4.019,0,7.306,3.287,7.306,7.305v36.522c0,4.018-3.287,7.305-7.306,7.305H29.475c-4.018,0-7.305-3.287-7.305-7.305V31.989
+			L22.17,31.989z"/>
+		<path fill="#FFFFFF" d="M23.996,66.686L38.24,49.52c1.46-1.461,3.287-1.461,4.382,0l10.592,13.514l10.226-10.228
+			c1.461-1.461,3.652-1.461,4.748,0.365l10.592,13.514l-1.826,6.209L27.647,73.99L23.996,66.686L23.996,66.686z"/>
+		<path fill="#FFFFFF" d="M55.04,41.119c0,0.717,0.144,1.434,0.417,2.097c0.273,0.663,0.682,1.27,1.188,1.777
+			c0.508,0.507,1.114,0.913,1.778,1.188c0.661,0.274,1.379,0.417,2.097,0.417c0.717,0,1.435-0.143,2.097-0.417
+			c0.661-0.274,1.27-0.68,1.776-1.188c0.508-0.507,0.914-1.115,1.188-1.777c0.274-0.662,0.417-1.379,0.417-2.097
+			c0-0.717-0.143-1.434-0.417-2.096s-0.681-1.271-1.188-1.777c-0.508-0.507-1.115-0.913-1.776-1.188
+			c-0.662-0.274-1.38-0.417-2.097-0.417c-0.718,0-1.436,0.143-2.097,0.417c-0.664,0.275-1.271,0.681-1.778,1.188
+			c-0.506,0.507-0.912,1.115-1.188,1.777S55.04,40.402,55.04,41.119L55.04,41.119z"/>
+	</g>
+</g>
+</svg>

+ 14 - 0
public/static/mobile/images/my/icon_intro.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g id="自我介绍">
+	<g id="图层_2_x5F_复制_2">
+		<circle fill="#FFBE3B" cx="50" cy="50" r="50"/>
+		<path fill="#FFFFFF" d="M67.563,24.25H32.438c-2.575,0-4.687,2.085-4.687,4.687V75.75l22.48-7.029l22.016,7.029V28.937
+			C72.248,26.335,70.137,24.25,67.563,24.25z M60.532,54.688H39.468V50h21.064V54.688L60.532,54.688z M60.532,42.97H39.468v-4.686
+			h21.064V42.97L60.532,42.97z"/>
+	</g>
+</g>
+</svg>

BIN
public/static/mobile/images/my/icon_like.png


+ 26 - 0
public/static/mobile/images/my/icon_profile.svg

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g id="个人资料">
+	<g id="图层_2">
+		<circle fill="#76BEFF" cx="50" cy="50" r="50"/>
+		<path fill="#FFFFFF" d="M34.118,36.894c1.813,0,3.282-1.806,3.282-4.034v-4.531c0-2.229-1.471-4.034-3.282-4.034
+			c-1.813,0-3.283,1.806-3.283,4.034v4.531C30.835,35.088,32.305,36.894,34.118,36.894z M73.234,29.121h-1.815l-0.144,6.401
+			c0,0-0.045,2.812-2.773,2.818h-5.505c-2.776-0.09-2.647-2.743-2.647-2.743v-6.476H39.637v6.478c0,0,0.129,2.655-2.649,2.744
+			h-5.489c-2.729-0.005-2.774-2.82-2.774-2.82v-6.401h-1.838c-0.12,0-3.534-0.244-3.682,3.448c-0.027,0.145-0.027,0.233-0.027,0.233
+			v39.206c0,3.658,3.712,3.697,3.712,3.697h46.215c0,0,3.719-0.033,3.719-3.697V32.801c0,0,0-0.089-0.026-0.238
+			C76.648,28.872,73.234,29.121,73.234,29.121z M29.226,67.872V63.85c0-2.058,3.705-4.139,6.858-5.281
+			c0.229-0.082,1.319-0.676,0.709-2.275c-1.565-1.598-2.743-4.188-2.743-6.735c0-3.903,2.58-5.944,5.598-5.944
+			c3.017,0,5.611,2.045,5.611,5.944c0,2.538-1.188,5.117-2.743,6.717c-0.588,1.813,0.366,2.244,0.518,2.287
+			c3.314,1.097,7.038,3.162,7.038,5.278v4.021L29.226,67.872z M68.48,65.027H56.764c-1.391,0.068-2.57-1.002-2.64-2.391
+			c-0.069-1.39,1.001-2.57,2.392-2.64c0.082-0.003,0.164-0.003,0.248,0h11.721c1.39-0.067,2.57,1.003,2.639,2.392
+			s-1.003,2.57-2.391,2.639c-0.084,0.005-0.166,0.005-0.248,0H68.48z M68.48,55.063H56.764c-1.391,0.068-2.57-1.002-2.64-2.392
+			c-0.067-1.389,1.001-2.57,2.392-2.638c0.082-0.004,0.164-0.004,0.248,0h11.721c1.39-0.068,2.57,1.002,2.639,2.391
+			s-1.003,2.57-2.391,2.639c-0.084,0.004-0.166,0.004-0.248,0H68.48z M65.898,36.894c1.813,0,3.283-1.806,3.283-4.034v-4.531
+			c0-2.229-1.594-4.034-3.406-4.034c-1.813,0-3.161,1.806-3.161,4.034v4.531C62.614,35.088,64.085,36.894,65.898,36.894
+			L65.898,36.894z"/>
+	</g>
+</g>
+</svg>

BIN
public/static/mobile/images/my/icon_ticket.png


BIN
public/static/mobile/images/my/my_avatar.png


BIN
public/static/mobile/images/my/myicon01.png


BIN
public/static/mobile/images/my/myicon02.png


BIN
public/static/mobile/images/my/myicon03.png


BIN
public/static/mobile/images/my/myicon04.png


BIN
public/static/mobile/images/my/ticket.jpg


BIN
public/static/mobile/images/my/ticket.png


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


+ 48 - 0
public/static/mobile/js/component/applyList.js

@@ -0,0 +1,48 @@
+Vue.component('like-list', {
+    template: `
+    <div class="job-box">
+        <div class="job-item" v-for="item in list" @click="goDetail(item.comjobs.id)">
+            <div class="job-flex">
+                <div class="job-flex-left job-title">{{item.comjobs.title}}</div>
+                <div class="job-flex-right text-gray" @click.stop="onCancel(item.id)">取消报名</div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left"></div>
+                <div class="job-flex-right" style="color: #e54d42;">
+                    {{item.comjobs.zwagall}}({{item.comjobs.wtype_text}})
+                </div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left">
+                    {{item.comjobs.worker_name}}
+                </div>
+                <div class="job-flex-right">
+                    浏览量:{{item.comjobs.volume}}
+                </div>
+            </div>
+        </div>
+    </div>
+    `,
+    data() {
+        return {}
+    },
+    props: {
+        list: {
+            type: Array,
+            default: [],
+        },
+    },
+    methods: {
+        onCancel(id) {
+            this.$dialog.confirm({
+                title: '提示',
+                message: '确定取消?',
+            }).then(() => {
+                this.$emit('cancel', id);
+            })
+        },
+        goDetail(id) {
+            location.href = "/jobs/detail?id=" + id;
+        },
+    },
+});

+ 48 - 0
public/static/mobile/js/component/likeList.js

@@ -0,0 +1,48 @@
+Vue.component('like-list', {
+    template: `
+    <div class="job-box">
+        <div class="job-item" v-for="item in list" @click="goDetail(item.comjobs.id)">
+            <div class="job-flex">
+                <div class="job-flex-left job-title">{{item.comjobs.title}}</div>
+                <div class="job-flex-right text-gray" @click.stop="onCancel(item.id)">取消关注</div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left salary">{{item.status_text}}</div>
+                <div class="job-flex-right" style="color: #e54d42;">
+                    {{item.comjobs.zwagall}}({{item.comjobs.wtype_text}})
+                </div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left">
+                    {{item.comjobs.worker_name}}
+                </div>
+                <div class="job-flex-right">
+                    浏览量:{{item.comjobs.volume}}
+                </div>
+            </div>
+        </div>
+    </div>
+    `,
+    data() {
+        return {}
+    },
+    props: {
+        list: {
+            type: Array,
+            default: [],
+        },
+    },
+    methods: {
+        onCancel(id) {
+            this.$dialog.confirm({
+                title: '提示',
+                message: '确定取消?',
+            }).then(() => {
+                this.$emit('cancel', id);
+            })
+        },
+        goDetail(id) {
+            location.href = "/jobs/detail?id=" + id;
+        },
+    },
+});

+ 43 - 0
public/static/mobile/js/component/trainAdd.js

@@ -0,0 +1,43 @@
+Vue.component('train-add', {
+    template: `
+    <div class="job-box">
+        <div class="job-item" v-for="item in list" @click="onAdd(item.id)">
+            <div class="job-flex">
+                <div class="job-flex-left job-title">{{item.title}}</div>
+                <div class="job-flex-right"></div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left">
+                    {{item.contact}}
+                </div>
+                <div class="job-flex-right num">{{item.mobile}}</div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left">
+                    {{item.address}}
+                </div>
+                <div class="job-flex-right"></div>
+            </div>
+        </div>
+    </div>
+    `,
+    data() {
+        return {}
+    },
+    props: {
+        list: {
+            type: Array,
+            default: [],
+        },
+    },
+    methods: {
+        onAdd(id) {
+            this.$dialog.confirm({
+                title: '提示',
+                message: '确定添加?',
+            }).then(() => {
+                this.$emit('add', id);
+            })
+        },
+    },
+});

+ 43 - 0
public/static/mobile/js/component/trainList.js

@@ -0,0 +1,43 @@
+Vue.component('train-list', {
+    template: `
+    <div class="job-box">
+        <div class="job-item" v-for="item in list">
+            <div class="job-flex">
+                <div class="job-flex-left job-title">{{item.train.title}}</div>
+                <div class="job-flex-right salary" @click="onCancel(item.id)">取消报名</div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left">
+                    {{item.train.contact}}
+                </div>
+                <div class="job-flex-right num">{{item.train.mobile}}</div>
+            </div>
+            <div class="job-flex margin-top-10">
+                <div class="job-flex-left">
+                    {{item.train.address}}
+                </div>
+                <div class="job-flex-right"></div>
+            </div>
+        </div>
+    </div>
+    `,
+    data() {
+        return {}
+    },
+    props: {
+        list: {
+            type: Array,
+            default: [],
+        },
+    },
+    methods: {
+        onCancel(id) {
+            this.$dialog.confirm({
+                title: '提示',
+                message: '确定取消?',
+            }).then(() => {
+                this.$emit('cancel', id);
+            })
+        },
+    },
+});

File diff suppressed because it is too large
+ 3 - 0
public/static/mobile/js/jquery-1.10.2.min.js


File diff suppressed because it is too large
+ 0 - 0
public/static/mobile/js/vant.min.js


File diff suppressed because it is too large
+ 5 - 0
public/static/mobile/js/vue.min.js


+ 24 - 0
public/worker.php

@@ -0,0 +1,24 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+
+// [ 应用入口文件 ]
+namespace think;
+
+require __DIR__ . '/../vendor/autoload.php';
+
+// 执行HTTP应用并响应
+$http = (new App())->http;
+
+$response = $http->run();
+
+$response->send();
+
+$http->end($response);

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