cats.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. <template>
  2. <section id="cert-check" class>
  3. <div class="table cats cats-boxs">
  4. <header>
  5. <el-form :inline="true" :model="queryForm" class="form-inline">
  6. <div>
  7. <el-form-item>
  8. <!-- 需要有全部 -->
  9. <el-cascader
  10. clearable
  11. filterable
  12. v-model="queryForm.devDir"
  13. placeholder="开发方向"
  14. :options="devDirList"
  15. change-on-select="true"
  16. @change="handleChangeDir"
  17. ></el-cascader>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-cascader
  21. clearable
  22. filterable
  23. v-model="queryForm.area"
  24. placeholder="所在地区"
  25. :props="defaultProps"
  26. :options="areaList"
  27. change-on-select
  28. @change="handleChange"
  29. ></el-cascader>
  30. </el-form-item>
  31. <el-form-item>
  32. <el-cascader
  33. clearable
  34. filterable
  35. v-model="queryForm.industry"
  36. :props="defaultProp"
  37. placeholder="行业领域"
  38. :options="industryList"
  39. change-on-select
  40. ></el-cascader>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-select v-model="queryForm.confirm" clearable placeholder="资质认证">
  44. <el-option
  45. v-for="item in confirmOptions"
  46. :key="item.value"
  47. :label="item.label"
  48. :value="item.value"
  49. ></el-option>
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item>
  53. <el-checkbox-group v-model="queryForm.filter">
  54. <el-checkbox label="1" name="type">已签约</el-checkbox>
  55. <el-checkbox label="2" name="type">空闲</el-checkbox>
  56. <el-checkbox label="3" name="type">负权重</el-checkbox>
  57. <el-checkbox label="4" name="type">黑名单</el-checkbox>
  58. </el-checkbox-group>
  59. </el-form-item>
  60. </div>
  61. <div>
  62. <el-form-item label="昵称">
  63. <el-input
  64. v-model="queryForm.nick"
  65. @keyup.enter.native="searchDeveloper(1)"
  66. placeholder="用户UID/昵称/姓名"
  67. ></el-input>
  68. </el-form-item>
  69. <el-form-item label="公司">
  70. <el-input
  71. v-model="queryForm.company"
  72. @keyup.enter.native="searchDeveloper(1)"
  73. placeholder="公司名称"
  74. ></el-input>
  75. </el-form-item>
  76. <el-form-item label="项目">
  77. <el-input
  78. v-model="queryForm.project"
  79. @keyup.enter.native="searchDeveloper(1)"
  80. placeholder="项目名称"
  81. ></el-input>
  82. </el-form-item>
  83. <el-form-item label="技能">
  84. <el-input
  85. v-model="queryForm.skill"
  86. placeholder="技能名称"
  87. @keyup.enter.native="searchDeveloper(1)"
  88. ></el-input>
  89. </el-form-item>
  90. <el-form-item>
  91. <el-button type="primary" @click="searchDeveloper(1)">筛选</el-button>
  92. </el-form-item>
  93. </div>
  94. </el-form>
  95. </header>
  96. <div class="heightset">
  97. <div class="developer-box">
  98. <div class="dev-main clear" v-for="itm in searchList" :key="itm.id">
  99. <div class="dev-left">
  100. <div class="grid-content">
  101. <img class="dev-head point" @click="clickUserID(itm.uid)" :src="itm.icon_url" alt />
  102. <p class="blackc">{{itm.uid}}</p>
  103. <p class="lblack font13">¥{{itm.work_price}}</p>
  104. <p v-if="itm.realname_re=='2'&&itm.developer_verify_status=='2'">
  105. <span class="state-of">已签约</span>
  106. </p>
  107. </div>
  108. </div>
  109. <div class="dev-center">
  110. <div class="grid-content">
  111. <div class="clear">
  112. <div class="floatl">
  113. <span class="lblue point" @click="clickUID(itm.uid)">{{itm.nickname}}</span>
  114. <span v-if="itm.realname" class="lblack font13">({{itm.realname}})</span>
  115. <span class="blod">{{itm.occupation_name}}</span>
  116. <span v-if="itm.direction_name">/{{itm.direction_name}}</span>
  117. </div>
  118. <div class="floatr dev-mark clear">
  119. <span v-if="itm.in_black_list==1" class="dev-dark">{{'黑名单'}}</span>
  120. <span v-if="itm.city_op_name">{{itm.city_op_name}}</span>
  121. <span v-if="itm.industry_name">{{itm.industry_name}}</span>
  122. <span v-if="itm.work_year_name">{{itm.work_year_name}}</span>
  123. <span>{{itm.hire_status?'工作中':'空闲'}}</span>
  124. <!-- <span v-for="(itms,ind) in itm.certTags" :key="itms.uid">
  125. {{itms.tag_name}}
  126. <span v-if="ind!=itm.works.length-1">,</span>
  127. </span>-->
  128. </div>
  129. </div>
  130. <div class="dev-infor">
  131. <p>
  132. <span class="blod black">技能:</span>
  133. <span>{{itm.skill_description}}</span>
  134. </p>
  135. <p>
  136. <span class="blod black">项目:</span>
  137. <span v-for="(itms,ind) in itm.works" :key="itms.uid">
  138. {{itms.name}}
  139. <span v-if="ind!=itm.works.length-1">,</span>
  140. </span>
  141. </p>
  142. <p>
  143. <span class="blod black">公司:</span>
  144. <span>{{itm.company}}</span>
  145. <span>{{itm.title}}</span>
  146. </p>
  147. <p style="padding-top:22px;">
  148. <span class="blod black">认证:</span>
  149. <span v-for="(itms,ind) in itm.certTags" :key="itms.uid">
  150. {{itms.tag_name}}
  151. <span v-if="ind!=itm.certTags.length-1">,</span>
  152. </span>
  153. </p>
  154. </div>
  155. </div>
  156. </div>
  157. <div class="dev-right">
  158. <div class="grid-content">
  159. <div class="dev-detail">
  160. <p>
  161. <span class="blod black">意愿:</span>
  162. <span>{{itm.willing}}</span>
  163. </p>
  164. <p>
  165. <span class="blod black">接单:</span>
  166. <span v-if="itm.work_status==1">
  167. <span v-if="itm.work_option==0 ">接受所有派单及预约机会</span>
  168. <span v-if="itm.work_option==3">只接受平台派单和认证企业预约</span>
  169. <span v-if="itm.work_option==1">只接受平台派单</span>
  170. </span>
  171. <span v-else>
  172. <span>不接单</span>
  173. </span>
  174. </p>
  175. <p>
  176. <span class="blod black">数量:</span>
  177. <span v-if="itm.doing_project_num">项目:{{itm.doing_project_num}},</span>
  178. <span v-if="itm.doing_job_num">云端:{{itm.doing_job_num}},</span>
  179. <span v-if="itm.doing_hire_num">雇佣:{{itm.doing_hire_num}},</span>
  180. </p>
  181. <p>
  182. <span class="blod black">权重:</span>
  183. <span>{{itm.appoint_weight}}</span>
  184. </p>
  185. <p style="padding-top:22px;">
  186. <span class="blod black">评价:</span>
  187. <el-rate
  188. disabled
  189. class="inlineb"
  190. style=" vertical-align: top;"
  191. v-model="itm.rating"
  192. :colors="['#99A9BF', '#F7BA2A', '#FF9900']"
  193. ></el-rate>
  194. <span v-if="itm.rating_count" class="lblack">({{itm.rating_count}})</span>
  195. </p>
  196. </div>
  197. </div>
  198. </div>
  199. </div>
  200. </div>
  201. </div>
  202. </div>
  203. <div class>
  204. <el-pagination
  205. background
  206. @current-change="changePagination"
  207. @size-change="changePageSize"
  208. :current-page.sync="currentPage"
  209. :page-sizes="[10, 20, 30, 40]"
  210. :page-size="10"
  211. layout="total, sizes, prev, pager, next, jumper"
  212. :total="totalCount"
  213. ></el-pagination>
  214. </div>
  215. </section>
  216. </template>
  217. <script>
  218. const tableHeaders = [
  219. "用户ID",
  220. "昵称",
  221. "会员类型",
  222. "开始时间",
  223. "到期时间",
  224. "最新购买",
  225. "累计月数",
  226. "累计金额",
  227. "当前状态"
  228. ];
  229. const tableProps = [
  230. "uid",
  231. "nickname",
  232. "type_name",
  233. "start_date",
  234. "end_date",
  235. "pay_date",
  236. "total_month",
  237. "total_price",
  238. "status_name"
  239. ];
  240. // 现在环境是线上还是测试
  241. let env = "test";
  242. export default {
  243. data() {
  244. return {
  245. // query
  246. queryForm: {
  247. devDir: "",
  248. filter: ["1"],
  249. area: [],
  250. industry: [],
  251. confirm: "",
  252. nick: "",
  253. company: "",
  254. project: "",
  255. skill: ""
  256. },
  257. defaultProp: {
  258. label: "name",
  259. value: "id"
  260. },
  261. defaultProps: {
  262. children: "cities",
  263. label: "name",
  264. value: "id"
  265. },
  266. pageSize: 10,
  267. searchList: [],
  268. stars: 3,
  269. page: 1,
  270. pages: 0,
  271. // 原始数据
  272. listData: {},
  273. // 头部信息
  274. titleInfo: {},
  275. // 数据总条目
  276. totalCount: 0,
  277. // 当前页面
  278. currentPage: 1,
  279. // 列表头显示内容
  280. tableHeaders,
  281. // 列表头字段
  282. tableProps,
  283. // 列表数据
  284. tableData: [],
  285. checkeds: "",
  286. confirmOptions: [],
  287. number: 0,
  288. devDirList: [],
  289. areaList: [],
  290. industryList: []
  291. };
  292. },
  293. computed: {
  294. whole() {
  295. return this.listData.whole || {};
  296. }
  297. },
  298. mounted() {
  299. this.getTableData();
  300. this.getEnum();
  301. this.getSkillMap();
  302. this.getDirectionMap();
  303. this.getAreaMap();
  304. this.searchDeveloper();
  305. this.getIndustryMap();
  306. },
  307. filters: {
  308. toDate(val) {
  309. return new Date(val * 1000).toLocaleDateString();
  310. },
  311. projectLink(i) {
  312. const type = i.entity_type;
  313. let link = "javascript:void(0)";
  314. if (type === "1") link = `/rooter/outsourceitem/${i.entity_id}>`;
  315. else if (type === "3") link = `/rooter/wagedetails?job_id=${i.entity_id}`;
  316. return link;
  317. }
  318. },
  319. methods: {
  320. async getTableData() {
  321. let body = { page: this.currentPage, page_size: this.currentPageSize };
  322. const res = await this.$post("/api/admin/cert/getUserList", body);
  323. data = res.data;
  324. env = data.current_env;
  325. },
  326. clickUID(uid) {
  327. console.log(uid);
  328. if (env === "test") window.open(`https://dev.test.proginn.com/wo/${uid}`);
  329. else window.open(`https://www.proginn.com/wo/${uid}`);
  330. },
  331. clickUserID(uid) {
  332. console.log(uid);
  333. if (env === "test")
  334. window.open(`https://dev.test.proginn.com/rooter/user/${uid}`);
  335. else window.open(`https://www.proginn.com/rooter/user/${uid}`);
  336. },
  337. handleChange(value) {
  338. console.log(value);
  339. },
  340. handleChangeDir(value) {
  341. console.log(value);
  342. },
  343. /**
  344. * 点击 uid
  345. */
  346. changePageSize(pageSize) {
  347. this.pageSize = pageSize;
  348. this.searchDeveloper();
  349. },
  350. // 页码变动
  351. changePagination(page) {
  352. // console.log(pageSize);
  353. this.currentPage = page;
  354. this.searchDeveloper();
  355. },
  356. // 格式化列表数据
  357. formatTableData(data) {
  358. return data.map(i => {
  359. let projectName = "--";
  360. let prePay = "";
  361. let servicePay = "";
  362. let getPay = "";
  363. let realGet = "";
  364. return {
  365. ...i
  366. };
  367. });
  368. },
  369. // 认证资质
  370. async getEnum() {
  371. const res = await this.$get("/api/admin/cert/getEnum");
  372. this.confirmOptions = [];
  373. var data = res.data.cert_type_list;
  374. data.forEach(itm => {
  375. var obj = {};
  376. obj.value = itm.id;
  377. obj.label = itm.name;
  378. this.confirmOptions.push(obj);
  379. });
  380. },
  381. // 获取技能列表
  382. async getSkillMap() {
  383. const res = await this.$get("/api/admin/common/getSkillMap");
  384. },
  385. // 获取研发方向
  386. async getDirectionMap() {
  387. const res = await this.$get("/api/admin/common/getDirectionMap");
  388. var data = res.data;
  389. var arr = [];
  390. for (var i = 0; i < data.length; i++) {
  391. var obj = {};
  392. obj.label = data[i].occupation_name;
  393. obj.value = data[i].occupation_id;
  394. arr.push(obj);
  395. var arr1 = [];
  396. for (var j = 0; j < data[i].directions.length; j++) {
  397. var son = {};
  398. son.label = data[i].directions[j].direction_name;
  399. son.value = data[i].directions[j].direction_id;
  400. arr1.push(son);
  401. }
  402. arr[i].children = arr1;
  403. }
  404. arr.children = arr1;
  405. this.devDirList = arr;
  406. },
  407. // 获取城市列表
  408. async getAreaMap() {
  409. const res = await this.$get("/api/admin/common/getAreaMap");
  410. this.areaList = res.data;
  411. },
  412. // 获取用户列表
  413. async searchDeveloper(value) {
  414. console.log(111);
  415. if (value == 1) {
  416. this.currentPage = 1;
  417. }
  418. var developer_sign = 0;
  419. var free = 0;
  420. var negative_weight = 0;
  421. var black_list = 0;
  422. console.log(this.queryForm.filter);
  423. for (var i = 0; i < this.queryForm.filter.length; i++) {
  424. if (this.queryForm.filter[i] == "1") {
  425. developer_sign = 1;
  426. }
  427. if (this.queryForm.filter[i] == "2") {
  428. free = 1;
  429. }
  430. if (this.queryForm.filter[i] == "3") {
  431. negative_weight = 1;
  432. }
  433. if (this.queryForm.filter[i] == "4") {
  434. black_list = 1;
  435. }
  436. }
  437. // 行业是传一级还是二级的id
  438. var leng = this.queryForm.industry.length;
  439. var industry = this.queryForm.industry[leng - 1];
  440. // var confirm = this.queryForm.confirm.toString();
  441. const res = await this.$get("/api/admin/developer/searchDeveloper", {
  442. occupation_op: this.queryForm.devDir[0],
  443. direction_op: this.queryForm.devDir[1],
  444. province_op: this.queryForm.area[0],
  445. city_op: this.queryForm.area[1],
  446. industry_id: industry,
  447. verified: this.queryForm.confirm,
  448. developer_sign: developer_sign,
  449. free: free,
  450. negative_weight: negative_weight,
  451. black_list: black_list,
  452. nickname: this.queryForm.nick,
  453. company_name: this.queryForm.company,
  454. project_name: this.queryForm.project,
  455. skill_name: this.queryForm.skill,
  456. page_size: this.pageSize,
  457. page: this.currentPage
  458. });
  459. this.searchList = res.data.list;
  460. // console.log(this.searchList);
  461. this.totalCount = res.data.total;
  462. },
  463. // 获取行业列表
  464. async getIndustryMap() {
  465. const res = await this.$get("/api/admin/common/getIndustryMap");
  466. console.log(res.data);
  467. this.industryList = res.data;
  468. }
  469. },
  470. created() {}
  471. };
  472. </script>
  473. <style scoped lang="scss">
  474. .cats-boxs {
  475. height: calc(100% - 40px);
  476. overflow-y: auto;
  477. }
  478. .point {
  479. cursor: pointer;
  480. }
  481. .cats {
  482. // height: calc(100% - 80px);
  483. }
  484. .form-inline {
  485. display: flex;
  486. flex-wrap: wrap;
  487. }
  488. .developer-box {
  489. padding-top: 10px;
  490. background: #f7f7f7;
  491. font-size: 14px;
  492. padding-bottom: 20px;
  493. }
  494. .dev-main {
  495. margin: 0 auto;
  496. padding: 37px 9px 20px 23px;
  497. background: white;
  498. width: 1000px;
  499. // border: 1px solid gray;
  500. margin-bottom: 10px;
  501. box-sizing: border-box;
  502. }
  503. .dev-main > div {
  504. float: left;
  505. }
  506. .dev-left {
  507. width: 112px;
  508. text-align: center;
  509. }
  510. .state-of {
  511. display: inline-block;
  512. background: rgba(243, 243, 243, 1);
  513. font-size: 12px;
  514. color: #888888;
  515. padding: 3px 11px;
  516. }
  517. .dev-left p {
  518. padding: 3px 0;
  519. }
  520. .dev-center {
  521. width: 594px;
  522. }
  523. .dev-right {
  524. width: 260px;
  525. }
  526. .dev-detail {
  527. border-left: 1px solid #e0e0e0;
  528. padding: 3px 0 3px 19px;
  529. }
  530. .dev-detail > p {
  531. padding-top: 3px;
  532. padding-right: 10px;
  533. font-size: 13px;
  534. color: #505050;
  535. box-sizing: border-box;
  536. overflow: hidden;
  537. text-overflow: ellipsis;
  538. white-space: nowrap;
  539. }
  540. .dev-head {
  541. width: 74px;
  542. border-radius: 50%;
  543. overflow: hidden;
  544. }
  545. .dev-mark {
  546. margin-right: 22px;
  547. }
  548. .dev-mark > span {
  549. float: left;
  550. padding: 2px 9px;
  551. color: #888888;
  552. font-size: 12px;
  553. border: 1px solid #c0c0c0;
  554. border-radius: 2px;
  555. margin-right: 7px;
  556. height: 23px;
  557. line-height: 18px;
  558. }
  559. .dev-mark .dev-dark {
  560. float: left;
  561. padding: 2px 9px;
  562. color: white;
  563. font-size: 12px;
  564. background: #999999;
  565. border: 1px solid #999999;
  566. border-radius: 2px;
  567. margin-right: 7px;
  568. }
  569. .dev-infor {
  570. padding-top: 2px;
  571. }
  572. .dev-infor > p {
  573. padding-top: 3px;
  574. padding-right: 10px;
  575. font-size: 13px;
  576. color: #505050;
  577. box-sizing: border-box;
  578. overflow: hidden;
  579. text-overflow: ellipsis;
  580. white-space: nowrap;
  581. }
  582. .heightset {
  583. // height: calc(100% - 200px);
  584. // overflow: auto;
  585. }
  586. </style>