cats.vue 21 KB

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