瀏覽代碼

Merge branch 'master' of http://59.57.98.130:3000/jjhc/report

# Conflicts:
#	composer.lock
sandm 2 年之前
父節點
當前提交
4b79420b16
共有 100 個文件被更改,包括 10394 次插入649 次删除
  1. 1 1
      .gitignore
  2. 28 0
      app/admin/api/DeptApi.php
  3. 85 1
      app/admin/api/RoleApi.php
  4. 93 0
      app/admin/controller/Batch.php
  5. 35 0
      app/admin/controller/Dept.php
  6. 70 0
      app/admin/controller/Dict.php
  7. 35 0
      app/admin/controller/Menu.php
  8. 35 11
      app/admin/controller/Role.php
  9. 202 0
      app/admin/controller/Talent.php
  10. 16 0
      app/admin/model/Depart.php
  11. 124 0
      app/admin/view/Batch/add.html
  12. 124 0
      app/admin/view/Batch/edit.html
  13. 90 0
      app/admin/view/Batch/index.html
  14. 73 0
      app/admin/view/Talent/add_field.html
  15. 195 0
      app/admin/view/Talent/build_form.html
  16. 345 0
      app/admin/view/Talent/dept_fst_verify.html
  17. 364 0
      app/admin/view/Talent/dept_verify.html
  18. 128 0
      app/admin/view/Talent/filesShow.html
  19. 374 0
      app/admin/view/Talent/fst_verify.html
  20. 575 0
      app/admin/view/Talent/pre_list.html
  21. 368 0
      app/admin/view/Talent/re_verify.html
  22. 470 0
      app/admin/view/Talent/talentInfo_common_check.html
  23. 362 0
      app/admin/view/Talent/talentInfo_common_checkIC.html
  24. 385 0
      app/admin/view/Talent/talentInfo_library.html
  25. 74 0
      app/admin/view/dict/add.html
  26. 95 0
      app/admin/view/dict/edit.html
  27. 59 0
      app/admin/view/dict/index.html
  28. 2 2
      app/admin/view/role/assign.html
  29. 2 2
      app/admin/view/role/edit.html
  30. 4 4
      app/admin/view/role/index.html
  31. 30 0
      app/common.php
  32. 167 0
      app/common/api/BatchApi.php
  33. 119 1
      app/common/api/DictApi.php
  34. 15 2
      app/common/api/MenuApi.php
  35. 57 0
      app/common/api/UploadApi.php
  36. 3 3
      app/common/api/UserApi.php
  37. 23 0
      app/common/controller/Batch.php
  38. 23 0
      app/common/controller/Tool.php
  39. 16 0
      app/common/model/Batch.php
  40. 1 1
      app/common/model/Dict.php
  41. 10 6
      app/enterprise/api/TalentApi.php
  42. 4 0
      app/enterprise/controller/Talent.php
  43. 354 0
      app/enterprise/view/talent/add.html
  44. 45 0
      app/index/config/route.php
  45. 2 1
      composer.json
  46. 3 3
      config/database.php
  47. 21 0
      nbproject/private/private.xml
  48. 87 86
      public/static/modular/gate/talentInfo/talentInfo.js
  49. 15 15
      public/static/modular/gate/talentInfo/talentInfo_info.js
  50. 53 51
      public/static/modular/system/batch/batch.js
  51. 37 35
      public/static/modular/system/batch/batch_info.js
  52. 4 4
      public/static/modular/system/dict/dict.js
  53. 35 27
      public/static/modular/system/dict/dict_info.js
  54. 3 3
      public/static/modular/system/role/role.js
  55. 3 3
      public/static/modular/system/role/role_info.js
  56. 2 0
      vendor/.gitignore
  57. 12 0
      vendor/autoload.php
  58. 117 0
      vendor/bin/var-dump-server
  59. 5 0
      vendor/bin/var-dump-server.bat
  60. 572 0
      vendor/composer/ClassLoader.php
  61. 352 0
      vendor/composer/InstalledVersions.php
  62. 21 0
      vendor/composer/LICENSE
  63. 15 0
      vendor/composer/autoload_classmap.php
  64. 15 0
      vendor/composer/autoload_files.php
  65. 11 0
      vendor/composer/autoload_namespaces.php
  66. 26 0
      vendor/composer/autoload_psr4.php
  67. 57 0
      vendor/composer/autoload_real.php
  68. 161 0
      vendor/composer/autoload_static.php
  69. 295 387
      vendor/composer/installed.json
  70. 203 0
      vendor/composer/installed.php
  71. 26 0
      vendor/composer/platform_check.php
  72. 10 0
      vendor/league/flysystem-cached-adapter/.editorconfig
  73. 4 0
      vendor/league/flysystem-cached-adapter/.gitignore
  74. 7 0
      vendor/league/flysystem-cached-adapter/.php_cs
  75. 34 0
      vendor/league/flysystem-cached-adapter/.scrutinizer.yml
  76. 29 0
      vendor/league/flysystem-cached-adapter/.travis.yml
  77. 19 0
      vendor/league/flysystem-cached-adapter/LICENSE
  78. 2 0
      vendor/league/flysystem-cached-adapter/clover/.gitignore
  79. 30 0
      vendor/league/flysystem-cached-adapter/composer.json
  80. 6 0
      vendor/league/flysystem-cached-adapter/phpspec.yml
  81. 3 0
      vendor/league/flysystem-cached-adapter/phpunit.php
  82. 29 0
      vendor/league/flysystem-cached-adapter/phpunit.xml
  83. 20 0
      vendor/league/flysystem-cached-adapter/readme.md
  84. 435 0
      vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php
  85. 101 0
      vendor/league/flysystem-cached-adapter/src/CacheInterface.php
  86. 346 0
      vendor/league/flysystem-cached-adapter/src/CachedAdapter.php
  87. 418 0
      vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php
  88. 115 0
      vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php
  89. 59 0
      vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php
  90. 22 0
      vendor/league/flysystem-cached-adapter/src/Storage/Memory.php
  91. 171 0
      vendor/league/flysystem-cached-adapter/src/Storage/Noop.php
  92. 62 0
      vendor/league/flysystem-cached-adapter/src/Storage/PhpRedis.php
  93. 75 0
      vendor/league/flysystem-cached-adapter/src/Storage/Predis.php
  94. 59 0
      vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php
  95. 60 0
      vendor/league/flysystem-cached-adapter/src/Storage/Stash.php
  96. 104 0
      vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php
  97. 16 0
      vendor/league/flysystem-cached-adapter/tests/InspectionTests.php
  98. 35 0
      vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php
  99. 255 0
      vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php
  100. 35 0
      vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php

+ 1 - 1
.gitignore

@@ -1,6 +1,6 @@
 /.idea
 /.vscode
-/vendor
 *.log
 .env
 /config/database.php
+/composer.lock

+ 28 - 0
app/admin/api/DeptApi.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace app\admin\api;
+
+use app\admin\model\Depart;
+
+/**
+ * Description of RoleApi
+ *
+ * @author sgq
+ */
+class DeptApi {
+
+    public static function getOne($id) {
+        return Depart::findOrEmpty($id);
+    }
+
+    public static function getList($params) {
+        $where = [];
+        if (isset($params["condition"])) {
+            $where[] = [["simplename", "like", "%" . $params["condition"] . "%"]];
+            $where[] = [["fullname", "like", "%" . $params["condition"] . "%"]];
+        }
+        $list = Depart::whereOr($where)->select()->toArray();
+        return $list;
+    }
+
+}

+ 85 - 1
app/admin/api/RoleApi.php

@@ -3,6 +3,7 @@
 namespace app\admin\api;
 
 use app\admin\model\Role;
