cats.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. <template>
  2. <section id="cert-check">
  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'">
  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 blod" @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.on_project==0&&itm.on_job==0&&itm.on_hire==0 ?'空闲':'工作中'}}</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. <p class="clickable">
  155. <a
  156. class="clickable"
  157. :href="`/main/persona?uid=${itm.uid}`"
  158. target="_blank"
  159. >程序员画像</a>
  160. </p>
  161. </div>
  162. </div>
  163. </div>
  164. <div class="dev-right">
  165. <div class="grid-content">
  166. <div class="dev-detail">
  167. <p>
  168. <span class="blod black">意愿:</span>
  169. <span>{{itm.willing}}</span>
  170. </p>
  171. <p>
  172. <span class="blod black">接单:</span>
  173. <span v-if="itm.work_status==1">
  174. <span v-if="itm.work_option==0 ">接受所有派单及预约机会</span>
  175. <span v-if="itm.work_option==3">只接受平台派单和认证企业预约</span>
  176. <span v-if="itm.work_option==1">只接受平台派单</span>
  177. </span>
  178. <span v-else>
  179. <span>不接单</span>
  180. </span>
  181. </p>
  182. <p>
  183. <span class="blod black">数量:</span>
  184. <span v-if="itm.doing_project_num">项目:{{itm.doing_project_num}},</span>
  185. <span v-if="itm.doing_job_num">云端:{{itm.doing_job_num}},</span>
  186. <span v-if="itm.doing_hire_num">雇佣:{{itm.doing_hire_num}},</span>
  187. </p>
  188. <p>
  189. <span class="blod black">权重:</span>
  190. <span>{{itm.appoint_weight}}</span>
  191. </p>
  192. <p style="padding-top:22px;">
  193. <span class="blod black">评价:</span>
  194. <el-rate
  195. disabled
  196. class="inlineb"
  197. style=" vertical-align: top;"
  198. v-model="itm.rating"
  199. :colors="['#99A9BF', '#F7BA2A', '#FF9900']"
  200. ></el-rate>
  201. <span v-if="itm.rating_count" class="lblack">({{itm.rating_count}})</span>
  202. </p>
  203. </div>
  204. </div>
  205. </div>
  206. </div>
  207. </div>
  208. </div>
  209. </div>
  210. <div>
  211. <el-pagination
  212. background
  213. @current-change="changePagination"
  214. @size-change="changePageSize"
  215. :current-page.sync="currentPage"
  216. :page-sizes="[10, 20, 30, 40]"
  217. :page-size="10"
  218. layout="total, sizes, prev, pager, next, jumper"
  219. :total="totalCount"
  220. ></el-pagination>
  221. </div>
  222. </section>
  223. </template>
  224. <script>
  225. const tableHeaders = [
  226. "用户ID",
  227. "昵称",
  228. "会员类型",
  229. "开始时间",
  230. "到期时间",
  231. "最新购买",
  232. "累计月数",
  233. "累计金额",
  234. "当前状态"
  235. ];
  236. const tableProps = [
  237. "uid",
  238. "nickname",
  239. "type_name",
  240. "start_date",
  241. "end_date",
  242. "pay_date",
  243. "total_month",
  244. "total_price",
  245. "status_name"
  246. ];
  247. // 现在环境是线上还是测试
  248. let env = "test";
  249. export default {
  250. data() {
  251. return {
  252. // query
  253. queryForm: {
  254. devDir: "",
  255. filter: ["1"],
  256. area: [],
  257. industry: [],
  258. confirm: "",
  259. nick: "",
  260. company: "",
  261. project: "",
  262. skill: ""
  263. },
  264. defaultProp: {
  265. label: "name",
  266. value: "id"
  267. },
  268. defaultProps: {
  269. children: "cities",
  270. label: "name",
  271. value: "id"
  272. },
  273. pageSize: 10,
  274. searchList: [],
  275. stars: 3,
  276. page: 1,
  277. pages: 0,
  278. // 原始数据
  279. listData: {},
  280. // 头部信息
  281. titleInfo: {},
  282. // 数据总条目
  283. totalCount: 0,
  284. // 当前页面
  285. currentPage: 1,
  286. // 列表头显示内容
  287. tableHeaders,
  288. // 列表头字段
  289. tableProps,
  290. // 列表数据
  291. tableData: [],
  292. checkeds: "",
  293. confirmOptions: [],
  294. number: 0,
  295. devDirList: [],
  296. areaList: [],
  297. industryList: []
  298. };
  299. },
  300. computed: {
  301. whole() {
  302. return this.listData.whole || {};
  303. }
  304. },
  305. mounted() {
  306. this.getTableData();
  307. this.getEnum();
  308. this.getSkillMap();
  309. this.getDirectionMap();
  310. this.getAreaMap();
  311. this.searchDeveloper();
  312. this.getIndustryMap();
  313. },
  314. filters: {
  315. toDate(val) {
  316. return new Date(val * 1000).toLocaleDateString();
  317. },
  318. projectLink(i) {
  319. const type = i.entity_type;
  320. let link = "javascript:void(0)";
  321. if (type === "1") link = `/rooter/outsourceitem/${i.entity_id}>`;
  322. else if (type === "3") link = `/rooter/wagedetails?job_id=${i.entity_id}`;
  323. return link;
  324. }
  325. },
  326. methods: {
  327. async getTableData() {
  328. let body = { page: this.currentPage, page_size: this.currentPageSize };
  329. const res = await this.$post("/api/admin/cert/getUserList", body);
  330. var data = res.data;
  331. env = data.current_env;
  332. },
  333. clickUID(uid) {
  334. console.log(uid);
  335. window.open(this.$store.state.domainConfig.siteUrl + `/wo/${uid}`);
  336. },
  337. clickUserID(uid) {
  338. console.log(uid);
  339. window.open(
  340. this.$store.state.domainConfig.siteUrl + `/rooter/user/${uid}`
  341. );
  342. },
  343. handleChange(value) {
  344. console.log(value);
  345. },
  346. handleChangeDir(value) {
  347. console.log(value);
  348. },
  349. /**
  350. * 点击 uid
  351. */
  352. changePageSize(pageSize) {
  353. this.pageSize = pageSize;
  354. this.searchDeveloper();
  355. },
  356. // 页码变动
  357. changePagination(page) {
  358. // console.log(pageSize);
  359. this.currentPage = page;
  360. this.searchDeveloper();
  361. },
  362. // 格式化列表数据
  363. formatTableData(data) {
  364. return data.map(i => {
  365. let projectName = "--";
  366. let prePay = "";
  367. let servicePay = "";
  368. let getPay = "";
  369. let realGet = "";
  370. return {
  371. ...i
  372. };
  373. });
  374. },
  375. // 认证资质
  376. async getEnum() {
  377. const res = await this.$get("/api/admin/cert/getEnum");
  378. this.confirmOptions = [];
  379. var data = res.data.cert_type_list;
  380. data.forEach(itm => {
  381. var obj = {};
  382. obj.value = itm.id;
  383. obj.label = itm.name;
  384. this.confirmOptions.push(obj);
  385. });
  386. },
  387. // 获取技能列表
  388. async getSkillMap() {
  389. const res = await this.$get("/api/admin/common/getSkillMap");
  390. },
  391. // 获取研发方向
  392. async getDirectionMap() {
  393. const res = await this.$get("/api/admin/common/getDirectionMap");
  394. var data = res.data;
  395. var arr = [];
  396. for (var i = 0; i < data.length; i++) {
  397. var obj = {};
  398. obj.label = data[i].occupation_name;
  399. obj.value = data[i].occupation_id;
  400. arr.push(obj);
  401. var arr1 = [];
  402. for (var j = 0; j < data[i].directions.length; j++) {
  403. var son = {};
  404. son.label = data[i].directions[j].direction_name;
  405. son.value = data[i].directions[j].direction_id;
  406. arr1.push(son);
  407. }
  408. arr[i].children = arr1;
  409. }
  410. arr.children = arr1;
  411. this.devDirList = arr;
  412. },
  413. // 获取城市列表
  414. async getAreaMap() {
  415. const res = await this.$get("/api/admin/common/getAreaMap");
  416. this.areaList = res.data;
  417. },
  418. // 获取用户列表
  419. async searchDeveloper(value) {
  420. console.log(111);
  421. if (value == 1) {
  422. this.currentPage = 1;
  423. }
  424. var developer_sign = 0;
  425. var free = 0;
  426. var negative_weight = 0;
  427. var black_list = 0;
  428. console.log(this.queryForm.filter);
  429. for (var i = 0; i < this.queryForm.filter.length; i++) {
  430. if (this.queryForm.filter[i] == "1") {
  431. developer_sign = 1;
  432. }
  433. if (this.queryForm.filter[i] == "2") {
  434. free = 1;
  435. }
  436. if (this.queryForm.filter[i] == "3") {
  437. negative_weight = 1;
  438. }
  439. if (this.queryForm.filter[i] == "4") {
  440. black_list = 1;
  441. }
  442. }
  443. // 行业是传一级还是二级的id
  444. var leng = this.queryForm.industry.length;
  445. var industry = this.queryForm.industry[leng - 1];
  446. // var confirm = this.queryForm.confirm.toString();
  447. const res = await this.$get("/api/admin/developer/searchDeveloper", {
  448. occupation_op: this.queryForm.devDir[0],
  449. direction_op: this.queryForm.devDir[1],
  450. province_op: this.queryForm.area[0],
  451. city_op: this.queryForm.area[1],
  452. industry_id: industry,
  453. verified: this.queryForm.confirm,
  454. developer_sign: developer_sign,
  455. free: free,
  456. negative_weight: negative_weight,
  457. black_list: black_list,
  458. nickname: this.queryForm.nick,
  459. company_name: this.queryForm.company,
  460. project_name: this.queryForm.project,
  461. skill_name: this.queryForm.skill,
  462. page_size: this.pageSize,
  463. page: this.currentPage
  464. });
  465. this.searchList = res.data.list;
  466. // console.log(this.searchList);
  467. this.totalCount = res.data.total;
  468. },
  469. // 获取行业列表
  470. async getIndustryMap() {
  471. const res = await this.$get("/api/admin/common/getIndustryMap");
  472. console.log(res.data);
  473. this.industryList = res.data;
  474. }
  475. },
  476. created() {}
  477. };
  478. </script>
  479. <style scoped lang="scss">
  480. .lblue {
  481. color: #419df7;
  482. }
  483. .lblack {
  484. color: #aeaeae;
  485. }
  486. .cats-boxs {
  487. height: calc(100% - 40px);
  488. overflow-y: auto;
  489. }
  490. .point {
  491. cursor: pointer;
  492. }
  493. .cats {
  494. // height: calc(100% - 80px);
  495. }
  496. .form-inline {
  497. display: flex;
  498. flex-wrap: wrap;
  499. }
  500. .developer-box {
  501. padding-top: 10px;
  502. background: #f7f7f7;
  503. font-size: 14px;
  504. padding-bottom: 20px;
  505. }
  506. .dev-main {
  507. margin: 0 auto;
  508. padding: 37px 9px 20px 23px;
  509. background: white;
  510. width: 1000px;
  511. // border: 1px solid gray;
  512. margin-bottom: 10px;
  513. box-sizing: border-box;
  514. }
  515. .dev-main > div {
  516. float: left;
  517. }
  518. .dev-left {
  519. width: 112px;
  520. text-align: center;
  521. }
  522. .state-of {
  523. display: inline-block;
  524. background: rgba(243, 243, 243, 1);
  525. font-size: 14px;
  526. color: #888888;
  527. padding: 3px 11px;
  528. }
  529. .dev-left p {
  530. padding: 3px 0;
  531. }
  532. .dev-center {
  533. width: 594px;
  534. }
  535. .dev-right {
  536. width: 260px;
  537. }
  538. .dev-detail {
  539. border-left: 1px solid #e0e0e0;
  540. padding: 3px 0 3px 19px;
  541. }
  542. .dev-detail > p {
  543. padding-top: 3px;
  544. padding-right: 10px;
  545. font-size: 13px;
  546. color: #505050;
  547. box-sizing: border-box;
  548. overflow: hidden;
  549. text-overflow: ellipsis;
  550. white-space: nowrap;
  551. }
  552. .dev-head {
  553. width: 74px;
  554. border-radius: 50%;
  555. overflow: hidden;
  556. }
  557. .dev-mark {
  558. margin-right: 22px;
  559. }
  560. .dev-mark > span {
  561. float: left;
  562. padding: 2px 9px;
  563. color: #888888;
  564. font-size: 14px;
  565. border: 1px solid #c0c0c0;
  566. border-radius: 2px;
  567. margin-right: 7px;
  568. height: 23px;
  569. line-height: 18px;
  570. }
  571. .dev-mark .dev-dark {
  572. float: left;
  573. padding: 2px 9px;
  574. color: white;
  575. font-size: 14px;
  576. background: #999999;
  577. border: 1px solid #999999;
  578. border-radius: 2px;
  579. margin-right: 7px;
  580. }
  581. .dev-infor {
  582. padding-top: 2px;
  583. }
  584. .dev-infor > p {
  585. padding-top: 3px;
  586. padding-right: 10px;
  587. font-size: 13px;
  588. color: #505050;
  589. box-sizing: border-box;
  590. overflow: hidden;
  591. text-overflow: ellipsis;
  592. white-space: nowrap;
  593. }
  594. .heightset {
  595. // height: calc(100% - 200px);
  596. // overflow: auto;
  597. }
  598. .clear::after {
  599. display: block;
  600. clear: both;
  601. content: "";
  602. }
  603. .inlineb {
  604. display: inline-block;
  605. }
  606. .floatl {
  607. float: left;
  608. }
  609. .floatr {
  610. float: right;
  611. }
  612. .table {
  613. height: calc(100% - 40px);
  614. }
  615. #main {
  616. }
  617. </style>