personInfo-list.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">系统管理</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <a href="/personInfo">企业人员管理</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form
  17. ref="queryForm"
  18. :model="queryModel"
  19. inline
  20. class="demo-form-inline"
  21. >
  22. <el-form-item label="企业名称" prop="companyId">
  23. <el-select
  24. v-model="queryModel.companyId"
  25. filterable
  26. placeholder="请选择"
  27. style="width: 90%"
  28. size="mini"
  29. :filter-method="filterMethod"
  30. >
  31. <el-option
  32. v-for="company in companyInfoList"
  33. :key="company.id"
  34. :label="company.companyName"
  35. :value="company.id"
  36. ></el-option>
  37. </el-select>
  38. </el-form-item>
  39. <el-form-item label="企业类型" prop="registerType">
  40. <el-select
  41. v-model="queryModel.registerType"
  42. filterable
  43. placeholder="请选择"
  44. style="width: 120px"
  45. size="mini"
  46. >
  47. <el-option
  48. v-for="type in registerTypeResult"
  49. :key="type.value"
  50. :label="type.name"
  51. :value="type.value"
  52. ></el-option>
  53. </el-select>
  54. </el-form-item>
  55. <el-form-item label="姓名" prop="personName">
  56. <el-input
  57. type="text"
  58. size="mini"
  59. v-model="queryModel.personName"
  60. ></el-input>
  61. </el-form-item>
  62. <el-form-item label="身份证号码" prop="idCard">
  63. <el-input
  64. type="text"
  65. size="mini"
  66. v-model="queryModel.idCard"
  67. ></el-input>
  68. </el-form-item>
  69. <el-form-item label="openId" prop="openId">
  70. <el-input
  71. type="text"
  72. size="mini"
  73. v-model="queryModel.openId"
  74. ></el-input>
  75. </el-form-item>
  76. <el-form-item>
  77. <el-button
  78. type="primary"
  79. size="mini"
  80. icon="ios-search"
  81. @click="changePage(1)"
  82. :loading="loading"
  83. >查询</el-button
  84. >&nbsp;
  85. <el-button
  86. type="info"
  87. size="mini"
  88. style="margin-left: 8px"
  89. @click="handleReset('queryForm')"
  90. >重置</el-button
  91. >&nbsp;
  92. </el-form-item>
  93. </el-form>
  94. <el-divider></el-divider>
  95. <el-row class="button-group">
  96. <el-button
  97. type="primary"
  98. size="small"
  99. plain
  100. icon="el-icon-circle-plus"
  101. @click="handleAdd"
  102. >新增</el-button
  103. >
  104. <el-button
  105. type="primary"
  106. size="small"
  107. plain
  108. icon="el-icon-circle-plus"
  109. :disabled="multipleSelection.length == 0"
  110. @click="handleBatchDelete"
  111. >删除选中项</el-button
  112. >
  113. <el-button
  114. type="primary"
  115. size="small"
  116. plain
  117. icon="el-icon-upload2"
  118. @click="batchImportVisible = true"
  119. >导入</el-button
  120. >
  121. </el-row>
  122. <el-table
  123. :data="tableData"
  124. style="min-height: 400px"
  125. v-loading="loading"
  126. stripe
  127. @sort-change="sortChange"
  128. @selection-change="handleSelectionChange"
  129. >
  130. <el-table-column type="selection" width="55"></el-table-column>
  131. <el-table-column
  132. type="index"
  133. label="序号"
  134. :index="indexMethod"
  135. width="50"
  136. ></el-table-column>
  137. <el-table-column
  138. prop="companyName"
  139. label="企业"
  140. width="200"
  141. show-overflow-tooltip
  142. ></el-table-column>
  143. <el-table-column
  144. prop="registerTypeName"
  145. label="注册类型"
  146. width="120"
  147. ></el-table-column>
  148. <el-table-column
  149. prop="personName"
  150. label="姓名"
  151. width="150"
  152. ></el-table-column>
  153. <el-table-column
  154. prop="userName"
  155. label="用户名称"
  156. width="150"
  157. ></el-table-column>
  158. <el-table-column
  159. prop="idCard"
  160. label="身份证号码"
  161. width="180"
  162. show-overflow-tooltip
  163. ></el-table-column>
  164. <el-table-column
  165. prop="phone"
  166. label="手机号码"
  167. width="180"
  168. ></el-table-column>
  169. <el-table-column prop="faceImageUrl" label="人脸照片" width="180">
  170. <template slot-scope="{ row }">
  171. <a :href="row.faceImageUrl" target="_blank">
  172. <el-avatar
  173. :size="48"
  174. shape="circle"
  175. :src="
  176. row.faceImageUrl +
  177. '?x-oss-process=image/resize,m_fill,w_64,h_64'
  178. "
  179. :key="row.id"
  180. ></el-avatar>
  181. </a> </template
  182. ></el-table-column>
  183. <el-table-column prop="idCardUrl" label="身份证照片" width="180"
  184. ><template slot-scope="{ row }">
  185. <a :href="row.idCardUrl" target="_blank">
  186. <el-avatar
  187. :size="48"
  188. shape="circle"
  189. :src="
  190. row.idCardUrl + '?x-oss-process=image/resize,m_fill,w_64,h_64'
  191. "
  192. :key="row.id"
  193. ></el-avatar>
  194. </a> </template
  195. ></el-table-column>
  196. <el-table-column
  197. prop="openId"
  198. label="openId"
  199. width="180"
  200. ></el-table-column>
  201. <el-table-column
  202. prop="remark"
  203. label="备注"
  204. width="180"
  205. show-overflow-tooltip=""
  206. ></el-table-column>
  207. <el-table-column label="操作" width="180" fixed="right">
  208. <template slot-scope="{ row }">
  209. <el-row
  210. ><el-col :span="7">
  211. <el-link type="primary" @click="handleEdit(row)" gutter>编辑</el-link>
  212. </el-col>
  213. <el-col :span="7">
  214. <el-link type="danger" @click="handleDelete(row)">删除</el-link>
  215. </el-col>
  216. <el-col :span="10">
  217. <el-link type="warning" @click="resetPassword(row)"
  218. >密码重置</el-link
  219. >
  220. </el-col>
  221. </el-row>
  222. </template>
  223. </el-table-column>
  224. </el-table>
  225. <el-pagination
  226. :current-page.sync="pageIndex"
  227. :total="totalElements"
  228. :page-sizes="pageSizeList"
  229. @current-change="changePage"
  230. @size-change="pageSizeChange"
  231. layout="total, sizes, prev, pager, next, jumper"
  232. ></el-pagination>
  233. <personInfo-detail
  234. v-if="showModal"
  235. :businessKey="businessKey"
  236. :title="modalTitle"
  237. @close="onDetailModalClose"
  238. ></personInfo-detail>
  239. <!--批量导入S-->
  240. <el-dialog
  241. title="导入"
  242. :visible.sync="batchImportVisible"
  243. :modal-append-to-body="false"
  244. style="text-align: left"
  245. :close-on-click-modal="false"
  246. >
  247. <el-form label-width="150px">
  248. <el-form-item label="模板下载">
  249. <el-link
  250. href="http://rccs.oss-cn-hangzhou.aliyuncs.com/enterprise-federation/%E5%AF%BC%E5%85%A5%E4%BC%81%E4%B8%9A%E7%94%A8%E6%88%B7%E6%A8%A1%E6%9D%BF.xlsx"
  251. type="primary"
  252. target="_blank"
  253. >点击下载模板</el-link
  254. >
  255. </el-form-item>
  256. <el-form-item label="上传文件">
  257. <el-upload
  258. class="upload-demo"
  259. accept=".xlsx"
  260. :action="uploadUrlXls"
  261. :data="uploadXlsData"
  262. :headers="headers"
  263. :on-preview="handleBatchImportPreview"
  264. name="uploadFile"
  265. :multiple="true"
  266. :limit="1"
  267. :on-remove="handleBatchImportRemove"
  268. :before-remove="beforeBatchImportRemove"
  269. :before-upload="beforeUpload"
  270. :on-exceed="handleBatchImportExceed"
  271. :on-success="handleBatchImportSuccess"
  272. :file-list="batchImportFileList"
  273. >
  274. <el-button size="small" type="primary" :loading="xlsLoading"
  275. >点击上传</el-button
  276. >
  277. <div slot="tip" class="el-upload__tip">
  278. 只能上传xls文件,且不超过500kb
  279. </div>
  280. </el-upload>
  281. </el-form-item>
  282. </el-form>
  283. <div slot="footer" class="dialog-footer">
  284. <el-button type="primary" @click="batchImportVisible = false"
  285. >关 闭</el-button
  286. >
  287. </div>
  288. </el-dialog>
  289. <!--批量导入E-->
  290. </div>
  291. </template>
  292. <script>
  293. import Constant from "@/constant";
  294. import PersonInfoDetail from "./personInfo-detail";
  295. import personInfoApi from "@/api/base/personInfo";
  296. import dataDictionaryApi from "@/api/sys/dataDictionary";
  297. import companyInfoApi from "@/api/base/companyInfo";
  298. import NProgress from "nprogress"; // progress bar
  299. import "nprogress/nprogress.css"; // progress bar style
  300. import { getToken } from "@/utils/auth"; // get token from cookie
  301. export default {
  302. name: "BasePersonInfoList",
  303. data() {
  304. var self = this;
  305. return {
  306. queryModel: {
  307. companyId: "",
  308. companyName: "",
  309. registerType: "",
  310. personName: "",
  311. idCard: "",
  312. openId: "",
  313. },
  314. loading: false,
  315. tableData: [],
  316. pageIndex: 1,
  317. pageSize: 10,
  318. totalPages: 0,
  319. totalElements: 0,
  320. field: "",
  321. direction: "",
  322. pageSizeList: [10, 20, 30],
  323. multipleSelection: [],
  324. showModal: false,
  325. modalTitle: "",
  326. businessKey: "",
  327. registerTypeResult: [],
  328. //导入S
  329. batchImportVisible: false,
  330. batchImportFileList: [],
  331. uploadUrlXls: Constant.serverUrl + "/base/personInfo/importXls",
  332. uploadXlsData: {
  333. subFolder: "company",
  334. companyId: "",
  335. },
  336. headers: {
  337. Authorization: getToken(),
  338. },
  339. xlsLoading: false,
  340. //导入E
  341. companyInfoList: [],
  342. };
  343. },
  344. created() {
  345. var self = this;
  346. dataDictionaryApi
  347. .findByCatalogName({
  348. catalogName: "注册用户类型",
  349. })
  350. .then((response) => {
  351. var jsonData = response.data;
  352. this.registerTypeResult = jsonData.data;
  353. });
  354. },
  355. methods: {
  356. indexMethod(index) {
  357. return (this.pageIndex - 1) * this.pageSize + (index + 1);
  358. },
  359. changePage(pageIndex) {
  360. var self = this;
  361. self.loading = true;
  362. self.pageIndex = pageIndex;
  363. var formData = new FormData();
  364. formData.append("pageIndex", self.pageIndex);
  365. formData.append("pageSize", self.pageSize);
  366. formData.append("companyId", self.queryModel.companyId);
  367. formData.append("registerType", self.queryModel.registerType);
  368. formData.append("personName", self.queryModel.personName);
  369. formData.append("idCard", self.queryModel.idCard);
  370. formData.append("openId", self.queryModel.openId);
  371. if (this.field != null) {
  372. formData.append("field", this.field);
  373. }
  374. if (this.direction != null) {
  375. formData.append("direction", this.direction);
  376. }
  377. personInfoApi
  378. .pageList(formData)
  379. .then(function (response) {
  380. self.loading = false;
  381. var jsonData = response.data.data;
  382. self.tableData = jsonData.data;
  383. self.totalPages = jsonData.totalPages;
  384. self.totalElements = jsonData.recordsTotal;
  385. })
  386. .catch((error) => {
  387. self.loading = false;
  388. // self.$message.error(error + "");
  389. });
  390. },
  391. pageSizeChange(pageSize) {
  392. this.pageSize = pageSize;
  393. this.$nextTick(() => {
  394. this.changePage(this.pageIndex);
  395. });
  396. },
  397. sortChange(data) {
  398. this.field = data.column.field;
  399. this.direction = data.order;
  400. this.changePage(this.pageIndex);
  401. },
  402. handleSelectionChange(val) {
  403. this.multipleSelection = val;
  404. },
  405. handleReset(name) {
  406. this.$refs[name].resetFields();
  407. },
  408. handleAdd() {
  409. this.modalTitle = "新增";
  410. this.businessKey = "";
  411. this.showModal = true;
  412. },
  413. handleEdit(record) {
  414. this.modalTitle = "编辑";
  415. this.businessKey = record.id;
  416. this.showModal = true;
  417. },
  418. handleDelete(record) {
  419. var self = this;
  420. self
  421. .$confirm("是否确认删除?", "提示", {
  422. confirmButtonText: "确定",
  423. cancelButtonText: "取消",
  424. type: "warning",
  425. })
  426. .then(() => {
  427. personInfoApi.remove(record.id).then(function (response) {
  428. var jsonData = response.data;
  429. if (jsonData.result) {
  430. // var index = self.tableData.indexOf(record);
  431. // self.tableData.splice(index, 1);
  432. self.changePage(self.pageIndex);
  433. self.$message({
  434. type: "success",
  435. message: "删除成功!",
  436. });
  437. }
  438. });
  439. });
  440. },
  441. handleBatchDelete() {
  442. var self = this;
  443. var idList = this.multipleSelection.map((record) => {
  444. return record.id;
  445. });
  446. this.$confirm("是否确认删除选中项?", "提示", {
  447. confirmButtonText: "确定",
  448. cancelButtonText: "取消",
  449. type: "warning",
  450. }).then(() => {
  451. personInfoApi.batchRemove(idList).then(function (response) {
  452. var jsonData = response.data;
  453. if (jsonData.result) {
  454. self.changePage(self.pageIndex);
  455. self.$message({
  456. type: "success",
  457. message: "删除成功!",
  458. });
  459. }
  460. });
  461. });
  462. },
  463. onDetailModalClose(refreshed) {
  464. //保存成功后回调
  465. this.showModal = false;
  466. if (refreshed) {
  467. this.changePage(this.pageIndex);
  468. }
  469. },
  470. beforeUpload(file, fileList) {
  471. //导入前判断
  472. },
  473. //批量导入-上传成功
  474. handleBatchImportSuccess(response, file, fileList) {
  475. var self = this;
  476. self.xlsLoading = false;
  477. if (response.result) {
  478. self.$message.success(response.message);
  479. this.batchImportFileList = [];
  480. this.changePage(1);
  481. this.batchImportVisible = false;
  482. } else {
  483. //this.$message.error(response.message);
  484. this.batchImportFileList = [];
  485. this.changePage(1);
  486. if (response.data != null) {
  487. //下载有错误信息提示的报表
  488. //window.open(response.data);
  489. self.$message({
  490. showClose: true,
  491. dangerouslyUseHTMLString: true,
  492. message:
  493. response.message +
  494. `,<a href="${response.data}" target="_blank">点击下载未导入的数据报表</a>&nbsp;`,
  495. duration: 30000,
  496. });
  497. }
  498. }
  499. },
  500. //批量导入-预览
  501. handleBatchImportPreview(file) {
  502. console.log(file.url);
  503. },
  504. //批量导入-移除
  505. handleBatchImportRemove(file, fileList) {
  506. console.log(file, fileList);
  507. },
  508. //批量导入-移除前操作
  509. beforeBatchImportRemove(file, fileList) {
  510. console.log(file, fileList);
  511. },
  512. //批量导入-文件超出个数限制时的钩子
  513. handleBatchImportExceed(files, fileList) {
  514. this.$message.warning(
  515. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  516. files.length + fileList.length
  517. } 个文件`
  518. );
  519. },
  520. filterMethod(query, item) {
  521. var self = this;
  522. var formData = new FormData();
  523. formData.append("pageSize", 5);
  524. formData.append("companyName", query);
  525. companyInfoApi.list(formData).then(function (response) {
  526. var jsonData = response.data;
  527. if (jsonData.result) {
  528. self.companyInfoList = jsonData.data;
  529. }
  530. });
  531. },
  532. resetPassword(record) {
  533. var self = this;
  534. var formData = new FormData();
  535. formData.append("id", record.id);
  536. self
  537. .$confirm("是否确认重置密码?", "提示", {
  538. confirmButtonText: "确定",
  539. cancelButtonText: "取消",
  540. type: "warning",
  541. })
  542. .then(() => {
  543. personInfoApi.resetPassword(formData).then(function (response) {
  544. var jsonData = response.data;
  545. if (jsonData.result) {
  546. self.changePage(self.pageIndex);
  547. self.$message({
  548. type: "success",
  549. message: "重置成功!",
  550. });
  551. }
  552. });
  553. });
  554. },
  555. },
  556. mounted: function () {
  557. this.changePage(1);
  558. },
  559. components: {
  560. "personInfo-detail": PersonInfoDetail,
  561. },
  562. };
  563. </script>
  564. <style lang="scss" scoped>
  565. .el-breadcrumb {
  566. margin: 10px;
  567. line-height: 20px;
  568. }
  569. .el-divider {
  570. margin: 5px 0;
  571. }
  572. .demo-form-inline {
  573. margin-left: 10px;
  574. text-align: left;
  575. }
  576. .button-group {
  577. margin-left: 10px;
  578. text-align: left;
  579. }
  580. </style>