+use app\admin\model\SysRelation;
 
 /**
  * Description of RoleApi
@@ -11,9 +12,92 @@ use app\admin\model\Role;
  */
 class RoleApi {
 
-    public static function getList($where = "") {
+    public static function getOne($id) {
+        $res = Role::findOrEmpty($id);
+        if ($res["pid"] > 0) {
+            $res["pName"] = isNullOrEmpty(Role::where("id", "=", $res["pid"])->findOrEmpty()["name"]);
+        }
+        if ($res["deptid"] > 0) {
+            $res["deptName"] = isNullOrEmpty(DeptApi::getOne($res["deptid"])["simplename"]);
+        }
+        return $res;
+    }
+
+    public static function getList($params) {
+        $where = [];
+        if (isset($params["roleName"])) {
+            $where = [["name", "like", "%" . $name . "%"]];
+        }
         $list = Role::where($where)->select()->toArray();
+        foreach ($list as &$item) {
+            if ($item["pid"] > 0) {
+                $item["pName"] = isNullOrEmpty(Role::where("id", "=", $item["pid"])->findOrEmpty()["name"]);
+            }
+            if ($item["deptid"] > 0) {
+                $item["deptName"] = isNullOrEmpty(DeptApi::getOne($item["deptid"])["simplename"]);
+            }
+        }
         return $list;
     }
 
+    public static function create($params) {
+        if (!isset($params["name"]))
+            return ["msg" => "角色名不能为空"];
+        if (!isset($params["tips"]))
+            return ["msg" => "别名不能为空"];
+        if (!isset($params["pid"]))
+            return ["msg" => "请选择上级名称"];
+        $data["name"] = $params["name"];
+        $data["pid"] = $params["pid"];
+        $data["deptid"] = $params["deptid"];
+        $data["tips"] = $params["tips"];
+        $data["num"] = $params["num"];
+        Role::insert($data);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function update($params) {
+        if (!isset($params["id"]))
+            return ["msg" => "没有角色信息"];
+        if (!isset($params["name"]))
+            return ["msg" => "角色名不能为空"];
+        if (!isset($params["tips"]))
+            return ["msg" => "别名不能为空"];
+        if (!isset($params["pid"]))
+            return ["msg" => "请选择上级名称"];
+        $child_ids = Role::where("pid", "=", $params["id"])->column("id");
+        if (in_array($params["pid"], $child_ids))
+            return ["msg" => "不能选择自身下级作为上级"];
+        $data["id"] = $params["id"];
+        $data["name"] = $params["name"];
+        $data["pid"] = $params["pid"];
+        $data["deptid"] = $params["deptid"];
+        $data["tips"] = $params["tips"];
+        $data["num"] = $params["num"];
+        Role::update($data);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function set_authority($id, $mids) {
+        SysRelation::where("roleid", "=", $id)->delete();
+        $data = [];
+        $mids = explode(",", $mids);
+        for ($i = 0; $i < count($mids); $i++) {
+            $data[] = [
+                "menuid" => $mids[$i],
+                "roleid" => $id
+            ];
+        }
+        SysRelation::insertAll($data);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function delete($id) {
+        //不能删除超级管理员角色
+        if ($id == 1)
+            return ["msg" => "不能删除超级管理员角色"];
+        Role::where(["id" => $id])->delete();
+        return ["code" => 200, "msg" => "成功"];
+    }
+
 }

+ 93 - 0
app/admin/controller/Batch.php

@@ -0,0 +1,93 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\common\AdminController;
+use app\common\api\BatchApi;
+
+/**
+ * Description of Batch
+ *
+ * @author sgq
+ */
+class Batch extends AdminController {
+
+    /**
+     * @@auth {{/batch}}
+     * @return type
+     */
+    public function index() {
+        return view();
+    }
+
+    /**
+     * @@auth {{/batch/list}}
+     * @return type
+     */
+    public function list() {
+        return json(BatchApi::getList($this->request));
+    }
+
+    /**
+     * @@auth {{/batch/add}}
+     * @return type
+     */
+    public function add() {
+        if ($this->request->isPost()) {
+            return json(BatchApi::create($this->request->param()));
+        }
+        return view();
+    }
+
+    /**
+     * @@auth {{/batch/update}}
+     * @return type
+     */
+    public function edit() {
+        if ($this->request->isPost()) {
+            return json(BatchApi::update($this->request->param()));
+        }
+        $batch = BatchApi::getOne($this->request->param("id"));
+        return view("", ["batch" => $batch]);
+    }
+
+    /**
+     * @@auth {{/batch/delete}}
+     * @return type
+     */
+    public function delete() {
+        if ($this->request->isPost()) {
+            return json(BatchApi::delete($this->request->param("batchId")));
+        }
+    }
+
+    /**
+     * @@auth {{/batch/setActive}}
+     * @return type
+     */
+    public function setActive() {
+        if ($this->request->isPost()) {
+            return json(BatchApi::setActive($this->request->param("batchId"), 1));
+        }
+    }
+
+    /**
+     * @@auth {{/batch/setNotActive}}
+     * @return type
+     */
+    public function setNotActive() {
+        if ($this->request->isPost()) {
+            return json(BatchApi::setActive($this->request->param("batchId"), 2));
+        }
+    }
+
+    /**
+     * @@auth {{/batch/detail}}
+     * @return type
+     */
+    public function detail() {
+
+        return view();
+    }
+
+}

+ 35 - 0
app/admin/controller/Dept.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\common\AdminController;
+
+/**
+ * Description of Dept
+ *
+ * @author sgq
+ */
+class Dept extends AdminController {
+
+    /**
+     * 树形
+     * @return type
+     */
+    function treelist() {
+        $list = getTreeList(\app\admin\api\DeptApi::getList([]));
+        $format_list = [];
+        foreach ($list as $item) {
+            $format_list[] = [
+                "checked" => false,
+                "id" => $item["id"],
+                "isOpen" => true,
+                "name" => $item["simplename"],
+                "open" => $item["pid"] == 0 ? true : false,
+                "pId" => $item["pid"]
+            ];
+        }
+        $format_list[] = ["checked" => true, "id" => "0", "isOpen" => true, "name" => "顶级", "open" => true, "pId" => "0"];
+        return $format_list;
+    }
+
+}

+ 70 - 0
app/admin/controller/Dict.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\common\AdminController;
+use app\common\api\DictApi;
+
+/**
+ * Description of Dict
+ *
+ * @author sgq
+ */
+class Dict extends AdminController {
+
+    /**
+     * @auth {{/dict}}
+     * @return type
+     */
+    public function index() {
+        return view();
+    }
+
+    /**
+     * @auth {{/dict/list}}
+     * @return type
+     */
+    public function list() {
+        $res = DictApi::getList($this->request);
+        return json($res);
+    }
+
+    /**
+     * @auth {{/dict/add}}
+     * @return type
+     */
+    public function add() {
+        if ($this->request->isPost()) {
+            return json(DictApi::create($this->request->param()));
+        }
+        return view();
+    }
+
+    /**
+     * @auth {{/dict/update}}
+     * @return type
+     */
+    public function edit() {
+        if ($this->request->isPost()) {
+            return json(DictApi::update($this->request->param()));
+        }
+
+        $dict = DictApi::getOne($this->request->param("id"));
+        return view("", ["dict" => $dict]);
+    }
+
+    /**
+     * @auth {{/dict/delete}}
+     * @return type
+     */
+    public function delete() {
+        if ($this->request->isPost()) {
+            return json(DictApi::delete($this->request->param("dictId")));
+        }
+    }
+    
+    public function findChildDictByCode(){
+        return json(DictApi::findChildDictByCode($this->request->param("code")));
+    }
+
+}

+ 35 - 0
app/admin/controller/Menu.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\common\AdminController;
+
+/**
+ * Description of Menu
+ *
+ * @author sgq
+ */
+class Menu extends AdminController {
+
+    /**
+     * 树形
+     * @return type
+     */
+    function treelist() {
+        $id = $this->request->param("id");
+        $list = getTreeList(\app\common\api\MenuApi::getPrivilagesByRoleid($id));
+        $format_list = [];
+        foreach ($list as $item) {
+            $format_list[] = [
+                "checked" => $item["checked"],
+                "id" => $item["id"],
+                "isOpen" => true,
+                "name" => $item["name"],
+                "open" => $item["pid"] == 0 ? true : false,
+                "pId" => $item["pid"]
+            ];
+        }
+        return $format_list;
+    }
+
+}

+ 35 - 11
app/admin/controller/Role.php

@@ -25,12 +25,7 @@ class Role extends AdminController {
      * @return type
      */
     public function list() {
-        $name = trim($this->request->param("roleName"));
-        $where = [];
-        if ($name) {
-            $where = [["name", "like", "%" . $name . "%"]];
-        }
-        $list = RoleApi::getList($where);
+        $list = RoleApi::getList($this->request->param());
         return json($list);
     }
 
@@ -39,6 +34,9 @@ class Role extends AdminController {
      * @return type
      */
     public function add() {
+        if ($this->request->isPost()) {
+            return json(RoleApi::create($this->request->param()));
+        }
         return view();
     }
 
@@ -47,7 +45,11 @@ class Role extends AdminController {
      * @return type
      */
     public function edit() {
-        return view();
+        if ($this->request->isPost()) {
+            return json(RoleApi::update($this->request->param()));
+        }
+        $id = $this->request->param("id");
+        return view("", ["role" => RoleApi::getOne($id)]);
     }
 
     /**
@@ -62,21 +64,43 @@ class Role extends AdminController {
      * @return type
      */
     public function assign() {
-        
+        $role = RoleApi::getOne($this->request->param("id"));
+        return view("", ["role" => $role]);
     }
 
     /**
      * @auth {{/role/setAuthority}}
      */
     public function set_authority() {
-        
+        if ($this->request->isPost()) {
+            return json(RoleApi::set_authority($this->request["roleId"], $this->request["ids"]));
+        }
     }
 
     /**
      * @auth {{/role/remove}}
      */
-    public function remove() {
-        
+    public function delete() {
+        if ($this->request->isPost()) {
+            return json(RoleApi::delete($this->request->param("roleId")));
+        }
+    }
+
+    function treelist() {
+        $list = getTreeList(RoleApi::getList([]));
+        $format_list = [];
+        foreach ($list as $item) {
+            $format_list[] = [
+                "checked" => false,
+                "id" => $item["id"],
+                "isOpen" => true,
+                "name" => $item["name"],
+                "open" => $item["pid"] == 0 ? true : false,
+                "pId" => $item["pid"]
+            ];
+        }
+        $format_list[] = ["checked" => true, "id" => "0", "isOpen" => true, "name" => "顶级", "open" => true, "pId" => "0"];
+        return $format_list;
     }
 
 }

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

@@ -0,0 +1,202 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\common\AdminController;
+
+/**
+ * Description of Talent
+ *
+ * @author sgq
+ */
+class Talent extends AdminController {
+
+    private function common_verify() {
+        
+    }
+
+    /**
+     * 部门初审
+     * @auth {{/talentInfo/gotoIndex/-1}}
+     */
+    public function dept_fst_verify() {
+        $this->common_verify(-1);
+    }
+
+    /**
+     * 部门初审-审核
+     * @auth {{/talentInfo/beforeCheck}}
+     */
+    public function dept_fst_check() {
+        
+    }
+
+    /**
+     * 初审
+     * @auth {{/talentInfo/gotoIndex/1}}
+     */
+    public function fst_verify() {
+        $this->common_verify(1);
+    }
+
+    /**
+     * 初审-审核
+     * @auth {{/talentInfo/firstCheck}}
+     */
+    public function fst_check() {
+        
+    }
+
+    /**
+     * 初审-修改驳回字段
+     * @auth {{/talentInfo/updateFieldsAndFiles}}
+     */
+    public function updateFieldsAndFiles() {
+        
+    }
+
+    /**
+     * 初审-审核不通过
+     * @auth {{/talentInfo/setNotPass}}
+     */
+    public function dis_pass() {
+        
+    }
+
+    /**
+     * 部门审核
+     * @auth {{/talentInfo/gotoIndex/2}}
+     */
+    public function dept_verify() {
+        $this->common_verify(2);
+    }
+
+    /**
+     * 部门审核-审核
+     * @auth {{/talentInfo/depCheck}}
+     */
+    public function dept_check() {
+        
+    }
+
+    /**
+     * 复审
+     * @auth {{/talentInfo/gotoIndex/3}}
+     */
+    public function re_verify() {
+        $this->common_verify(3);
+    }
+
+    /**
+     * 复审-审核
+     * @auth {{/talentInfo/thirdCheck}}
+     */
+    public function re_check() {
+        
+    }
+
+    /**
+     * 复审-撤销复核
+     * @auth {{/talentInfo/cancleThirdCheck}}
+     */
+    public function cancel_check() {
+        
+    }
+
+    /**
+     * 预备人才库
+     * @auth {{/talentInfo/gotoIndex/4}}
+     */
+    public function pre_list() {
+        $this->common_verify(4);
+    }
+
+    /**
+     * 预备人才库-公示
+     * @auth {{/talentInfo/preparePublic}}
+     */
+    public function pre_public() {
+        
+    }
+
+    /**
+     * 预备人才库-核查征信
+     * @auth {{/talentInfo/prepareHczx}}
+     */
+    public function pre_hczx() {
+        
+    }
+
+    /**
+     * 预备人才库-征信通过
+     * @auth {{/talentInfo/hczxPass}}
+     */
+    public function pre_zx_pass() {
+        
+    }
+
+    /**
+     * 预备人才库-征信失信
+     * @auth {{/talentInfo/hczxReject}}
+     */
+    public function pre_zx_reject() {
+        
+    }
+
+    /**
+     * 预备人才库-公示再审核
+     * @auth {{/talentInfo/prepareCheck}}
+     */
+    public function pre_check() {
+        
+    }
+
+    /**
+     * 预备人才库-公示通过
+     * @auth {{/talentInfo/publicPass}}
+     */
+    public function pre_public_pass() {
+        
+    }
+
+    /**
+     * 预备人才库-公布
+     * @auth {{/talentInfo/preparePublish}}
+     */
+    public function pre_publish() {
+        
+    }
+
+    /**
+     * 预备人才库-发证
+     * @auth {{/talentInfo/prepareCertification}}
+     */
+    public function pre_certification() {
+        
+    }
+
+    /**
+     * 预备人才库-撤销公布
+     * @auth {{/talentInfo/prepareCanclePublish}}
+     */
+    public function pre_cancel_publish() {
+        
+    }
+
+    /**
+     * 预备人才库-公示预览
+     * @auth {{/talentInfo/publicExportBefore}}
+     */
+    public function pre_public_preview() {
+        
+    }
+
+    /**
+     * 预备人才库-公布预览
+     * @auth {{/talentInfo/publishExportBefore}}
+     */
+    public function pre_publish_preview() {
+        
+    }
+
+}

+ 16 - 0
app/admin/model/Depart.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * Description of Depart
+ *
+ * @author sgq
+ */
+class Depart extends Model {
+
+    protected $table = "sys_dept";
+
+}

+ 124 - 0
app/admin/view/Batch/add.html

@@ -0,0 +1,124 @@
+{extend name="layout/content"}
+{block name="content"}
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <form id="batchInfoForm">
+            <div class="form-horizontal">
+                <input id="id" name="id" type="hidden" value=""/>
+                <div class="row">
+                    <div class="col-sm-6">
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报类别</label>
+                            <div class="col-sm-9">
+                                <select class="form-control" id="type" name="type" data-bv-field="type"><option value="">---请选择---</option></select>
+                                <i style="display: none;" class="form-control-feedback" data-bv-icon-for="type"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="type" data-bv-result="NOT_VALIDATED">申报类别不能为空</small>
+                            </div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报批次</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="batch" name="batch" type="1" data-bv-field="batch">
+                                <i style="display: none;" class="form-control-feedback" data-bv-icon-for="batch"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="batch" data-bv-result="NOT_VALIDATED">申报批次不能为空</small>
+                                <small style="display: none;" class="help-block" data-bv-validator="regexp" data-bv-for="batch" data-bv-result="NOT_VALIDATED">只能输入数字</small>
+                            </div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报截止时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="endTime" id="endTime" data-bv-field="endTime" lay-key="1"><i style="display: none;" class="form-control-feedback" data-bv-icon-for="endTime"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="endTime" data-bv-result="NOT_VALIDATED">申报截止时间不能为空</small></div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                公示开始时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="publicStartTime" id="publicStartTime" lay-key="2">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                平均工资</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="averageWage" name="averageWage" type="1">
+
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                备注</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="description" name="description" type="1">
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-6">
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                人才类型</label>
+                            <div class="col-sm-9">
+                                <select class="form-control" selectval="1" disabled="disabled" id="source" name="source" data-bv-field="source">
+                                    <option value="">请选择</option>
+                                    <option value="1">晋江市优秀人才</option>
+                                    <option value="2">晋江市集成电路优秀人才</option>
+
+                                </select><i style="display: none;" class="form-control-feedback" data-bv-icon-for="source"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="source" data-bv-result="NOT_VALIDATED">人才类型不能为空</small></div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报开始时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="startTime" id="startTime" data-bv-field="startTime" lay-key="3"><i style="display: none;" class="form-control-feedback" data-bv-icon-for="startTime"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="startTime" data-bv-result="NOT_VALIDATED">申报开始时间不能为空</small></div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                提交截止时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="submitEndTime" id="submitEndTime" lay-key="4">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                公示截止时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="publicEndTime" id="publicEndTime" lay-key="5">
+                            </div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                是否有效</label>
+                            <div class="col-sm-9">
+                                <select class="form-control" disabled="disabled" id="active" name="active" data-bv-field="active">
+                                    <option value="2" selected="selected">无效</option>
+                                    <option value="1">有效</option>
+
+                                </select><i style="display: none;" class="form-control-feedback" data-bv-icon-for="active"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="active" data-bv-result="NOT_VALIDATED">有效状态不能为空</small></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row btn-group-m-t">
+                    <div class="col-sm-12" style="text-align: center">
+                        <button type="button" class="btn btn-sm btn-info " onclick="BatchInfoDlg.addSubmit()" id="ensure">
+                            <i class="fa fa-check"></i>&nbsp;提交
+                        </button>
+                        <button type="button" class="btn btn-sm btn-danger " onclick="BatchInfoDlg.close()" id="cancel">
+                            <i class="fa fa-eraser"></i>&nbsp;取消
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
+<script type="text/javascript">
+    document.write('<script src="/static/modular/system/batch/batch_info.js?v=' + (new Date()).getTime() + '"><\/script>');
+</script>
+{/block}

+ 124 - 0
app/admin/view/Batch/edit.html

@@ -0,0 +1,124 @@
+{extend name="layout/content"}
+{block name="content"}
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <form id="batchInfoForm" autocomplete="off">
+            <div class="form-horizontal">
+                <input id="id" name="id" type="hidden" value="{$batch.id}"/>
+                <div class="row">
+                    <div class="col-sm-6">
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报类别</label>
+                            <div class="col-sm-9">
+                                <select class="form-control" id="type" name="type" selectVal="{$batch.type}" data-bv-field="type"><option value="">---请选择---</option></select>
+                                <i style="display: none;" class="form-control-feedback" data-bv-icon-for="type"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="type" data-bv-result="NOT_VALIDATED">申报类别不能为空</small>
+                            </div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报批次</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="batch" name="batch" value="{$batch.batch}" type="1" data-bv-field="batch">
+                                <i style="display: none;" class="form-control-feedback" data-bv-icon-for="batch"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="batch" data-bv-result="NOT_VALIDATED">申报批次不能为空</small>
+                                <small style="display: none;" class="help-block" data-bv-validator="regexp" data-bv-for="batch" data-bv-result="NOT_VALIDATED">只能输入数字</small>
+                            </div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报截止时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="endTime" value="{$batch.endTime}" id="endTime" data-bv-field="endTime" lay-key="1"><i style="display: none;" class="form-control-feedback" data-bv-icon-for="endTime"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="endTime" data-bv-result="NOT_VALIDATED">申报截止时间不能为空</small></div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                公示开始时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="publicStartTime" value="{$batch.publicStartTime}" id="publicStartTime" lay-key="2">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                平均工资</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="averageWage" name="averageWage" value="{$batch.averageWage}" type="1">
+
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                备注</label>
+                            <div class="col-sm-9">
+                                <input class="form-control" id="description" name="description" value="{$batch.description}" type="1">
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-sm-6">
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                人才类型</label>
+                            <div class="col-sm-9">
+                                <select class="form-control" selectval="1" disabled="disabled" selectVal="{$batch.source}" id="source" name="source" data-bv-field="source">
+                                    <option value="">请选择</option>
+                                    <option value="1">晋江市优秀人才</option>
+                                    <option value="2">晋江市集成电路优秀人才</option>
+
+                                </select><i style="display: none;" class="form-control-feedback" data-bv-icon-for="source"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="source" data-bv-result="NOT_VALIDATED">人才类型不能为空</small></div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                申报开始时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="startTime" value="{$batch.startTime}" id="startTime" data-bv-field="startTime" lay-key="3"><i style="display: none;" class="form-control-feedback" data-bv-icon-for="startTime"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="startTime" data-bv-result="NOT_VALIDATED">申报开始时间不能为空</small></div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                提交截止时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="submitEndTime" value="{$batch.submitEndTime}" id="submitEndTime" lay-key="4">
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">
+                                公示截止时间</label>
+                            <div class="col-sm-9">
+                                <input type="text" time="time" format="datetime" class="form-control" name="publicEndTime" id="publicEndTime" value="{$batch.publicEndTime}" lay-key="5">
+                            </div>
+                        </div>
+                        <div class="form-group has-feedback">
+                            <label class="col-sm-3 control-label">
+                                是否有效</label>
+                            <div class="col-sm-9">
+                                <select class="form-control" disabled="disabled" id="active" name="active" selectVal="{$batch.active}" data-bv-field="active">
+                                    <option value="2" selected="selected">无效</option>
+                                    <option value="1">有效</option>
+
+                                </select><i style="display: none;" class="form-control-feedback" data-bv-icon-for="active"></i>
+                                <small style="display: none;" class="help-block" data-bv-validator="notEmpty" data-bv-for="active" data-bv-result="NOT_VALIDATED">有效状态不能为空</small></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row btn-group-m-t">
+                    <div class="col-sm-12" style="text-align: center">
+                        <button type="button" class="btn btn-sm btn-info " onclick="BatchInfoDlg.editSubmit()" id="ensure">
+                            <i class="fa fa-check"></i>&nbsp;提交
+                        </button>
+                        <button type="button" class="btn btn-sm btn-danger " onclick="BatchInfoDlg.close()" id="cancel">
+                            <i class="fa fa-eraser"></i>&nbsp;取消
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
+<script type="text/javascript">
+    document.write('<script src="/static/modular/system/batch/batch_info.js?v=' + (new Date()).getTime() + '"><\/script>');
+</script>
+{/block}

+ 90 - 0
app/admin/view/Batch/index.html

@@ -0,0 +1,90 @@
+{extend name="layout/content"}
+{block name="content"}
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>批次管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+                                            申报类别
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="type"><option value="">---请选择---</option></select>
+                                </div>
+                            </div>
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+                                            是否有效
+                                        </button>
+                                    </div>
+                                    <select class="form-control" id="active">
+                                        <option value=""></option>
+                                        <option value="1">有效</option>
+                                        <option value="2">无效</option>
+
+                                    </select>
+                                </div>                            
+                            </div>
+                            <div class="col-sm-3">
+                                <button type="button" class="btn btn-sm btn-primary " onclick="Batch.search()" id="">
+                                    <i class="fa fa-search"></i>&nbsp;搜索
+                                </button>
+                                <button type="button" class="btn btn-sm btn-primary " onclick="Batch.reset()" id="">
+                                    <i class="fa fa-trash"></i>&nbsp;重置
+                                </button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="BatchTableToolbar" role="group">
+                            {if condition="chkCommission('/admin/batch/add','/batch/add')"} 
+                            <button type="button" class="btn btn-sm btn-primary " onclick="Batch.openAddBatch()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;添加
+                            </button>
+                            {/if}  
+                            {if condition="chkCommission('/admin/batch/edit','/batch/update')"}   
+                            <button type="button" class="btn btn-sm btn-primary " onclick="Batch.openBatchDetail()" id="">
+                                <i class="fa fa-edit"></i>&nbsp;修改
+                            </button>
+                            {/if}  
+                            {if condition="chkCommission('/admin/batch/delete','/batch/delete')"}   
+                            <button type="button" class="btn btn-sm btn-primary " onclick="Batch.delete()" id="">
+                                <i class="fa fa-remove"></i>&nbsp;删除
+                            </button>
+                            {/if}
+                            {if condition="chkCommission('/admin/batch/setActive','/batch/setActive')"}   
+                            <button type="button" class="btn btn-sm btn-danger " onclick="Batch.setActive()" id="">
+                                <i class="fa fa-toggle-off"></i>&nbsp;设置生效
+                            </button>
+                            {/if}
+                            {if condition="chkCommission('/admin/batch/setNotActive','/batch/setNotActive')"}   
+                            <button type="button" class="btn btn-sm btn-danger " onclick="Batch.setNotActive()" id="">
+                                <i class="fa fa-toggle-off"></i>&nbsp;设置失效
+                            </button>
+                            {/if}
+                        </div>
+                        <table id="BatchTable" class="table-condensed" style="font-size: 10px;table-layout: fixed!important;" data-mobile-responsive="true" data-click-to-select="true">
+                            <thead>
+                                <tr>
+                                    <th data-field="selectItem" data-checkbox="true"></th>
+                                </tr>
+                            </thead>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/javascript">
+    document.write('<script src="/static/modular/system/batch/batch.js?v=' + (new Date()).getTime() + '"><\/script>');
+</script>
+{/block}

+ 73 - 0
app/admin/view/Talent/add_field.html

@@ -0,0 +1,73 @@
+{extend name="layout/content"}
+{block name="content"}
+<style type="text/css">
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #009688;
+        background-color: #009688;
+        color: #fff;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>添加字段</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">                            
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+                                            选择表单类型
+                                        </button>
+                                    </div>
+                                    <select class="form-control" name="type">
+                                        <option value="1">人才认定申请</option>
+                                    </select>
+                                </div>
+                            </div>               
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+                                            针对人才类型
+                                        </button>
+                                    </div>
+                                    <select class="form-control" name="talentType">
+                                        <option>全部人才</option>
+                                        <option value="1">优秀人才</option>
+                                        <option value="2">人才认定申请</option>
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            <button type="button" class="btn btn-sm btn-primary " onclick="addField()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;添加字段
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    function addField() {
+        layer.open({
+            type: 2,
+            title: "添加字段",
+            fixed: false,
+            content: "/admin/talent/add_field",
+            area: ['50%', '50%'],
+            maxmin: true,
+            success: function (layero, index) {
+                
+            }
+        });
+    }
+</script>
+{/block}

+ 195 - 0
app/admin/view/Talent/build_form.html

@@ -0,0 +1,195 @@
+{extend name="layout/content"}
+{block name="content"}
+<style type="text/css">
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #009688;
+        background-color: #009688;
+        color: #fff;
+    }
+    .base .form-check{float:left;margin:5px;}
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>创建表单模板</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">                            
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+                                            选择表单类型
+                                        </button>
+                                    </div>
+                                    <select class="form-control" name="type">
+                                        <option value="1">人才认定申请</option>
+                                    </select>
+                                </div>
+                            </div>               
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+                                            针对人才类型
+                                        </button>
+                                    </div>
+                                    <select class="form-control" name="talentType">
+                                        <option>全部人才</option>
+                                        <option value="1">优秀人才</option>
+                                        <option value="2">人才认定申请</option>
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+                        <fieldset>
+                            <legend>个人信息</legend>
+                            <div class="row base">               
+                                <div class="col-sm-12">
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="talentType" class="form-check-input" value="" checked="" autocomplete="off">单位标签
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="companyName" class="form-check-input" value="" checked="" autocomplete="off">单位名称
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="address" class="form-check-input" value="" checked="" autocomplete="off">所属镇街
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="industryField" class="form-check-input" value="" checked="" autocomplete="off">产业领域
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="name" class="form-check-input" value="" checked="" autocomplete="off">姓名
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="cardType" class="form-check-input" value="" checked="" autocomplete="off">证件类型
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="idCard" class="form-check-input" value="" checked="" autocomplete="off">证件号码
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="sex" class="form-check-input" value="" checked="" autocomplete="off">性别
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="politics" class="form-check-input" value="" checked="" autocomplete="off">政治面貌
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="birthday" class="form-check-input" value="" checked="" autocomplete="off">出生日期
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="birthday" class="form-check-input" value="" checked="" autocomplete="off">国籍/地区
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="birthday" class="form-check-input" value="" checked="" autocomplete="off">出生日期
+                                        </label>
+                                    </div>
+                                    <div class="form-check">
+                                        <label class="form-check-label">
+                                            <input type="checkbox" name="photo" class="form-check-input" value="" checked="" autocomplete="off">头像
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+                        </fieldset>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            <button type="button" class="btn btn-sm btn-primary " onclick="addField()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;添加字典字段
+                            </button>
+                        </div>
+                        <table id="form" class="table-condensed table table-bordered table-hover table-sm table-striped">
+                            <thead>
+                                <tr>
+                                    <th>字段</th>
+                                    <th>是否必选</th>
+                                    <th>选择附件</th>
+                                    <th>排序</th>
+                                    <th></th>
+                                </tr>
+                            </thead>
+                            <tbody>
+
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--<script src="${ctxPath}/static/modular/gate/talentInfo/talentInfo.js"></script>-->
+<script>
+    var __initialize = function () {
+        var count = $(".base input[type=checkbox]").length;
+        for (var i = 0; i < count; i++) {
+            var chk = $(".base input[type=checkbox]").eq(i);
+            if (chk.is(":checked")) {
+                var value = chk.attr("name");
+                var text = chk.parent().text();
+                addToTable(value, text);
+            }
+        }
+    }();
+    function addField() {
+        layer.open({
+            type: 2,
+            title: "添加字段",
+            fixed: false,
+            content: "/admin/talent/add_field",
+            area: ['50%', '50%'],
+            maxmin: true,
+            success: function (layero, index) {
+
+            }
+        });
+    }
+    function addToTable(value, text) {
+        if ($("#form").find("input[name='field[]'][value='" + value + "']").length == 0) {
+            var tr = '<tr><td>' + text + '<input type="hidden" name="field[]" value="' + value + '"></td><td><input type="checkbox" name="need[]" checked=""></td><td><button class="btn btn-sm btn-primary" onclick="chooseFile(this);">选择附件</button><input type="hidden" name="file[]"></td><td><input name="order[]" value="1"></td><td><button class="btn btn-sm btn-primary" onclick="remove(this);">删除</button></td></tr>';
+            $("#form tbody").append(tr);
+        }
+    }
+    function remove(obj) {
+        var tr = $(obj).parents("tr");
+        var name = tr.find("input[type=checkbox]").attr("name");
+        $(obj).parents("tr").remove();
+        $(".base input[type=checkbox][name='" + name + "']").prop("checked", false);
+    }
+    $(".base input[type=checkbox]").change(function () {
+        if ($(this).is(":checked")) {
+            var value = $(this).attr("name");
+            var text = $(this).parent().text();
+            addToTable(value, text);
+        }
+    })
+</script>
+<script type="text/javascript">
+    document.write('<script src="/static/modular/gate/talentInfo/talentInfo.js?v=' + (new Date()).getTime() + '"><\/script>');
+    document.write('<script src="/static/modular/common/config.js?v=' + (new Date()).getTime() + '"><\/script>');
+</script>
+{/block}

+ 345 - 0
app/admin/view/Talent/dept_fst_verify.html

@@ -0,0 +1,345 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #009688;
+        background-color: #009688;
+        color: #fff;
+    }
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        margin-bottom: 5px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-top:1px;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>人才认定审核</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <input type="hidden" id="type" value="${user.type}">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="idCard" name="证件号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="sex" name="性别" >
+                                    <option value=""></option>
+                                    <option value="1">男</option>
+                                    <option value="2">女</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="nation" name="民族" >
+                                </#SelectCon>
+                            </div>
+                        </div>
+                        <div class="row highSearch" style="display: none">
+                            <div class="col-sm-3">
+                                <#SelectCon id="nationality" name="国籍/地区" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="provinceCode" name="籍贯省" >
+                                    <option value="">请选择</option>
+                                    @for(item in provinceList){
+                                    <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="politics" name="政治面貌" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="enterpriseId" name="单位名称" >
+                                    <option value="">请选择</option>
+                                    @for(item in enterpriseList){
+                                    <option value="${item.id}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="industryField" name="行业领域" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                    style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="source" name="申报来源">
+                                    <option value=""></option>
+                                    <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                    <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                    <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                    style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="fromCity" name="入选来源县市">
+                                    <option value="">请选择</option>
+                                    @for(item in fromCityList){
+                                    <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                    style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="introductionMode" name="引进方式">
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="highEducation" name="最高学历" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="major" name="专业" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="title" name="职称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="studyAbroad" name="是否有留学经历" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="email" name="电子邮箱" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentType" name="人才标签" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentArrange" name="人才层次" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="identifyCondition" name="认定条件" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="address" name="所属镇街" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="breakFaith" name="是否失信" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="checkState" name="审核状态">
+                                    <option value="">请选择</option>
+                                    <option value="-1">审核不通过</option>
+                                    <option value="3">待审核</option>
+                                    <option value="5">已驳回</option>
+                                    <option value="7">已通过</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="active" name="离职状态" >
+                                <option value="">请选择</option>
+                                <option value="1">在职</option>
+                                <option value="2">离职</option>
+                            </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="isPublic" name="公示状态" >
+                                    <option value="">请选择</option>
+                                    <option value="1">待核查征信</option>
+                                    <option value="2">待公示</option>
+                                    <option value="3">公示中</option>
+                                    <option value="4">待公布</option>
+                                    <option value="5">待发证</option>
+                                    <option value="6">已发证</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="year" name="申报年度" />
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-sm-12" style="text-align: center">
+                                <button type="button" style="cursor:pointer;" id="openSearch" onclick="$('.highSearch,#closeSearch').show();$(this).hide();" class="btn btn-sm btn-primary glyphicon glyphicon-eye-open" id="open-but">打开高级搜索</button>
+                                <button type="button" style="cursor:pointer;display: none;" id="closeSearch" onclick="$('#openSearch').show();$('.highSearch').hide();$(this).hide();"  class="btn btn-sm btn-danger glyphicon glyphicon-eye-close" id="close-but">关闭高级搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-info  glyphicon glyphicon-search" onclick="TalentInfo.search()">搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-warning glyphicon glyphicon-repeat" onclick="TalentInfo.reset()">重置</button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            @if(shiro.hasPermission("/talentInfo/beforeCheck")){
+                            <#button name="审核" icon="fa-check" clickFun="TalentInfo.openCheckTalentInfo()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/beforeExport")){
+                            <#button name="导出" icon="fa-file-excel-o" clickFun="TalentInfo.export()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/beforeDownload")){
+                            <#button name="下载" icon="fa-download" clickFun="TalentInfo.download()"/>
+                            @}
+                        </div>
+                        <#table id="TalentInfoTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--导出模态框-->
+<div class="modal fade " id="commonExportModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="firstModalLabel">导出</h4>
+            </div>
+            <div class="modal-body">
+                <form id="exportForm" action="${ctxPath}/talentInfoExport/publicExport" target="hiddenIframe" class="form-horizontal">
+                    <div class="form-group" id="field">
+                        <div id="field_info">
+                            <ul>
+                                @if(user.type==1){
+                                <li style="width:12%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:12%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:12%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:12%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:12%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:12%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:12%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:12%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:12%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:12%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:12%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:12%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:12%"><input type="checkbox" value="industryFieldName"><span>行业领域</span></li>
+                                <li style="width:12%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:12%"><input type="checkbox" value="sourceName"><span>申报来源</span></li>
+                                <li style="width:12%"><input type="checkbox" value="ourCitySourceName"><span>公布入选来源</span></li>
+                                <li style="width:12%"><input type="checkbox" value="fromCityName"><span>入选来源县市</span></li>
+                                <li style="width:12%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>
+                                <li style="width:12%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:12%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:12%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="enterpriseTalentTypeName"><span>企业标签</span></li>
+                                <li style="width:12%"><input type="checkbox" value="talentTypeName"><span>人才标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="introductionModeName"><span>引进方式</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="lastYearWages"><span>上一年度年薪(元)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业院校)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:12%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:12%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:12%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:12%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:12%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:12%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>
+                                <li style="width:12%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24.5%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:12%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:12%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:12%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                                @if(user.type==2){
+                                <li style="width:12%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:12%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:12%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:12%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:12%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:12%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:12%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:12%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:12%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:12%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:12%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:12%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:12%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:12%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:12%"><input type="checkbox" value="graduateSchool"><span>毕业学校</span></li>
+                                <li style="width:12%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:12%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:12%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:12%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:12%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:12%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:12%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:12%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:12%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24.5%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:36%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:12%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:12%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:12%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:12%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                            </ul>
+                        </div>
+                        <div class="form-group" style="text-align: center">
+                            <button type="button" class="btn btn-primary" onclick="TalentInfo.checkAll()">全选</button>
+                            <button type="button" class="btn btn-success" onclick="TalentInfo.unCheckAll()">反选</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.export(-1)">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_before.js"></script>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_before.js?v='+(new Date()).getTime()+'"><\/script>');
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}

+ 364 - 0
app/admin/view/Talent/dept_verify.html

@@ -0,0 +1,364 @@
+{extend name="layout/content"}
+{block name="content"}
+<style type="text/css">
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #009688;
+        background-color: #009688;
+        color: #fff;
+    }
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        margin-bottom: 5px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-top:1px;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>人才认定申报</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <input type="hidden" id="type" value="${user.type}">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="idCard" name="证件号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="sex" name="性别" >
+                                <option value=""></option>
+                                <option value="1">男</option>
+                                <option value="2">女</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="nation" name="民族" >
+                                </#SelectCon>
+                            </div>
+                        </div>
+                        <div class="row highSearch" style="display: none">
+                            <div class="col-sm-3">
+                                <#SelectCon id="nationality" name="国籍/地区" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="provinceCode" name="籍贯省" >
+                                <option value="">请选择</option>
+                                @for(item in provinceList){
+                                <option value="${item.code}">${item.name}</option>
+                                @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="politics" name="政治面貌" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="enterpriseId" name="单位名称" >
+                                <option value="">请选择</option>
+                                @for(item in enterpriseList){
+                                <option value="${item.id}">${item.name}</option>
+                                @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="industryField" name="行业领域" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                 style="display: none"
+                                 @}
+                                 >
+                                 <#SelectCon id="source" name="申报来源">
+                                 <option value=""></option>
+                                <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                 style="display: none"
+                                 @}
+                                 >
+                                 <#SelectCon id="fromCity" name="入选来源县市">
+                                 <option value="">请选择</option>
+                                @for(item in fromCityList){
+                                <option value="${item.code}">${item.name}</option>
+                                @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                 style="display: none"
+                                 @}
+                                 >
+                                 <#SelectCon id="introductionMode" name="引进方式">
+                                 </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="highEducation" name="最高学历" >
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#NameCon id="major" name="专业" />
+                        </div>
+                        <div class="col-sm-3">
+                            <#NameCon id="title" name="职称" />
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="studyAbroad" name="是否有留学经历" >
+                            <option value="">请选择</option>
+                            <option value="2">否</option>
+                            <option value="1">是</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#NameCon id="phone" name="手机号码" />
+                        </div>
+                        <div class="col-sm-3">
+                            <#NameCon id="email" name="电子邮箱" />
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="talentType" name="人才标签" >
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="talentArrange" name="人才层次" >
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="identifyCondition" name="认定条件" >
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="address" name="所属镇街" >
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="breakFaith" name="是否失信" >
+                            <option value="">请选择</option>
+                            <option value="2">否</option>
+                            <option value="1">是</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#SelectCon id="checkState" name="审核状态" >
+                            <option value="" >请选择</option>
+                            <option value="1">待审核</option>
+                            <option value="2">已驳回</option>
+                            <option value="3">已通过</option>
+                            <option value="4">上级驳回</option>
+                            <option value="9">重新提交</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3" style="display: none">
+                            <#SelectCon id="active" name="离职状态" >
+                            <option value="">请选择</option>
+                            <option value="1">在职</option>
+                            <option value="2">离职</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3" style="display: none">
+                            <#SelectCon id="isPublic" name="公示状态" >
+                            <option value="">请选择</option>
+                            <option value="1">待核查征信</option>
+                            <option value="2">待公示</option>
+                            <option value="3">公示中</option>
+                            <option value="4">待公布</option>
+                            <option value="5">待发证</option>
+                            <option value="6">已发证</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#NameCon id="year" name="申报年度" />
+                        </div>
+                        <div class="col-sm-3" style="display: none">
+                            <#SelectCon id="isEffect" name="是否有效">
+                            <option value="">请选择</option>
+                            <option value="1">有效</option>
+                            <option value="3">人才证书过期</option>
+                            <option value="4">已取消</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3" style="display: none">
+                            <div class="input-group ">
+                                <div class="input-group-btn">
+                                    <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">公布入选月份
+                                    </button>
+                                </div>
+                                <input type="text"  class="form-control time" id="identifyMonth" name="identifyMonth"/>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row">
+                        <div class="col-sm-12" style="text-align: center">
+                            <button type="button" style="cursor:pointer;" id="openSearch" onclick="$('.highSearch,#closeSearch').show();$(this).hide();" class="btn btn-sm btn-primary glyphicon glyphicon-eye-open" id="open-but">打开高级搜索</button>
+                            <button type="button" style="cursor:pointer;display: none;" id="closeSearch" onclick="$('#openSearch').show();$('.highSearch').hide();$(this).hide();"  class="btn btn-sm btn-danger glyphicon glyphicon-eye-close" id="close-but">关闭高级搜索</button>
+                            <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-info  glyphicon glyphicon-search" onclick="TalentInfo.search()">搜索</button>
+                            <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-warning glyphicon glyphicon-repeat" onclick="TalentInfo.reset()">重置</button>
+                        </div>
+                    </div>
+                    <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                        @if(shiro.hasPermission("/talentInfo/depCheck")){
+                        <#button name="审核" icon="fa-check" clickFun="TalentInfo.openCheckTalentInfo()"/>
+                        @}
+                        @if(shiro.hasPermission("/talentInfo/depExport")){
+                        <#button name="导出" icon="fa-file-excel-o" clickFun="TalentInfo.showExportModal(2)" space="true"/>
+                        @}
+                        @if(shiro.hasPermission("/talentInfo/depDownload")){
+                        <#button name="下载" icon="fa-download" clickFun="TalentInfo.download()"/>
+                        @}
+                    </div>
+                    <#table id="TalentInfoTable"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+<!--导出模态框-->
+<div class="modal fade " id="commonExportModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document" style="min-width: 1000px">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="firstModalLabel">导出</h4>
+            </div>
+            <div class="modal-body">
+                <form id="exportForm" action="${ctxPath}/talentInfoExport/publicExport" target="hiddenIframe" class="form-horizontal">
+                    <div class="form-group" id="field">
+                        <div id="field_info">
+                            <ul>
+                                @if(user.type==1){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="industryFieldName"><span>行业领域</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sourceName"><span>申报来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="ourCitySourceName"><span>公布入选来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="fromCityName"><span>入选来源县市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseTalentTypeName"><span>企业标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentTypeName"><span>人才标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="introductionModeName"><span>引进方式</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="lastYearWages"><span>上一年度年薪(元)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业院校)</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                                @if(user.type==2){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业学校</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                            </ul>
+                        </div>
+                        <div class="form-group" style="text-align: center">
+                            <button type="button" class="btn btn-primary" onclick="TalentInfo.checkAll()">全选</button>
+                            <button type="button" class="btn btn-success" onclick="TalentInfo.unCheckAll()">反选</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.export(2)">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_dep.js"></script>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="/static/modular/talentIdentify/talentInfo/talentInfo_dep.js?v=' + (new Date()).getTime() + '"><\/script>');
+    document.write('<script src="/static/modular/talentIdentify/talentInfo/talentInfo_common.js?v=' + (new Date()).getTime() + '"><\/script>');
+</script>
+{/block}

+ 128 - 0
app/admin/view/Talent/filesShow.html

@@ -0,0 +1,128 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    .spacing {
+        margin-bottom: 10px;
+        padding-right:4px;
+        padding-left: 4px;
+    }
+    #talentInfoForm label {
+        font-size: xx-small;
+    }
+    .has-feedback .form-control {
+        padding-right: 5px;
+    }
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        width:13%;
+    }
+    .imgs li{
+        list-style: none;
+        float: left;
+        border: 1px solid #d8d1d1;
+        text-align: center;
+        height: 30px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-right:5px;
+        margin-top:1px;
+    }
+</style>
+    <#table id="fileTable2"/>
+<script>
+    function downloadFile(id){
+        window.location.href = Feng.ctxPath + "/api/talentInfo/downloadFile?id=" + id;
+    }
+
+    function getFile(project,type,id) {
+        var queryData = {};
+        queryData['project'] = project;
+        queryData['type'] = type;
+        $("#fileTable2").bootstrapTable({
+            url: Feng.ctxPath + "/api/talentInfo/findUnCommonFileType",
+            method: 'POST',
+            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+            search: false,					// 是否显示表格搜索,此搜索是客户端搜索,不会进服务端
+            showRefresh: false,				// 是否显示刷新按钮
+            clickToSelect: true,			// 是否启用点击选中行
+            singleSelect: true,				// 设置True 将禁止多选
+            striped: true,  				// 是否显示行间隔色
+            escape: true,
+            pagination: false,   			// 设置为 true 会在表格底部显示分页条
+            paginationHAlign: "left",
+            paginationDetailHAlign: "right",
+            sidePagination: "server",   	// 设置在哪里进行分页,可选值为 'client' 或者 'server'
+            showColumns: false,
+            detailView: true,               //是否显示父子表
+            pageList: [10, 30, 50],
+            queryParams: function (params) {
+                return $.extend(queryData,params)
+            },
+            rowStyle: function (row, index) {
+                return {classes:"info"};
+            },
+            columns: [
+                {field: 'selectItem', checkbox:false,visible:false},
+                {title: '名称', field: 'name', visible: true, align: 'center', valign: 'middle',width:"70%",'class': 'uitd_showTip',
+                    formatter : function(value,row,index){
+                        if(row.must==1){
+                            return '<i class="fa fa-paste"></i><span style="font-weight:bold;color:red;font-size:14px;font-family:宋体"> * </span> '+ value;
+                        }if(row.must==2){
+                            return '<i class="fa fa-paste"></i>'+value;
+                        }
+                    }
+                }
+            ],
+            onPostBody: function () {
+                $("td.uitd_showTip").bind("mouseover", function () {
+                    var htm = $(this).html();
+                    $(this).webuiPopover({title: '详情', content: htm, trigger: 'hover'}).webuiPopover('show');
+                });
+            },
+            onLoadSuccess: function (data) {
+                $("#fileTable2").bootstrapTable('expandAllRows');
+            },
+            onExpandRow: function (index, row, $detail) {
+                var ajax = new $ax(Feng.ctxPath + "/api/talentInfo/listTalentFile", function (data) {
+                    if(data==null||data.length==0){
+                        return;
+                    }
+                    var html = '<ul class="imgs"><li style="width: 80%;font-weight: bold;padding-top: 5px;">附件原名</li><li style="width: 10%;font-weight: bold;padding-top: 5px;">预览</li><li style="width: 10%;font-weight: bold;padding-top: 5px;">操作</li>';
+                    for(var key in data){
+                        var sn = data[key].url.lastIndexOf(".");
+                        var suffix = data[key].url.substring(sn+1,data[key].url.length);
+                        var imgStr = "";
+                        if(suffix=="pdf"||suffix=="PDF"){
+                            imgStr = "<button type='button'  onclick=\"Feng.showPdf('"+data[key].url+"','"+data[key].id+"','"+data[key].orignName+"')\" class=\"btn btn-xs btn-danger\"><i class=\"fa fa-file-pdf-o\" aria-hidden=\"true\"></i></button>";
+                        }
+                        else if(suffix == "xlsx" || suffix=="XLSX" || suffix == 'xls' || suffix == 'XLS'){
+                            imgStr = "<button type='button'  onclick=\"Feng.showExcel('"+data[key].url+"','"+data[key].id+"','"+data[key].orignName+"')\" class=\"btn btn-xs btn-danger\"><i class=\"fa fa-file-excel-o\" aria-hidden=\"true\"></i></button>";
+                        }
+                        else{
+                            imgStr = '<img class=\"imgUrl\"  src=\"'+data[key].url+'\" style=\"width:25px;height:25px;\">';
+                        }
+                        html = html + '<li style="display: none">'+data[key].id+'</li>\n'+
+                            '<li style="width: 80%;padding-top: 5px;">'+data[key].orignName+'</li>\n'+
+                            '<li style="width: 10%;">'+imgStr+'</li>\n'+
+                            "<li style='width: 10%;padding-top: 2px;'><button type='button' onclick=\"downloadFile('"+data[key].id+"')\" class=\"btn btn-xs btn-success\"><i class=\"fa fa-download\" aria-hidden=\"true\"></i>下载</button></li>";
+                    }
+                    html = html + '</ul>';
+                    $detail.html(html);
+                    $(".imgs").viewer({
+                        // toolbar:false,
+                        fullscreen:false
+                    });
+                }, function (data) {
+                    Feng.error("查询失败!" + data.responseJSON.message + "!");
+                });
+                var queryData = {};
+                queryData["mainId"] = id;
+                queryData["fileTypeId"] = row.id;
+                ajax.set(queryData);
+                ajax.start();
+            }
+        });
+    }
+</script>
+@}

+ 374 - 0
app/admin/view/Talent/fst_verify.html

@@ -0,0 +1,374 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #009688;
+        background-color: #009688;
+        color: #fff;
+    }
+    ul li{
+        list-style: none;
+        display:inline-block;
+        margin-bottom: 5px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-top:1px;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>人才认定申报</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <input type="hidden" id="type" value="${user.type}">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="idCard" name="证件号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="sex" name="性别" >
+                                    <option value=""></option>
+                                    <option value="1">男</option>
+                                    <option value="2">女</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="nation" name="民族" >
+                                </#SelectCon>
+                            </div>
+                        </div>
+                        <div class="row highSearch" style="display: none">
+                            <div class="col-sm-3">
+                                <#SelectCon id="nationality" name="国籍/地区" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="provinceCode" name="籍贯省" >
+                                    <option value="">请选择</option>
+                                    @for(item in provinceList){
+                                        <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="politics" name="政治面貌" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="enterpriseId" name="单位名称" >
+                                    <option value="">请选择</option>
+                                    @for(item in enterpriseList){
+                                    <option value="${item.id}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="industryField" name="行业领域" >
+                                </#SelectCon>
+                            </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                        style="display: none"
+                                     @}
+                                    >
+                                    <#SelectCon id="source" name="申报来源">
+                                        <option value=""></option>
+                                        <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                        <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                        <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                     style="display: none"
+                                     @}
+                                    >
+                                    <#SelectCon id="fromCity" name="入选来源县市">
+                                        <option value="">请选择</option>
+                                        @for(item in fromCityList){
+                                        <option value="${item.code}">${item.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                     style="display: none"
+                                     @}
+                                    >
+                                    <#SelectCon id="introductionMode" name="引进方式">
+                                    </#SelectCon>
+                                </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="highEducation" name="最高学历" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="major" name="专业" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="title" name="职称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="studyAbroad" name="是否有留学经历" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="email" name="电子邮箱" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentType" name="人才标签" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentArrange" name="人才层次" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="identifyCondition" name="认定条件" >
+                                    <option value="">请选择</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="address" name="所属镇街" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="breakFaith" name="是否失信" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="checkState" name="审核状态">
+                                    <option value="">请选择</option>
+                                    <option value="-1">审核不通过</option>
+                                    <option value="1">待提交</option>
+                                    <option value="5">重新提交</option>
+                                    <option value="7">待审核</option>
+                                    <option value="10">已驳回</option>
+                                    <option value="20">上级驳回</option>
+                                    <option value="15">已通过</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="active" name="离职状态" >
+                                <option value="">请选择</option>
+                                <option value="1">在职</option>
+                                <option value="2">离职</option>
+                            </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="isPublic" name="公示状态" >
+                                    <option value="">请选择</option>
+                                    <option value="1">待核查征信</option>
+                                    <option value="2">待公示</option>
+                                    <option value="3">公示中</option>
+                                    <option value="4">待公布</option>
+                                    <option value="5">待发证</option>
+                                    <option value="6">已发证</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="isEffect" name="是否有效">
+                                    <option value="">请选择</option>
+                                    <option value="1">有效</option>
+                                    <option value="3">人才证书过期</option>
+                                    <option value="4">已取消</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="year" name="申报年度" />
+                            </div>
+<div class="col-sm-3" style="display: none">
+    <div class="input-group ">
+        <div class="input-group-btn">
+            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">公布入选月份
+            </button>
+        </div>
+        <input type="text"  class="form-control time" id="identifyMonth" name="identifyMonth"/>
+    </div>
+</div>
+                        </div>
+                        <div class="row">
+                            <div class="col-sm-12" style="text-align: center">
+                                <button type="button" style="cursor:pointer;" id="openSearch" onclick="$('.highSearch,#closeSearch').show();$(this).hide();" class="btn btn-sm btn-primary glyphicon glyphicon-eye-open" id="open-but">打开高级搜索</button>
+                                <button type="button" style="cursor:pointer;display: none;" id="closeSearch" onclick="$('#openSearch').show();$('.highSearch').hide();$(this).hide();"  class="btn btn-sm btn-danger glyphicon glyphicon-eye-close" id="close-but">关闭高级搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-info  glyphicon glyphicon-search" onclick="TalentInfo.search()">搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-warning glyphicon glyphicon-repeat" onclick="TalentInfo.reset()">重置</button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            @if(shiro.hasPermission("/talentInfo/firstCheck")){
+                            <#button name="审核" icon="fa-check" clickFun="TalentInfo.openCheckTalentInfo()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/firstExport")){
+                            <#button name="导出" icon="fa-file-excel-o" clickFun="TalentInfo.showExportModal(1)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/firstDownload")){
+                            <#button name="下载" icon="fa-download" clickFun="TalentInfo.download()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/updateFieldsAndFiles")){
+                                <#button name="修改驳回字段" icon="fa-edit" clickFun="TalentInfo.updateFieldsAndFiles()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/setNotPass")){
+                                <#button name="审核不通过" icon="fa-exclamation-triangle" clickFun="TalentInfo.setNotPass()"/>
+                            @}
+                            <#button name="获取人才手机号" icon="fa-mobile" clickFun="TalentInfo.getPhones()" space="true"/>
+                            <#button name="获取经办人手机号" icon="fa-phone" clickFun="TalentInfo.getEnterprisePhones()" space="true"/>
+                        </div>
+                        <#table id="TalentInfoTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--导出模态框-->
+<div class="modal fade " id="commonExportModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document" style="min-width: 1000px">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="firstModalLabel">导出</h4>
+            </div>
+            <div class="modal-body">
+                <form id="exportForm" action="${ctxPath}/talentInfoExport/publicExport" target="hiddenIframe" class="form-horizontal">
+                    <div class="form-group" id="field">
+                        <div id="field_info">
+                            <ul>
+                                @if(user.type==1){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="industryFieldName"><span>行业领域</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sourceName"><span>申报来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="ourCitySourceName"><span>公布入选来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="fromCityName"><span>入选来源县市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseTalentTypeName"><span>企业标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentTypeName"><span>人才标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="introductionModeName"><span>引进方式</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="lastYearWages"><span>上一年度年薪(元)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业院校)</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                                @if(user.type==2){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业学校</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                            </ul>
+                        </div>
+                        <div class="form-group" style="text-align: center">
+                            <button type="button" class="btn btn-primary" onclick="TalentInfo.checkAll()">全选</button>
+                            <button type="button" class="btn btn-success" onclick="TalentInfo.unCheckAll()">反选</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.export(1)">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_first.js"></script>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_first.js?v='+(new Date()).getTime()+'"><\/script>');
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}

+ 575 - 0
app/admin/view/Talent/pre_list.html

@@ -0,0 +1,575 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    #talentInfoForm label {
+        font-size: xx-small;
+    }
+
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        margin-bottom: 5px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-top:1px;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>人才认定申报</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input type="hidden" id="usertype" value="${user.type}">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="idCard" name="证件号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="sex" name="性别" >
+                                    <option value=""></option>
+                                    <option value="1">男</option>
+                                    <option value="2">女</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="nation" name="民族" >
+                                </#SelectCon>
+                            </div>
+                        </div>
+                        <div class="row highSearch" style="display: none">
+                            <div class="col-sm-3">
+                                <#SelectCon id="nationality" name="国籍/地区" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="provinceCode" name="籍贯省" >
+                                    <option value="">请选择</option>
+                                    @for(item in provinceList){
+                                    <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="politics" name="政治面貌" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="enterpriseId" name="单位名称" >
+                                    <option value="">请选择</option>
+                                    @for(item in enterpriseList){
+                                    <option value="${item.id}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="industryField" name="行业领域" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                    style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="source" name="申报来源">
+                                <option value=""></option>
+                                <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                            </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                    style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="fromCity" name="入选来源县市">
+                                    <option value="">请选择</option>
+                                    @for(item in fromCityList){
+                                    <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                    style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="introductionMode" name="引进方式">
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="highEducation" name="最高学历" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="major" name="专业" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="title" name="职称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="studyAbroad" name="是否有留学经历" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="email" name="电子邮箱" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentType" name="人才标签" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentArrange" name="人才层次" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="identifyCondition" name="认定条件" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="address" name="所属镇街" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="active" name="离职状态" >
+                                    <option value="">请选择</option>
+                                    <option value="1">在职</option>
+                                    <option value="2">离职</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="checkState" name="审核状态">
+                                    <option value="">请选择</option>
+                                    <option value="-1">审核不通过</option>
+                                    <option value="35">已通过</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="isPublic" name="公示状态" >
+                                    <option value="">请选择</option>
+                                    <option value="1">待核查征信</option>
+                                    <option value="2">待公示</option>
+                                    <option value="3">公示中</option>
+                                    <option value="4">待公布</option>
+                                    <option value="5">待发证</option>
+                                    <option value="6">已发证</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="breakFaith" name="是否失信" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="year" name="申报年度" />
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="isEffect" name="是否有效">
+                                    <option value="">请选择</option>
+                                    <option value="1">有效</option>
+                                    <option value="3">人才证书过期</option>
+                                    <option value="4">已取消</option>
+                                </#SelectCon>
+                            </div>
+<div class="col-sm-3" style="display: none">
+    <div class="input-group ">
+        <div class="input-group-btn">
+            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">公布入选月份
+            </button>
+        </div>
+        <input type="text"  class="form-control time" id="identifyMonth" name="identifyMonth"/>
+    </div>
+</div>
+                        </div>
+                        <div class="row">
+                            <div class="col-sm-12" style="text-align: center">
+                                <button type="button" style="cursor:pointer;" id="openSearch" onclick="$('.highSearch,#closeSearch').show();$(this).hide();" class="btn btn-sm btn-primary glyphicon glyphicon-eye-open" id="open-but">打开高级搜索</button>
+                                <button type="button" style="cursor:pointer;display: none;" id="closeSearch" onclick="$('#openSearch').show();$('.highSearch').hide();$(this).hide();"  class="btn btn-sm btn-danger glyphicon glyphicon-eye-close" id="close-but">关闭高级搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-info  glyphicon glyphicon-search" onclick="TalentInfo.search()">搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-warning glyphicon glyphicon-repeat" onclick="TalentInfo.reset()">重置</button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            @if(shiro.hasPermission("/talentInfo/prepareHczx")){
+                            <#button name="导出核查征信" icon="fa-file-excel-o" clickFun="TalentInfo.showDataCheckModal(1)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/hczxReject")){
+                            <#button name="征信失信" icon="fa-warning" clickFun="TalentInfo.showHczxRejectModal()" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/hczxPass")){
+                            <#button name="征信通过" icon="fa-check" clickFun="TalentInfo.showDataCheckModal(2)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/publicExportBefore")){
+                                <#button name="公示预览" icon="fa-file-excel-o" clickFun="TalentInfo.showDataCheckModal(7)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/preparePublic")){
+                            <#button name="公示" icon="fa-opencart" btnCss="danger" clickFun="TalentInfo.showDataCheckModal(3)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/preparePublicExport")){
+                            <#button name="公示导出" icon="fa-file-excel-o" clickFun="TalentInfo.publicExport(1)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/prepareCheck")){
+                            <#button name="公示再审核" icon="fa-check-square-o" clickFun="TalentInfo.afterCheck()" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/publicPass")){
+                            <#button name="公示通过" icon="fa-compass" clickFun="TalentInfo.showDataCheckModal(4)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/publishExportBefore")){
+                            <#button name="公布预览" icon="fa-television"  clickFun="TalentInfo.showDataCheckModal(8)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/preparePublish")){
+                            <#button name="公布" icon="fa-television" btnCss="danger" clickFun="TalentInfo.showDataCheckModal(5)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/preparePublishExport")){
+                            <#button name="公布导出" icon="fa-file-excel-o" clickFun="TalentInfo.publicExport(2)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/prepareCanclePublish")){
+                            <#button name="撤销公布" icon="fa-reply" clickFun="TalentInfo.canclePublish()" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/prepareCertification")){
+                            <#button name="发证" icon="fa-newspaper-o" clickFun="TalentInfo.showDataCheckModal(6)" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/prepareExport")){
+                            <#button name="导出" icon="fa-file-excel-o" clickFun="TalentInfo.showExportModal()" space="false"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/prepareDownload")){
+                            <#button name="下载" icon="fa-download" clickFun="TalentInfo.download()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/prepareDownload")){
+                            <#button name="批量下载头像" icon="fa-cloud-download" clickFun="TalentInfo.downloadPhoto()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/libraryDetail")){
+                            <#button name="查看" icon="fa-eye" clickFun="TalentInfo.openTalentInfoDetail()" space="false"/>
+                            @}
+                        </div>
+                        <#table id="TalentInfoTable"/>
+                        <form id="publicForm" action="${ctxPath}/talentInfo/talentInfoPublic" target="hiddenIframe" style="display: none">
+                            <input name="type" id="type">
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--核查征信导入模态框-->
+<div class="modal fade " id="hczxModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="hczxModalLabel">导入核查征信结果文件</h4>
+            </div>
+            <div class="modal-body">
+                <form id="importHczx-form" action="${ctxPath}/talentInfoImport/importHczx" method="post" enctype="multipart/form-data" target="hiddenIframe">
+                    <input type="file" id="file" name="file" onchange="$('#fileName').val($('#file').val());" class="hidden">
+                    <div class="form-group row">
+                        <div class="col-sm-1"></div>
+                        <div class="col-sm-11">
+                            <div class="input-group">
+                                <input type="text" class="form-control" id="fileName" name="fileName" placeholder="请选择需要上传的附件" readonly="readonly" >
+                                <span class="input-group-btn">
+						        	<button class="btn btn-secondary" type="button" onclick="$('#file').click()"><i class="fa fa-search"></i>选择文件</button>
+						      	</span>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.importHczxSubmit()">提交</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--公示再审核模态框-->
+<div class="modal fade " id="checkModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog" role="document" >
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="rejectModalLabel">公示再审核</h4>
+            </div>
+            <div class="modal-body">
+                <form id="checkForm" class="form-horizontal">
+                    <input type="hidden" id="mainId" name="id">
+                    <div class="form-group">
+                        <div class="row" style="margin-bottom: 10px;">
+                            <label class="col-sm-2 control-label">审核状态</label>
+                            <div class="col-sm-10">
+                                <select id="checkStateAfter" name="checkState" class="form-control">
+                                </select>
+                            </div>
+
+                        </div>
+                        <div class="row">
+                            <label class="col-sm-2 control-label">审核意见</label>
+                            <div class="col-sm-10">
+                                <textarea id="msg" name="msg" class="form-control"></textarea>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.afterCheckSubmit()">提交</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--需要核查征信的名单-->
+<div class="modal fade " id="exportCommonModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document" style="min-width: 1200px;">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="exportCommonModalLabel">待核查征信名单</h4>
+            </div>
+            <div class="modal-body">
+                <form class="form-horizontal" style="padding-bottom: 5px;">
+                    <div class="form-group-sm ">
+                        <div class="row">
+                            <div class="rowGroup">
+                                <label class="col-sm-1 control-label">姓名</label>
+                                <div class="col-sm-3 spacing">
+                                    <input type="text" class="form-control input-sm"  id="pub_name" name="name" >
+                                </div>
+                            </div>
+                            <div class="rowGroup">
+                                <label class="col-sm-1 control-label">性别</label>
+                                <div class="col-sm-3 spacing">
+                                    <select  class="form-control input-sm"  id="pub_sex" name="sex" >
+                                        <option value="">请选择</option>
+                                        <option value="1">男</option>
+                                        <option value="2">女</option>
+                                    </select>
+                                </div>
+                            </div>
+                            <div class="rowGroup">
+                                <label class="col-sm-1 control-label">审核状态</label>
+                                <div class="col-sm-3 spacing">
+                                    <select type="text" class="form-control input-sm"  id="pub_checkState" name="checkState" >
+                                        <option value="">请选择</option>
+                                        <option value="-1">审核不通过</option>
+                                        <option value="35">已通过</option>
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+                <div class="toolbar" style="padding-bottom: 5px;text-align: center">
+                    <button type="button" class="btn btn-sm btn-info" onclick="TalentInfo.prepareSearch()"><i class="fa fa-search"></i>搜索</button>
+                    <button type="button" class="btn btn-sm btn-danger" onclick="TalentInfo.prepareReset()"><i class="fa fa-trash"></i>重置</button>
+                    <button id="checkAll" class="btn btn-secondary btn-sm btn-success"><i class="fa fa-check-square-o"></i>全选</button>
+                    <button id="uncheckAll" class="btn btn-secondary btn-sm btn-danger"><i class="fa fa-ban"></i>取消全选</button>
+                </div>
+                <table id="dataTable" class="table-condensed table-sm" style="font-size: 12px;"></table>
+                <form id="hczxForm" style="padding-top: 10px;">
+                    <div class="form-group form-inline">
+                        <label class=" control-label">是否发送短信</label>
+                        <input type="radio" name="isSend" id="isSend1" value="1" onclick="TalentInfo.toggleMessage()" checked="checked"> 是
+                        <input type="radio" name="isSend" id="isSend2" value="2" onclick="TalentInfo.toggleMessage()"> 否
+                    </div>
+                    <div class="form-group form-inline" id="messageEdit">
+                        <label class=" control-label" style="line-height: 40px;"><span style="color: red;">编辑短信内容</span>:您好!您提交申请的
+                            <input type="text" class="form-control input-sm" id="typeName" value="${message.typeName}" maxlength="20">已完成初步审核,现通过
+                            <input type="text" class="form-control input-sm" id="web" placeholder="公示平台(如聚财网/人才晋江公众号)" value="${message.address}" maxlength="40">将审核结果予以公示,公示时间
+                            <input type="text" class="form-control input-sm time" id="publicStartTime" maxlength="15">至<input type="text" class="form-control input-sm time" id="publicEndTime" maxlength="15">。公示期间如有异议,请及时向
+                            <input type="text" class="form-control input-sm" id="dep" placeholder="xx单位/部门" value="${message.dep}" maxlength="30">反映。电话
+                            <input type="text" class="form-control input-sm" id="fyphone" value="${message.phone}" maxlength="30">,电子邮箱
+                            <input type="text" class="form-control input-sm" id="fyemail" value="${message.email}" maxlength="20">。
+                        </label>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" id="hczxButton" onclick="TalentInfo.checkExport()">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--核查征信不通过-->
+<div class="modal fade " id="hczxRejectModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="hczxRejectModalLabel">核查征信不通过</h4>
+            </div>
+            <div class="modal-body">
+                <form id="hczxRejectForm" class="form-horizontal">
+                    <input type="hidden" name="hczxId" id="hczxId">
+                    <div class="form-group">
+                        <div class="row">
+                            <label class="col-sm-2 control-label">审核意见</label>
+                            <div class="col-sm-10">
+                                <textarea id="hczxMsg" name="hczxMsg" class="form-control"></textarea>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary"  onclick="TalentInfo.hczxReject()">提交</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--导出模态框-->
+<div class="modal fade " id="commonExportModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document" style="min-width: 1000px">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="firstModalLabel">导出</h4>
+            </div>
+            <div class="modal-body">
+                <form id="exportForm" action="${ctxPath}/talentInfoExport/publicExport" target="hiddenIframe" class="form-horizontal">
+                    <div class="form-group" id="field">
+                        <div id="field_info">
+                            <ul>
+                                @if(user.type==1){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="industryFieldName"><span>行业领域</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sourceName"><span>申报来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="ourCitySourceName"><span>公布入选来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="fromCityName"><span>入选来源县市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseTalentTypeName"><span>企业标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentTypeName"><span>人才标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="introductionModeName"><span>引进方式</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="lastYearWages"><span>上一年度年薪(元)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业院校)</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="isPublicName"><span>公示状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                                @if(user.type==2){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业学校</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="isPublicName"><span>公示状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                @}
+                            </ul>
+                        </div>
+                        <div class="form-group" style="text-align: center">
+                            <button type="button" class="btn btn-primary" onclick="TalentInfo.checkAll()">全选</button>
+                            <button type="button" class="btn btn-success" onclick="TalentInfo.unCheckAll()">反选</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.export(4)">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_prepare.js"></script>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_prepare.js?v='+(new Date()).getTime()+'"><\/script>');
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}

+ 368 - 0
app/admin/view/Talent/re_verify.html

@@ -0,0 +1,368 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #009688;
+        background-color: #009688;
+        color: #fff;
+    }
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        margin-bottom: 5px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-top:1px;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>人才认定申报</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <input type="hidden" id="type" value="${user.type}">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="idCard" name="证件号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="sex" name="性别" >
+                                    <option value=""></option>
+                                    <option value="1">男</option>
+                                    <option value="2">女</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="nation" name="民族" >
+                                </#SelectCon>
+                            </div>
+                        </div>
+                        <div class="row highSearch" style="display: none">
+                            <div class="col-sm-3">
+                                <#SelectCon id="nationality" name="国籍/地区" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="provinceCode" name="籍贯省" >
+                                    <option value="">请选择</option>
+                                    @for(item in provinceList){
+                                    <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="politics" name="政治面貌" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="enterpriseId" name="单位名称" >
+                                    <option value="">请选择</option>
+                                    @for(item in enterpriseList){
+                                    <option value="${item.id}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="industryField" name="行业领域" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                 style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="source" name="申报来源">
+                                    <option value=""></option>
+                                    <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                    <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                    <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                 style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="fromCity" name="入选来源县市">
+                                    <option value="">请选择</option>
+                                    @for(item in fromCityList){
+                                    <option value="${item.code}">${item.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3"
+                                 @if(user.type==2){
+                                 style="display: none"
+                                 @}
+                                >
+                                <#SelectCon id="introductionMode" name="引进方式">
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="highEducation" name="最高学历" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="major" name="专业" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="title" name="职称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="studyAbroad" name="是否有留学经历" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号码" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="email" name="电子邮箱" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentType" name="人才标签" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="talentArrange" name="人才层次" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="identifyCondition" name="认定条件">
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="address" name="所属镇街" >
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="breakFaith" name="是否失信" >
+                                    <option value="">请选择</option>
+                                    <option value="2">否</option>
+                                    <option value="1">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="checkState" name="审核状态">
+                                    <option value="">请选择</option>
+                                    <option value="-1">审核不通过</option>
+                                    <option value="5">重新提交</option>
+                                    <option value="25">待审核</option>
+                                    <option value="30">已驳回</option>
+                                    <option value="35">已通过</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="active" name="离职状态" >
+                                    <option value="">请选择</option>
+                                    <option value="1">在职</option>
+                                    <option value="2">离职</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="isPublic" name="公示状态" >
+                                    <option value="">请选择</option>
+                                    <option value="1">待核查征信</option>
+                                    <option value="2">待公示</option>
+                                    <option value="3">公示中</option>
+                                    <option value="4">待公布</option>
+                                    <option value="5">待发证</option>
+                                    <option value="6">已发证</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="year" name="申报年度" />
+                            </div>
+                            <div class="col-sm-3" style="display: none">
+                                <#SelectCon id="isEffect" name="是否有效">
+                                    <option value="">请选择</option>
+                                    <option value="1">有效</option>
+                                    <option value="3">人才证书过期</option>
+                                    <option value="4">已取消</option>
+                                </#SelectCon>
+                            </div>
+<div class="col-sm-3" style="display: none">
+    <div class="input-group ">
+        <div class="input-group-btn">
+            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">公布入选月份
+            </button>
+        </div>
+        <input type="text"  class="form-control time" id="identifyMonth" name="identifyMonth"/>
+    </div>
+</div>
+                        </div>
+                        <div class="row">
+                            <div class="col-sm-12" style="text-align: center">
+                                <button type="button" style="cursor:pointer;" id="openSearch" onclick="$('.highSearch,#closeSearch').show();$(this).hide();" class="btn btn-sm btn-primary glyphicon glyphicon-eye-open" id="open-but">打开高级搜索</button>
+                                <button type="button" style="cursor:pointer;display: none;" id="closeSearch" onclick="$('#openSearch').show();$('.highSearch').hide();$(this).hide();"  class="btn btn-sm btn-danger glyphicon glyphicon-eye-close" id="close-but">关闭高级搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-info  glyphicon glyphicon-search" onclick="TalentInfo.search()">搜索</button>
+                                <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-warning glyphicon glyphicon-repeat" onclick="TalentInfo.reset()">重置</button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            @if(shiro.hasPermission("/talentInfo/thirdCheck")){
+                            <#button name="审核" icon="fa-check" clickFun="TalentInfo.openCheckTalentInfo()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/cancleThirdCheck")){
+                            <#button name="撤销复核" icon="fa-backward" clickFun="TalentInfo.cancleThirdCheck()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/thirdExport")){
+                            <#button name="导出" icon="fa-file-excel-o" clickFun="TalentInfo.showExportModal(3)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/thirdDownload")){
+                            <#button name="下载" icon="fa-download" clickFun="TalentInfo.download()"/>
+                            @}
+                        </div>
+                        <#table id="TalentInfoTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--导出模态框-->
+<div class="modal fade " id="commonExportModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document" style="min-width: 1000px">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="firstModalLabel">导出</h4>
+            </div>
+            <div class="modal-body">
+                <form id="exportForm" action="${ctxPath}/talentInfoExport/publicExport" target="hiddenIframe" class="form-horizontal">
+                    <div class="form-group" id="field">
+                        <div id="field_info">
+                            <ul>
+                                @if(user.type==1){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="industryFieldName"><span>行业领域</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sourceName"><span>申报来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="ourCitySourceName"><span>公布入选来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="fromCityName"><span>入选来源县市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseTalentTypeName"><span>企业标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentTypeName"><span>人才标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="introductionModeName"><span>引进方式</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="lastYearWages"><span>上一年度年薪(元)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业院校)</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                <li style="width:24%"><input type="checkbox" value="isPublicName"><span>公示状态</span></li>
+                                @}
+                                @if(user.type==2){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业学校</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkMsg"><span>审核意见</span></li>
+                                <li style="width:24%"><input type="checkbox" value="isPublicName"><span>公示状态</span></li>
+                                @}
+                            </ul>
+                        </div>
+                        <div class="form-group" style="text-align: center">
+                            <button type="button" class="btn btn-primary" onclick="TalentInfo.checkAll()">全选</button>
+                            <button type="button" class="btn btn-success" onclick="TalentInfo.unCheckAll()">反选</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.export(3)">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_third.js"></script>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_third.js?v='+(new Date()).getTime()+'"><\/script>');
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}

+ 470 - 0
app/admin/view/Talent/talentInfo_common_check.html

@@ -0,0 +1,470 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    .spacing {
+        margin-bottom: 10px;
+        padding-right:4px;
+        padding-left: 4px;
+    }
+    #talentInfoForm label {
+        font-size: xx-small;
+    }
+    .has-feedback .form-control {
+        padding-right: 5px;
+    }
+    ul li {
+        list-style: none;
+        display: inline-block;
+    }
+    .imgs li{
+        float: left;
+        border: 1px solid #d8d1d1;
+        text-align: center;
+        height: 30px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-right:5px;
+        margin-top:1px;
+    }
+    .control-label{
+        color: #337ab7;
+    }
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #1E9FFF;
+        background-color: #1E9FFF;
+        color: #fff;
+    }
+    .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
+        background-color: #ddd;
+        opacity: 1;
+    }
+    #fileTable td{
+        word-break: break-word;
+        white-space: inherit;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <div class="col-sm-12" >
+                    <div class="tabs-container" >
+                        <ul class="nav nav-tabs">
+                            <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">基本信息</a></li>
+                            <li id="fileLi" class=""><a data-toggle="tab" href="#tab-2" onclick="TalentInfoInfoDlg.initFileTable()"  aria-expanded="false">申报附件</a></li>
+                            <li  class="" style="float: right;margin-left: 10px;">
+                                <button type="button" class="btn btn-sm btn-primary " onclick="TalentInfoInfoDlg.download()" >
+                                    <i class="fa fa-download"></i>&nbsp;打包下载
+                                </button>
+                            </li>
+                            <li  class="" style="float: right;">
+                                <button type="button" class="btn btn-sm btn-info " onclick="$('#fileTable').bootstrapTable('expandAllRows');" >
+                                    <i class="fa fa-caret-square-o-down"></i>&nbsp;显示附件
+                                </button>
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="tab-content">
+                        <div id="tab-1" class="tab-pane active">
+                            <div class="panel-body" >
+                                <div class="panel panel-default">
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">申报信息<span style="color: red;">(${item.year}年度)</span></div>
+                                    <div class="panel-body">
+                                        <form id="talentInfoForm" class="form-horizontal" action="${ctxPath}/api/talentInfo/upsert" method="post" enctype="multipart/form-data" target="hiddenIframe">
+                                            <div class="col-sm-12 form-group-sm">
+                                                <input type="hidden" name="id" id="id" value="${item.id}">
+                                                <input type="hidden" name="type" id="type" value="${item.type}">
+                                                <input type="hidden" name="checkState" id="checkState" value="${item.checkState}">
+                                                <input type="hidden" id="process" value="${item.process}">
+                                                <input type="hidden" id="companyId" value="${companyId}">
+                                                <input type="hidden" id="talentType" name="talentType" value="${item.talentType}"/>
+                                                <div class="row">
+                                                    <div class="col-sm-11">
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>姓名</label>
+                                                            <input type="text" class="form-control" id="name" name="name" value="${item.name}" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>性别</label>
+                                                            <select class="form-control" id="sex" name="sex" value="${item.sex}">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">男</option>
+                                                                <option value="2">女</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>出生日期</label>
+                                                            <input type="text" class="form-control date" id="birthday" name="birthday" value="${item.birthday}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>国籍/地区</label>
+                                                            <input class="form-control" id="nationality" name="nationality" value="${item.nationalityName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>籍贯</label>
+                                                            <input class="form-control" id="provinceCode" name="provinceCode" value="${item.provinceName}${item.cityName}${item.countyName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>民族</label>
+                                                            <input class="form-control" id="nation" name="nation" value="${item.nationName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>政治面貌</label>
+                                                            <input class="form-control" id="politics" name="politics" value="${item.politicsName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>证件类型</label>
+                                                            <select class="form-control" id="cardType" name="cardType" value="${item.cardType}">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">身份证</option>
+                                                                <option value="2">通行证</option>
+                                                                <option value="3">护照</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*证件号码</span></label>
+                                                            <input class="form-control" id="idCard" name="idCard" value="${item.idCard}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>首次来晋工作时间</label>
+                                                            <input type="text" class="form-control" id="firstInJJTime" name="firstInJJTime" value="${item.firstInJJTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>单位名称</label>
+                                                            <input type="text" class="form-control" id="companyName"  name="companyName" readonly="readonly" value="${item.enterpriseName}" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>行业领域</label>
+                                                            <input type="text" class="form-control" id="industryFieldName" name="industryFieldName" value="${item.industryFieldName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>所属镇街</label>
+                                                            <input class="form-control" id="address" name="address" value="${item.streetName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>申报来源</label>
+                                                            <select class="form-control" id="source" name="source" onchange="TalentInfoInfoDlg.sourceChange()" value="${item.source}"
+                                                                @if(item.source == 1){
+                                                                    title="经我市申报并已经成功入选的泉州高层次人才"
+                                                                @}
+                                                                @if(item.source == 2){
+                                                                    title="从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才"
+                                                                @}
+                                                                @if(item.source == 3){
+                                                                    title="依据《晋江市优秀人才补充认定标准》申报认定"
+                                                                @}
+                                                                >
+                                                                <option value="">请选择</option>
+                                                                <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                                                <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                                                <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>公布入选来源</label>
+                                                            <select class="form-control" id="ourCitySource" name="ourCitySource" value="${item.ourCitySource}"
+                                                                    @if(item.ourCitySource == 1){
+                                                                    title="泉州市公布入选的泉州市第一至第五层次人才"
+                                                                    @}
+                                                                    @if(item.ourCitySource == 2){
+                                                                    title="晋江市公布入选的泉州市高层次第六七层次人才"
+                                                                    @}
+                                                                >
+                                                                <option value="">请选择</option>
+                                                                <option value="1">泉州市公布入选的泉州市第一至第五层次人才</option>
+                                                                <option value="2">晋江市公布入选的泉州市高层次第六七层次人才</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>入选来源县市</label>
+                                                            <input class="form-control" id="fromCityName" name="fromCityName" value="${item.fromCityName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>入选名单批次</label>
+                                                            <input type="text" class="form-control" id="qzBatch"  name="qzBatch" value="${item.qzBatch}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>泉州高层次人才证书发证日期</label>
+                                                            <input type="text" class="form-control" id="certificateStartTime" name="certificateStartTime" value="${item.certificateStartTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>泉州高层次人才证书有效期</label>
+                                                            <input type="text" class="form-control" id="qzgccrcActiveTime" name="qzgccrcActiveTime" value="${item.qzgccrcActiveTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>人才层次</label>
+                                                            <input class="form-control" id="talentArrange" name="talentArrange" value="${item.talentArrangeName}" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>认定条件</label>
+                                                            <input class="form-control" id="identifyCondition" name="identifyCondition" value="${item.identifyConditionText}" title="${item.identifyConditionText}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>认定条件名称</label>
+                                                            <input type="text" class="form-control" id="identifyConditionName" name="identifyConditionName" value="${item.identifyConditionName}" title="${item.identifyConditionName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>认定条件证书取得时间</label>
+                                                            <input type="text" class="form-control" id="identifyGetTime" name="identifyGetTime" value="${item.identifyGetTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>人才标签</label>
+                                                            <input class="form-control" data-toggle="tooltip" title="企业标签:${item.enterpriseTalentTypeName}" id="talentTypeName" name="talentTypeName" value="${item.talentTypeName}"  >
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>首次来晋行政介绍信时间</label>
+                                                            <input type="text" class="form-control" id="letterTime" name="letterTime" value="${item.letterTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>引进方式</label>
+                                                            <input class="form-control" id="introductionModeName" name="introductionModeName" value="${item.introductionModeName}" data-placeholder="引进方式">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>本单位入职时间</label>
+                                                            <input type="text" class="form-control date" id="entryTime" name="entryTime" value="${item.entryTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>职务</label>
+                                                            <input type="text" class="form-control" id="post" name="post" value="${item.post}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>工作合同开始时间</label>
+                                                            <input type="text" class="form-control" id="startTime" name="startTime" value="${item.startTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>工作合同结束时间</label>
+                                                            <input type="text" class="form-control" id="endTime" name="endTime" value="${item.endTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>上一年度年薪(元)</label>
+                                                            <input type="text" class="form-control" id="lastYearWages" name="lastYearWages" value="${item.lastYearWages}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>最高学历</label>
+                                                            <input class="form-control" id="highEducation" name="highEducation" value="${item.educationName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>毕业院校</label>
+                                                            <input type="text" class="form-control" id="graduateSchool" name="graduateSchool" value="${item.graduateSchool}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>专业</label>
+                                                            <input type="text" class="form-control" id="major" name="major" value="${item.major}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing">职称</label>
+                                                            <input type="text" class="form-control" id="title" name="title" value="${item.title}" title="${item.title}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing">国家职业资格</label>
+                                                            <input type="text" class="form-control" id="professionalQualifications" name="professionalQualifications" value="${item.professionalQualifications}" title="${item.professionalQualifications}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing">是否有留学经历</label>
+                                                            <select class="form-control" id="studyAbroad" name="studyAbroad" value="${item.studyAbroad}">
+                                                                <option value="2">否</option>
+                                                                <option value="1">是</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>手机号码</label>
+                                                            <input type="text" class="form-control" id="phone" name="phone" value="${item.phone}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>电子邮箱</label>
+                                                            <input type="text" class="form-control" id="email" name="email" value="${item.email}" title="${item.email}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>开户银行</label>
+                                                            <input type="text" class="form-control" onchange="TalentInfoInfoDlg.bankChange()" id="bank" name="bank" placeholder="XX银行" value="${item.bank}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>银行行号</label>
+                                                            <input type="text" class="form-control" id="bankNumber" name="bankNumber" value="${item.bankNumber}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>开户银行网点</label>
+                                                            <input type="text" class="form-control" id="bankNetwork" name="bankNetwork" placeholder="XX银行XX省XX市XX支行/分行/分理处" value="${item.bankNetwork}" title="${item.bankNetwork}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>银行账号</label>
+                                                            <input type="text" class="form-control" id="bankAccount" name="bankAccount" value="${item.bankAccount}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>是否曾被相关主管部门列为失信个人</label>
+                                                            <select class="form-control" id="breakFaith" name="breakFaith" value="${item.breakFaith}">
+                                                                <option value="2">否</option>
+                                                                <option value="1">是</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing">企业标签</label>
+                                                            <input class="form-control" id="enterpriseTalentTypeName" name="enterpriseTalentTypeName" value="${item.enterpriseTalentTypeName}">
+                                                        </div>
+                                                    </div>
+                                                    <div class="col-sm-1">
+                                                        <img id="photoImg" src="${item.photo}"  style="height: 110px;width: 76px;padding-bottom: 5px;">
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <div class="rowGroup col-sm-12">
+                                                        <label class=" control-label spacing"><span style="color: red">*</span>教育背景及工作简历</label>
+                                                        <textarea style="overflow: auto;word-break: break-all; " class="form-control" id="educationAndResume" name="educationAndResume" rows="4">${item.educationAndResume}</textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <div class="rowGroup col-sm-12">
+                                                        <label class=" control-label spacing"><span style="color: red">*</span>主要业绩及取得的荣誉</label>
+                                                        <textarea style="overflow: auto;word-break: break-all; " class="form-control" id="mainHonours" name="mainHonours" rows="4">${item.mainHonours}</textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <label class="col-sm-12 control-label spacing" style="text-align: left"><span style="color: red">声明:本人对输入材料的真实性负全部责任</span></label>
+                                                </div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                <div class="panel panel-default">
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">日志</div>
+                                    <table id="logTable">
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+                        <div id="tab-2" class="tab-pane ">
+                            <#table id="fileTable"/>
+                            <label style="padding-top: 15px;color: red">*请根据上传的附件材料,编辑好相应的文件夹名称</label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--&lt;!&ndash;审核模态框&ndash;&gt;-->
+<!--<div class="modal fade " id="commonModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">-->
+<!--    <div class="modal-dialog" role="document">-->
+<!--        <div class="modal-content animated flipInY">-->
+<!--            <div class="modal-header">-->
+<!--                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>-->
+<!--                <h4 class="modal-title" id="basicModalLabel">审核</h4>-->
+<!--            </div>-->
+<!--            <div class="modal-body">-->
+<!--                <form id="commonCheckForm">-->
+<!--                    <div class="form-group">-->
+<!--                        <label for="checkState" class="control-label">审核状态</label>-->
+<!--                        <select class="form-control" id="checkStateModal" onchange="TalentInfoInfoDlg.toggledepField()">-->
+<!--                            <option value=""></option>-->
+<!--                            <option value="3">审核通过</option>-->
+<!--                            <option value="2">审核驳回</option>-->
+<!--                        </select>-->
+<!--                    </div>-->
+<!--                    <div class="form-group">-->
+<!--                        <label for="checkMsg" class="control-label">审核意见</label>-->
+<!--                        <textarea class="form-control" id="checkMsg" placeholder="审核状态属“审核通过”的,仅代表此步骤已操作完成,不代表用户提交的信息符合认定条件。若不符合认定条件的,请写明不符合原因。" rows="6"></textarea>-->
+<!--                    </div>-->
+<!--                </form>-->
+<!--            </div>-->
+<!--            <div class="modal-footer">-->
+<!--                <button type="button" class="btn btn-primary" onclick="TalentInfoInfoDlg.commonCheck()">提交</button>-->
+<!--                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>-->
+<!--            </div>-->
+<!--        </div>-->
+<!--    </div>-->
+<!--</div>-->
+
+<!--审核模态框-->
+<!--<div class="modal fade " id="firstModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">-->
+<!--    <div class="modal-dialog modal-lg" role="document">-->
+<!--        <div class="modal-content animated flipInY">-->
+<!--            <div class="modal-header">-->
+<!--                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>-->
+<!--                <h4 class="modal-title" id="firstModalLabel">初级审核</h4>-->
+<!--            </div>-->
+<!--            <div class="modal-body" id="neewFieldForm">-->
+<!--                <form id="firstCheckForm">-->
+<!--                    <div class="form-group" style="margin: 10px;">-->
+<!--                        <label for="checkState" class="control-label">审核状态</label>-->
+<!--                        <select class="form-control" id="checkStateFirstModal" onchange="TalentInfoInfoDlg.toggleField()">-->
+<!--                            <option value="">请选择</option>-->
+<!--                            <option value="3">审核通过</option>-->
+<!--                            <option value="2">审核驳回</option>-->
+<!--                            <option value="-1">审核不通过</option>-->
+<!--                        </select>-->
+<!--                    </div>-->
+<!--                    <div class="form-group" style="margin: 10px;">-->
+<!--                        <label for="checkMsg" class="control-label" >审核意见</label>-->
+<!--                        <textarea class="form-control" id="checkMsgFirst" placeholder="审核状态属“审核通过”的,仅代表此步骤已操作完成,不代表用户提交的信息符合认定条件。若不符合认定条件的,请写明不符合原因。" rows="6"></textarea>-->
+<!--                        <div id="field" style="padding-top: 5px;display: none">-->
+<!--                            <label for="checkMsg" class="control-label">可修改字段</label>-->
+<!--                            <div id="field_info">-->
+<!--                                <ul>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="name"><span>姓名</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="sex"><span>性别</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="birthday"><span>出生日期</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="nationality"><span>国籍/地区</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="provinceCode" onchange="TalentInfoInfoDlg.fieldCheckd(this)"><span>籍贯省</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="cityCode" onchange="TalentInfoInfoDlg.fieldCheckd(this)"><span>籍贯市</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="countyCode"><span>籍贯县</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="nation"><span>民族</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="politics"><span>政治面貌</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="cardType"><span>证件类型</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="idCard"><span>证件号码</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="source"><span>申报来源</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="ourCitySource"><span>公布入选来源</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="fromCity"><span>入选来源县市</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>-->
+<!--                                    <li style="width:31%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>-->
+<!--                                    <li style="width:31%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="talentArrange" onchange="TalentInfoInfoDlg.fieldCheckd(this)"><span>人才层次</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="identifyCondition"><span>认定条件</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="talentType"><span>人才标签</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="introductionMode"><span>引进方式</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="post"><span>职务</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="highEducation"><span>最高学历</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="major"><span>专业</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="title"><span>职称</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="studyAbroad"><span>是否有留学经历</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="phone"><span>手机号码</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="email"><span>电子邮箱</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="bank"><span>开户银行</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>-->
+<!--                                    <li style="width:10%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>-->
+<!--                                    <li style="width:31%"><input type="checkbox" value="breakFaith"><span>曾被相关主管部门列为失信个人</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="educationAndResume"><span>教育背景及工作简历</span></li>-->
+<!--                                    <li style="width:20.5%"><input type="checkbox" value="mainHonours"><span>主要业绩及取得的荣誉</span></li>-->
+<!--                                </ul>-->
+<!--                            </div>-->
+<!--                            <label for="checkMsg" class="control-label">可修改附件</label>-->
+<!--                            <div id="field_file">-->
+<!--                            </div>-->
+<!--                            <div class="form-group" style="text-align: center">-->
+<!--                                <button type="button" class="btn btn-primary" onclick="TalentInfoInfoDlg.checkAll()">全选</button>-->
+<!--                                <button type="button" class="btn btn-success" onclick="TalentInfoInfoDlg.unCheckAll()">反选</button>-->
+<!--                            </div>-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </form>-->
+<!--            </div>-->
+<!--            <div class="modal-footer">-->
+<!--                <button type="button" class="btn btn-primary" onclick="TalentInfoInfoDlg.firstCheck()">提交</button>-->
+<!--                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>-->
+<!--            </div>-->
+<!--        </div>-->
+<!--    </div>-->
+<!--</div>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common_check.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common_check.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}

+ 362 - 0
app/admin/view/Talent/talentInfo_common_checkIC.html

@@ -0,0 +1,362 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    .spacing {
+        margin-bottom: 10px;
+    }
+    #talentInfoForm label {
+        font-size: 10px;
+    }
+    .has-feedback .form-control {
+        padding-right: 5px;
+    }
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        width:13%;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-right:5px;
+        margin-top:1px;
+    }
+    .layui-layer-btn .layui-layer-btn1 {
+        border-color: #1E9FFF;
+        background-color: #1E9FFF;
+        color: #fff;
+    }
+    .imgs li{
+        list-style: none;
+        float: left;
+        border: 1px solid #d8d1d1;
+        text-align: center;
+        height: 30px;
+    }
+    .control-label{
+        color: #337ab7;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <div class="col-sm-12" >
+                    <div class="tabs-container" >
+                        <ul class="nav nav-tabs">
+                            <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">基本信息</a></li>
+                            <li id="fileLi" class=""><a data-toggle="tab" href="#tab-2" onclick="TalentInfoInfoDlg.initFileTable()"  aria-expanded="false">申报附件</a></li>
+                            <li  class="" style="float: right;"><#button name="打包下载" icon="fa-download" clickFun="TalentInfoInfoDlg.download()"/></li>
+                        </ul>
+                    </div>
+                    <div class="tab-content">
+                        <div id="tab-1" class="tab-pane active">
+                            <div class="panel-body" >
+                                <div class="panel panel-default">
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">申报信息<span style="color: red;">(${item.year}年度)</span></div>
+                                    <div class="panel-body">
+                                        <form id="talentInfoForm" class="form-horizontal" action="${ctxPath}/api/talentInfo/upsert" method="post" enctype="multipart/form-data" target="hiddenIframe">
+                                            <div class="col-sm-12 form-group-sm">
+                                                <input type="hidden" name="id" id="id" value="${item.id}">
+                                                <input type="hidden" name="source" id="source" value="${item.source}">
+                                                <input type="hidden" name="enterpriseId" id="enterpriseId" value="${item.enterpriseId}">
+                                                <input type="hidden" name="type" id="type" value="${item.type}">
+                                                <input type="hidden" name="checkState" id="checkState" value="${item.checkState}">
+                                                <input type="hidden" id="process" value="${item.process}">
+                                                <input type="hidden" id="companyId" value="${companyId}">
+                                                <div class="row">
+                                                    <div class="col-sm-11">
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>姓名</label>
+                                                            <input type="text" class="form-control" id="name" name="name" value="${item.name}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>性别</label>
+                                                            <select class="form-control" id="sex" name="sex" value="${item.sex}">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">男</option>
+                                                                <option value="2">女</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>国籍/地区</label>
+                                                            <input class="form-control" id="nationality" name="nationality" value="${item.nationalityName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>籍贯</label>
+                                                            <input class="form-control" id="provinceCode" name="provinceCode" value="${item.provinceName}${item.cityName}${item.countyName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>民族</label>
+                                                            <input class="form-control" id="nation" name="nation" value="${item.nationName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>政治面貌</label>
+                                                            <input class="form-control" id="politics" name="politics" value="${item.politicsName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>出生日期</label>
+                                                            <input type="text" class="form-control date" id="birthday" name="birthday" value="${item.birthday}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>证件类别</label>
+                                                            <select type="text" class="form-control" id="cardType" name="cardType" value="${item.cardType}">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">身份证</option>
+                                                                <option value="2">通行证</option>
+                                                                <option value="3">护照</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*证件号码</span></label>
+                                                            <input type="text" class="form-control" id="idCard" name="idCard" value="${item.idCard}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>是否曾被相关主管部门列为失信个人</label>
+                                                            <select class="form-control" id="breakFaith" name="breakFaith" value="${item.breakFaith}">
+                                                                <option value="2">否</option>
+                                                                <option value="1">是</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>手机号码</label>
+                                                            <input type="text" class="form-control" id="phone" name="phone" value="${item.phone}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>电子邮箱</label>
+                                                            <input type="text" class="form-control" id="email" name="email" value="${item.email}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>最高学历</label>
+                                                            <input class="form-control" id="highEducation" name="highEducation" value="${item.educationName}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>毕业学校</label>
+                                                            <input type="text" class="form-control" id="graduateSchool" name="graduateSchool" value="${item.graduateSchool}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>专业</label>
+                                                            <input type="text" class="form-control" id="major" name="major" value="${item.major}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing">是否有留学经历</label>
+                                                            <select class="form-control" id="studyAbroad" name="studyAbroad" value="${item.studyAbroad}">
+                                                                <option value="2">否</option>
+                                                                <option value="1">是</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>单位名称</label>
+                                                            <input type="text" class="form-control" id="companyName"  name="companyName" readonly="readonly" value="${item.enterpriseName}" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>所属镇街</label>
+                                                            <input class="form-control" id="address" name="address" value="${item.streetName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>职务</label>
+                                                            <input type="text" class="form-control" id="post" name="post" value="${item.post}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>入职时间</label>
+                                                            <input type="text" class="form-control date" id="entryTime" name="entryTime" value="${item.entryTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>工作合同开始时间</label>
+                                                            <input type="text" class="form-control date" id="startTime" name="startTime" value="${item.startTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>工作合同结束时间</label>
+                                                            <input type="text" class="form-control date" id="endTime" name="endTime" value="${item.endTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>人才层次</label>
+                                                            <input class="form-control" id="talentArrange" name="talentArrange" value="${item.talentArrangeName}" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>认定条件</label>
+                                                            <input class="form-control" id="identifyCondition" name="identifyCondition"  value="${item.identifyConditionText}" title="${item.identifyConditionText}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>认定条件名称</label>
+                                                            <input type="text" class="form-control" id="identifyConditionName" name="identifyConditionName" value="${item.identifyConditionName}" title="${item.identifyConditionName}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>认定条件证书取得时间</label>
+                                                            <input type="text" class="form-control date" id="identifyGetTime" name="identifyGetTime" value="${item.identifyGetTime}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing">职称</label>
+                                                            <input type="text" class="form-control" id="title" name="title" value="${item.title}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing">国家职业资格</label>
+                                                            <input type="text" class="form-control" id="professionalQualifications" name="professionalQualifications" value="${item.professionalQualifications}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>开户银行</label>
+                                                            <input type="text" class="form-control" onchange="TalentInfoInfoDlg.bankChange()" id="bank" name="bank" value="${item.bank}" placeholder="XX银行"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>开户银行网点</label>
+                                                            <input type="text" class="form-control" id="bankNetwork" name="bankNetwork" value="${item.bankNetwork}" PLACEHOLDER="XX银行XX省XX市XX支行/分行/分理处"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-4">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>银行账号</label>
+                                                            <input type="text" class="form-control" id="bankAccount" name="bankAccount" value="${item.bankAccount}"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-8">
+                                                            <label class=" control-label spacing">备注</label>
+                                                            <input type="text" class="form-control" id="description" name="description" value="${item.description}"/>
+                                                        </div>
+                                                    </div>
+                                                    <div class="col-sm-1">
+                                                        <img id="photoImg" src="${item.photo}"  style="height: 110px;width: 76px;">
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <div class="rowGroup col-sm-12">
+                                                        <label class=" control-label spacing"><span style="color: red">*</span>教育背景及工作简历</label>
+                                                        <textarea style="overflow: auto;word-break: break-all; " class="form-control" id="educationAndResume" name="educationAndResume" rows="2">${item.educationAndResume}</textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <div class="rowGroup col-sm-12">
+                                                        <label class=" control-label spacing"><span style="color: red">*</span>主要业绩及取得的荣誉</label>
+                                                        <textarea style="overflow: auto;word-break: break-all; " class="form-control" id="mainHonours" name="mainHonours" rows="2">${item.mainHonours}</textarea>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">日志</div>
+                                    <table id="logTable">
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+                        <div id="tab-2" class="tab-pane ">
+                            <#table id="fileTable"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--审核模态框-->
+<!--<div class="modal fade " id="commonModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">-->
+<!--    <div class="modal-dialog" role="document">-->
+<!--        <div class="modal-content animated flipInY">-->
+<!--            <div class="modal-header">-->
+<!--                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>-->
+<!--                <h4 class="modal-title" id="basicModalLabel">审核</h4>-->
+<!--            </div>-->
+<!--            <div class="modal-body">-->
+<!--                <form id="commonCheckForm">-->
+<!--                    <div class="form-group">-->
+<!--                        <label for="checkState" class="control-label">审核状态</label>-->
+<!--                        <select class="form-control" id="checkStateModal" onchange="TalentInfoInfoDlg.toggledepField()">-->
+<!--                            <option value=""></option>-->
+<!--                            <option value="3">审核通过</option>-->
+<!--                            <option value="2">审核驳回</option>-->
+<!--                        </select>-->
+<!--                    </div>-->
+<!--                    <div class="form-group">-->
+<!--                        <label for="checkMsg" class="control-label">审核意见</label>-->
+<!--                        <textarea class="form-control" id="checkMsg"></textarea>-->
+<!--                    </div>-->
+<!--                </form>-->
+<!--            </div>-->
+<!--            <div class="modal-footer">-->
+<!--                <button type="button" class="btn btn-primary" onclick="TalentInfoInfoDlg.commonCheck()">提交</button>-->
+<!--                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>-->
+<!--            </div>-->
+<!--        </div>-->
+<!--    </div>-->
+<!--</div>-->
+
+<!--&lt;!&ndash;审核模态框&ndash;&gt;-->
+<!--<div class="modal fade " id="firstModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">-->
+<!--    <div class="modal-dialog modal-lg" role="document">-->
+<!--        <div class="modal-content animated flipInY">-->
+<!--            <div class="modal-header">-->
+<!--                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>-->
+<!--                <h4 class="modal-title" id="firstModalLabel">初级审核</h4>-->
+<!--            </div>-->
+<!--            <div class="modal-body">-->
+<!--                <form id="firstCheckForm">-->
+<!--                    <div class="form-group">-->
+<!--                        <label for="checkState" class="control-label">审核状态</label>-->
+<!--                        <select class="form-control" id="checkStateFirstModal" onchange="TalentInfoInfoDlg.toggleField()">-->
+<!--                            <option value=""></option>-->
+<!--                            <option value="3">审核通过</option>-->
+<!--                            <option value="2">审核驳回</option>-->
+<!--                            <option value="-1">审核不通过</option>-->
+<!--                        </select>-->
+<!--                    </div>-->
+<!--                    <div class="form-group">-->
+<!--                        <label for="checkMsg" class="control-label">审核意见</label>-->
+<!--                        <textarea class="form-control" id="checkMsgFirst"></textarea>-->
+<!--                    </div>-->
+<!--                    <div class="form-group" id="field" style="display: none">-->
+<!--                        <label for="checkMsg" class="control-label">可修改字段</label>-->
+<!--                        <div id="field_info">-->
+<!--                            <ul>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="name"><span>姓名</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="sex"><span>性别</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="birthday"><span>出生日期</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="industryField"><span>行业领域</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="address"><span>所属镇街</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="nationality"><span>国籍/地区</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="provinceCode"><span>籍贯省</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="cityCode"><span>籍贯市</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="countyCode"><span>籍贯县</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="cardType"><span>证件类型</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="idCard"><span>证件号码</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="nation"><span>民族</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="politics"><span>政治面貌</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="post"><span>职务</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="highEducation"><span>最高学历</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="major"><span>专业</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="title"><span>职称</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="studyAbroad"><span>是否有留学经历</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="phone"><span>手机号码</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="email"><span>电子邮箱</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="bank"><span>开户银行</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>-->
+<!--                                <li style="width:31%"><input type="checkbox" value="breakFaith"><span>曾被相关主管部门列为失信个人</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="talentArrange"><span>人才层次</span></li>-->
+<!--                                <li style="width:10%"><input type="checkbox" value="identifyCondition"><span>认定条件</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="educationAndResume"><span>教育背景及工作简历</span></li>-->
+<!--                                <li style="width:20.5%"><input type="checkbox" value="mainHonours"><span>主要业绩及取得的荣誉</span></li>-->
+<!--                            </ul>-->
+<!--                        </div>-->
+<!--                        <label for="checkMsg" class="control-label">可修改附件</label>-->
+<!--                        <div id="field_file">-->
+<!--                        </div>-->
+<!--                        <div class="form-group" style="text-align: center">-->
+<!--                            <button type="button" class="btn btn-primary" onclick="TalentInfoInfoDlg.checkAll()">全选</button>-->
+<!--                            <button type="button" class="btn btn-success" onclick="TalentInfoInfoDlg.unCheckAll()">反选</button>-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </form>-->
+<!--            </div>-->
+<!--            <div class="modal-footer">-->
+<!--                <button type="button" class="btn btn-primary" onclick="TalentInfoInfoDlg.firstCheck()">提交</button>-->
+<!--                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>-->
+<!--            </div>-->
+<!--        </div>-->
+<!--    </div>-->
+<!--</div>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common_check.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common_check.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}

+ 385 - 0
app/admin/view/Talent/talentInfo_library.html

@@ -0,0 +1,385 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    #talentInfoForm label {
+        font-size: xx-small;
+    }
+    .has-feedback .form-control {
+        padding-right: 5px;
+    }
+    #field ul li{
+        list-style: none;
+        display:inline-block;
+        margin-bottom: 5px;
+    }
+    #field ul li input{
+        vertical-align:middle;
+        margin-top:1px;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>人才认定申报</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <form id="search-form">
+                            <input type="hidden" id="usertype" value="${user.type}">
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#NameCon id="name" name="姓名" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#NameCon id="idCard" name="证件号码" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="sex" name="性别" >
+                                        <option value=""></option>
+                                        <option value="1">男</option>
+                                        <option value="2">女</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="enterpriseId" name="单位名称" >
+                                        <option value="">请选择</option>
+                                        @for(item in enterpriseList){
+                                        <option value="${item.id}">${item.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                            </div>
+                            <div class="row highSearch" style="display: none">
+                                <div class="col-sm-3">
+                                    <#SelectCon id="nationality" name="国籍/地区" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="provinceCode" name="籍贯省" >
+                                        <option value="">请选择</option>
+                                        @for(item in provinceList){
+                                        <option value="${item.code}">${item.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="politics" name="政治面貌" >
+                                    </#SelectCon>
+                                </div>
+                                    <div class="col-sm-3">
+                                        <#SelectCon id="nation" name="民族" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="industryField" name="行业领域" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                        style="display: none"
+                                     @}
+                                    >
+                                    <#SelectCon id="source" name="申报来源">
+                                        <option value=""></option>
+                                        <option value="1">经我市申报并已经成功入选的泉州高层次人才</option>
+                                        <option value="2">从我市以外的其他县(市、区)变动到我市工作的泉州市高层次人才</option>
+                                        <option value="3">依据《晋江市优秀人才补充认定标准》申报认定</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                        style="display: none"
+                                     @}
+                                    >
+                                    <#SelectCon id="fromCity" name="入选来源县市">
+                                        <option value="">请选择</option>
+                                        @for(item in fromCityList){
+                                        <option value="${item.code}">${item.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                        style="display: none"
+                                     @}
+                                    >
+                                    <#SelectCon id="introductionMode" name="引进方式">
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="highEducation" name="最高学历" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#NameCon id="major" name="专业" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#NameCon id="title" name="职称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="studyAbroad" name="是否有留学经历" >
+                                        <option value="">请选择</option>
+                                        <option value="2">否</option>
+                                        <option value="1">是</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#NameCon id="phone" name="手机号码" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#NameCon id="email" name="电子邮箱" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="talentType" name="人才标签" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="talentArrange" name="人才层次" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="identifyCondition" name="认定条件" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="address" name="所属镇街" >
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="breakFaith" name="是否失信" >
+                                        <option value="">请选择</option>
+                                        <option value="2">否</option>
+                                        <option value="1">是</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <div class="input-group ">
+                                        <div class="input-group-btn">
+                                            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">公布入选月份
+                                            </button>
+                                        </div>
+                                        <input type="text"  class="form-control time" id="identifyMonth" name="identifyMonth"/>
+                                    </div>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="active" name="离职状态" >
+                                        <option value="">请选择</option>
+                                        <option value="1">在职</option>
+                                        <option value="2">离职</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#NameCon id="year" name="申报年度" />
+                                </div>
+                                <div class="col-sm-3" style="display: none">
+                                    <#SelectCon id="isPublic" name="公示状态" >
+                                        <option value="">请选择</option>
+                                        <option value="1">待核查征信</option>
+                                        <option value="2">待公示</option>
+                                        <option value="3">公示中</option>
+                                        <option value="4">待公布</option>
+                                        <option value="5">待发证</option>
+                                        <option value="6">已发证</option>
+                                    </#SelectCon>
+                                    <#SelectCon id="checkState" name="审核状态">
+                                        <option value="">请选择</option>
+                                        <option value="-1">审核不通过</option>
+                                        <option value="35">已通过</option>
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3"
+                                     @if(user.type==2){
+                                     style="display: none"
+                                     @}
+                                >
+                                    <#SelectCon id="isEffect" name="是否有效">
+                                        <option value="">请选择</option>
+                                        <option value="1">有效</option>
+                                        <option value="3">人才证书过期</option>
+                                        <option value="4">已取消</option>
+                                    </#SelectCon>
+                                </div>
+                            </div>
+                            <div class="row">
+                                <div class="col-sm-12" style="text-align: center">
+                                    <button type="button" style="cursor:pointer;" id="openSearch" onclick="$('.highSearch,#closeSearch').show();$(this).hide();" class="btn btn-sm btn-primary glyphicon glyphicon-eye-open" id="open-but">打开高级搜索</button>
+                                    <button type="button" style="cursor:pointer;display: none;" id="closeSearch" onclick="$('#openSearch').show();$('.highSearch').hide();$(this).hide();"  class="btn btn-sm btn-danger glyphicon glyphicon-eye-close" id="close-but">关闭高级搜索</button>
+                                    <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-info  glyphicon glyphicon-search" onclick="TalentInfo.search()">搜索</button>
+                                    <button type="button" style="cursor:pointer;"  class="btn btn-sm btn-warning glyphicon glyphicon-repeat" onclick="TalentInfo.reset()">重置</button>
+                                </div>
+                            </div>
+                        </form>
+                        <div class="hidden-xs" id="TalentInfoTableToolbar" role="group">
+                            @if(shiro.hasPermission("/talentInfo/libraryCancle")){
+                                <#button name="取消优秀人才" icon="fa-remove" clickFun="TalentInfo.cancle()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/libraryRecovery")){
+                                <#button name="恢复优秀人才" icon="fa-mail-reply" clickFun="TalentInfo.recovery()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/libraryExport")){
+                                <#button name="导出" icon="fa-file-excel-o" clickFun="TalentInfo.showExportModal()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/libraryDownload")){
+                                <#button name="下载" icon="fa-download" clickFun="TalentInfo.download()"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/libraryDetail")){
+                                <#button name="查看" icon="fa-eye" clickFun="TalentInfo.openTalentInfoDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/editBasicInfo")){
+                                <#button name="修改信息" icon="fa-edit" clickFun="TalentInfo.editBasicInfo()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/talentInfo/selectFirstInfo")){
+                                <#button name="查看首次申报信息" icon="fa-history" clickFun="TalentInfo.selectFirstInfo()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TalentInfoTable"/>
+                        <form id="publicForm" action="${ctxPath}/talentInfo/talentInfoPublic" target="hiddenIframe" style="display: none">
+                            <input name="type" id="type">
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!--导出模态框-->
+<div class="modal fade " id="commonExportModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
+    <div class="modal-dialog modal-lg" role="document" style="min-width: 1000px">
+        <div class="modal-content animated flipInY">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="firstModalLabel">导出</h4>
+            </div>
+            <div class="modal-body">
+                <form id="exportForm" action="${ctxPath}/talentInfoExport/publicExport" target="hiddenIframe" class="form-horizontal">
+                    <div class="form-group" id="field">
+                        <div id="field_info">
+                            <ul>
+                                @if(user.type==1){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstInJJTime"><span>首次来晋工作时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="industryFieldName"><span>行业领域</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sourceName"><span>申报来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="ourCitySourceName"><span>公布入选来源</span></li>
+                                <li style="width:24%"><input type="checkbox" value="fromCityName"><span>入选来源县市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzBatch"><span>入选名单批次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateStartTime"><span>泉州高层次人才证书发证日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="qzgccrcActiveTime"><span>泉州高层次人才证书的有效期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseTalentTypeName"><span>企业标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentTypeName"><span>人才标签</span></li>
+                                <li style="width:24%"><input type="checkbox" value="letterTime"><span>首次来晋行政介绍信时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="introductionModeName"><span>引进方式</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="lastYearWages"><span>上一年度年薪(元)</span></li>
+                                <li style="width:12%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业院校)</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNumber"><span>银行行号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="activeName"><span>离职状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="quitTime"><span>离职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="isPublicName"><span>公示状态</span></li>
+                                @}
+                                @if(user.type==2){
+                                <li style="width:24%"><input type="checkbox" value="year"><span>申报年度</span></li>
+                                <li style="width:24%"><input type="checkbox" value="enterpriseName"><span>企业名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="name"><span>姓名</span></li>
+                                <li style="width:24%"><input type="checkbox" value="sexName"><span>性别</span></li>
+                                <li style="width:24%"><input type="checkbox" value="birthday"><span>出生日期</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationName"><span>民族</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cardTypeName"><span>证件类型</span></li>
+                                <li style="width:24%"><input type="checkbox" value="idCard"><span>证件号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="nationalityName"><span>国籍/地区</span></li>
+                                <li style="width:24%"><input type="checkbox" value="politicsName"><span>政治面貌</span></li>
+                                <li style="width:24%"><input type="checkbox" value="streetName"><span>所属镇街</span></li>
+                                <li style="width:24%"><input type="checkbox" value="provinceName"><span>籍贯省</span></li>
+                                <li style="width:24%"><input type="checkbox" value="cityName"><span>籍贯市</span></li>
+                                <li style="width:24%"><input type="checkbox" value="countyName"><span>籍贯县</span></li>
+                                <li style="width:24%"><input type="checkbox" value="educationName"><span>最高学历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="graduateSchool"><span>毕业学校</span></li>
+                                <li style="width:24%"><input type="checkbox" value="major"><span>专业</span></li>
+                                <li style="width:24%"><input type="checkbox" value="post"><span>职务</span></li>
+                                <li style="width:24%"><input type="checkbox" value="phone"><span>手机号码</span></li>
+                                <li style="width:24%"><input type="checkbox" value="email"><span>电子邮箱</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bank"><span>开户银行</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankNetwork"><span>开户银行网点</span></li>
+                                <li style="width:24%"><input type="checkbox" value="bankAccount"><span>银行账号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="startTime"><span>工作合同开始时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="endTime"><span>工作合同结束时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="entryTime"><span>本单位入职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="talentArrangeName"><span>人才层次</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionText"><span>认定条件</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyConditionName"><span>认定条件名称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyGetTime"><span>认定条件证书取得时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="title"><span>职称</span></li>
+                                <li style="width:24%"><input type="checkbox" value="professionalQualifications"><span>国家职业资格</span></li>
+                                <li style="width:24%"><input type="checkbox" value="studyAbroadName"><span>是否有留学经历</span></li>
+                                <li style="width:24%"><input type="checkbox" value="breakFaithName"><span>曾被相关主管部门列为失信个人</span></li>
+                                <li style="width:24%"><input type="checkbox" value="identifyMonth"><span>公布入选月份</span></li>
+                                <li style="width:24%"><input type="checkbox" value="certificateNO"><span>人才编号</span></li>
+                                <li style="width:24%"><input type="checkbox" value="activeName"><span>离职状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="quitTime"><span>离职时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="firstSubmitTime"><span>首次确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="newSubmitTime"><span>最新确认提交时间</span></li>
+                                <li style="width:24%"><input type="checkbox" value="checkStateName"><span>审核状态</span></li>
+                                <li style="width:24%"><input type="checkbox" value="isPublicName"><span>公示状态</span></li>
+                                @}
+                            </ul>
+                        </div>
+                        <div class="form-group" style="text-align: center">
+                            <button type="button" class="btn btn-primary" onclick="TalentInfo.checkAll()">全选</button>
+                            <button type="button" class="btn btn-success" onclick="TalentInfo.unCheckAll()">反选</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" onclick="TalentInfo.export(5)">导出</button>
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_library.js"></script>-->
+<!--<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_library.js?v='+(new Date()).getTime()+'"><\/script>');
+    document.write('<script src="${ctxPath}/static/modular/talentIdentify/talentInfo/talentInfo_common.js?v='+(new Date()).getTime()+'"><\/script>');
+</script>
+@}
+

+ 74 - 0
app/admin/view/dict/add.html

@@ -0,0 +1,74 @@
+{extend name="layout/content"}
+{block name="content"}
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <input type="hidden" id="id" value="">
+
+            <div class="row">
+                <div class="col-sm-12" id="itemsArea">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">类型编码</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictCode" type="text">
+                        </div>
+                        <label class="col-sm-2 control-label">类型名称</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictName" type="text">
+                        </div>
+
+                        <div class="col-sm-2">
+                            <button type="button" class="btn btn-sm btn-info " onclick="DictInfoDlg.addItem()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;增加
+                            </button>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">备注</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" id="dictTips" type="text">
+                        </div>
+                    </div>
+                    <div class="hr-line-dashed"></div>
+
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-12" style="text-align: center">
+                    <button type="button" class="btn btn-sm btn-info " onclick="DictInfoDlg.addSubmit()" id="ensure">
+                        <i class="fa fa-check"></i>&nbsp;提交
+                    </button>
+                    <button type="button" class="btn btn-sm btn-danger " onclick="DictInfoDlg.close()" id="cancel">
+                        <i class="fa fa-eraser"></i>&nbsp;取消
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/template" id="itemTemplate">
+    <div class="form-group" name="dictItem" id="dictItem">
+            <label class="col-sm-1 control-label">值</label>
+            <div class="col-sm-2">
+                <input class="form-control" type="text" name="itemCode">
+            </div>
+            <label class="col-sm-1 control-label" >名称</label>
+            <div class="col-sm-2">
+                <input class="form-control" type="text" name="itemName">
+            </div>
+            <label class="col-sm-1 control-label" >序号</label>
+            <div class="col-sm-2">
+                <input class="form-control" type="text" name="itemNum">
+            </div>
+            <div class="col-sm-2">
+
+<button type="button" class="btn btn-sm btn-danger " onclick="DictInfoDlg.deleteItem(event)" id="cancel">
+    <i class="fa fa-remove"></i>&nbsp;删除
+</button>
+
+            </div>
+        </div>
+</script>
+<script src="/static/modular/system/dict/dict_info.js"></script>
+{/block}

+ 95 - 0
app/admin/view/dict/edit.html

@@ -0,0 +1,95 @@
+{extend name="layout/content"}
+{block name="content"}
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <input type="hidden" id="id" value="">
+
+            <div class="row">
+                <div class="col-sm-12" id="itemsArea">
+                    <input type="hidden" id="itemSize" value="{$dict.children|count}" />
+                    <div class="form-group">
+
+                        <label class="col-sm-2 control-label">类型编码</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictCode" type="text" value="{$dict.code}">
+                        </div>
+
+                        <label class="col-sm-2 control-label">类型名称</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictName" type="text" value="{$dict.name}">
+                            <input type="hidden" id="dictId" value="{$dict.id}">
+                        </div>
+
+                        <div class="col-sm-2">
+                            <button type="button" class="btn btn-sm btn-info " onclick="DictInfoDlg.addItem()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;增加
+                            </button>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">备注</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" id="dictTips" type="text" value="{$dict.tips}">
+                        </div>
+                    </div>
+                    <div class="hr-line-dashed"></div>
+                    {volist name="dict.children" id="item"}
+                    <div class="form-group" name="dictItem" id="dictItem">
+                        <label class="col-sm-1 control-label">值</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" type="text" name="itemCode" value="{$item.code}">
+                        </div>
+                        <label class="col-sm-1 control-label" >名称</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" type="text" name="itemName" value="{$item.name}">
+                        </div>
+                        <label class="col-sm-1 control-label" >序号</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" type="text" name="itemNum" value="{$item.num}">
+                        </div>
+                        <div class="col-sm-2">
+                            <button type="button" class="btn btn-sm btn-danger " onclick="DictInfoDlg.deleteItem(event)" id="cancel">
+                                <i class="fa fa-remove"></i>&nbsp;删除
+                            </button>
+                        </div>
+                    </div>
+                    {/volist}
+                </div>
+                <div class="row btn-group-m-t">
+                    <div class="col-sm-12" style="text-align: center">
+                        <button type="button" class="btn btn-sm btn-info " onclick="DictInfoDlg.editSubmit()" id="ensure">
+                            <i class="fa fa-check"></i>&nbsp;提交
+                        </button>
+                        <button type="button" class="btn btn-sm btn-danger " onclick="DictInfoDlg.close()" id="cancel">
+                            <i class="fa fa-eraser"></i>&nbsp;取消
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/template" id="itemTemplate">
+    <div class="form-group" name="dictItem" id="dictItem">
+    <label class="col-sm-1 control-label">值</label>
+    <div class="col-sm-2">
+    <input class="form-control" type="text" name="itemCode">
+    </div>
+    <label class="col-sm-1 control-label" >名称</label>
+    <div class="col-sm-2">
+    <input class="form-control" type="text" name="itemName">
+    </div>
+    <label class="col-sm-1 control-label" >序号</label>
+    <div class="col-sm-2">
+    <input class="form-control" type="text" name="itemNum">
+    </div>
+    <div class="col-sm-2">
+    <#button btnCss="danger" name="删除" id="cancel" icon="fa-remove" clickFun="DictInfoDlg.deleteItem(event)"/>
+    </div>
+    </div>
+</script>
+
+<script src="/static/modular/system/dict/dict_info.js"></script>
+{/block}

+ 59 - 0
app/admin/view/dict/index.html

@@ -0,0 +1,59 @@
+{extend name="layout/content"}
+{block name="content"}
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>字典管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <div class="input-group input-group-sm">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">名称
+                                        </button>
+                                    </div>
+                                    <input type="text" class="form-control" id="condition" placeholder="">
+                                </div>                            
+                            </div>
+                            <div class="col-sm-3">
+                                <button type="button" class="btn btn-sm btn-primary " onclick="Dict.search()" id="">
+                                    <i class="fa fa-search"></i>&nbsp;搜索
+                                </button>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="DictTableToolbar" role="group">
+                            {if condition="chkCommission('/admin/dict/add','/dict/add')"} 
+                            <button type="button" class="btn btn-sm btn-primary " onclick="Dict.openAddDict()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;添加
+                            </button>
+                            {/if}  
+                            {if condition="chkCommission('/admin/dict/edit','/dict/update')"}   
+                            <button type="button" class="btn btn-sm btn-primary " onclick="Dict.openDictDetail()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;修改
+                            </button>
+                            {/if}  
+                            {if condition="chkCommission('/admin/dict/delete','/dict/delete')"}   
+                            <button type="button" class="btn btn-sm btn-primary " onclick="Dict.delete()" id="">
+                                <i class="fa fa-plus"></i>&nbsp;删除
+                            </button>
+                            {/if}
+                        </div>
+                        <table id="DictTable" class="table-condensed" style="font-size: 10px;table-layout: fixed!important;" data-mobile-responsive="true" data-click-to-select="true">
+                            <thead>
+                                <tr>
+                                    <th data-field="selectItem" data-checkbox="true"></th>
+                                </tr>
+                            </thead>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="/static/modular/system/dict/dict.js"></script>
+{/block}

+ 2 - 2
app/admin/view/role/assign.html

@@ -39,8 +39,8 @@
             }
         };
 
-        var ztree = new $ZTree("zTree", "/admin/menu/menuTreeListByRoleId/"
-            + "${roleId}");
+        var ztree = new $ZTree("zTree", "/admin/menu/treelist/id/"
+            + "{$role.id}");
         ztree.setSettings(setting);
         ztree.init();
     }

+ 2 - 2
app/admin/view/role/edit.html

@@ -16,14 +16,14 @@
                         <label class="col-sm-3 control-label">上级名称</label>
                         <div class="col-sm-9">
                             <input class="form-control" id="pName" name="pName" value="{$role.pName}" type="text" style="background-color: #ffffff !important;" onclick="RolInfoDlg.showPNameSelectTree(); return false;" readonly="">
-                            <input id="pid" type="hidden"/>
+                            <input id="pid" value="{$role.pid}" type="hidden"/>
                         </div>
                     </div>
                     <div class="form-group">
                         <label class="col-sm-3 control-label">部门名称</label>
                         <div class="col-sm-9">
                             <input class="form-control" id="deptName" name="deptName" value="{$role.deptName}" type="text" style="background-color: #ffffff !important;" onclick="RolInfoDlg.showDeptSelectTree(); return false;" readonly="">
-                            <input id="deptid" type="hidden"/>
+                            <input id="deptid" value="{$role.deptid}" type="hidden"/>
                         </div>
                     </div>
                 </div>

+ 4 - 4
app/admin/view/role/index.html

@@ -27,22 +27,22 @@
                         <div class="hidden-xs" id="roleTableToolbar" role="group">
                             <if condition="chkCommission('/admin/role/add','/role/add')">                                
                                 <button type="button" class="btn btn-sm btn-primary " onclick="Role.openAddRole()">
-                                    <i class="fa fa-search"></i>添加
+                                    <i class="fa fa-plus"></i>添加
                                 </button>
                             </if>
                             <if condition="chkCommission('/admin/role/edit','/role/edit')"> 
                                 <button type="button" class="btn btn-sm btn-primary " onclick="Role.openChangeRole()">
-                                    <i class="fa fa-search"></i>修改
+                                    <i class="fa fa-edit"></i>修改
                                 </button>  
                             </if>
                             <if condition="chkCommission('/admin/role/remove','/role/remove')">   
                                 <button type="button" class="btn btn-sm btn-primary " onclick="Role.delRole()">
-                                    <i class="fa fa-search"></i>删除
+                                    <i class="fa fa-delete"></i>删除
                                 </button>
                             </if>
                             <if condition="chkCommission('/admin/role/setAuthority','/role/setAuthority')">   
                                 <button type="button" class="btn btn-sm btn-primary " onclick="Role.assign()">
-                                    <i class="fa fa-search"></i>权限配置
+                                    <i class="fa fa-user-secret"></i>权限配置
                                 </button>
                             </if>
                         </div>

+ 30 - 0
app/common.php

@@ -36,3 +36,33 @@ function simple_hash($algo = 'md5', $password = '', $salt = '', $hash_iterations
 function chkCommission($url, $old_url) {
     return app\common\api\MenuApi::chkPermission($url, $old_url);
 }
+
+/**
+ * 随机字符ID
+ * @return type
+ */
+function getStringId() {
+    $day = random_int(10, 30);
+    $time = strtotime("-4 years -6 months -" . $day . " days");
+    $randnum = random_int(100000000, 999999999);
+    $randnum = str_shuffle($randnum);
+    return $time . $randnum;
+}
+
+function isNullOrEmpty($obj) {
+    if (!$obj || $obj == "" || !isset($obj))
+        return "";
+    return $obj;
+}
+
+function getTreeList($array, $id_field = "id", $pid_field = "pid", $value = "0") {
+    static $result = [];
+    foreach ($array as $key => $item) {
+        if ($value == $item[$pid_field]) {
+            $result[] = $item;
+            unset($array[$key]);
+            getTreeList($array, $id_field, $pid_field, $item[$id_field]);
+        }
+    }
+    return $result;
+}

+ 167 - 0
app/common/api/BatchApi.php

@@ -0,0 +1,167 @@
+<?php
+
+namespace app\common\api;
+
+use app\common\model\Batch;
+
+/**
+ * Description of BatchApi
+ *
+ * @author sgq
+ */
+class BatchApi {
+
+    public static function getOne($id) {
+        return Batch::findOrEmpty($id)->toArray();
+    }
+
+    public static function getList($request) {
+        $order = trim($request->param("order")) ?: "desc";
+        $offset = trim($request->param("offset")) ?: 0;
+        $limit = trim($request->param("limit")) ?: 10;
+        $type = trim($request->param("type"));
+        $active = trim($request->param("active"));
+        $where = [];
+        if ($type) {
+            $where[] = ["type", "=", $type];
+        }
+        if ($active) {
+            $where[] = ["active", "=", $active];
+        }
+        $count = Batch::where($where)->count();
+        $list = Batch::where($where)->limit($offset, $limit)->order("createTime " . $order)->select()->toArray();
+        $projects = DictApi::selectByParentCode("un_project"); //申报类型
+        foreach ($list as $key => $item) {
+            $list[$key]["type"] = $projects[$item["type"]];
+        }
+        return ["total" => $count, "rows" => $list];
+    }
+
+    public static function create($params) {
+        if (!$params["type"])
+            return ["msg" => "申报类别不能为空"];
+        if (!$params["batch"])
+            return ["msg" => "批次不能为空"];
+        $where[] = ["type", "=", $params["type"]];
+        $where[] = ["batch", "=", $params["batch"]];
+        $count = Batch::where($where)->count();
+        if ($count > 0) {
+            return ["msg" => "该申报类别的批次重复"];
+        }
+        if (!strtotime($params["startTime"]) && $params["startTime"]) {
+            return ["msg" => "申报开始时间错误"];
+        }
+        if (!strtotime($params["endTime"]) && $params["endTime"]) {
+            return ["msg" => "申报截止时间错误"];
+        }
+        if (!strtotime($params["submitEndTime"]) && $params["submitEndTime"]) {
+            return ["msg" => "提交截止时间错误"];
+        }
+        if (!strtotime($params["publicStartTime"]) && $params["publicStartTime"]) {
+            return ["msg" => "公示开始时间错误"];
+        }
+        if (!strtotime($params["publicEndTime"]) && $params["publicEndTime"]) {
+            return ["msg" => "公示截止时间错误"];
+        }
+
+        $id = getStringId();
+        $data["id"] = $id;
+        $data["type"] = $params["type"];
+        $data["source"] = $params["source"];
+        $data["batch"] = $params["batch"];
+        $data["active"] = $params["active"] ?: 2;
+        $data["description"] = $params["description"];
+        $data["type"] = $params["type"];
+        $data["startTime"] = $params["startTime"];
+        $data["endTime"] = $params["endTime"];
+        $data["submitEndTime"] = $params["submitEndTime"];
+        $data["publicStartTime"] = $params["publicStartTime"];
+        $data["publicEndTime"] = $params["publicEndTime"];
+        $data["averageWage"] = $params["averageWage"];
+        $data["createTime"] = date("Y-m-d H:i:s");
+        $data["createUser"] = session("user")["uid"];
+        Batch::insert($data);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function update($params) {
+        if (!$params["type"])
+            return ["msg" => "申报类别不能为空"];
+        if (!$params["batch"])
+            return ["msg" => "批次不能为空"];
+        $where[] = ["type", "=", $params["type"]];
+        $where[] = ["batch", "=", $params["batch"]];
+        $where[] = ["id", "<>", $params["id"]];
+        $count = Batch::where($where)->count();
+        if ($count > 0) {
+            return ["msg" => "该申报类别的批次重复"];
+        }
+        if (!strtotime($params["startTime"]) && $params["startTime"]) {
+            return ["msg" => "申报开始时间错误"];
+        }
+        if (!strtotime($params["endTime"]) && $params["endTime"]) {
+            return ["msg" => "申报截止时间错误"];
+        }
+        if (!strtotime($params["submitEndTime"]) && $params["submitEndTime"]) {
+            return ["msg" => "提交截止时间错误"];
+        }
+        if (!strtotime($params["publicStartTime"]) && $params["publicStartTime"]) {
+            return ["msg" => "公示开始时间错误"];
+        }
+        if (!strtotime($params["publicEndTime"]) && $params["publicEndTime"]) {
+            return ["msg" => "公示截止时间错误"];
+        }
+
+        $data["id"] = $params["id"];
+        $data["type"] = $params["type"];
+        $data["source"] = $params["source"];
+        $data["batch"] = $params["batch"];
+        $data["active"] = $params["active"] ?: 2;
+        $data["description"] = $params["description"];
+        $data["type"] = $params["type"];
+        $data["startTime"] = $params["startTime"];
+        $data["endTime"] = $params["endTime"];
+        $data["submitEndTime"] = $params["submitEndTime"];
+        $data["publicStartTime"] = $params["publicStartTime"];
+        $data["publicEndTime"] = $params["publicEndTime"];
+        $data["averageWage"] = $params["averageWage"];
+        $data["updateTime"] = date("Y-m-d H:i:s");
+        $data["updateUser"] = session("user")["uid"];
+        \think\facade\Db::table("sys_batch")->update($data);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function delete($id) {
+        Batch::where(["id" => $id])->delete();
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function setActive($id, $active) {
+        $data["id"] = $id;
+        $data["active"] = $active ?: 2;
+        Batch::update($data);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    /**
+     * 
+     * @param type $type 申报类别
+     * @param type $talentType 人才类型
+     */
+    public static function checkBatchValid($type, $talentType) {
+        $now = time();
+        $where = [];
+        $where[] = ["active", "=", 1];
+        $where[] = ["source", "=", $talentType];
+        $where[] = ["type", "=", $type];
+        $batch = Batch::where($where)->findOrEmpty();
+        if (!$batch)
+            return ["msg" => "该申报未启动"];
+        if (strtotime($batch["startTime"]) > $now)
+            return ["msg" => sprintf("申报还未开始,日期为:%s - %s", $batch["startTime"], $batch["endTime"])];
+        if (strtotime($batch["endTime"]) < $now)
+            return ["msg" => "申报已结束,无法申报"];
+        return ["code" => 200, "batch" => $batch["batch"]];
+    }
+
+}

+ 119 - 1
app/common/api/DictApi.php

@@ -3,6 +3,7 @@
 namespace app\common\api;
 
 use app\common\model\Dict;
+use think\Facade\Db;
 
 /**
  * Description of DictApi
@@ -11,8 +12,125 @@ use app\common\model\Dict;
  */
 class DictApi {
 
+    public static function create($params) {
+        $data["code"] = $params["dictCode"];
+        $data["name"] = $params["dictName"];
+        $data["tips"] = $params["dictTips"];
+        $data["pid"] = 0;
+        $values = $params["dictValues"];
+        if (self::isExistByCode($data["code"]))
+            return ["msg" => sprintf("编码[%s]已经存在", $data["code"])];
+        $items = array_filter(explode(";", $values));
+        $id = Dict::insertGetId($data);
+        $childs = [];
+        for ($i = 0; $i < count($items); $i++) {
+            $fields = array_filter(explode(":", $items[$i]));
+            $childs[] = ["pid" => $id, "code" => $fields[0], "name" => $fields[1], "num" => $fields[2]];
+        }
+        Dict::insertAll($childs);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function update($params) {
+        $data["id"] = $params["dictId"];
+        $data["code"] = $params["dictCode"];
+        $data["name"] = $params["dictName"];
+        $data["tips"] = $params["dictTips"];
+        $data["pid"] = 0;
+        $values = $params["dictValues"];
+        if (self::isExistByCode($data["code"], $params["dictId"]))
+            return ["msg" => sprintf("编码[%s]已经存在", $data["code"])];
+        $items = array_filter(explode(";", $values));
+        $id = Dict::table('sys_dict')->save($data);
+        //删除原来的子项
+        Dict::where(["pid" => $params["dictId"]])->delete();
+        $childs = [];
+        for ($i = 0; $i < count($items); $i++) {
+            $fields = array_filter(explode(":", $items[$i]));
+            $childs[] = ["pid" => $params["dictId"], "code" => $fields[0], "name" => $fields[1], "num" => $fields[2]];
+        }
+        Dict::insertAll($childs);
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function delete($id) {
+        Dict::where(["id" => $id])->delete();
+        Dict::where(["pid" => $id])->delete();
+        return ["code" => 200, "msg" => "成功"];
+    }
+
+    public static function isExistByCode($code, $id = 0) {
+        $where = [];
+        if ($id > 0) {
+            $where[] = ["id", "<>", $id];
+        }
+        $where[] = ["code", "=", $code];
+        $dict = Dict::where($where)->findOrEmpty()->toArray();
+        return $dict;
+    }
+
+    /**
+     * 获取一条
+     * @param type $id
+     * @return type
+     */
+    public static function getOne($id) {
+        $info = Dict::where("id", $id)->findOrEmpty()->toArray();
+        if ($info) {
+            $items = Dict::where("pid", "=", $id)->select()->toArray();
+            $info["children"] = $items;
+        }
+        return $info;
+    }
+
+    /**
+     * 获取列表
+     * @param type $request
+     * @return type
+     */
+    public static function getList($request) {
+        $order = trim($request->param("order")) ?: "desc";
+        $offset = trim($request->param("offset")) ?: 0;
+        $limit = trim($request->param("limit")) ?: 10;
+        $name = trim($request->param("condition"));
+        $where = [];
+        $where[] = ["pid", "=", "0"];
+        if ($name) {
+            $where[] = ["name", "like", "%" . $name . "%"];
+        }
+        $count = Dict::where($where)->count();
+        $list = Dict::where($where)->limit($offset, $limit)->order("id " . $order)->select()->toArray();
+        foreach ($list as &$item) {
+            $items = Dict::where("pid", "=", $item["id"])->column("name");
+            $item["detail"] = implode(",", $items);
+        }
+        return ["total" => $count, "rows" => $list];
+    }
+
+    /**
+     * 
+     * @param type $code
+     * @return type
+     */
     public static function selectByParentCode($code) {
-        $dictList = Dict::where("pcode", $code)->select()->toArray();
+        $parent = Dict::where("code", $code)->findOrEmpty()->toArray();
+        $dictList = Dict::where("pid", $parent["id"])->select()->toArray();
+        $tmp = [];
+        foreach ($dictList as $dict) {
+            $tmp[$dict["code"]] = $dict["name"];
+        }
+        return $tmp;
+    }
+
+    /**
+     * 
+     * @param type $code
+     * @return type
+     */
+    public static function findChildDictByCode($code) {
+        $parent = Dict::where("code", $code)->findOrEmpty()->toArray();
+        $dictList = Dict::where("pid", $parent["id"])->select()->toArray();
+        return $dictList;
     }
 
 }

+ 15 - 2
app/common/api/MenuApi.php

@@ -20,6 +20,19 @@ class MenuApi {
         return self::buildMenu($menus);
     }
 
+    public static function getPrivilagesByRoleid($roleid) {
+        $role = Role::find($roleid);
+        $menu_ids = $role->sysRelation->column("menuid");
+        $menus = Menu::where("status", 1)->order("levels asc,num asc")->select()->toArray();
+        $codeToPid = [];
+        foreach ($menus as &$menu) {
+            $codeToPid[$menu["code"]] = $menu["id"];
+            $menu["checked"] = in_array($menu["id"], $menu_ids) ? true : false;
+            $menu["pid"] = isset($codeToPid[$menu["pcode"]]) ? $codeToPid[$menu["pcode"]] : 0;
+        }unset($menu);
+        return $menus;
+    }
+
     /**
      * 递归获取多级菜单集合
      * @param type $menus
@@ -63,8 +76,8 @@ class MenuApi {
         $menus = [];
         $menus[] = ["type" => [1, 2, 3], "code" => "qyzx", "pcode" => "0", "name" => "企业用户中心", "url" => "", "icon" => "fa-user"];
         $menus[] = ["type" => [1, 2], "code" => "yhfk", "pcode" => "0", "name" => "用户反馈", "url" => "", "icon" => "fa-bug"];
-        $menus[] = ["type" => [1, 2], "code" => "rcrd", "pcode" => "0", "name" => "人才认定", "url" => "", "icon" => "fa-thumbs-o-up"];
-        $menus[] = ["type" => [1, 2], "code" => "rcrdsb", "pcode" => "rcrd", "name" => "人才认定申报", "url" => "", "icon" => "fa-thumbs-up"];
+        $menus[] = ["type" => [1, 2], "code" => "rcrd", "pcode" => "0", "name" => "人才认定", "url" => "#", "icon" => "fa-thumbs-o-up"];
+        $menus[] = ["type" => [1, 2], "code" => "rcrdsb", "pcode" => "rcrd", "name" => "人才认定申报", "url" => "/enterprise/talent", "icon" => "fa-thumbs-up"];
         $menus[] = ["type" => [1, 2], "code" => "yxrck", "pcode" => "rcrd", "name" => "优秀人才库", "url" => "", "icon" => "fa-thumbs-up"];
         $menus[] = ["type" => [1, 2], "code" => "lzsb", "pcode" => "rcrd", "name" => "离职申报", "url" => "", "icon" => "fa-thumbs-up"];
         $menus[] = ["type" => [1, 2], "code" => "gzdwbg", "pcode" => "rcrd", "name" => "工作单位变更", "url" => "", "icon" => "fa-thumbs-up"];

+ 57 - 0
app/common/api/UploadApi.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace app\common\api;
+
+/**
+ * Description of UploadApi
+ *
+ * @author sgq
+ */
+class UploadApi {
+
+    protected $fileSize = 5 * 1024 * 1024;
+    protected $fileExt = "jpg,png,gif,pdf";
+    protected $fileMime = "image/jpg,image/png,image/gif,application/pdf";
+
+    public function __construct($config = []) {
+        $this->fileSize = $config["maxSize"] ?: $this->fileSize;
+        $this->fileExt = $config["fileExt"] ?: $this->fileExt;
+        $this->fileMime = $config["fileMime"] ?: $this->fileMime;
+    }
+
+    /**
+     * 批量上传文件
+     * @param type $files
+     * @return type
+     */
+    public function uploadList($files) {
+        try {
+            validate(['image' => 'fileSize:' . $this->maxSize . '|fileExt:' . $this->fileExt . '|fileMime:' . $this->fileMime])
+                    ->check($files);
+            $savename = [];
+            foreach ($files as $file) {
+                $savename[] = \think\facade\Filesystem::disk("public")->putFile('topic', $file);
+            }
+            return $savename;
+        } catch (\think\exception\ValidateException $e) {
+            echo $e->getMessage();
+        }
+    }
+
+    /**
+     * 单个文件上传
+     * @param type $file
+     * @return type
+     */
+    public function uploadOne($file) {
+        try {
+            validate(['image' => 'fileSize:' . $this->maxSize . '|fileExt:' . $this->fileExt . '|fileMime:' . $this->fileMime])
+                    ->check($file);
+            $savename = \think\facade\Filesystem::disk("public")->putFile('topic', $file);
+            return $savename;
+        } catch (\think\exception\ValidateException $e) {
+            echo $e->getMessage();
+        }
+    }
+
+}

+ 3 - 3
app/common/api/UserApi.php

@@ -28,15 +28,15 @@ class UserApi {
         switch ($usertype) {
             case 2:
                 //企业
-                $user = Enterprise::where(['username' => $username])->find();
+                $user = Enterprise::where(['username' => $username])->findOrEmpty();
                 break;
             case 3:
                 //个人
-                $user = Person::where('username', $username)->find();
+                $user = Person::where('username', $username)->findOrEmpty();
                 break;
             default:
                 //管理员
-                $user = User::where(['account' => $username])->find();
+                $user = User::where(['account' => $username])->findOrEmpty();
                 break;
         }
         $this->info = $user;

+ 23 - 0
app/common/controller/Batch.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\common\controller;
+
+use app\BaseController;
+use app\common\middleware\Auth;
+use app\common\api\BatchApi;
+
+/**
+ * Description of Batch
+ *
+ * @author sgq
+ */
+class Batch extends BaseController {
+
+    protected $middleware = [Auth::class];
+
+    public function checkBatchValid($type) {
+        $user = session("user");
+        return json(BatchApi::checkBatchValid($type, $user["type"]));
+    }
+
+}

+ 23 - 0
app/common/controller/Tool.php

@@ -5,6 +5,7 @@ namespace app\common\controller;
 use app\BaseController;
 use app\common\middleware\Auth;
 use app\admin\model\Notice as NoticeModel;
+use think\facade\Db;
 
 /**
  * Description of Tool
@@ -28,4 +29,26 @@ class Tool extends BaseController {
         return json(["code" => "200", "msg" => "", "obj" => $result]);
     }
 
+    public function findCommonFileType() {
+        
+    }
+
+    public function getProvinceSelect() {
+        $where = [];
+        $where[] = ["code", "like", "%0000"];
+        return json(Db::table("un_common_location")->where($where)->select()->toArray());
+    }
+
+    public function findCityByProvinceSelect() {
+        $code = $this->request->param("code");
+        $province_prefix = substr($code, 0, 2);
+        return json(Db::table("un_common_location")->where("code", "like", $province_prefix . "%00")->select()->toArray());
+    }
+
+    public function findCountyByCitySelect() {
+        $code = $this->request->param("code");
+        $city_prefix = substr($code, 0, 4);
+        return json(Db::table("un_common_location")->where("code", "like", $city_prefix . "%")->select()->toArray());
+    }
+
 }

+ 16 - 0
app/common/model/Batch.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+/**
+ * Description of Batch
+ *
+ * @author sgq
+ */
+class Batch extends Model {
+
+    protected $table = "sys_batch";
+
+}

+ 1 - 1
app/common/model/Dict.php

@@ -11,6 +11,6 @@ use think\Model;
  */
 class Dict extends Model {
 
-    protected $table = "sys_dict";
+    protected $table = "new_talent_dict";
 
 }

+ 10 - 6
app/enterprise/api/TalentApi.php

@@ -3,6 +3,7 @@
 namespace app\enterprise\api;
 
 use app\enterprise\model\Talent;
+use app\common\api\DictApi;
 
 /**
  * Description of TalentApi
@@ -68,12 +69,15 @@ class TalentApi {
             $where[] = [["checkState", 35], ["isPublic", 6]];
         }
         $count = Talent::where($where)->count();
-        $list = Talent::where($where)->limit($offset, $limit)->order("createTime ".$order)->select()->toArray();
-        $talentTypeList = \app\common\api\DictApi::selectByParentCode("un_jbt_talentType");//人才标签
-        foreach($list as $key=>$list){            
-            $list[$key]["talentArrangeName"]='';
-            $list[$key]["talentTypeName"]='';
-            $list[$key]["identifyConditionName"]='';
+        $list = Talent::where($where)->limit($offset, $limit)->order("createTime " . $order)->select()->toArray();
+        $talentTypeList = DictApi::selectByParentCode("un_jbt_talentType"); //人才标签
+        $talentArangeList = DictApi::selectByParentCode("un_talentLevel");//人才层次
+        //$talentTypeNameList = DictApi::selectByParentCode("un_talentLevel");//认定条件
+        //DictApi::selectByParentCode($code);
+        foreach ($list as $key => $item) {
+            $list[$key]["talentArrangeName"] = $talentArangeList[$item["talentArrange"]];
+            $list[$key]["talentTypeName"] = $talentTypeList[$item["talentType"]];
+            $list[$key]["identifyConditionText"] = "";
         }
         return ["total" => $count, "rows" => $list];
     }

+ 4 - 0
app/enterprise/controller/Talent.php

@@ -20,5 +20,9 @@ class Talent extends EnterpriseController {
         $res = TalentApi::getList($this->request);
         return json($res);
     }
+    
+    public function add(){
+        return view();
+    }
 
 }

+ 354 - 0
app/enterprise/view/talent/add.html

@@ -0,0 +1,354 @@
+{extend name="layout/content"}
+{block name="content"}
+<style type="text/css">
+    .spacing {
+        margin-bottom: 10px;
+        padding-right:4px;
+        padding-left: 4px;
+    }
+    #talentInfoForm label {
+        font-size: xx-small;
+    }
+    .has-feedback .form-control {
+        padding-right: 5px;
+    }
+    .control-label{
+        color: #337ab7;
+    }
+    .rowGroup{
+        padding-bottom: 5px;
+    }
+    .imgs li{
+        list-style: none;
+        float: left;
+        border: 1px solid #d8d1d1;
+        text-align: center;
+        height: 30px;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <div class="col-sm-12" >
+                    <div class="tab-content">
+                        <div id="tab-1" class="tab-pane active">
+                            <div class="panel-body" >
+                                <div class="panel panel-default">
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">基础信息</div>
+                                    <div class="panel-body">
+                                        <form id="talentInfoForm" class="form-horizontal" action="/api/talentInfo/upsert" method="post" enctype="multipart/form-data" target="hiddenIframe">
+                                            <div class="col-sm-12 form-group-sm">
+                                                <input type="hidden" name="id" id="id" value="">
+                                                <input type="hidden" name="year" id="year" value="${year}">
+                                                <input type="hidden" name="enterpriseId" id="enterpriseId" value="${enterprise.id}">
+                                                <input type="hidden" name="type" id="type" value="${enterprise.type}">
+                                                <input type="hidden" name="checkState" id="checkState" value="">
+                                                <input type="file" name="photo" id="photo" style="display: none">
+                                                <input type="hidden" name="provinceName" id="provinceName" value="">
+                                                <input type="hidden" name="cityName" id="cityName" value="">
+                                                <input type="hidden" name="countyName" id="countyName" value="">
+                                                <input type="hidden" name="fromCityName" id="fromCityName" value="">
+                                                <input type="hidden" name="hand" id="hand" value="${hand}">
+                                                <div class="row">
+                                                    <div class="col-sm-11">
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>人才类型</label>
+                                                            <select class="form-control" id="source" name="source" onchange="TalentInfoInfoDlg.sourceChange()">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">现有人才。含经晋江市认定且还在晋江市就业创业的人才,或在晋江市就业创业但未曾申报过晋江市优秀人才的人才。</option>
+                                                                <option value="2">新引进人才。含本办法出台后首次从晋江市以外引进认定的人才,或者流出晋江市满3年后又返回晋江市就业创业<不含企业集团内部人员调动>的人才。</option>
+                                                                <option value="3">预引进人才。含已经与晋江市用人单位达成就业意向且签订预引进意向合作协议(合同)的人才,或拟来我市创业且提交企业名称预先核准的人才。</option>                                                                
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>在我市缴交社会保险或个人所得税月份</label>
+                                                            <input type="text" class="form-control" id="name" name="name" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>劳动合同起止时间</label>
+                                                            <input type="text" class="form-control" id="name" name="name" />
+                                                        </div>                                                        
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>单位标签</label>
+                                                            <select class="form-control" id="talentType" name="talentType" onchange="TalentInfoInfoDlg.typeChange(this)" >
+                                                                <option value="">请选择</option>
+                                                                <option value="1">国字号平台</option>
+                                                                <option value="2">民营企业</option>
+                                                                <option value="3">媒体单位</option>
+                                                                <option value="4">民办非企业</option>
+                                                                <option value="5">国有企业(我市本级国有股比超过50%)</option>
+                                                                <option value="6">国有企业(我市本级国有股比未超过50%)</option>
+                                                                <option value="7">金融机构(银行保险)</option>
+                                                                <option value="8">金融机构(银行保险除外)</option>
+                                                                <option value="9">在站博士后”</option>
+                                                                <option value="10">事业单位(医疗教育除外)</option>
+                                                                <option value="11">其他</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>单位名称</label>
+                                                            <input type="text" class="form-control" id="companyName"  name="companyName" readonly="readonly" value="${enterprise.name}" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>所属镇街</label>
+                                                            <select class="form-control" id="address" name="address" value="${enterprise.street}" disabled="disabled"></select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>产业领域</label>
+                                                            <select type="text" class="form-control" id="industryField" value="${enterprise.industryField}" name="industryField" disabled="disabled">
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>姓名</label>
+                                                            <input type="text" class="form-control" id="name" name="name" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>证件类型</label>
+                                                            <select class="form-control" id="cardType" name="cardType">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">身份证</option>
+                                                                <option value="2">通行证</option>
+                                                                <option value="3">护照</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>证件号码</label>
+                                                            <input class="form-control" id="idCard" name="idCard">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>性别</label>
+                                                            <select class="form-control" id="sex" name="sex">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">男</option>
+                                                                <option value="2">女</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>出生日期</label>
+                                                            <input type="text" class="form-control date" id="birthday" name="birthday"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>国籍/地区</label>
+                                                            <select class="form-control" id="nationality" name="nationality">
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>籍贯省</label>
+                                                            <select class="form-control " onchange="TalentInfoInfoDlg.afterSelectProvince()" id="provinceCode" name="provinceCode">
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>籍贯市</label>
+                                                            <select class="form-control" onchange="TalentInfoInfoDlg.afterSelectCity()" id="cityCode" name="cityCode"></select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>籍贯县</label>
+                                                            <select class="form-control" id="countyCode" name="countyCode"></select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>民族</label>
+                                                            <select class="form-control" id="nation" name="nation">
+                                                            </select>
+                                                        </div>       
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>政治面貌</label>
+                                                            <select class="form-control" id="politics" name="politics">
+                                                            </select>
+                                                        </div>  
+                                                    </div>
+                                                    <div class="col-sm-1">
+                                                        <img id="photoImg" src="/static/img/photo.png" onclick="$('#photo').click()" style="height: 110px;width: 76px;padding-bottom: 5px;">
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">个人信息填报及人才认定申请</div>
+                                    <div class="panel-body">
+                                        <form id="talentInfoForm" class="form-horizontal" action="/api/talentInfo/upsert" method="post" enctype="multipart/form-data" target="hiddenIframe">
+                                            <div class="col-sm-12 form-group-sm">
+                                                <div class="row">
+                                                    <div class="col-sm-11">                          
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>申报年度</label>
+                                                            <input type="text" class="form-control" name="year" id="year" value="${year}">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>首次来晋工作时间</label>
+                                                            <input type="text" class="form-control date" id="firstInJJTime" name="firstInJJTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class=" control-label spacing"><span style="color: red">*</span>引进方式</label>
+                                                            <select class="form-control" id="introductionMode" name="introductionMode" data-placeholder="引进方式">
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>本单位入职时间</label>
+                                                            <input type="text" class="form-control date" id="entryTime" name="entryTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>本单位现任职务</label>
+                                                            <input type="text" class="form-control" id="post" name="post"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>上一年度年薪(元)</label>
+                                                            <input type="text" class="form-control" id="lastYearWages" name="lastYearWages"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>申报来源</label>
+                                                            <select class="form-control" id="source" name="source" onchange="TalentInfoInfoDlg.sourceChange()">
+                                                                <option value="">请选择</option>
+                                                                <option value="1">经我市申报入选省级人才且符合我市产业人才认定标准。</option>
+                                                                <option value="2">经我市申报入选泉州市高层次人才且符合我市产业人才认定标准。</option>
+                                                                <option value="3">其他地级市入选省级人才申报认定。</option>
+                                                                <option value="4">其他县市区入选泉州市高层次人才申报认定。</option>
+                                                                <option value="5">依据晋江现代产业人才认定标准(晋江补充条款)申报认定。</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>申报来源批次</label>
+                                                            <input type="text" class="form-control date" id="certificateStartTime" name="source_batch"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>福建省高层次人才证书发证日期</label>
+                                                            <input type="text" class="form-control date" id="certificateStartTime" name="certificateStartTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>福建省高层次人才证书有效期</label>
+                                                            <input type="text" class="form-control date" id="qzgccrcActiveTime" name="qzgccrcActiveTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>泉州高层次人才证书发证日期</label>
+                                                            <input type="text" class="form-control date" id="certificateStartTime" name="certificateStartTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3" style="display: none">
+                                                            <label class=" control-label spacing" ><span style="color: red">*</span>泉州高层次人才证书有效期</label>
+                                                            <input type="text" class="form-control date" id="qzgccrcActiveTime" name="qzgccrcActiveTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>人才层次</label>
+                                                            <select class="form-control" id="talentArrange" name="talentArrange" onchange="TalentInfoInfoDlg.getIdentifyCondition()"></select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>认定条件</label>
+                                                            <select class="chosen" id="identifyCondition" name="identifyCondition"></select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>认定条件证书取得时间</label>
+                                                            <input type="text" class="form-control date" id="identifyGetTime" name="identifyGetTime"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>最高学历</label>
+                                                            <select class="form-control" id="highEducation" name="highEducation"></select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>毕业院校</label>
+                                                            <input type="text" class="form-control" id="graduateSchool" name="graduateSchool">
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>专业</label>
+                                                            <input type="text" class="form-control" id="major" name="major"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing">专业技术职称</label>
+                                                            <input type="text" class="form-control" id="title" name="title"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>开户银行</label>
+                                                            <input type="text" class="form-control" onchange="TalentInfoInfoDlg.bankChange()" id="bank" name="bank" placeholder="XX银行"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>银行行号</label>
+                                                            <input type="text" class="form-control" id="bankNumber" name="bankNumber"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>开户银行网点</label>
+                                                            <input type="text" class="form-control" id="bankNetwork" name="bankNetwork" placeholder="XX银行XX省XX市XX支行/分行/分理处"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>银行账号</label>
+                                                            <input type="text" class="form-control" id="bankAccount" name="bankAccount" />
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing">是否有留学经历</label>
+                                                            <select class="form-control" id="studyAbroad" name="study_broad">
+                                                                <option value="2">否</option>
+                                                                <option value="1">是</option>
+                                                            </select>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>毕业院校</label>
+                                                            <input type="text" class="form-control" id="phone" name="broad_" maxlength="11"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>专业</label>
+                                                            <input type="text" class="form-control" id="phone" name="broad_profession" maxlength="11"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>手机号码</label>
+                                                            <input type="text" class="form-control" id="phone" name="phone" maxlength="11"/>
+                                                        </div>
+                                                        <div class="rowGroup col-sm-3">
+                                                            <label class="control-label spacing"><span style="color: red">*</span>电子邮箱</label>
+                                                            <input type="text" class="form-control" id="email" name="email"/>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <div class="rowGroup col-sm-12">
+                                                        <label class=" control-label spacing"><span style="color: red">*</span>教育背景及工作简历</label>
+                                                        <textarea style="overflow: auto;word-break: break-all; " class="form-control" id="educationAndResume" name="educationAndResume" rows="2"></textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <div class="rowGroup col-sm-12">
+                                                        <label class=" control-label spacing"><span style="color: red">*</span>主要业绩及取得的荣誉</label>
+                                                        <textarea style="overflow: auto;word-break: break-all; " class="form-control" id="mainHonours" name="mainHonours" rows="2"></textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="row">
+                                                    <label class="col-sm-12 control-label spacing" style="text-align: left"><span style="color: red">声明:本人对输入材料的真实性负全部责任</span></label>
+                                                </div>
+                                            </div>
+                                        </form>
+                                    </div>                                    
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">附件上传</div>
+                                    <div class="panel-body">
+                                        <table id="fileTable" class="table-condensed" style="font-size: 10px;table-layout: fixed!important;" data-mobile-responsive="true" data-click-to-select="true">
+                                            <thead>
+                                                <tr>
+                                                    <th data-field="selectItem" data-checkbox="true"></th>
+                                                </tr>
+                                            </thead>
+                                        </table>
+                                        <label style="padding-top: 15px;color: red">*请根据上传的附件材料,编辑好相应的文件夹名称</label>
+                                        <form id="uploadForm" action="/api/talentInfo/addTalentFile" method="post" class="form-horizontal" enctype="multipart/form-data" target="hiddenIframe" style="display: none">
+                                            <input type='hidden' id="fileId" name="fileId" >
+                                            <input type='file' id="upload_file" name="fileUrl" style='display: none'>
+                                            <input type='hidden' id="mainId" name="mainId" >
+                                            <input type='hidden' id="fileTypeId" name="fileTypeId" >
+                                            <input type='hidden' id="index" name="index" >
+                                            <input type="hidden" name="backName" value="TalentInfoInfoDlg.callBack">
+                                            <input type="type" name="type" value="1">
+                                        </form>
+                                    </div>
+                                    <div class="panel-heading" onclick="$(this).next().toggle()">日志</div>
+                                    <table id="logTable">
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<iframe id="hiddenIframe" name="hiddenIframe" style="display: none;"></iframe>
+<!--<script src="${ctxPath}/static/modular/gate/talentInfo/talentInfo_info.js"></script>-->
+<script type="text/javascript">
+    document.write('<script src="/static/modular/gate/talentInfo/talentInfo_info.js?v=' + (new Date()).getTime() + '"><\/script>');
+    document.write('<script src="/static/modular/common/config.js?v=' + (new Date()).getTime() + '"><\/script>');
+</script>
+{/block}

+ 45 - 0
app/index/config/route.php

@@ -0,0 +1,45 @@
+<?php
+// +----------------------------------------------------------------------
+// | 路由设置
+// +----------------------------------------------------------------------
+
+return [
+    // pathinfo分隔符
+    'pathinfo_depr'         => '/',
+    // URL伪静态后缀
+    'url_html_suffix'       => 'html',
+    // URL普通方式参数 用于自动生成
+    'url_common_param'      => true,
+    // 是否开启路由延迟解析
+    'url_lazy_route'        => false,
+    // 是否强制使用路由
+    'url_route_must'        => false,
+    // 合并路由规则
+    'route_rule_merge'      => false,
+    // 路由是否完全匹配
+    'route_complete_match'  => false,
+    // 访问控制器层名称
+    'controller_layer'      => 'controller',
+    // 空控制器名
+    'empty_controller'      => 'Error',
+    // 是否使用控制器后缀
+    'controller_suffix'     => false,
+    // 默认的路由变量规则
+    'default_route_pattern' => '[\w\.]+',
+    // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
+    'request_cache_key'     => false,
+    // 请求缓存有效期
+    'request_cache_expire'  => null,
+    // 全局请求缓存排除规则
+    'request_cache_except'  => [],
+    // 默认控制器名
+    'default_controller'    => 'Auth',
+    // 默认操作名
+    'default_action'        => 'login',
+    // 操作方法后缀
+    'action_suffix'         => '',
+    // 默认JSONP格式返回的处理方法
+    'default_jsonp_handler' => 'jsonpReturn',
+    // 默认JSONP处理方法
+    'var_jsonp_handler'     => 'callback',
+];

+ 2 - 1
composer.json

@@ -24,7 +24,8 @@
         "topthink/framework": "^6.0.0",
         "topthink/think-orm": "^2.0",
         "topthink/think-view": "^1.0",
-        "topthink/think-multi-app": "^1.0"
+        "topthink/think-multi-app": "^1.0",
+        "phpoffice/phpexcel": "^1.8"
     },
     "require-dev": {
         "symfony/var-dumper": "^4.2",

+ 3 - 3
config/database.php

@@ -24,13 +24,13 @@ return [
             // 数据库类型
             'type'            => env('database.type', 'mysql'),
             // 服务器地址
-            'hostname'        => env('database.hostname', '127.0.0.1'),
+            'hostname'        => env('database.hostname', '172.17.0.4'),
             // 数据库名
-            'database'        => env('database.database', 'jjrc'),
+            'database'        => env('database.database', 'jjrcwpro'),
             // 用户名
             'username'        => env('database.username', 'root'),
             // 密码
-            'password'        => env('database.password', ''),
+            'password'        => env('database.password', 'root'),
             // 端口
             'hostport'        => env('database.hostport', '3306'),
             // 数据库连接参数

+ 21 - 0
nbproject/private/private.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
+    <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
+    <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
+        <group>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/enterprise/controller/Talent.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/index/controller/Auth.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/enterprise/view/talent/add.html</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/public/static/modular/gate/talentInfo/talentInfo.js</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/common/controller/Batch.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/enterprise/common/EnterpriseController.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/common/controller/Tool.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/common/model/Dict.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/common/api/UserApi.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/common/api/DictApi.php</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/public/static/modular/gate/talentInfo/talentInfo_info.js</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/enterprise/view/talent/index.html</file>
+            <file>file:/C:/xampp/htdocs/jjrcuniflat/app/common/api/BatchApi.php</file>
+        </group>
+    </open-files>
+</project-private>

+ 87 - 86
public/static/modular/gate/talentInfo/talentInfo.js

@@ -2,95 +2,96 @@
  * 人才认定申报管理初始化
  */
 var TalentInfo = {
-    id: "TalentInfoTable",	//表格id
-    seItem: null,		//选中的条目
+    id: "TalentInfoTable", //表格id
+    seItem: null, //选中的条目
     table: null,
     layerIndex: -1
 };
-
 /**
  * 初始化表格的列
  */
 TalentInfo.initColumn = function () {
     var type = $("#type").val();
     var isShow = true;
-    if(type==2){
+    if (type == 2) {
         isShow = false;
     }
     return [
         {field: 'selectItem', radio: true},
-        {title: '申报年度', field: 'year', visible: true, align: 'center', valign: 'middle',width:'80px'},
-        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',width:"100px",
-            formatter : function(value,row,index){
-                if(row.sex==1){
-                    return value+'<span style="color:#6495ED">【男】</span>';
-                }if(row.sex==2){
-                    return value+'<span style="color:#FF82AB">【女】</span>';
+        {title: '申报年度', field: 'year', visible: true, align: 'center', valign: 'middle', width: '80px'},
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle', width: "100px",
+            formatter: function (value, row, index) {
+                if (row.sex == 1) {
+                    return value + '<span style="color:#6495ED">【男】</span>';
+                }
+                if (row.sex == 2) {
+                    return value + '<span style="color:#FF82AB">【女】</span>';
                 }
             }
         },
-        {title: '人才类别', field: 'type', visible: true, align: 'center', valign: 'middle',width:"100px",
-            formatter : function (value,row,index){
-                if(value==1){
+        {title: '人才类别', field: 'type', visible: true, align: 'center', valign: 'middle', width: "100px",
+            formatter: function (value, row, index) {
+                if (value == 1) {
                     return '晋江市优秀人才';
-                }if(value==2){
+                }
+                if (value == 2) {
                     return '集成电路优秀人才';
                 }
             }
         },
-        {title: '人才层次', field: 'talentArrangeName', visible: true, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"80px",},
-        {title: '人才标签', field: 'talentTypeName', visible: isShow, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"80px"},
-        {title: '证件号码', field: 'idCard', visible: true, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"120px"},
-        {title: '认定条件', field: 'identifyConditionText', visible: true, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"120px"},
-        {title: '认定条件名称', field: 'identifyConditionName', visible: true, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"120px"},
-        {title: '认定条件证书取得时间', field: 'identifyGetTime', visible: true, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"100px"},
-        {title: '审核状态', field: 'checkState', visible: true, align: 'center', valign: 'middle',width:"100px",
-            formatter : function (value,row,index) {
-                if(value==1){
+        {title: '人才层次', field: 'talentArrangeName', visible: true, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "80px", },
+        {title: '人才标签', field: 'talentTypeName', visible: isShow, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "80px"},
+        {title: '证件号码', field: 'idCard', visible: true, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "120px"},
+        {title: '认定条件', field: 'identifyConditionText', visible: true, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "120px"},
+        {title: '认定条件名称', field: 'identifyConditionName', visible: true, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "120px"},
+        {title: '认定条件证书取得时间', field: 'identifyGetTime', visible: true, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "100px"},
+        {title: '审核状态', field: 'checkState', visible: true, align: 'center', valign: 'middle', width: "100px",
+            formatter: function (value, row, index) {
+                if (value == 1) {
                     return "<span class='label'>待提交</span>"
-                }else if(value==10 || value==5){
+                } else if (value == 10 || value == 5) {
                     return "<span class='label label-danger'>已驳回</span>"
-                }else{
-                    if(row.isPublic>=5){
-                        if(value==-1){
+                } else {
+                    if (row.isPublic >= 5) {
+                        if (value == -1) {
                             return "<span class='label label-danger'>审核不通过</span>"
-                        }else if(value==35){
+                        } else if (value == 35) {
                             return "<span class='label label-primary'>认定通过</span>"
-                        }else{
+                        } else {
                             return "<span class='label label-success'>审核中</span>"
                         }
-                    }else{
+                    } else {
                         return "<span class='label label-success'>审核中</span>"
                     }
                 }
             }
         },
-        {title: '审核意见', field: 'checkMsg', visible: false, align: 'center', valign: 'middle','class': 'uitd_showTip',width:"100px",
-            formatter : function (value,row,index) {
-                if(value==1){
+        {title: '审核意见', field: 'checkMsg', visible: false, align: 'center', valign: 'middle', 'class': 'uitd_showTip', width: "100px",
+            formatter: function (value, row, index) {
+                if (value == 1) {
                     return ""
-                }else if(value==10 || value==5){
+                } else if (value == 10 || value == 5) {
                     return value;
-                }else{
-                    if(row.isPublic>=5){
-                        if(value==-1){
+                } else {
+                    if (row.isPublic >= 5) {
+                        if (value == -1) {
                             return value
-                        }else if(value==35){
+                        } else if (value == 35) {
                             return value;
-                        }else{
+                        } else {
                             return ""
                         }
-                    }else{
+                    } else {
                         return ""
                     }
                 }
             }
         },
-        {title: '操作', field: 'id', visible: true, align: 'center', valign: 'middle',width:"80px",
-            formatter : function (value,row,index){
-                return "<span class='label label-success' onclick=\"TalentInfo.showLog('"+value+"')\" >" +
-                    "<i class=\"fa fa-book\"></i>日志" +
-                    "</span>";
+        {title: '操作', field: 'id', visible: true, align: 'center', valign: 'middle', width: "80px",
+            formatter: function (value, row, index) {
+                return "<span class='label label-success' onclick=\"TalentInfo.showLog('" + value + "')\" >" +
+                        "<i class=\"fa fa-book\"></i>日志" +
+                        "</span>";
             }
         }
     ];
@@ -101,10 +102,10 @@ TalentInfo.initColumn = function () {
  */
 TalentInfo.check = function () {
     var selected = $('#' + this.id).bootstrapTable('getSelections');
-    if(selected.length == 0){
+    if (selected.length == 0) {
         Feng.info("请先选中表格中的某一记录!");
         return false;
-    }else{
+    } else {
         TalentInfo.seItem = selected[0];
         return true;
     }
@@ -113,16 +114,16 @@ TalentInfo.check = function () {
 /**
  * 显示审核日志
  */
-TalentInfo.showLog = function (id){
+TalentInfo.showLog = function (id) {
     layer.open({
         type: 1,
-        title:"日志",
-        fixed:false,
-        content: '<table id="'+id+'"></table>',
+        title: "日志",
+        fixed: false,
+        content: '<table id="' + id + '"></table>',
         area: ['80%', '80%'],
         maxmin: true,
-        success :function (layero, index) {
-            Feng.getCheckLog(id,{"type":CONFIG.project_rcrd,"mainId":id,"typeFileId":"","active":1})
+        success: function (layero, index) {
+            Feng.getCheckLog(id, {"type": CONFIG.project_rcrd, "mainId": id, "typeFileId": "", "active": 1})
         }
     });
 
@@ -133,40 +134,40 @@ TalentInfo.showLog = function (id){
  * 点击添加人才认定申报
  */
 TalentInfo.openAddTalentInfo = function () {
-    var ajax = new $ax(Feng.ctxPath + "/api/commonBatch/valiateIsAdd", function (data) {
-        if(data.code==200){
+    var ajax = new $ax("/common/batch/checkBatchValid", function (data) {
+        if (data.code == 200) {
             var index = layer.open({
                 type: 2,
                 title: '添加人才认定申报',
                 fix: false, //不固定
                 maxmin: true,
-                content: Feng.ctxPath + '/api/talentInfo/talentInfo_add?year='+data.obj,
-                btn: ['<i class="fa fa-eye"></i>&nbsp;&nbsp;保存未提交','<i class="fa fa-check layui-bg-green"></i>&nbsp;&nbsp;提交审核', '<i class="fa fa-eraser"></i>&nbsp;&nbsp;取消'],
+                content: '/enterprise/talent/add?year=' + data.batch,
+                btn: ['<i class="fa fa-eye"></i>&nbsp;&nbsp;保存未提交', '<i class="fa fa-check layui-bg-green"></i>&nbsp;&nbsp;提交审核', '<i class="fa fa-eraser"></i>&nbsp;&nbsp;取消'],
                 btnAlign: 'c',
                 btn1: function (index, layero) {
                     var obj = layero.find("iframe")[0].contentWindow;
                     obj.TalentInfoInfoDlg.addSubmit();
-                },btn2: function(index, layero){
+                }, btn2: function (index, layero) {
                     var obj = layero.find("iframe")[0].contentWindow;
                     obj.TalentInfoInfoDlg.submitToCheck();
                     return false;
                 },
-                success :function (layero, index) {
-                    layer.tips('添加基本信息并上传附件后点击','.layui-layer-btn1',{tips:[1,"#78BA32"],time:0,closeBtn :2});
+                success: function (layero, index) {
+                    layer.tips('添加基本信息并上传附件后点击', '.layui-layer-btn1', {tips: [1, "#78BA32"], time: 0, closeBtn: 2});
                 },
-                end :function () {
+                end: function () {
                     layer.closeAll('tips');
                 }
             });
             layer.full(index);
             TalentInfo.layerIndex = index;
-        }else{
+        } else {
             Feng.info(data.msg);
         }
     }, function (data) {
         Feng.error("校验失败!" + data.responseJSON.message + "!");
     });
-    ajax.set("type",CONFIG.project_rcrd);
+    ajax.set("type", CONFIG.project_rcrd);
     ajax.start();
 };
 
@@ -175,7 +176,7 @@ TalentInfo.openAddTalentInfo = function () {
  */
 TalentInfo.openTalentInfoDetail = function () {
     if (this.check()) {
-        var ajax = new $ax(Feng.ctxPath + "/api/commonBatch/valiateIsEditOrSubmit", function (data) {
+        var ajax = new $ax("/api/commonBatch/valiateIsEditOrSubmit", function (data) {
             if (data.code == 200) {
                 var index = layer.open({
                     type: 2,
@@ -183,34 +184,34 @@ TalentInfo.openTalentInfoDetail = function () {
                     area: ['800px', '420px'], //宽高
                     fix: false, //不固定
                     maxmin: true,
-                    content: Feng.ctxPath + '/api/talentInfo/talentInfo_update/' + TalentInfo.seItem.id+"/update",
-                    btn: ['<i class="fa fa-eye"></i>&nbsp;&nbsp;保存未提交','<i class="fa fa-check layui-bg-green"></i>&nbsp;&nbsp;提交审核', '<i class="fa fa-eraser"></i>&nbsp;&nbsp;取消'],
+                    content: '/api/talentInfo/talentInfo_update/' + TalentInfo.seItem.id + "/update",
+                    btn: ['<i class="fa fa-eye"></i>&nbsp;&nbsp;保存未提交', '<i class="fa fa-check layui-bg-green"></i>&nbsp;&nbsp;提交审核', '<i class="fa fa-eraser"></i>&nbsp;&nbsp;取消'],
                     btnAlign: 'c',
                     btn1: function (index, layero) {
                         var obj = layero.find("iframe")[0].contentWindow;
                         obj.TalentInfoInfoDlg.addSubmit();
-                    },btn2: function(index, layero){
+                    }, btn2: function (index, layero) {
                         var obj = layero.find("iframe")[0].contentWindow;
                         obj.TalentInfoInfoDlg.submitToCheck();
                         return false;
                     },
-                    success :function (layero, index) {
-                        layer.tips('添加基本信息并上传附件后点击','.layui-layer-btn1',{tips:[1,"#78BA32"],time:0,closeBtn :2});
+                    success: function (layero, index) {
+                        layer.tips('添加基本信息并上传附件后点击', '.layui-layer-btn1', {tips: [1, "#78BA32"], time: 0, closeBtn: 2});
                     },
-                    end :function () {
+                    end: function () {
                         layer.closeAll('tips');
                     }
                 });
                 layer.full(index);
                 TalentInfo.layerIndex = index;
-            }else{
+            } else {
                 Feng.info(data.msg);
             }
         }, function (data) {
             Feng.error("校验失败!" + data.responseJSON.message + "!");
         });
-        ajax.set("type",CONFIG.project_rcrd);
-        ajax.set("year",TalentInfo.seItem.year);
+        ajax.set("type", CONFIG.project_rcrd);
+        ajax.set("year", TalentInfo.seItem.year);
         ajax.start();
     }
 };
@@ -219,7 +220,7 @@ TalentInfo.openTalentInfoDetail = function () {
 /**
  * 查看
  */
-TalentInfo.openTalentInfoSelect = function(){
+TalentInfo.openTalentInfoSelect = function () {
     if (this.check()) {
         var index = layer.open({
             type: 2,
@@ -227,7 +228,7 @@ TalentInfo.openTalentInfoSelect = function(){
             area: ['800px', '420px'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/api/talentInfo/talentInfo_select/' + TalentInfo.seItem.id,
+            content: '/api/talentInfo/talentInfo_select/' + TalentInfo.seItem.id,
             btn: ['<i class="fa fa-eraser"></i>&nbsp;&nbsp;取消'],
             btnAlign: 'c',
         });
@@ -241,12 +242,12 @@ TalentInfo.openTalentInfoSelect = function(){
  */
 TalentInfo.delete = function () {
     if (this.check()) {
-        if(TalentInfo.seItem.checkState!=1){
+        if (TalentInfo.seItem.checkState != 1) {
             Feng.error("该申报已提交审核,无法删除");
-            return ;
+            return;
         }
-        var operation = function() {
-            var ajax = new $ax(Feng.ctxPath + "/api/talentInfo/delete", function (data) {
+        var operation = function () {
+            var ajax = new $ax("/api/talentInfo/delete", function (data) {
                 Feng.success("删除成功!");
                 TalentInfo.table.refresh();
             }, function (data) {
@@ -263,7 +264,7 @@ TalentInfo.delete = function () {
  * 查询表单提交参数对象
  * @returns {{}}
  */
-TalentInfo.formParams = function() {
+TalentInfo.formParams = function () {
     var queryData = {};
     queryData['name'] = $("#name").val();
     queryData['idCard'] = $("#idCard").val();
@@ -286,7 +287,7 @@ TalentInfo.search = function () {
 /**
  * 重置
  */
-TalentInfo.reset = function (){
+TalentInfo.reset = function () {
     $("#name").val("");
     $("#idCard").val("");
     $("#sex").val("");
@@ -307,10 +308,10 @@ $(function () {
     TalentInfo.table = table.init();
     //批量加载字典表数据
     var arr = [
-        {"name":"nation","code":"un_nation"},
-        {"name":"talentArrange","code":"un_talentLevel"},
-        {"name":"nationality","code":"un_nationality"},
-        {"name":"talentType","code":"un_jbt_talentType"}];
+        {"name": "nation", "code": "nation"},
+        {"name": "talentArrange", "code": "talent_arrange"},
+        {"name": "nationality", "code": "nationality"},
+        {"name": "talentType", "code": "talent_type"}];
     Feng.findChildDictBatch(JSON.stringify(arr));
 });
 

+ 15 - 15
public/static/modular/gate/talentInfo/talentInfo_info.js

@@ -361,7 +361,7 @@ TalentInfoInfoDlg.afterSelectProvince = function () {
         "displayCode": "code",
         "displayName": "name",
         "type": "GET",
-        "url": Feng.ctxPath + "/api/commonLocation/findCityByProvinceSelect/"+province
+        "url": Feng.ctxPath + "/common/tool/findCityByProvinceSelect/code/"+province
     });
 }
 /**
@@ -378,7 +378,7 @@ TalentInfoInfoDlg.afterSelectCity = function (){
         "displayCode": "code",
         "displayName": "name",
         "type": "GET",
-        "url": Feng.ctxPath + "/api/commonLocation/findCountyByCitySelect/"+city
+        "url": Feng.ctxPath + "/common/tool/findCountyByCitySelect/code/"+city
     });
 }
 
@@ -439,7 +439,7 @@ TalentInfoInfoDlg.initFileTable = function (){
     queryData['project'] = CONFIG.project_rcrd;
     queryData['type'] = $("#type").val();
     $("#fileTable").bootstrapTable({
-        url: Feng.ctxPath + "/api/talentInfo/findUnCommonFileType",
+        url: "/commom/tool/findCommonFileType",
         method: 'POST',
         contentType: "application/x-www-form-urlencoded; charset=UTF-8",
         search: false,					// 是否显示表格搜索,此搜索是客户端搜索,不会进服务端
@@ -737,16 +737,16 @@ $(function() {
     var checkState = $("#checkState").val();
     //批量加载字典表数据
     var arr = [
-        {"name":"nation","code":"un_nation"},
-        {"name":"talentArrange","code":"un_talentLevel"},
-        {"name":"nationality","code":"un_nationality"},
-        {"name":"politics","code":"un_political"},
-        {"name":"highEducation","code":"un_education"},
-        {"name":"introductionMode","code":"un_introduction_mode"},
-        {"name":"industryField","code":"un_industryField"},
-        {"name":"address","code":"un_street"}];
-    if(hand == "select")arr.push({"name":"talentType","code":"un_jbt_talentType"});
-    if(hand == "update" && checkState!=1 && checkState != 10 )arr.push({"name":"talentType","code":"un_jbt_talentType"});
+        {"name":"nation","code":"nation"},
+        {"name":"talentArrange","code":"talent_arrange"},
+        {"name":"nationality","code":"nationality"},
+        {"name":"politics","code":"politics"},
+        {"name":"highEducation","code":"high_education"},
+        {"name":"introductionMode","code":"introduction_mode"},
+        {"name":"industryField","code":"industry_field"},
+        {"name":"address","code":"street"}];
+    if(hand == "select")arr.push({"name":"talentType","code":"talent_type"});
+    if(hand == "update" && checkState!=1 && checkState != 10 )arr.push({"name":"talentType","code":"talent_type"});
     Feng.findChildDictBatch(JSON.stringify(arr))
     //加载省份
     Feng.addAjaxSelect({
@@ -754,7 +754,7 @@ $(function() {
         "displayCode": "code",
         "displayName": "name",
         "type": "GET",
-        "url": Feng.ctxPath + "/api/commonLocation/getProvinceSelect"
+        "url": "/common/tool/getProvinceSelect"
     });
     //加载福建省泉州的县
     Feng.addAjaxSelect({
@@ -762,7 +762,7 @@ $(function() {
         "displayCode": "code",
         "displayName": "name",
         "type": "GET",
-        "url": Feng.ctxPath + "/api/commonLocation/findCountyByCitySelect/350500"
+        "url": "/common/tool/findCountyByCitySelect/code/350500"
     });
     if(hand == 'add' || (hand == 'update' && (checkState == 1 || checkState == 10))){
         //加载人才标签

+ 53 - 51
public/static/modular/system/batch/batch.js

@@ -2,45 +2,47 @@
  * 批次管理管理初始化
  */
 var Batch = {
-    id: "BatchTable",	//表格id
-    seItem: null,		//选中的条目
+    id: "BatchTable", //表格id
+    seItem: null, //选中的条目
     table: null,
     layerIndex: -1
 };
-
+Feng.ctxPath = "/admin";
 /**
  * 初始化表格的列
  */
 Batch.initColumn = function () {
     return [
         {field: 'selectItem', radio: true},
-            {title: '申报类别', field: 'type', visible: true, align: 'center', valign: 'middle'},
-            {title: '人才类型', field: 'source', visible: true, align: 'center', valign: 'middle',
-                formatter: function (value, row, index) {
-                    if(value == 1) {
-                        return "晋江市优秀人才";
-                    }if(value == 2) {
-                        return "晋江市集成电路优秀人才";
-                    }
+        {title: '申报类别', field: 'type', visible: true, align: 'center', valign: 'middle'},
+        {title: '人才类型', field: 'source', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                if (value == 1) {
+                    return "晋江市优秀人才";
+                }
+                if (value == 2) {
+                    return "晋江市集成电路优秀人才";
+                }
+            }
+        },
+        {title: '申报批次', field: 'batch', visible: true, align: 'center', valign: 'middle'},
+        {title: '申报开始时间', field: 'startTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '申报截止时间', field: 'endTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '提交截止时间', field: 'submitEndTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '公示开始时间', field: 'publicStartTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '公示截止时间', field: 'publicEndTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '平均工资', field: 'averageWage', visible: true, align: 'center', valign: 'middle'},
+        {title: '是否有效', field: 'active', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                if (value == 1) {
+                    return "<span style='color: green'>是</span>";
                 }
-            },
-            {title: '申报批次', field: 'batch', visible: true, align: 'center', valign: 'middle'},
-            {title: '申报开始时间', field: 'startTime', visible: true, align: 'center', valign: 'middle'},
-            {title: '申报截止时间', field: 'endTime', visible: true, align: 'center', valign: 'middle'},
-            {title: '提交截止时间', field: 'submitEndTime', visible: true, align: 'center', valign: 'middle'},
-            {title: '公示开始时间', field: 'publicStartTime', visible: true, align: 'center', valign: 'middle'},
-            {title: '公示截止时间', field: 'publicEndTime', visible: true, align: 'center', valign: 'middle'},
-            {title: '平均工资', field: 'averageWage', visible: true, align: 'center', valign: 'middle'},
-            {title: '是否有效', field: 'active', visible: true, align: 'center', valign: 'middle',
-                formatter: function (value, row, index) {
-                    if(value == 1) {
-                        return "<span style='color: green'>是</span>";
-                    }if(value == 2) {
-                        return "<span style='color: red'>否</span>";
-                    }
+                if (value == 2) {
+                    return "<span style='color: red'>否</span>";
                 }
-            },
-            {title: '备注', field: 'description', visible: true, align: 'center', valign: 'middle'}
+            }
+        },
+        {title: '备注', field: 'description', visible: true, align: 'center', valign: 'middle'}
 
     ];
 };
@@ -50,10 +52,10 @@ Batch.initColumn = function () {
  */
 Batch.check = function () {
     var selected = $('#' + this.id).bootstrapTable('getSelections');
-    if(selected.length == 0){
+    if (selected.length == 0) {
         Feng.info("请先选中表格中的某一记录!");
         return false;
-    }else{
+    } else {
         Batch.seItem = selected[0];
         return true;
     }
@@ -69,7 +71,7 @@ Batch.openAddBatch = function () {
         area: ['800px', '420px'], //宽高
         fix: false, //不固定
         maxmin: true,
-        content: Feng.ctxPath + '/batch/batch_add'
+        content: Feng.ctxPath + '/batch/add'
     });
     Batch.layerIndex = index;
 };
@@ -85,7 +87,7 @@ Batch.openBatchDetail = function () {
             area: ['800px', '420px'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/batch/batch_update/' + Batch.seItem.id
+            content: Feng.ctxPath + '/batch/edit/id/' + Batch.seItem.id
         });
         Batch.layerIndex = index;
     }
@@ -96,14 +98,14 @@ Batch.openBatchDetail = function () {
  */
 Batch.delete = function () {
     if (this.check()) {
-        var operation = function(){
+        var operation = function () {
             var ajax = new $ax(Feng.ctxPath + "/batch/delete", function (data) {
                 Feng.success("删除成功!");
                 Batch.table.refresh();
             }, function (data) {
                 Feng.error("删除失败!" + data.responseJSON.message + "!");
             });
-            ajax.set("batchId",Batch.seItem.id);
+            ajax.set("batchId", Batch.seItem.id);
             ajax.start();
         };
         Feng.confirm("是否刪除该批次?", operation);
@@ -114,7 +116,7 @@ Batch.delete = function () {
  * 查询表单提交参数对象
  * @returns {{}}
  */
-Batch.formParams = function() {
+Batch.formParams = function () {
     var queryData = {};
     queryData['type'] = $("#type").val();
     queryData['source'] = $("#source").val();
@@ -133,7 +135,7 @@ Batch.search = function () {
 /**
  * 重置
  */
-Batch.reset = function (){
+Batch.reset = function () {
     $("#type").val("");
     $("#active").val("");
     $("#source").val("");
@@ -142,48 +144,48 @@ Batch.reset = function (){
 /**
  * 设置生效
  */
-Batch.setActive = function (){
+Batch.setActive = function () {
     if (this.check()) {
-        if(Batch.seItem.active==1){
+        if (Batch.seItem.active == 1) {
             Feng.error("该批次已生效,无需再次操作");
-            return ;
+            return;
         }
-        var operation = function(){
-            var ajax = new $ax(Feng.ctxPath + "/batch/setupActive", function (data) {
-                if(data.code=="200"){
+        var operation = function () {
+            var ajax = new $ax(Feng.ctxPath + "/batch/setActive", function (data) {
+                if (data.code == "200") {
                     Feng.success(data.msg);
                     Batch.table.refresh();
-                }else{
+                } else {
                     Feng.error(data.msg);
                 }
             }, function (data) {
                 Feng.error("设置生效失败!" + data.responseJSON.message + "!");
             });
-            ajax.set("batchId",Batch.seItem.id);
+            ajax.set("batchId", Batch.seItem.id);
             ajax.start();
         };
         Feng.confirm("一旦设置生效,该类别其他批次将无效,确认生效吗?", operation);
     }
 }
 
-Batch.setNotActive = function(){
+Batch.setNotActive = function () {
     if (this.check()) {
-        if(Batch.seItem.active==2){
+        if (Batch.seItem.active == 2) {
             Feng.error("该批次未生效,无需再次操作");
-            return ;
+            return;
         }
-        var operation = function(){
+        var operation = function () {
             var ajax = new $ax(Feng.ctxPath + "/batch/setNotActive", function (data) {
-                if(data.code=="200"){
+                if (data.code == "200") {
                     Feng.success(data.msg);
                     Batch.table.refresh();
-                }else{
+                } else {
                     Feng.error(data.msg);
                 }
             }, function (data) {
                 Feng.error("设置失效失败!" + data.responseJSON.message + "!");
             });
-            ajax.set("batchId",Batch.seItem.id);
+            ajax.set("batchId", Batch.seItem.id);
             ajax.start();
         };
         Feng.confirm("确认设置失效吗?", operation);

+ 37 - 35
public/static/modular/system/batch/batch_info.js

@@ -1,8 +1,9 @@
 /**
  * 初始化批次管理详情对话框
  */
+Feng.ctxPath = "/admin";
 var BatchInfoDlg = {
-    batchInfoData : {},
+    batchInfoData: {},
     validateFields: {
         type: {
             validators: {
@@ -23,9 +24,9 @@ var BatchInfoDlg = {
                 notEmpty: {
                     message: '申报批次不能为空'
                 },
-                regexp :{
+                regexp: {
                     regexp: /^\d+$/,
-                    message:"只能输入数字"
+                    message: "只能输入数字"
                 }
             }
         },
@@ -56,7 +57,7 @@ var BatchInfoDlg = {
 /**
  * 清除数据
  */
-BatchInfoDlg.clearData = function() {
+BatchInfoDlg.clearData = function () {
     this.batchInfoData = {};
 }
 
@@ -66,7 +67,7 @@ BatchInfoDlg.clearData = function() {
  * @param key 数据的名称
  * @param val 数据的具体值
  */
-BatchInfoDlg.set = function(key, val) {
+BatchInfoDlg.set = function (key, val) {
     this.batchInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
     return this;
 }
@@ -77,34 +78,34 @@ BatchInfoDlg.set = function(key, val) {
  * @param key 数据的名称
  * @param val 数据的具体值
  */
-BatchInfoDlg.get = function(key) {
+BatchInfoDlg.get = function (key) {
     return $("#" + key).val();
 }
 
 /**
  * 关闭此对话框
  */
-BatchInfoDlg.close = function() {
+BatchInfoDlg.close = function () {
     parent.layer.close(window.parent.Batch.layerIndex);
 }
 
 /**
  * 收集数据
  */
-BatchInfoDlg.collectData = function() {
+BatchInfoDlg.collectData = function () {
     this
-    .set('id')
-    .set('type')
-    .set('source')
-    .set('batch')
-    .set('startTime')
-    .set('endTime')
-    .set('submitEndTime')
-    .set('publicStartTime')
-    .set('publicEndTime')
-    .set('averageWage')
-    .set('active')
-    .set('description');
+            .set('id')
+            .set('type')
+            .set('source')
+            .set('batch')
+            .set('startTime')
+            .set('endTime')
+            .set('submitEndTime')
+            .set('publicStartTime')
+            .set('publicEndTime')
+            .set('averageWage')
+            .set('active')
+            .set('description');
 }
 
 /**
@@ -120,22 +121,22 @@ BatchInfoDlg.validate = function () {
 /**
  * 提交添加
  */
-BatchInfoDlg.addSubmit = function() {
+BatchInfoDlg.addSubmit = function () {
     this.clearData();
     this.collectData();
     if (!this.validate()) {
         return;
     }
     //提交信息
-    var ajax = new $ax(Feng.ctxPath + "/batch/add", function(data){
-        if(data.code=="200"){
+    var ajax = new $ax(Feng.ctxPath + "/batch/add", function (data) {
+        if (data.code == "200") {
             Feng.success(data.msg);
             window.parent.Batch.table.refresh();
             BatchInfoDlg.close();
-        }else{
+        } else {
             Feng.error(data.msg);
         }
-    },function(data){
+    }, function (data) {
         Feng.error("添加失败!" + data.responseJSON.message + "!");
     });
     ajax.set(this.batchInfoData);
@@ -145,29 +146,29 @@ BatchInfoDlg.addSubmit = function() {
 /**
  * 提交修改
  */
-BatchInfoDlg.editSubmit = function() {
+BatchInfoDlg.editSubmit = function () {
     this.clearData();
     this.collectData();
     if (!this.validate()) {
         return;
     }
     //提交信息
-    var ajax = new $ax(Feng.ctxPath + "/batch/update", function(data){
-        if(data.code=="200"){
+    var ajax = new $ax(Feng.ctxPath + "/batch/edit", function (data) {
+        if (data.code == "200") {
             Feng.success(data.msg);
             window.parent.Batch.table.refresh();
             BatchInfoDlg.close();
-        }else{
+        } else {
             Feng.error(data.msg);
         }
-    },function(data){
+    }, function (data) {
         Feng.error("修改失败!" + data.responseJSON.message + "!");
     });
     ajax.set(this.batchInfoData);
     ajax.start();
 }
 
-$(function() {
+$(function () {
     Feng.initValidator("batchInfoForm", BatchInfoDlg.validateFields);
     //下拉框数据动态加载
     Feng.addAjaxSelect({
@@ -178,15 +179,16 @@ $(function() {
         "url": Feng.ctxPath + "/dict/findChildDictByCode?code=un_project"
     });
     //批量加载时间控件
-    $("input[time='time']").each(function(){
+    $("input[time='time']").each(function () {
         laydate.render({
-             elem: "#"+$(this).attr("id")
-            ,type: $(this).attr("format")
-            ,trigger: 'click'
+            elem: "#" + $(this).attr("id")
+            , type: $(this).attr("format")
+            , trigger: 'click'
         });
     });
     //下拉框数据回显
     $("select").each(function () {
+        console.log($(this).attr("selectVal"))
         $(this).val($(this).attr("selectVal"));
     });
 });

+ 4 - 4
public/static/modular/system/dict/dict.js

@@ -7,7 +7,7 @@ var Dict = {
     table: null,
     layerIndex: -1
 };
-
+Feng.ctxPath = "/admin";
 /**
  * 初始化表格的列
  */
@@ -44,7 +44,7 @@ Dict.openAddDict = function () {
         area: ['800px', '420px'], //宽高
         fix: false, //不固定
         maxmin: true,
-        content: Feng.ctxPath + '/dict/dict_add'
+        content: Feng.ctxPath + '/dict/add'
     });
     this.layerIndex = index;
 };
@@ -60,7 +60,7 @@ Dict.openDictDetail = function () {
             area: ['800px', '420px'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: Feng.ctxPath + '/dict/dict_edit/' + Dict.seItem.id
+            content: Feng.ctxPath + '/dict/edit/id/' + Dict.seItem.id
         });
         this.layerIndex = index;
     }
@@ -99,6 +99,6 @@ Dict.search = function () {
 $(function () {
     var defaultColunms = Dict.initColumn();
     var table = new BSTable(Dict.id, "/dict/list", defaultColunms);
-    table.setPaginationType("client");
+    table.setPaginationType("server");
     Dict.table = table.init();
 });

+ 35 - 27
public/static/modular/system/dict/dict_info.js

@@ -3,18 +3,18 @@
  */
 var DictInfoDlg = {
     count: $("#itemSize").val(),
-    dictName: '',			//字典的名称
-    dictCode: '',//字典类型编码
-    dictTips: '',//字典备注
-    mutiString: '',		//拼接字符串内容(拼接字典条目)
+    dictName: '', //字典的名称
+    dictCode: '', //字典类型编码
+    dictTips: '', //字典备注
+    mutiString: '', //拼接字符串内容(拼接字典条目)
     itemTemplate: $("#itemTemplate").html()
 };
-
+Feng.ctxPath = "/admin";
 /**
  * item获取新的id
  */
 DictInfoDlg.newId = function () {
-    if(this.count == undefined){
+    if (this.count == undefined) {
         this.count = 0;
     }
     this.count = this.count + 1;
@@ -48,11 +48,11 @@ DictInfoDlg.deleteItem = function (event) {
 /**
  * 清除为空的item Dom
  */
-DictInfoDlg.clearNullDom = function(){
-    $("[name='dictItem']").each(function(){
+DictInfoDlg.clearNullDom = function () {
+    $("[name='dictItem']").each(function () {
         var num = $(this).find("[name='itemNum']").val();
         var name = $(this).find("[name='itemName']").val();
-        if(num == '' || name == ''){
+        if (num == '' || name == '') {
             $(this).remove();
         }
     });
@@ -64,11 +64,11 @@ DictInfoDlg.clearNullDom = function(){
 DictInfoDlg.collectData = function () {
     this.clearNullDom();
     var mutiString = "";
-    $("[name='dictItem']").each(function(){
+    $("[name='dictItem']").each(function () {
         var code = $(this).find("[name='itemCode']").val();
         var name = $(this).find("[name='itemName']").val();
         var num = $(this).find("[name='itemNum']").val();
-        mutiString = mutiString + (code + ":" + name + ":"+ num+";");
+        mutiString = mutiString + (code + ":" + name + ":" + num + ";");
     });
     this.dictName = $("#dictName").val();
     this.dictCode = $("#dictCode").val();
@@ -84,16 +84,20 @@ DictInfoDlg.addSubmit = function () {
     this.collectData();
     //提交信息
     var ajax = new $ax(Feng.ctxPath + "/dict/add", function (data) {
-        Feng.success("添加成功!");
-        window.parent.Dict.table.refresh();
-        DictInfoDlg.close();
+        if (data.code == 200) {
+            Feng.success("添加成功!");
+            window.parent.Dict.table.refresh();
+            DictInfoDlg.close();
+        } else {
+            Feng.error(data.msg);
+        }
     }, function (data) {
         Feng.error("添加失败!" + data.responseJSON.message + "!");
     });
-    ajax.set('dictName',this.dictName);
-    ajax.set('dictCode',this.dictCode);
-    ajax.set('dictTips',this.dictTips);
-    ajax.set('dictValues',this.mutiString);
+    ajax.set('dictName', this.dictName);
+    ajax.set('dictCode', this.dictCode);
+    ajax.set('dictTips', this.dictTips);
+    ajax.set('dictValues', this.mutiString);
     ajax.start();
 };
 
@@ -102,17 +106,21 @@ DictInfoDlg.addSubmit = function () {
  */
 DictInfoDlg.editSubmit = function () {
     this.collectData();
-    var ajax = new $ax(Feng.ctxPath + "/dict/update", function (data) {
-        Feng.success("修改成功!");
-        window.parent.Dict.table.refresh();
-        DictInfoDlg.close();
+    var ajax = new $ax(Feng.ctxPath + "/dict/edit", function (data) {
+        if (data.code == 200) {
+            Feng.success("修改成功!");
+            window.parent.Dict.table.refresh();
+            DictInfoDlg.close();
+        } else {
+            Feng.error(data.msg);
+        }
     }, function (data) {
         Feng.error("修改失败!" + data.responseJSON.message + "!");
     });
-    ajax.set('dictId',$("#dictId").val());
-    ajax.set('dictName',this.dictName);
-    ajax.set('dictCode',this.dictCode);
-    ajax.set('dictTips',this.dictTips);
-    ajax.set('dictValues',this.mutiString);
+    ajax.set('dictId', $("#dictId").val());
+    ajax.set('dictName', this.dictName);
+    ajax.set('dictCode', this.dictCode);
+    ajax.set('dictTips', this.dictTips);
+    ajax.set('dictValues', this.mutiString);
     ajax.start();
 };

+ 3 - 3
public/static/modular/system/role/role.js

@@ -63,7 +63,7 @@ Role.openChangeRole = function () {
             area: ['800px', '450px'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: '/admin/role/edit/' + this.seItem.id
+            content: '/admin/role/edit/id/' + this.seItem.id
         });
         this.layerIndex = index;
     }
@@ -76,7 +76,7 @@ Role.delRole = function () {
     if (this.check()) {
 
         var operation = function(){
-            var ajax = new $ax("/admin/role/remove", function () {
+            var ajax = new $ax("/admin/role/delete", function () {
                 Feng.success("删除成功!");
                 Role.table.refresh();
             }, function (data) {
@@ -101,7 +101,7 @@ Role.assign = function () {
             area: ['300px', '450px'], //宽高
             fix: false, //不固定
             maxmin: true,
-            content: '/admin/role/assign/' + this.seItem.id
+            content: '/admin/role/assign/id/' + this.seItem.id
         });
         this.layerIndex = index;
     }

+ 3 - 3
public/static/modular/system/role/role_info.js

@@ -172,7 +172,7 @@ RolInfoDlg.editSubmit = function () {
         window.parent.Role.table.refresh();
         RolInfoDlg.close();
     }, function (data) {
-        Feng.error("修改失败!" + data.responseJSON.message + "!");
+        Feng.error("修改失败!" + data.msg + "!");
     });
     ajax.set(this.roleInfoData);
     ajax.start();
@@ -181,13 +181,13 @@ RolInfoDlg.editSubmit = function () {
 $(function () {
     Feng.initValidator("roleInfoForm", RolInfoDlg.validateFields);
 
-    var deptTree = new $ZTree("deptTree", "/admin/dept/tree");
+    var deptTree = new $ZTree("deptTree", "/admin/dept/treelist");
     deptTree.bindOnClick(RolInfoDlg.onClickDept);
     deptTree.bindOnDblClick(RolInfoDlg.onDblClickDept)
     deptTree.init();
     RolInfoDlg.deptZtree = deptTree;
 
-    var pNameTree = new $ZTree("pNameTree", "/admin/role/roleTreeList");
+    var pNameTree = new $ZTree("pNameTree", "/admin/role/treelist");
     pNameTree.bindOnClick(RolInfoDlg.onClickPName);
     pNameTree.init();
     RolInfoDlg.pNameZtree = pNameTree;

+ 2 - 0
vendor/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 12 - 0
vendor/autoload.php

@@ -0,0 +1,12 @@
+<?php
+
+// autoload.php @generated by Composer
+
+if (PHP_VERSION_ID < 50600) {
+    echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
+    exit(1);
+}
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInit0767332e67f37ff78a6c5ac32275d5ac::getLoader();

+ 117 - 0
vendor/bin/var-dump-server

@@ -0,0 +1,117 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Proxy PHP file generated by Composer
+ *
+ * This file includes the referenced bin path (../symfony/var-dumper/Resources/bin/var-dump-server)
+ * using a stream wrapper to prevent the shebang from being output on PHP<8
+ *
+ * @generated
+ */
+
+namespace Composer;
+
+$GLOBALS['_composer_bin_dir'] = __DIR__;
+$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
+
+if (PHP_VERSION_ID < 80000) {
+    if (!class_exists('Composer\BinProxyWrapper')) {
+        /**
+         * @internal
+         */
+        final class BinProxyWrapper
+        {
+            private $handle;
+            private $position;
+            private $realpath;
+
+            public function stream_open($path, $mode, $options, &$opened_path)
+            {
+                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
+                $opened_path = substr($path, 17);
+                $this->realpath = realpath($opened_path) ?: $opened_path;
+                $opened_path = $this->realpath;
+                $this->handle = fopen($this->realpath, $mode);
+                $this->position = 0;
+
+                return (bool) $this->handle;
+            }
+
+            public function stream_read($count)
+            {
+                $data = fread($this->handle, $count);
+
+                if ($this->position === 0) {
+                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
+                }
+
+                $this->position += strlen($data);
+
+                return $data;
+            }
+
+            public function stream_cast($castAs)
+            {
+                return $this->handle;
+            }
+
+            public function stream_close()
+            {
+                fclose($this->handle);
+            }
+
+            public function stream_lock($operation)
+            {
+                return $operation ? flock($this->handle, $operation) : true;
+            }
+
+            public function stream_seek($offset, $whence)
+            {
+                if (0 === fseek($this->handle, $offset, $whence)) {
+                    $this->position = ftell($this->handle);
+                    return true;
+                }
+
+                return false;
+            }
+
+            public function stream_tell()
+            {
+                return $this->position;
+            }
+
+            public function stream_eof()
+            {
+                return feof($this->handle);
+            }
+
+            public function stream_stat()
+            {
+                return array();
+            }
+
+            public function stream_set_option($option, $arg1, $arg2)
+            {
+                return true;
+            }
+
+            public function url_stat($path, $flags)
+            {
+                $path = substr($path, 17);
+                if (file_exists($path)) {
+                    return stat($path);
+                }
+
+                return false;
+            }
+        }
+    }
+
+    if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
+        include("phpvfscomposer://" . __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server');
+        exit(0);
+    }
+}
+
+include __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server';

+ 5 - 0
vendor/bin/var-dump-server.bat

@@ -0,0 +1,5 @@
+@ECHO OFF
+setlocal DISABLEDELAYEDEXPANSION
+SET BIN_TARGET=%~dp0/var-dump-server
+SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
+php "%BIN_TARGET%" %*

+ 572 - 0
vendor/composer/ClassLoader.php

@@ -0,0 +1,572 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    https://www.php-fig.org/psr/psr-0/
+ * @see    https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    /** @var ?string */
+    private $vendorDir;
+
+    // PSR-4
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<string, int>>
+     */
+    private $prefixLengthsPsr4 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<int, string>>
+     */
+    private $prefixDirsPsr4 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, string>
+     */
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<string, string[]>>
+     */
+    private $prefixesPsr0 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, string>
+     */
+    private $fallbackDirsPsr0 = array();
+
+    /** @var bool */
+    private $useIncludePath = false;
+
+    /**
+     * @var string[]
+     * @psalm-var array<string, string>
+     */
+    private $classMap = array();
+
+    /** @var bool */
+    private $classMapAuthoritative = false;
+
+    /**
+     * @var bool[]
+     * @psalm-var array<string, bool>
+     */
+    private $missingClasses = array();
+
+    /** @var ?string */
+    private $apcuPrefix;
+
+    /**
+     * @var self[]
+     */
+    private static $registeredLoaders = array();
+
+    /**
+     * @param ?string $vendorDir
+     */
+    public function __construct($vendorDir = null)
+    {
+        $this->vendorDir = $vendorDir;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+        }
+
+        return array();
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return array<string, array<int, string>>
+     */
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return array<string, string>
+     */
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return array<string, string>
+     */
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    /**
+     * @return string[] Array of classname => path
+     * @psalm-return array<string, string>
+     */
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param string[] $classMap Class to filename map
+     * @psalm-param array<string, string> $classMap
+     *
+     * @return void
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string          $prefix  The prefix
+     * @param string[]|string $paths   The PSR-0 root directories
+     * @param bool            $prepend Whether to prepend the directories
+     *
+     * @return void
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string          $prefix  The prefix/namespace, with trailing '\\'
+     * @param string[]|string $paths   The PSR-4 base directories
+     * @param bool            $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string          $prefix The prefix
+     * @param string[]|string $paths  The PSR-0 base directories
+     *
+     * @return void
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string          $prefix The prefix/namespace, with trailing '\\'
+     * @param string[]|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     *
+     * @return void
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     *
+     * @return void
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     *
+     * @return void
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     *
+     * @return void
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+        if (null === $this->vendorDir) {
+            return;
+        }
+
+        if ($prepend) {
+            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+        } else {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+            self::$registeredLoaders[$this->vendorDir] = $this;
+        }
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     *
+     * @return void
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+
+        if (null !== $this->vendorDir) {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+        }
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return true|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+
+        return null;
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    /**
+     * Returns the currently registered loaders indexed by their corresponding vendor directories.
+     *
+     * @return self[]
+     */
+    public static function getRegisteredLoaders()
+    {
+        return self::$registeredLoaders;
+    }
+
+    /**
+     * @param  string       $class
+     * @param  string       $ext
+     * @return string|false
+     */
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath . '\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ *
+ * @param  string $file
+ * @return void
+ * @private
+ */
+function includeFile($file)
+{
+    include $file;
+}

+ 352 - 0
vendor/composer/InstalledVersions.php

@@ -0,0 +1,352 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ *
+ * @final
+ */
+class InstalledVersions
+{
+    /**
+     * @var mixed[]|null
+     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
+     */
+    private static $installed;
+
+    /**
+     * @var bool|null
+     */
+    private static $canGetVendors;
+
+    /**
+     * @var array[]
+     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    private static $installedByVendor = array();
+
+    /**
+     * Returns a list of all package names which are present, either by being installed, replaced or provided
+     *
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackages()
+    {
+        $packages = array();
+        foreach (self::getInstalled() as $installed) {
+            $packages[] = array_keys($installed['versions']);
+        }
+
+        if (1 === \count($packages)) {
+            return $packages[0];
+        }
+
+        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+    }
+
+    /**
+     * Returns a list of all package names with a specific type e.g. 'library'
+     *
+     * @param  string   $type
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackagesByType($type)
+    {
+        $packagesByType = array();
+
+        foreach (self::getInstalled() as $installed) {
+            foreach ($installed['versions'] as $name => $package) {
+                if (isset($package['type']) && $package['type'] === $type) {
+                    $packagesByType[] = $name;
+                }
+            }
+        }
+
+        return $packagesByType;
+    }
+
+    /**
+     * Checks whether the given package is installed
+     *
+     * This also returns true if the package name is provided or replaced by another package
+     *
+     * @param  string $packageName
+     * @param  bool   $includeDevRequirements
+     * @return bool
+     */
+    public static function isInstalled($packageName, $includeDevRequirements = true)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (isset($installed['versions'][$packageName])) {
+                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks whether the given package satisfies a version constraint
+     *
+     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+     *
+     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+     *
+     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param  string        $packageName
+     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @return bool
+     */
+    public static function satisfies(VersionParser $parser, $packageName, $constraint)
+    {
+        $constraint = $parser->parseConstraints($constraint);
+        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+        return $provided->matches($constraint);
+    }
+
+    /**
+     * Returns a version constraint representing all the range(s) which are installed for a given package
+     *
+     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+     * whether a given version of a package is installed, and not just whether it exists
+     *
+     * @param  string $packageName
+     * @return string Version constraint usable with composer/semver
+     */
+    public static function getVersionRanges($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            $ranges = array();
+            if (isset($installed['versions'][$packageName]['pretty_version'])) {
+                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+            }
+            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+            }
+            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+            }
+            if (array_key_exists('provided', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+            }
+
+            return implode(' || ', $ranges);
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getPrettyVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['pretty_version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+     */
+    public static function getReference($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['reference'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['reference'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+     */
+    public static function getInstallPath($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @return array
+     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+     */
+    public static function getRootPackage()
+    {
+        $installed = self::getInstalled();
+
+        return $installed[0]['root'];
+    }
+
+    /**
+     * Returns the raw installed.php data for custom implementations
+     *
+     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+     * @return array[]
+     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+     */
+    public static function getRawData()
+    {
+        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = include __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        return self::$installed;
+    }
+
+    /**
+     * Returns the raw data of all installed.php which are currently loaded for custom implementations
+     *
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    public static function getAllRawData()
+    {
+        return self::getInstalled();
+    }
+
+    /**
+     * Lets you reload the static array from another file
+     *
+     * This is only useful for complex integrations in which a project needs to use
+     * this class but then also needs to execute another project's autoloader in process,
+     * and wants to ensure both projects have access to their version of installed.php.
+     *
+     * A typical case would be PHPUnit, where it would need to make sure it reads all
+     * the data it needs from this class, then call reload() with
+     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+     * the project in which it runs can then also use this class safely, without
+     * interference between PHPUnit's dependencies and the project's dependencies.
+     *
+     * @param  array[] $data A vendor/composer/installed.php data set
+     * @return void
+     *
+     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+     */
+    public static function reload($data)
+    {
+        self::$installed = $data;
+        self::$installedByVendor = array();
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    private static function getInstalled()
+    {
+        if (null === self::$canGetVendors) {
+            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+        }
+
+        $installed = array();
+
+        if (self::$canGetVendors) {
+            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                if (isset(self::$installedByVendor[$vendorDir])) {
+                    $installed[] = self::$installedByVendor[$vendorDir];
+                } elseif (is_file($vendorDir.'/composer/installed.php')) {
+                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+                        self::$installed = $installed[count($installed) - 1];
+                    }
+                }
+            }
+        }
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = require __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+        $installed[] = self::$installed;
+
+        return $installed;
+    }
+}

+ 21 - 0
vendor/composer/LICENSE

@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+

+ 15 - 0
vendor/composer/autoload_classmap.php

@@ -0,0 +1,15 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+    'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+    'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
+    'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+    'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
+);

+ 15 - 0
vendor/composer/autoload_files.php

@@ -0,0 +1,15 @@
+<?php
+
+// autoload_files.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    '9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
+    '35fab96057f1bf5e7aba31a8a6d5fdde' => $vendorDir . '/topthink/think-orm/stubs/load_stubs.php',
+    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
+    'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
+    '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
+);

+ 11 - 0
vendor/composer/autoload_namespaces.php

@@ -0,0 +1,11 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    'PHPExcel' => array($vendorDir . '/phpoffice/phpexcel/Classes'),
+    '' => array($baseDir . '/extend'),
+);

+ 26 - 0
vendor/composer/autoload_psr4.php

@@ -0,0 +1,26 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    'think\\view\\driver\\' => array($vendorDir . '/topthink/think-view/src'),
+    'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'),
+    'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'),
+    'think\\' => array($vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-template/src'),
+    'app\\' => array($baseDir . '/app'),
+    'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
+    'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
+    'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
+    'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
+    'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
+    'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+    'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
+    'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
+    'League\\MimeTypeDetection\\' => array($vendorDir . '/league/mime-type-detection/src'),
+    'League\\Flysystem\\Cached\\' => array($vendorDir . '/league/flysystem-cached-adapter/src'),
+    'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
+);

+ 57 - 0
vendor/composer/autoload_real.php

@@ -0,0 +1,57 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit0767332e67f37ff78a6c5ac32275d5ac
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    /**
+     * @return \Composer\Autoload\ClassLoader
+     */
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        require __DIR__ . '/platform_check.php';
+
+        spl_autoload_register(array('ComposerAutoloaderInit0767332e67f37ff78a6c5ac32275d5ac', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
+        spl_autoload_unregister(array('ComposerAutoloaderInit0767332e67f37ff78a6c5ac32275d5ac', 'loadClassLoader'));
+
+        require __DIR__ . '/autoload_static.php';
+        call_user_func(\Composer\Autoload\ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::getInitializer($loader));
+
+        $loader->register(true);
+
+        $includeFiles = \Composer\Autoload\ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::$files;
+        foreach ($includeFiles as $fileIdentifier => $file) {
+            composerRequire0767332e67f37ff78a6c5ac32275d5ac($fileIdentifier, $file);
+        }
+
+        return $loader;
+    }
+}
+
+/**
+ * @param string $fileIdentifier
+ * @param string $file
+ * @return void
+ */
+function composerRequire0767332e67f37ff78a6c5ac32275d5ac($fileIdentifier, $file)
+{
+    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+
+        require $file;
+    }
+}

+ 161 - 0
vendor/composer/autoload_static.php

@@ -0,0 +1,161 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac
+{
+    public static $files = array (
+        '9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
+        '35fab96057f1bf5e7aba31a8a6d5fdde' => __DIR__ . '/..' . '/topthink/think-orm/stubs/load_stubs.php',
+        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
+        'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
+        '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
+    );
+
+    public static $prefixLengthsPsr4 = array (
+        't' => 
+        array (
+            'think\\view\\driver\\' => 18,
+            'think\\trace\\' => 12,
+            'think\\app\\' => 10,
+            'think\\' => 6,
+        ),
+        'a' => 
+        array (
+            'app\\' => 4,
+        ),
+        'S' => 
+        array (
+            'Symfony\\Polyfill\\Php80\\' => 23,
+            'Symfony\\Polyfill\\Php72\\' => 23,
+            'Symfony\\Polyfill\\Mbstring\\' => 26,
+            'Symfony\\Component\\VarDumper\\' => 28,
+        ),
+        'P' => 
+        array (
+            'Psr\\SimpleCache\\' => 16,
+            'Psr\\Log\\' => 8,
+            'Psr\\Http\\Message\\' => 17,
+            'Psr\\Container\\' => 14,
+            'Psr\\Cache\\' => 10,
+        ),
+        'L' => 
+        array (
+            'League\\MimeTypeDetection\\' => 25,
+            'League\\Flysystem\\Cached\\' => 24,
+            'League\\Flysystem\\' => 17,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'think\\view\\driver\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/topthink/think-view/src',
+        ),
+        'think\\trace\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/topthink/think-trace/src',
+        ),
+        'think\\app\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/topthink/think-multi-app/src',
+        ),
+        'think\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/topthink/think-helper/src',
+            1 => __DIR__ . '/..' . '/topthink/think-orm/src',
+            2 => __DIR__ . '/..' . '/topthink/framework/src/think',
+            3 => __DIR__ . '/..' . '/topthink/think-template/src',
+        ),
+        'app\\' => 
+        array (
+            0 => __DIR__ . '/../..' . '/app',
+        ),
+        'Symfony\\Polyfill\\Php80\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
+        ),
+        'Symfony\\Polyfill\\Php72\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
+        ),
+        'Symfony\\Polyfill\\Mbstring\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
+        ),
+        'Symfony\\Component\\VarDumper\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/var-dumper',
+        ),
+        'Psr\\SimpleCache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/simple-cache/src',
+        ),
+        'Psr\\Log\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
+        ),
+        'Psr\\Http\\Message\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/http-message/src',
+        ),
+        'Psr\\Container\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/container/src',
+        ),
+        'Psr\\Cache\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/cache/src',
+        ),
+        'League\\MimeTypeDetection\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/league/mime-type-detection/src',
+        ),
+        'League\\Flysystem\\Cached\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src',
+        ),
+        'League\\Flysystem\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/league/flysystem/src',
+        ),
+    );
+
+    public static $prefixesPsr0 = array (
+        'P' => 
+        array (
+            'PHPExcel' => 
+            array (
+                0 => __DIR__ . '/..' . '/phpoffice/phpexcel/Classes',
+            ),
+        ),
+    );
+
+    public static $fallbackDirsPsr0 = array (
+        0 => __DIR__ . '/../..' . '/extend',
+    );
+
+    public static $classMap = array (
+        'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+        'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+        'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
+        'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+        'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::$prefixDirsPsr4;
+            $loader->prefixesPsr0 = ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::$prefixesPsr0;
+            $loader->fallbackDirsPsr0 = ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::$fallbackDirsPsr0;
+            $loader->classMap = ComposerStaticInit0767332e67f37ff78a6c5ac32275d5ac::$classMap;
+
+        }, null, ClassLoader::class);
+    }
+}

文件差異過大導致無法顯示
+ 295 - 387
vendor/composer/installed.json


+ 203 - 0
vendor/composer/installed.php

@@ -0,0 +1,203 @@
+<?php return array(
+    'root' => array(
+        'pretty_version' => 'dev-master',
+        'version' => 'dev-master',
+        'type' => 'project',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'reference' => 'e9c0e9e209e6afbe48071401bde74757dc8e17c4',
+        'name' => 'topthink/think',
+        'dev' => true,
+    ),
+    'versions' => array(
+        'league/flysystem' => array(
+            'pretty_version' => '1.1.9',
+            'version' => '1.1.9.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/flysystem',
+            'aliases' => array(),
+            'reference' => '094defdb4a7001845300334e7c1ee2335925ef99',
+            'dev_requirement' => false,
+        ),
+        'league/flysystem-cached-adapter' => array(
+            'pretty_version' => '1.1.0',
+            'version' => '1.1.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/flysystem-cached-adapter',
+            'aliases' => array(),
+            'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff',
+            'dev_requirement' => false,
+        ),
+        'league/mime-type-detection' => array(
+            'pretty_version' => '1.11.0',
+            'version' => '1.11.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/mime-type-detection',
+            'aliases' => array(),
+            'reference' => 'ff6248ea87a9f116e78edd6002e39e5128a0d4dd',
+            'dev_requirement' => false,
+        ),
+        'phpoffice/phpexcel' => array(
+            'pretty_version' => '1.8.2',
+            'version' => '1.8.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../phpoffice/phpexcel',
+            'aliases' => array(),
+            'reference' => '1441011fb7ecdd8cc689878f54f8b58a6805f870',
+            'dev_requirement' => false,
+        ),
+        'psr/cache' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/cache',
+            'aliases' => array(),
+            'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
+            'dev_requirement' => false,
+        ),
+        'psr/container' => array(
+            'pretty_version' => '1.1.1',
+            'version' => '1.1.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/container',
+            'aliases' => array(),
+            'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
+            'dev_requirement' => false,
+        ),
+        'psr/http-message' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/http-message',
+            'aliases' => array(),
+            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
+            'dev_requirement' => false,
+        ),
+        'psr/log' => array(
+            'pretty_version' => '1.1.4',
+            'version' => '1.1.4.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/log',
+            'aliases' => array(),
+            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
+            'dev_requirement' => false,
+        ),
+        'psr/simple-cache' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/simple-cache',
+            'aliases' => array(),
+            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
+            'dev_requirement' => false,
+        ),
+        'symfony/polyfill-mbstring' => array(
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
+            'aliases' => array(),
+            'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
+            'dev_requirement' => true,
+        ),
+        'symfony/polyfill-php72' => array(
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/polyfill-php72',
+            'aliases' => array(),
+            'reference' => 'bf44a9fd41feaac72b074de600314a93e2ae78e2',
+            'dev_requirement' => true,
+        ),
+        'symfony/polyfill-php80' => array(
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/polyfill-php80',
+            'aliases' => array(),
+            'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace',
+            'dev_requirement' => true,
+        ),
+        'symfony/var-dumper' => array(
+            'pretty_version' => 'v4.4.44',
+            'version' => '4.4.44.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/var-dumper',
+            'aliases' => array(),
+            'reference' => 'f19951007dae942cc79b979c1fe26bfdfbeb54ed',
+            'dev_requirement' => true,
+        ),
+        'topthink/framework' => array(
+            'pretty_version' => 'v6.0.13',
+            'version' => '6.0.13.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/framework',
+            'aliases' => array(),
+            'reference' => '126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6',
+            'dev_requirement' => false,
+        ),
+        'topthink/think' => array(
+            'pretty_version' => 'dev-master',
+            'version' => 'dev-master',
+            'type' => 'project',
+            'install_path' => __DIR__ . '/../../',
+            'aliases' => array(),
+            'reference' => 'e9c0e9e209e6afbe48071401bde74757dc8e17c4',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-helper' => array(
+            'pretty_version' => 'v3.1.6',
+            'version' => '3.1.6.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-helper',
+            'aliases' => array(),
+            'reference' => '769acbe50a4274327162f9c68ec2e89a38eb2aff',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-multi-app' => array(
+            'pretty_version' => 'v1.0.14',
+            'version' => '1.0.14.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-multi-app',
+            'aliases' => array(),
+            'reference' => 'ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-orm' => array(
+            'pretty_version' => 'v2.0.54',
+            'version' => '2.0.54.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-orm',
+            'aliases' => array(),
+            'reference' => '97b061b47616301ff29fbd4c35ed9184e1162e4e',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-template' => array(
+            'pretty_version' => 'v2.0.8',
+            'version' => '2.0.8.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-template',
+            'aliases' => array(),
+            'reference' => 'abfc293f74f9ef5127b5c416310a01fe42e59368',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-trace' => array(
+            'pretty_version' => 'v1.4',
+            'version' => '1.4.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-trace',
+            'aliases' => array(),
+            'reference' => '9a9fa8f767b6c66c5a133ad21ca1bc96ad329444',
+            'dev_requirement' => true,
+        ),
+        'topthink/think-view' => array(
+            'pretty_version' => 'v1.0.14',
+            'version' => '1.0.14.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-view',
+            'aliases' => array(),
+            'reference' => 'edce0ae2c9551ab65f9e94a222604b0dead3576d',
+            'dev_requirement' => false,
+        ),
+    ),
+);

+ 26 - 0
vendor/composer/platform_check.php

@@ -0,0 +1,26 @@
+<?php
+
+// platform_check.php @generated by Composer
+
+$issues = array();
+
+if (!(PHP_VERSION_ID >= 70205)) {
+    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.';
+}
+
+if ($issues) {
+    if (!headers_sent()) {
+        header('HTTP/1.1 500 Internal Server Error');
+    }
+    if (!ini_get('display_errors')) {
+        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
+        } elseif (!headers_sent()) {
+            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
+        }
+    }
+    trigger_error(
+        'Composer detected issues in your platform: ' . implode(' ', $issues),
+        E_USER_ERROR
+    );
+}

+ 10 - 0
vendor/league/flysystem-cached-adapter/.editorconfig

@@ -0,0 +1,10 @@
+; top-most EditorConfig file
+root = true
+
+; Unix-style newlines
+[*]
+end_of_line = LF
+
+[*.php]
+indent_style = space
+indent_size = 4

+ 4 - 0
vendor/league/flysystem-cached-adapter/.gitignore

@@ -0,0 +1,4 @@
+coverage
+coverage.xml
+composer.lock
+vendor

+ 7 - 0
vendor/league/flysystem-cached-adapter/.php_cs

@@ -0,0 +1,7 @@
+<?php
+
+return Symfony\CS\Config\Config::create()
+    ->level(Symfony\CS\FixerInterface::PSR2_LEVEL)
+    ->fixers(['-yoda_conditions', 'ordered_use', 'short_array_syntax'])
+    ->finder(Symfony\CS\Finder\DefaultFinder::create()
+        ->in(__DIR__.'/src/'));

+ 34 - 0
vendor/league/flysystem-cached-adapter/.scrutinizer.yml

@@ -0,0 +1,34 @@
+filter:
+    paths: [src/*]
+checks:
+    php:
+        code_rating: true
+        remove_extra_empty_lines: true
+        remove_php_closing_tag: true
+        remove_trailing_whitespace: true
+        fix_use_statements:
+            remove_unused: true
+            preserve_multiple: false
+            preserve_blanklines: true
+            order_alphabetically: true
+        fix_php_opening_tag: true
+        fix_linefeed: true
+        fix_line_ending: true
+        fix_identation_4spaces: true
+        fix_doc_comments: true
+tools:
+    external_code_coverage:
+        timeout: 900
+        runs: 6
+    php_code_coverage: false
+    php_code_sniffer:
+        config:
+            standard: PSR2
+        filter:
+            paths: ['src']
+    php_loc:
+        enabled: true
+        excluded_dirs: [vendor, spec, stubs]
+    php_cpd:
+        enabled: true
+        excluded_dirs: [vendor, spec, stubs]

+ 29 - 0
vendor/league/flysystem-cached-adapter/.travis.yml

@@ -0,0 +1,29 @@
+language: php
+
+php:
+  - 5.5
+  - 5.6
+  - 7.0
+  - 7.1
+  - 7.2
+
+matrix:
+  allow_failures:
+  - php: 5.5
+
+env:
+  - COMPOSER_OPTS=""
+  - COMPOSER_OPTS="--prefer-lowest"
+
+install:
+  - if [[ "${TRAVIS_PHP_VERSION}" == "5.5" ]]; then composer require phpunit/phpunit:^4.8.36 phpspec/phpspec:^2 --prefer-dist --update-with-dependencies; fi
+  - if [[ "${TRAVIS_PHP_VERSION}" == "7.2" ]]; then composer require phpunit/phpunit:^6.0 --prefer-dist --update-with-dependencies; fi
+  - travis_retry composer update --prefer-dist $COMPOSER_OPTS
+
+script:
+  - vendor/bin/phpspec run
+  - vendor/bin/phpunit
+
+after_script:
+  - wget https://scrutinizer-ci.com/ocular.phar'
+  - php ocular.phar code-coverage:upload --format=php-clover ./clover/phpunit.xml'

+ 19 - 0
vendor/league/flysystem-cached-adapter/LICENSE

@@ -0,0 +1,19 @@
+Copyright (c) 2015 Frank de Jonge
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 2 - 0
vendor/league/flysystem-cached-adapter/clover/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 30 - 0
vendor/league/flysystem-cached-adapter/composer.json

@@ -0,0 +1,30 @@
+{
+    "name": "league/flysystem-cached-adapter",
+    "description": "An adapter decorator to enable meta-data caching.",
+    "autoload": {
+        "psr-4": {
+            "League\\Flysystem\\Cached\\": "src/"
+        }
+    },
+    "require": {
+        "league/flysystem": "~1.0",
+        "psr/cache": "^1.0.0"
+    },
+    "require-dev": {
+        "phpspec/phpspec": "^3.4",
+        "phpunit/phpunit": "^5.7",
+        "mockery/mockery": "~0.9",
+        "predis/predis": "~1.0",
+        "tedivm/stash": "~0.12"
+    },
+    "suggest": {
+      "ext-phpredis": "Pure C implemented extension for PHP"
+    },
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "frankdejonge",
+            "email": "info@frenky.net"
+        }
+    ]
+}

+ 6 - 0
vendor/league/flysystem-cached-adapter/phpspec.yml

@@ -0,0 +1,6 @@
+---
+suites:
+      cached_adapter_suite:
+        namespace: League\Flysystem\Cached
+        psr4_prefix: League\Flysystem\Cached
+formatter.name: pretty

+ 3 - 0
vendor/league/flysystem-cached-adapter/phpunit.php

@@ -0,0 +1,3 @@
+<?php
+
+include __DIR__.'/vendor/autoload.php';

+ 29 - 0
vendor/league/flysystem-cached-adapter/phpunit.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         bootstrap="./phpunit.php"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="true"
+         verbose="true"
+>
+    <testsuites>
+        <testsuite name="flysystem/tests">
+            <directory suffix=".php">./tests/</directory>
+        </testsuite>
+    </testsuites>
+    <filter>
+        <whitelist>
+            <directory suffix=".php">./src/</directory>
+        </whitelist>
+    </filter>
+    <logging>
+        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true"/>
+        <log type="coverage-html" target="coverage" showUncoveredFiles="true"/>
+        <log type="coverage-clover" target="clover/phpunit.xml" showUncoveredFiles="true"/>
+    </logging>
+</phpunit>

+ 20 - 0
vendor/league/flysystem-cached-adapter/readme.md

@@ -0,0 +1,20 @@
+# Flysystem Cached CachedAdapter
+
+[![Author](http://img.shields.io/badge/author-@frankdejonge-blue.svg?style=flat-square)](https://twitter.com/frankdejonge)
+[![Build Status](https://img.shields.io/travis/thephpleague/flysystem-cached-adapter/master.svg?style=flat-square)](https://travis-ci.org/thephpleague/flysystem-cached-adapter)
+[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/flysystem-cached-adapter.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/flysystem-cached-adapter/code-structure)
+[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/flysystem-cached-adapter.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/flysystem-cached-adapter)
+[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+[![Packagist Version](https://img.shields.io/packagist/v/league/flysystem-cached-adapter.svg?style=flat-square)](https://packagist.org/packages/league/flysystem-cached-adapter)
+[![Total Downloads](https://img.shields.io/packagist/dt/league/flysystem-cached-adapter.svg?style=flat-square)](https://packagist.org/packages/league/flysystem-cached-adapter)
+
+
+The adapter decorator caches metadata and directory listings.
+
+```bash
+composer require league/flysystem-cached-adapter
+```
+
+## Usage
+
+[Check out the docs.](https://flysystem.thephpleague.com/docs/advanced/caching/)

+ 435 - 0
vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php

@@ -0,0 +1,435 @@
+<?php
+
+namespace spec\League\Flysystem\Cached;
+
+use League\Flysystem\AdapterInterface;
+use League\Flysystem\Cached\CacheInterface;
+use League\Flysystem\Config;
+use PhpSpec\ObjectBehavior;
+
+class CachedAdapterSpec extends ObjectBehavior
+{
+    /**
+     * @var AdapterInterface
+     */
+    private $adapter;
+
+    /**
+     * @var CacheInterface
+     */
+    private $cache;
+
+    public function let(AdapterInterface $adapter, CacheInterface $cache)
+    {
+        $this->adapter = $adapter;
+        $this->cache = $cache;
+        $this->cache->load()->shouldBeCalled();
+        $this->beConstructedWith($adapter, $cache);
+    }
+
+    public function it_is_initializable()
+    {
+        $this->shouldHaveType('League\Flysystem\Cached\CachedAdapter');
+        $this->shouldHaveType('League\Flysystem\AdapterInterface');
+    }
+
+    public function it_should_forward_read_streams()
+    {
+        $path = 'path.txt';
+        $response = ['path' => $path];
+        $this->adapter->readStream($path)->willReturn($response);
+        $this->readStream($path)->shouldbe($response);
+    }
+
+    public function it_should_cache_writes()
+    {
+        $type = 'file';
+        $path = 'path.txt';
+        $contents = 'contents';
+        $config = new Config();
+        $response = compact('path', 'contents', 'type');
+        $this->adapter->write($path, $contents, $config)->willReturn($response);
+        $this->cache->updateObject($path, $response, true)->shouldBeCalled();
+        $this->write($path, $contents, $config)->shouldBe($response);
+    }
+
+    public function it_should_cache_streamed_writes()
+    {
+        $type = 'file';
+        $path = 'path.txt';
+        $stream = tmpfile();
+        $config = new Config();
+        $response = compact('path', 'stream', 'type');
+        $this->adapter->writeStream($path, $stream, $config)->willReturn($response);
+        $this->cache->updateObject($path, ['contents' => false] + $response, true)->shouldBeCalled();
+        $this->writeStream($path, $stream, $config)->shouldBe($response);
+        fclose($stream);
+    }
+
+    public function it_should_cache_streamed_updates()
+    {
+        $type = 'file';
+        $path = 'path.txt';
+        $stream = tmpfile();
+        $config = new Config();
+        $response = compact('path', 'stream', 'type');
+        $this->adapter->updateStream($path, $stream, $config)->willReturn($response);
+        $this->cache->updateObject($path, ['contents' => false] + $response, true)->shouldBeCalled();
+        $this->updateStream($path, $stream, $config)->shouldBe($response);
+        fclose($stream);
+    }
+
+    public function it_should_ignore_failed_writes()
+    {
+        $path = 'path.txt';
+        $contents = 'contents';
+        $config = new Config();
+        $this->adapter->write($path, $contents, $config)->willReturn(false);
+        $this->write($path, $contents, $config)->shouldBe(false);
+    }
+
+    public function it_should_ignore_failed_streamed_writes()
+    {
+        $path = 'path.txt';
+        $contents = tmpfile();
+        $config = new Config();
+        $this->adapter->writeStream($path, $contents, $config)->willReturn(false);
+        $this->writeStream($path, $contents, $config)->shouldBe(false);
+        fclose($contents);
+    }
+
+    public function it_should_cache_updated()
+    {
+        $type = 'file';
+        $path = 'path.txt';
+        $contents = 'contents';
+        $config = new Config();
+        $response = compact('path', 'contents', 'type');
+        $this->adapter->update($path, $contents, $config)->willReturn($response);
+        $this->cache->updateObject($path, $response, true)->shouldBeCalled();
+        $this->update($path, $contents, $config)->shouldBe($response);
+    }
+
+    public function it_should_ignore_failed_updates()
+    {
+        $path = 'path.txt';
+        $contents = 'contents';
+        $config = new Config();
+        $this->adapter->update($path, $contents, $config)->willReturn(false);
+        $this->update($path, $contents, $config)->shouldBe(false);
+    }
+
+    public function it_should_ignore_failed_streamed_updates()
+    {
+        $path = 'path.txt';
+        $contents = tmpfile();
+        $config = new Config();
+        $this->adapter->updateStream($path, $contents, $config)->willReturn(false);
+        $this->updateStream($path, $contents, $config)->shouldBe(false);
+        fclose($contents);
+    }
+
+    public function it_should_cache_renames()
+    {
+        $old = 'old.txt';
+        $new = 'new.txt';
+        $this->adapter->rename($old, $new)->willReturn(true);
+        $this->cache->rename($old, $new)->shouldBeCalled();
+        $this->rename($old, $new)->shouldBe(true);
+    }
+
+    public function it_should_ignore_rename_fails()
+    {
+        $old = 'old.txt';
+        $new = 'new.txt';
+        $this->adapter->rename($old, $new)->willReturn(false);
+        $this->rename($old, $new)->shouldBe(false);
+    }
+
+    public function it_should_cache_copies()
+    {
+        $old = 'old.txt';
+        $new = 'new.txt';
+        $this->adapter->copy($old, $new)->willReturn(true);
+        $this->cache->copy($old, $new)->shouldBeCalled();
+        $this->copy($old, $new)->shouldBe(true);
+    }
+
+    public function it_should_ignore_copy_fails()
+    {
+        $old = 'old.txt';
+        $new = 'new.txt';
+        $this->adapter->copy($old, $new)->willReturn(false);
+        $this->copy($old, $new)->shouldBe(false);
+    }
+
+    public function it_should_cache_deletes()
+    {
+        $delete = 'delete.txt';
+        $this->adapter->delete($delete)->willReturn(true);
+        $this->cache->delete($delete)->shouldBeCalled();
+        $this->delete($delete)->shouldBe(true);
+    }
+
+    public function it_should_ignore_delete_fails()
+    {
+        $delete = 'delete.txt';
+        $this->adapter->delete($delete)->willReturn(false);
+        $this->delete($delete)->shouldBe(false);
+    }
+
+    public function it_should_cache_dir_deletes()
+    {
+        $delete = 'delete';
+        $this->adapter->deleteDir($delete)->willReturn(true);
+        $this->cache->deleteDir($delete)->shouldBeCalled();
+        $this->deleteDir($delete)->shouldBe(true);
+    }
+
+    public function it_should_ignore_delete_dir_fails()
+    {
+        $delete = 'delete';
+        $this->adapter->deleteDir($delete)->willReturn(false);
+        $this->deleteDir($delete)->shouldBe(false);
+    }
+
+    public function it_should_cache_dir_creates()
+    {
+        $dirname = 'dirname';
+        $config = new Config();
+        $response = ['path' => $dirname, 'type' => 'dir'];
+        $this->adapter->createDir($dirname, $config)->willReturn($response);
+        $this->cache->updateObject($dirname, $response, true)->shouldBeCalled();
+        $this->createDir($dirname, $config)->shouldBe($response);
+    }
+
+    public function it_should_ignore_create_dir_fails()
+    {
+        $dirname = 'dirname';
+        $config = new Config();
+        $this->adapter->createDir($dirname, $config)->willReturn(false);
+        $this->createDir($dirname, $config)->shouldBe(false);
+    }
+
+    public function it_should_cache_set_visibility()
+    {
+        $path = 'path.txt';
+        $visibility = AdapterInterface::VISIBILITY_PUBLIC;
+        $this->adapter->setVisibility($path, $visibility)->willReturn(true);
+        $this->cache->updateObject($path, ['path' => $path, 'visibility' => $visibility], true)->shouldBeCalled();
+        $this->setVisibility($path, $visibility)->shouldBe(true);
+    }
+
+    public function it_should_ignore_set_visibility_fails()
+    {
+        $dirname = 'delete';
+        $visibility = AdapterInterface::VISIBILITY_PUBLIC;
+        $this->adapter->setVisibility($dirname, $visibility)->willReturn(false);
+        $this->setVisibility($dirname, $visibility)->shouldBe(false);
+    }
+
+    public function it_should_indicate_missing_files()
+    {
+        $this->cache->has($path = 'path.txt')->willReturn(false);
+        $this->has($path)->shouldBe(false);
+    }
+
+    public function it_should_indicate_file_existance()
+    {
+        $this->cache->has($path = 'path.txt')->willReturn(true);
+        $this->has($path)->shouldBe(true);
+    }
+
+    public function it_should_cache_missing_files()
+    {
+        $this->cache->has($path = 'path.txt')->willReturn(null);
+        $this->adapter->has($path)->willReturn(false);
+        $this->cache->storeMiss($path)->shouldBeCalled();
+        $this->has($path)->shouldBe(false);
+    }
+
+    public function it_should_delete_when_metadata_is_missing()
+    {
+        $path = 'path.txt';
+        $this->cache->has($path)->willReturn(true);
+        $this->cache->getSize($path)->willReturn(['path' => $path]);
+        $this->adapter->getSize($path)->willReturn($response = ['path' => $path, 'size' => 1024]);
+        $this->cache->updateObject($path, $response, true)->shouldBeCalled();
+        $this->getSize($path)->shouldBe($response);
+    }
+
+    public function it_should_cache_has()
+    {
+        $this->cache->has($path = 'path.txt')->willReturn(null);
+        $this->adapter->has($path)->willReturn(true);
+        $this->cache->updateObject($path, compact('path'), true)->shouldBeCalled();
+        $this->has($path)->shouldBe(true);
+    }
+
+    public function it_should_list_cached_contents()
+    {
+        $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(true);
+        $response = [['path' => 'path.txt']];
+        $this->cache->listContents($dirname, $recursive)->willReturn($response);
+        $this->listContents($dirname, $recursive)->shouldBe($response);
+    }
+
+    public function it_should_ignore_failed_list_contents()
+    {
+        $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(false);
+        $this->adapter->listContents($dirname, $recursive)->willReturn(false);
+        $this->listContents($dirname, $recursive)->shouldBe(false);
+    }
+
+    public function it_should_cache_contents_listings()
+    {
+        $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(false);
+        $response = [['path' => 'path.txt']];
+        $this->adapter->listContents($dirname, $recursive)->willReturn($response);
+        $this->cache->storeContents($dirname, $response, $recursive)->shouldBeCalled();
+        $this->listContents($dirname, $recursive)->shouldBe($response);
+    }
+
+    public function it_should_use_cached_visibility()
+    {
+        $this->make_it_use_getter_cache('getVisibility', 'path.txt', [
+            'path' => 'path.txt',
+            'visibility' => AdapterInterface::VISIBILITY_PUBLIC,
+        ]);
+    }
+
+    public function it_should_cache_get_visibility()
+    {
+        $path = 'path.txt';
+        $response = ['visibility' => AdapterInterface::VISIBILITY_PUBLIC, 'path' => $path];
+        $this->make_it_cache_getter('getVisibility', $path, $response);
+    }
+
+    public function it_should_ignore_failed_get_visibility()
+    {
+        $path = 'path.txt';
+        $this->make_it_ignore_failed_getter('getVisibility', $path);
+    }
+
+    public function it_should_use_cached_timestamp()
+    {
+        $this->make_it_use_getter_cache('getTimestamp', 'path.txt', [
+            'path' => 'path.txt',
+            'timestamp' => 1234,
+        ]);
+    }
+
+    public function it_should_cache_timestamps()
+    {
+        $this->make_it_cache_getter('getTimestamp', 'path.txt', [
+            'path' => 'path.txt',
+            'timestamp' => 1234,
+        ]);
+    }
+
+    public function it_should_ignore_failed_get_timestamps()
+    {
+        $this->make_it_ignore_failed_getter('getTimestamp', 'path.txt');
+    }
+
+    public function it_should_cache_get_metadata()
+    {
+        $path = 'path.txt';
+        $response = ['visibility' => AdapterInterface::VISIBILITY_PUBLIC, 'path' => $path];
+        $this->make_it_cache_getter('getMetadata', $path, $response);
+    }
+
+    public function it_should_use_cached_metadata()
+    {
+        $this->make_it_use_getter_cache('getMetadata', 'path.txt', [
+            'path' => 'path.txt',
+            'timestamp' => 1234,
+        ]);
+    }
+
+    public function it_should_ignore_failed_get_metadata()
+    {
+        $this->make_it_ignore_failed_getter('getMetadata', 'path.txt');
+    }
+
+    public function it_should_cache_get_size()
+    {
+        $path = 'path.txt';
+        $response = ['size' => 1234, 'path' => $path];
+        $this->make_it_cache_getter('getSize', $path, $response);
+    }
+
+    public function it_should_use_cached_size()
+    {
+        $this->make_it_use_getter_cache('getSize', 'path.txt', [
+            'path' => 'path.txt',
+            'size' => 1234,
+        ]);
+    }
+
+    public function it_should_ignore_failed_get_size()
+    {
+        $this->make_it_ignore_failed_getter('getSize', 'path.txt');
+    }
+
+    public function it_should_cache_get_mimetype()
+    {
+        $path = 'path.txt';
+        $response = ['mimetype' => 'text/plain', 'path' => $path];
+        $this->make_it_cache_getter('getMimetype', $path, $response);
+    }
+
+    public function it_should_use_cached_mimetype()
+    {
+        $this->make_it_use_getter_cache('getMimetype', 'path.txt', [
+            'path' => 'path.txt',
+            'mimetype' => 'text/plain',
+        ]);
+    }
+
+    public function it_should_ignore_failed_get_mimetype()
+    {
+        $this->make_it_ignore_failed_getter('getMimetype', 'path.txt');
+    }
+
+    public function it_should_cache_reads()
+    {
+        $path = 'path.txt';
+        $response = ['path' => $path, 'contents' => 'contents'];
+        $this->make_it_cache_getter('read', $path, $response);
+    }
+
+    public function it_should_use_cached_file_contents()
+    {
+        $this->make_it_use_getter_cache('read', 'path.txt', [
+            'path' => 'path.txt',
+            'contents' => 'contents'
+        ]);
+    }
+
+    public function it_should_ignore_failed_reads()
+    {
+        $this->make_it_ignore_failed_getter('read', 'path.txt');
+    }
+
+    protected function make_it_use_getter_cache($method, $path, $response)
+    {
+        $this->cache->{$method}($path)->willReturn($response);
+        $this->{$method}($path)->shouldBe($response);
+    }
+
+    protected function make_it_cache_getter($method, $path, $response)
+    {
+        $this->cache->{$method}($path)->willReturn(false);
+        $this->adapter->{$method}($path)->willReturn($response);
+        $this->cache->updateObject($path, $response, true)->shouldBeCalled();
+        $this->{$method}($path)->shouldBe($response);
+    }
+
+    protected function make_it_ignore_failed_getter($method, $path)
+    {
+        $this->cache->{$method}($path)->willReturn(false);
+        $this->adapter->{$method}($path)->willReturn(false);
+        $this->{$method}($path)->shouldBe(false);
+    }
+}

+ 101 - 0
vendor/league/flysystem-cached-adapter/src/CacheInterface.php

@@ -0,0 +1,101 @@
+<?php
+
+namespace League\Flysystem\Cached;
+
+use League\Flysystem\ReadInterface;
+
+interface CacheInterface extends ReadInterface
+{
+    /**
+     * Check whether the directory listing of a given directory is complete.
+     *
+     * @param string $dirname
+     * @param bool   $recursive
+     *
+     * @return bool
+     */
+    public function isComplete($dirname, $recursive);
+
+    /**
+     * Set a directory to completely listed.
+     *
+     * @param string $dirname
+     * @param bool   $recursive
+     */
+    public function setComplete($dirname, $recursive);
+
+    /**
+     * Store the contents of a directory.
+     *
+     * @param string $directory
+     * @param array  $contents
+     * @param bool   $recursive
+     */
+    public function storeContents($directory, array $contents, $recursive);
+
+    /**
+     * Flush the cache.
+     */
+    public function flush();
+
+    /**
+     * Autosave trigger.
+     */
+    public function autosave();
+
+    /**
+     * Store the cache.
+     */
+    public function save();
+
+    /**
+     * Load the cache.
+     */
+    public function load();
+
+    /**
+     * Rename a file.
+     *
+     * @param string $path
+     * @param string $newpath
+     */
+    public function rename($path, $newpath);
+
+    /**
+     * Copy a file.
+     *
+     * @param string $path
+     * @param string $newpath
+     */
+    public function copy($path, $newpath);
+
+    /**
+     * Delete an object from cache.
+     *
+     * @param string $path object path
+     */
+    public function delete($path);
+
+    /**
+     * Delete all objects from from a directory.
+     *
+     * @param string $dirname directory path
+     */
+    public function deleteDir($dirname);
+
+    /**
+     * Update the metadata for an object.
+     *
+     * @param string $path     object path
+     * @param array  $object   object metadata
+     * @param bool   $autosave whether to trigger the autosave routine
+     */
+    public function updateObject($path, array $object, $autosave = false);
+
+    /**
+     * Store object hit miss.
+     *
+     * @param string $path
+     */
+    public function storeMiss($path);
+}

+ 346 - 0
vendor/league/flysystem-cached-adapter/src/CachedAdapter.php

@@ -0,0 +1,346 @@
+<?php
+
+namespace League\Flysystem\Cached;
+
+use League\Flysystem\AdapterInterface;
+use League\Flysystem\Config;
+
+class CachedAdapter implements AdapterInterface
+{
+    /**
+     * @var AdapterInterface
+     */
+    private $adapter;
+
+    /**
+     * @var CacheInterface
+     */
+    private $cache;
+
+    /**
+     * Constructor.
+     *
+     * @param AdapterInterface $adapter
+     * @param CacheInterface   $cache
+     */
+    public function __construct(AdapterInterface $adapter, CacheInterface $cache)
+    {
+        $this->adapter = $adapter;
+        $this->cache = $cache;
+        $this->cache->load();
+    }
+
+    /**
+     * Get the underlying Adapter implementation.
+     *
+     * @return AdapterInterface
+     */
+    public function getAdapter()
+    {
+        return $this->adapter;
+    }
+
+    /**
+     * Get the used Cache implementation.
+     *
+     * @return CacheInterface
+     */
+    public function getCache()
+    {
+        return $this->cache;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($path, $contents, Config $config)
+    {
+        $result = $this->adapter->write($path, $contents, $config);
+
+        if ($result !== false) {
+            $result['type'] = 'file';
+            $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function writeStream($path, $resource, Config $config)
+    {
+        $result = $this->adapter->writeStream($path, $resource, $config);
+
+        if ($result !== false) {
+            $result['type'] = 'file';
+            $contents = false;
+            $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update($path, $contents, Config $config)
+    {
+        $result = $this->adapter->update($path, $contents, $config);
+
+        if ($result !== false) {
+            $result['type'] = 'file';
+            $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateStream($path, $resource, Config $config)
+    {
+        $result = $this->adapter->updateStream($path, $resource, $config);
+
+        if ($result !== false) {
+            $result['type'] = 'file';
+            $contents = false;
+            $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rename($path, $newPath)
+    {
+        $result = $this->adapter->rename($path, $newPath);
+
+        if ($result !== false) {
+            $this->cache->rename($path, $newPath);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function copy($path, $newpath)
+    {
+        $result = $this->adapter->copy($path, $newpath);
+
+        if ($result !== false) {
+            $this->cache->copy($path, $newpath);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($path)
+    {
+        $result = $this->adapter->delete($path);
+
+        if ($result !== false) {
+            $this->cache->delete($path);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteDir($dirname)
+    {
+        $result = $this->adapter->deleteDir($dirname);
+
+        if ($result !== false) {
+            $this->cache->deleteDir($dirname);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createDir($dirname, Config $config)
+    {
+        $result = $this->adapter->createDir($dirname, $config);
+
+        if ($result !== false) {
+            $type = 'dir';
+            $path = $dirname;
+            $this->cache->updateObject($dirname, compact('path', 'type'), true);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setVisibility($path, $visibility)
+    {
+        $result = $this->adapter->setVisibility($path, $visibility);
+
+        if ($result !== false) {
+            $this->cache->updateObject($path, compact('path', 'visibility'), true);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($path)
+    {
+        $cacheHas = $this->cache->has($path);
+
+        if ($cacheHas !== null) {
+            return $cacheHas;
+        }
+
+        $adapterResponse = $this->adapter->has($path);
+
+        if (! $adapterResponse) {
+            $this->cache->storeMiss($path);
+        } else {
+            $cacheEntry = is_array($adapterResponse) ? $adapterResponse : compact('path');
+            $this->cache->updateObject($path, $cacheEntry, true);
+        }
+
+        return $adapterResponse;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($path)
+    {
+        return $this->callWithFallback('contents', $path, 'read');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function readStream($path)
+    {
+        return $this->adapter->readStream($path);
+    }
+
+    /**
+     * Get the path prefix.
+     *
+     * @return string|null path prefix or null if pathPrefix is empty
+     */
+    public function getPathPrefix()
+    {
+        return $this->adapter->getPathPrefix();
+    }
+
+    /**
+     * Prefix a path.
+     *
+     * @param string $path
+     *
+     * @return string prefixed path
+     */
+    public function applyPathPrefix($path)
+    {
+        return $this->adapter->applyPathPrefix($path);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function listContents($directory = '', $recursive = false)
+    {
+        if ($this->cache->isComplete($directory, $recursive)) {
+            return $this->cache->listContents($directory, $recursive);
+        }
+
+        $result = $this->adapter->listContents($directory, $recursive);
+
+        if ($result !== false) {
+            $this->cache->storeContents($directory, $result, $recursive);
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadata($path)
+    {
+        return $this->callWithFallback(null, $path, 'getMetadata');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSize($path)
+    {
+        return $this->callWithFallback('size', $path, 'getSize');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMimetype($path)
+    {
+        return $this->callWithFallback('mimetype', $path, 'getMimetype');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTimestamp($path)
+    {
+        return $this->callWithFallback('timestamp', $path, 'getTimestamp');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVisibility($path)
+    {
+        return $this->callWithFallback('visibility', $path, 'getVisibility');
+    }
+
+    /**
+     * Call a method and cache the response.
+     *
+     * @param string $property
+     * @param string $path
+     * @param string $method
+     *
+     * @return mixed
+     */
+    protected function callWithFallback($property, $path, $method)
+    {
+        $result = $this->cache->{$method}($path);
+
+        if ($result !== false && ($property === null || array_key_exists($property, $result))) {
+            return $result;
+        }
+
+        $result = $this->adapter->{$method}($path);
+
+        if ($result) {
+            $object = $result + compact('path');
+            $this->cache->updateObject($path, $object, true);
+        }
+
+        return $result;
+    }
+}

+ 418 - 0
vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php

@@ -0,0 +1,418 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use League\Flysystem\Cached\CacheInterface;
+use League\Flysystem\Util;
+
+abstract class AbstractCache implements CacheInterface
+{
+    /**
+     * @var bool
+     */
+    protected $autosave = true;
+
+    /**
+     * @var array
+     */
+    protected $cache = [];
+
+    /**
+     * @var array
+     */
+    protected $complete = [];
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        if (! $this->autosave) {
+            $this->save();
+        }
+    }
+
+    /**
+     * Get the autosave setting.
+     *
+     * @return bool autosave
+     */
+    public function getAutosave()
+    {
+        return $this->autosave;
+    }
+
+    /**
+     * Get the autosave setting.
+     *
+     * @param bool $autosave
+     */
+    public function setAutosave($autosave)
+    {
+        $this->autosave = $autosave;
+    }
+
+    /**
+     * Store the contents listing.
+     *
+     * @param string $directory
+     * @param array  $contents
+     * @param bool   $recursive
+     *
+     * @return array contents listing
+     */
+    public function storeContents($directory, array $contents, $recursive = false)
+    {
+        $directories = [$directory];
+
+        foreach ($contents as $object) {
+            $this->updateObject($object['path'], $object);
+            $object = $this->cache[$object['path']];
+
+            if ($recursive && $this->pathIsInDirectory($directory, $object['path'])) {
+                $directories[] = $object['dirname'];
+            }
+        }
+
+        foreach (array_unique($directories) as $directory) {
+            $this->setComplete($directory, $recursive);
+        }
+
+        $this->autosave();
+    }
+
+    /**
+     * Update the metadata for an object.
+     *
+     * @param string $path     object path
+     * @param array  $object   object metadata
+     * @param bool   $autosave whether to trigger the autosave routine
+     */
+    public function updateObject($path, array $object, $autosave = false)
+    {
+        if (! $this->has($path)) {
+            $this->cache[$path] = Util::pathinfo($path);
+        }
+
+        $this->cache[$path] = array_merge($this->cache[$path], $object);
+
+        if ($autosave) {
+            $this->autosave();
+        }
+
+        $this->ensureParentDirectories($path);
+    }
+
+    /**
+     * Store object hit miss.
+     *
+     * @param string $path
+     */
+    public function storeMiss($path)
+    {
+        $this->cache[$path] = false;
+        $this->autosave();
+    }
+
+    /**
+     * Get the contents listing.
+     *
+     * @param string $dirname
+     * @param bool   $recursive
+     *
+     * @return array contents listing
+     */
+    public function listContents($dirname = '', $recursive = false)
+    {
+        $result = [];
+
+        foreach ($this->cache as $object) {
+            if ($object === false) {
+                continue;
+            }
+            if ($object['dirname'] === $dirname) {
+                $result[] = $object;
+            } elseif ($recursive && $this->pathIsInDirectory($dirname, $object['path'])) {
+                $result[] = $object;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($path)
+    {
+        if ($path !== false && array_key_exists($path, $this->cache)) {
+            return $this->cache[$path] !== false;
+        }
+
+        if ($this->isComplete(Util::dirname($path), false)) {
+            return false;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($path)
+    {
+        if (isset($this->cache[$path]['contents']) && $this->cache[$path]['contents'] !== false) {
+            return $this->cache[$path];
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function readStream($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rename($path, $newpath)
+    {
+        if ($this->has($path)) {
+            $object = $this->cache[$path];
+            unset($this->cache[$path]);
+            $object['path'] = $newpath;
+            $object = array_merge($object, Util::pathinfo($newpath));
+            $this->cache[$newpath] = $object;
+            $this->autosave();
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function copy($path, $newpath)
+    {
+        if ($this->has($path)) {
+            $object = $this->cache[$path];
+            $object = array_merge($object, Util::pathinfo($newpath));
+            $this->updateObject($newpath, $object, true);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($path)
+    {
+        $this->storeMiss($path);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function deleteDir($dirname)
+    {
+        foreach ($this->cache as $path => $object) {
+            if ($this->pathIsInDirectory($dirname, $path) || $path === $dirname) {
+                unset($this->cache[$path]);
+            }
+        }
+
+        unset($this->complete[$dirname]);
+
+        $this->autosave();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMimetype($path)
+    {
+        if (isset($this->cache[$path]['mimetype'])) {
+            return $this->cache[$path];
+        }
+
+        if (! $result = $this->read($path)) {
+            return false;
+        }
+
+        $mimetype = Util::guessMimeType($path, $result['contents']);
+        $this->cache[$path]['mimetype'] = $mimetype;
+
+        return $this->cache[$path];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSize($path)
+    {
+        if (isset($this->cache[$path]['size'])) {
+            return $this->cache[$path];
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTimestamp($path)
+    {
+        if (isset($this->cache[$path]['timestamp'])) {
+            return $this->cache[$path];
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVisibility($path)
+    {
+        if (isset($this->cache[$path]['visibility'])) {
+            return $this->cache[$path];
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadata($path)
+    {
+        if (isset($this->cache[$path]['type'])) {
+            return $this->cache[$path];
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isComplete($dirname, $recursive)
+    {
+        if (! array_key_exists($dirname, $this->complete)) {
+            return false;
+        }
+
+        if ($recursive && $this->complete[$dirname] !== 'recursive') {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setComplete($dirname, $recursive)
+    {
+        $this->complete[$dirname] = $recursive ? 'recursive' : true;
+    }
+
+    /**
+     * Filter the contents from a listing.
+     *
+     * @param array $contents object listing
+     *
+     * @return array filtered contents
+     */
+    public function cleanContents(array $contents)
+    {
+        $cachedProperties = array_flip([
+            'path', 'dirname', 'basename', 'extension', 'filename',
+            'size', 'mimetype', 'visibility', 'timestamp', 'type',
+            'md5',
+        ]);
+
+        foreach ($contents as $path => $object) {
+            if (is_array($object)) {
+                $contents[$path] = array_intersect_key($object, $cachedProperties);
+            }
+        }
+
+        return $contents;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function flush()
+    {
+        $this->cache = [];
+        $this->complete = [];
+        $this->autosave();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function autosave()
+    {
+        if ($this->autosave) {
+            $this->save();
+        }
+    }
+
+    /**
+     * Retrieve serialized cache data.
+     *
+     * @return string serialized data
+     */
+    public function getForStorage()
+    {
+        $cleaned = $this->cleanContents($this->cache);
+
+        return json_encode([$cleaned, $this->complete]);
+    }
+
+    /**
+     * Load from serialized cache data.
+     *
+     * @param string $json
+     */
+    public function setFromStorage($json)
+    {
+        list($cache, $complete) = json_decode($json, true);
+
+        if (json_last_error() === JSON_ERROR_NONE && is_array($cache) && is_array($complete)) {
+            $this->cache = $cache;
+            $this->complete = $complete;
+        }
+    }
+
+    /**
+     * Ensure parent directories of an object.
+     *
+     * @param string $path object path
+     */
+    public function ensureParentDirectories($path)
+    {
+        $object = $this->cache[$path];
+
+        while ($object['dirname'] !== '' && ! isset($this->cache[$object['dirname']])) {
+            $object = Util::pathinfo($object['dirname']);
+            $object['type'] = 'dir';
+            $this->cache[$object['path']] = $object;
+        }
+    }
+
+    /**
+     * Determines if the path is inside the directory.
+     *
+     * @param string $directory
+     * @param string $path
+     *
+     * @return bool
+     */
+    protected function pathIsInDirectory($directory, $path)
+    {
+        return $directory === '' || strpos($path, $directory . '/') === 0;
+    }
+}

+ 115 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php

@@ -0,0 +1,115 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use League\Flysystem\AdapterInterface;
+use League\Flysystem\Config;
+
+class Adapter extends AbstractCache
+{
+    /**
+     * @var AdapterInterface An adapter
+     */
+    protected $adapter;
+
+    /**
+     * @var string the file to cache to
+     */
+    protected $file;
+
+    /**
+     * @var int|null seconds until cache expiration
+     */
+    protected $expire = null;
+
+    /**
+     * Constructor.
+     *
+     * @param AdapterInterface $adapter adapter
+     * @param string           $file    the file to cache to
+     * @param int|null         $expire  seconds until cache expiration
+     */
+    public function __construct(AdapterInterface $adapter, $file, $expire = null)
+    {
+        $this->adapter = $adapter;
+        $this->file = $file;
+        $this->setExpire($expire);
+    }
+
+    /**
+     * Set the expiration time in seconds.
+     *
+     * @param int $expire relative expiration time
+     */
+    protected function setExpire($expire)
+    {
+        if ($expire) {
+            $this->expire = $this->getTime($expire);
+        }
+    }
+
+    /**
+     * Get expiration time in seconds.
+     *
+     * @param int $time relative expiration time
+     *
+     * @return int actual expiration time
+     */
+    protected function getTime($time = 0)
+    {
+        return intval(microtime(true)) + $time;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setFromStorage($json)
+    {
+        list($cache, $complete, $expire) = json_decode($json, true);
+
+        if (! $expire || $expire > $this->getTime()) {
+            $this->cache = is_array($cache) ? $cache : [];
+            $this->complete = is_array($complete) ? $complete : [];
+        } else {
+            $this->adapter->delete($this->file);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        if ($this->adapter->has($this->file)) {
+            $file = $this->adapter->read($this->file);
+            if ($file && !empty($file['contents'])) {
+                $this->setFromStorage($file['contents']);
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getForStorage()
+    {
+        $cleaned = $this->cleanContents($this->cache);
+
+        return json_encode([$cleaned, $this->complete, $this->expire]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $config = new Config();
+        $contents = $this->getForStorage();
+
+        if ($this->adapter->has($this->file)) {
+            $this->adapter->update($this->file, $contents, $config);
+        } else {
+            $this->adapter->write($this->file, $contents, $config);
+        }
+    }
+}

+ 59 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use Memcached as NativeMemcached;
+
+class Memcached extends AbstractCache
+{
+    /**
+     * @var string storage key
+     */
+    protected $key;
+
+    /**
+     * @var int|null seconds until cache expiration
+     */
+    protected $expire;
+
+    /**
+     * @var \Memcached Memcached instance
+     */
+    protected $memcached;
+
+    /**
+     * Constructor.
+     *
+     * @param \Memcached $memcached
+     * @param string     $key       storage key
+     * @param int|null   $expire    seconds until cache expiration
+     */
+    public function __construct(NativeMemcached $memcached, $key = 'flysystem', $expire = null)
+    {
+        $this->key = $key;
+        $this->expire = $expire;
+        $this->memcached = $memcached;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        $contents = $this->memcached->get($this->key);
+
+        if ($contents !== false) {
+            $this->setFromStorage($contents);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $contents = $this->getForStorage();
+        $expiration = $this->expire === null ? 0 : time() + $this->expire;
+        $this->memcached->set($this->key, $contents, $expiration);
+    }
+}

+ 22 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Memory.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+class Memory extends AbstractCache
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        // There is nothing to save
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        // There is nothing to load
+    }
+}

+ 171 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Noop.php

@@ -0,0 +1,171 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+class Noop extends AbstractCache
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected $autosave = false;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateObject($path, array $object, $autosave = false)
+    {
+        return $object;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function isComplete($dirname, $recursive)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setComplete($dirname, $recursive)
+    {
+        //
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function copy($path, $newpath)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rename($path, $newpath)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function storeContents($directory, array $contents, $recursive = false)
+    {
+        return $contents;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function storeMiss($path)
+    {
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function flush()
+    {
+        //
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function autosave()
+    {
+        //
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        //
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        //
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function has($path)
+    {
+        return;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function readStream($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function listContents($directory = '', $recursive = false)
+    {
+        return [];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMetadata($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSize($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getMimetype($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTimestamp($path)
+    {
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVisibility($path)
+    {
+        return false;
+    }
+}

+ 62 - 0
vendor/league/flysystem-cached-adapter/src/Storage/PhpRedis.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use Redis;
+
+class PhpRedis extends AbstractCache
+{
+    /**
+     * @var Redis PhpRedis Client
+     */
+    protected $client;
+
+    /**
+     * @var string storage key
+     */
+    protected $key;
+
+    /**
+     * @var int|null seconds until cache expiration
+     */
+    protected $expire;
+
+    /**
+     * Constructor.
+     *
+     * @param Redis|null $client phpredis client
+     * @param string     $key    storage key
+     * @param int|null   $expire seconds until cache expiration
+     */
+    public function __construct(Redis $client = null, $key = 'flysystem', $expire = null)
+    {
+        $this->client = $client ?: new Redis();
+        $this->key = $key;
+        $this->expire = $expire;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        $contents = $this->client->get($this->key);
+
+        if ($contents !== false) {
+            $this->setFromStorage($contents);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $contents = $this->getForStorage();
+        $this->client->set($this->key, $contents);
+
+        if ($this->expire !== null) {
+            $this->client->expire($this->key, $this->expire);
+        }
+    }
+}

+ 75 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Predis.php

@@ -0,0 +1,75 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use Predis\Client;
+
+class Predis extends AbstractCache
+{
+    /**
+     * @var \Predis\Client Predis Client
+     */
+    protected $client;
+
+    /**
+     * @var string storage key
+     */
+    protected $key;
+
+    /**
+     * @var int|null seconds until cache expiration
+     */
+    protected $expire;
+
+    /**
+     * Constructor.
+     *
+     * @param \Predis\Client $client predis client
+     * @param string         $key    storage key
+     * @param int|null       $expire seconds until cache expiration
+     */
+    public function __construct(Client $client = null, $key = 'flysystem', $expire = null)
+    {
+        $this->client = $client ?: new Client();
+        $this->key = $key;
+        $this->expire = $expire;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        if (($contents = $this->executeCommand('get', [$this->key])) !== null) {
+            $this->setFromStorage($contents);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $contents = $this->getForStorage();
+        $this->executeCommand('set', [$this->key, $contents]);
+
+        if ($this->expire !== null) {
+            $this->executeCommand('expire', [$this->key, $this->expire]);
+        }
+    }
+
+    /**
+     * Execute a Predis command.
+     *
+     * @param string $name
+     * @param array  $arguments
+     *
+     * @return string
+     */
+    protected function executeCommand($name, array $arguments)
+    {
+        $command = $this->client->createCommand($name, $arguments);
+
+        return $this->client->executeCommand($command);
+    }
+}

+ 59 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use Psr\Cache\CacheItemPoolInterface;
+
+class Psr6Cache extends AbstractCache
+{
+    /**
+     * @var CacheItemPoolInterface
+     */
+    private $pool;
+
+    /**
+     * @var string storage key
+     */
+    protected $key;
+
+    /**
+     * @var int|null seconds until cache expiration
+     */
+    protected $expire;
+
+    /**
+     * Constructor.
+     *
+     * @param CacheItemPoolInterface $pool
+     * @param string                 $key    storage key
+     * @param int|null               $expire seconds until cache expiration
+     */
+    public function __construct(CacheItemPoolInterface $pool, $key = 'flysystem', $expire = null)
+    {
+        $this->pool = $pool;
+        $this->key = $key;
+        $this->expire = $expire;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $item = $this->pool->getItem($this->key);
+        $item->set($this->getForStorage());
+        $item->expiresAfter($this->expire);
+        $this->pool->save($item);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        $item = $this->pool->getItem($this->key);
+        if ($item->isHit()) {
+            $this->setFromStorage($item->get());
+        }
+    }
+}

+ 60 - 0
vendor/league/flysystem-cached-adapter/src/Storage/Stash.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace League\Flysystem\Cached\Storage;
+
+use Stash\Pool;
+
+class Stash extends AbstractCache
+{
+    /**
+     * @var string storage key
+     */
+    protected $key;
+
+    /**
+     * @var int|null seconds until cache expiration
+     */
+    protected $expire;
+
+    /**
+     * @var \Stash\Pool Stash pool instance
+     */
+    protected $pool;
+
+    /**
+     * Constructor.
+     *
+     * @param \Stash\Pool $pool
+     * @param string      $key    storage key
+     * @param int|null    $expire seconds until cache expiration
+     */
+    public function __construct(Pool $pool, $key = 'flysystem', $expire = null)
+    {
+        $this->key = $key;
+        $this->expire = $expire;
+        $this->pool = $pool;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load()
+    {
+        $item = $this->pool->getItem($this->key);
+        $contents = $item->get();
+
+        if ($item->isMiss() === false) {
+            $this->setFromStorage($contents);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function save()
+    {
+        $contents = $this->getForStorage();
+        $item = $this->pool->getItem($this->key);
+        $item->set($contents, $this->expire);
+    }
+}

+ 104 - 0
vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php

@@ -0,0 +1,104 @@
+<?php
+
+use League\Flysystem\Cached\Storage\Adapter;
+use PHPUnit\Framework\TestCase;
+
+class AdapterCacheTests extends TestCase
+{
+    public function testLoadFail()
+    {
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false);
+        $cache = new Adapter($adapter, 'file.json', 10);
+        $cache->load();
+        $this->assertFalse($cache->isComplete('', false));
+    }
+
+    public function testLoadExpired()
+    {
+        $response = ['contents' => json_encode([[], ['' => true], 1234567890]), 'path' => 'file.json'];
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true);
+        $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response);
+        $adapter->shouldReceive('delete')->once()->with('file.json');
+        $cache = new Adapter($adapter, 'file.json', 10);
+        $cache->load();
+        $this->assertFalse($cache->isComplete('', false));
+    }
+
+    public function testLoadSuccess()
+    {
+        $response = ['contents' => json_encode([[], ['' => true], 9876543210]), 'path' => 'file.json'];
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true);
+        $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response);
+        $cache = new Adapter($adapter, 'file.json', 10);
+        $cache->load();
+        $this->assertTrue($cache->isComplete('', false));
+    }
+
+    public function testSaveExists()
+    {
+        $response = json_encode([[], [], null]);
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true);
+        $adapter->shouldReceive('update')->once()->with('file.json', $response, Mockery::any());
+        $cache = new Adapter($adapter, 'file.json', null);
+        $cache->save();
+    }
+
+    public function testSaveNew()
+    {
+        $response = json_encode([[], [], null]);
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false);
+        $adapter->shouldReceive('write')->once()->with('file.json', $response, Mockery::any());
+        $cache = new Adapter($adapter, 'file.json', null);
+        $cache->save();
+    }
+
+    public function testStoreContentsRecursive()
+    {
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false);
+        $adapter->shouldReceive('write')->once()->with('file.json', Mockery::any(), Mockery::any());
+
+        $cache = new Adapter($adapter, 'file.json', null);
+
+        $contents = [
+            ['path' => 'foo/bar', 'dirname' => 'foo'],
+            ['path' => 'afoo/bang', 'dirname' => 'afoo'],
+        ];
+
+        $cache->storeContents('foo', $contents, true);
+
+        $this->assertTrue($cache->isComplete('foo', true));
+        $this->assertFalse($cache->isComplete('afoo', true));
+    }
+
+    public function testDeleteDir()
+    {
+        $cache_data = [
+            'foo' => ['path' => 'foo', 'type' => 'dir', 'dirname' => ''],
+            'foo/bar' => ['path' => 'foo/bar', 'type' => 'file', 'dirname' => 'foo'],
+            'foobaz' => ['path' => 'foobaz', 'type' => 'file', 'dirname' => ''],
+        ];
+
+        $response = [
+            'contents' => json_encode([$cache_data, [], null]),
+            'path' => 'file.json',
+        ];
+
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $adapter->shouldReceive('has')->zeroOrMoreTimes()->with('file.json')->andReturn(true);
+        $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response);
+        $adapter->shouldReceive('update')->once()->with('file.json', Mockery::any(), Mockery::any())->andReturn(true);
+
+        $cache = new Adapter($adapter, 'file.json', null);
+        $cache->load();
+
+        $cache->deleteDir('foo', true);
+
+        $this->assertSame(1, count($cache->listContents('', true)));
+    }
+}

+ 16 - 0
vendor/league/flysystem-cached-adapter/tests/InspectionTests.php

@@ -0,0 +1,16 @@
+<?php
+
+use League\Flysystem\Cached\CachedAdapter;
+use PHPUnit\Framework\TestCase;
+
+class InspectionTests extends TestCase {
+
+    public function testGetAdapter()
+    {
+        $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
+        $cache = Mockery::mock('League\Flysystem\Cached\CacheInterface');
+        $cache->shouldReceive('load')->once();
+        $cached_adapter = new CachedAdapter($adapter, $cache);
+        $this->assertInstanceOf('League\Flysystem\AdapterInterface', $cached_adapter->getAdapter());
+    }
+}

+ 35 - 0
vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php

@@ -0,0 +1,35 @@
+<?php
+
+use League\Flysystem\Cached\Storage\Memcached;
+use PHPUnit\Framework\TestCase;
+
+class MemcachedTests extends TestCase
+{
+    public function testLoadFail()
+    {
+        $client = Mockery::mock('Memcached');
+        $client->shouldReceive('get')->once()->andReturn(false);
+        $cache = new Memcached($client);
+        $cache->load();
+        $this->assertFalse($cache->isComplete('', false));
+    }
+
+    public function testLoadSuccess()
+    {
+        $response = json_encode([[], ['' => true]]);
+        $client = Mockery::mock('Memcached');
+        $client->shouldReceive('get')->once()->andReturn($response);
+        $cache = new Memcached($client);
+        $cache->load();
+        $this->assertTrue($cache->isComplete('', false));
+    }
+
+    public function testSave()
+    {
+        $response = json_encode([[], []]);
+        $client = Mockery::mock('Memcached');
+        $client->shouldReceive('set')->once()->andReturn($response);
+        $cache = new Memcached($client);
+        $cache->save();
+    }
+}

+ 255 - 0
vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php

@@ -0,0 +1,255 @@
+<?php
+
+use League\Flysystem\Cached\Storage\Memory;
+use League\Flysystem\Util;
+use PHPUnit\Framework\TestCase;
+
+class MemoryCacheTests extends TestCase
+{
+    public function testAutosave()
+    {
+        $cache = new Memory();
+        $cache->setAutosave(true);
+        $this->assertTrue($cache->getAutosave());
+        $cache->setAutosave(false);
+        $this->assertFalse($cache->getAutosave());
+    }
+
+    public function testCacheMiss()
+    {
+        $cache = new Memory();
+        $cache->storeMiss('path.txt');
+        $this->assertFalse($cache->has('path.txt'));
+    }
+
+    public function testIsComplete()
+    {
+        $cache = new Memory();
+        $this->assertFalse($cache->isComplete('dirname', false));
+        $cache->setComplete('dirname', false);
+        $this->assertFalse($cache->isComplete('dirname', true));
+        $cache->setComplete('dirname', true);
+        $this->assertTrue($cache->isComplete('dirname', true));
+    }
+
+    public function testCleanContents()
+    {
+        $cache = new Memory();
+        $input = [[
+            'path'       => 'path.txt',
+            'visibility' => 'public',
+            'invalid'    => 'thing',
+        ]];
+
+        $expected = [[
+            'path'       => 'path.txt',
+            'visibility' => 'public',
+        ]];
+
+        $output = $cache->cleanContents($input);
+        $this->assertEquals($expected, $output);
+    }
+
+    public function testGetForStorage()
+    {
+        $cache = new Memory();
+        $input = [[
+            'path'       => 'path.txt',
+            'visibility' => 'public',
+            'type'       => 'file',
+        ]];
+
+        $cache->storeContents('', $input, true);
+        $contents = $cache->listContents('', true);
+        $cached = [];
+        foreach ($contents as $item) {
+            $cached[$item['path']] = $item;
+        }
+
+        $this->assertEquals(json_encode([$cached, ['' => 'recursive']]), $cache->getForStorage());
+    }
+
+    public function testParentCompleteIsUsedDuringHas()
+    {
+        $cache = new Memory();
+        $cache->setComplete('dirname', false);
+        $this->assertFalse($cache->has('dirname/path.txt'));
+    }
+
+    public function testFlush()
+    {
+        $cache = new Memory();
+        $cache->setComplete('dirname', true);
+        $cache->updateObject('path.txt', [
+            'path'       => 'path.txt',
+            'visibility' => 'public',
+        ]);
+        $cache->flush();
+        $this->assertFalse($cache->isComplete('dirname', true));
+        $this->assertNull($cache->has('path.txt'));
+    }
+
+    public function testSetFromStorage()
+    {
+        $cache = new Memory();
+        $json = [[
+            'path.txt' => ['path' => 'path.txt', 'type' => 'file'],
+        ], ['dirname' => 'recursive']];
+        $jsonString = json_encode($json);
+        $cache->setFromStorage($jsonString);
+        $this->assertTrue($cache->has('path.txt'));
+        $this->assertTrue($cache->isComplete('dirname', true));
+    }
+
+    public function testGetMetadataFail()
+    {
+        $cache = new Memory();
+        $this->assertFalse($cache->getMetadata('path.txt'));
+    }
+
+    public function metaGetterProvider()
+    {
+        return [
+            ['getTimestamp', 'timestamp', 12344],
+            ['getMimetype', 'mimetype', 'text/plain'],
+            ['getSize', 'size', 12],
+            ['getVisibility', 'visibility', 'private'],
+            ['read', 'contents', '__contents__'],
+        ];
+    }
+
+    /**
+     * @dataProvider metaGetterProvider
+     *
+     * @param $method
+     * @param $key
+     * @param $value
+     */
+    public function testMetaGetters($method, $key, $value)
+    {
+        $cache = new Memory();
+        $this->assertFalse($cache->{$method}('path.txt'));
+        $cache->updateObject('path.txt', $object = [
+                'path' => 'path.txt',
+                'type' => 'file',
+                $key   => $value,
+            ] + Util::pathinfo('path.txt'), true);
+        $this->assertEquals($object, $cache->{$method}('path.txt'));
+        $this->assertEquals($object, $cache->getMetadata('path.txt'));
+    }
+
+    public function testGetDerivedMimetype()
+    {
+        $cache = new Memory();
+        $cache->updateObject('path.txt', [
+            'contents' => 'something',
+        ]);
+        $response = $cache->getMimetype('path.txt');
+        $this->assertEquals('text/plain', $response['mimetype']);
+    }
+
+    public function testCopyFail()
+    {
+        $cache = new Memory();
+        $cache->copy('one', 'two');
+        $this->assertNull($cache->has('two'));
+        $this->assertNull($cache->load());
+    }
+
+    public function testStoreContents()
+    {
+        $cache = new Memory();
+        $cache->storeContents('dirname', [
+            ['path' => 'dirname', 'type' => 'dir'],
+            ['path' => 'dirname/nested', 'type' => 'dir'],
+            ['path' => 'dirname/nested/deep', 'type' => 'dir'],
+            ['path' => 'other/nested/deep', 'type' => 'dir'],
+        ], true);
+
+        $this->isTrue($cache->isComplete('other/nested', true));
+    }
+
+    public function testDelete()
+    {
+        $cache = new Memory();
+        $cache->updateObject('path.txt', ['type' => 'file']);
+        $this->assertTrue($cache->has('path.txt'));
+        $cache->delete('path.txt');
+        $this->assertFalse($cache->has('path.txt'));
+    }
+
+    public function testDeleteDir()
+    {
+        $cache = new Memory();
+        $cache->storeContents('dirname', [
+            ['path' => 'dirname/path.txt', 'type' => 'file'],
+        ]);
+        $this->assertTrue($cache->isComplete('dirname', false));
+        $this->assertTrue($cache->has('dirname/path.txt'));
+        $cache->deleteDir('dirname');
+        $this->assertFalse($cache->isComplete('dirname', false));
+        $this->assertNull($cache->has('dirname/path.txt'));
+    }
+
+    public function testReadStream()
+    {
+        $cache = new Memory();
+        $this->assertFalse($cache->readStream('path.txt'));
+    }
+
+    public function testRename()
+    {
+        $cache = new Memory();
+        $cache->updateObject('path.txt', ['type' => 'file']);
+        $cache->rename('path.txt', 'newpath.txt');
+        $this->assertTrue($cache->has('newpath.txt'));
+    }
+
+    public function testCopy()
+    {
+        $cache = new Memory();
+        $cache->updateObject('path.txt', ['type' => 'file']);
+        $cache->copy('path.txt', 'newpath.txt');
+        $this->assertTrue($cache->has('newpath.txt'));
+    }
+
+    public function testComplextListContents()
+    {
+        $cache = new Memory();
+        $cache->storeContents('', [
+            ['path' => 'dirname', 'type' => 'dir'],
+            ['path' => 'dirname/file.txt', 'type' => 'file'],
+            ['path' => 'other', 'type' => 'dir'],
+            ['path' => 'other/file.txt', 'type' => 'file'],
+            ['path' => 'other/nested/file.txt', 'type' => 'file'],
+        ]);
+
+        $this->assertCount(3, $cache->listContents('other', true));
+    }
+
+    public function testComplextListContentsWithDeletedFile()
+    {
+        $cache = new Memory();
+        $cache->storeContents('', [
+            ['path' => 'dirname', 'type' => 'dir'],
+            ['path' => 'dirname/file.txt', 'type' => 'file'],
+            ['path' => 'other', 'type' => 'dir'],
+            ['path' => 'other/file.txt', 'type' => 'file'],
+            ['path' => 'other/another_file.txt', 'type' => 'file'],
+        ]);
+
+        $cache->delete('other/another_file.txt');
+        $this->assertCount(4, $cache->listContents('', true));
+    }
+
+    public function testCacheMissIfContentsIsFalse()
+    {
+        $cache = new Memory();
+        $cache->updateObject('path.txt', [
+            'path'     => 'path.txt',
+            'contents' => false,
+        ], true);
+
+        $this->assertFalse($cache->read('path.txt'));
+    }
+}

+ 35 - 0
vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php

@@ -0,0 +1,35 @@
+<?php
+
+use League\Flysystem\Cached\Storage\Noop;
+use PHPUnit\Framework\TestCase;
+
+class NoopCacheTests extends TestCase
+{
+    public function testNoop()
+    {
+        $cache = new Noop();
+        $this->assertEquals($cache, $cache->storeMiss('file.txt'));
+        $this->assertNull($cache->setComplete('', false));
+        $this->assertNull($cache->load());
+        $this->assertNull($cache->flush());
+        $this->assertNull($cache->has('path.txt'));
+        $this->assertNull($cache->autosave());
+        $this->assertFalse($cache->isComplete('', false));
+        $this->assertFalse($cache->read('something'));
+        $this->assertFalse($cache->readStream('something'));
+        $this->assertFalse($cache->getMetadata('something'));
+        $this->assertFalse($cache->getMimetype('something'));
+        $this->assertFalse($cache->getSize('something'));
+        $this->assertFalse($cache->getTimestamp('something'));
+        $this->assertFalse($cache->getVisibility('something'));
+        $this->assertEmpty($cache->listContents('', false));
+        $this->assertFalse($cache->rename('', ''));
+        $this->assertFalse($cache->copy('', ''));
+        $this->assertNull($cache->save());
+        $object = ['path' => 'path.ext'];
+        $this->assertEquals($object, $cache->updateObject('path.txt', $object));
+        $this->assertEquals([['path' => 'some/file.txt']], $cache->storeContents('unknwon', [
+            ['path' => 'some/file.txt'],
+        ], false));
+    }
+}

部分文件因文件數量過多而無法顯示