index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <template>
  2. <div>
  3. <el-row :gutter="20">
  4. <!--部门数据-->
  5. <el-col :span="6" :xs="24">
  6. <div class="head-container">
  7. <el-input
  8. v-model="deptName"
  9. placeholder="请输入部门名称"
  10. clearable
  11. size="small"
  12. prefix-icon="el-icon-search"
  13. style="margin-bottom: 20px"
  14. />
  15. </div>
  16. <div class="head-container">
  17. <el-tree
  18. :data="deptOptions"
  19. :props="defaultProps"
  20. :expand-on-click-node="false"
  21. :filter-node-method="filterNode"
  22. ref="tree"
  23. node-key="id"
  24. :default-expand-all="false"
  25. highlight-current
  26. @node-click="handleNodeClick"
  27. />
  28. </div>
  29. </el-col>
  30. <!--用户数据-->
  31. <el-col :span="18" :xs="24">
  32. <el-form
  33. :model="queryParams"
  34. ref="queryForm"
  35. size="small"
  36. :inline="true"
  37. v-show="showSearch"
  38. label-width="68px"
  39. >
  40. <el-form-item label="用户名称" prop="userName">
  41. <el-input
  42. v-model="queryParams.userName"
  43. placeholder="请输入用户名称"
  44. clearable
  45. style="width: 150px"
  46. @keyup.enter.native="handleQuery"
  47. />
  48. </el-form-item>
  49. <el-form-item label="手机号码" prop="phonenumber">
  50. <el-input
  51. v-model="queryParams.phonenumber"
  52. placeholder="请输入手机号码"
  53. clearable
  54. style="width: 150px"
  55. @keyup.enter.native="handleQuery"
  56. />
  57. </el-form-item>
  58. <el-form-item>
  59. <el-button
  60. type="primary"
  61. icon="el-icon-search"
  62. size="mini"
  63. @click="handleQuery"
  64. >搜索</el-button
  65. >
  66. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  67. >重置</el-button
  68. >
  69. </el-form-item>
  70. </el-form>
  71. <el-table
  72. v-show="checkType === 'multiple'"
  73. ref="dataTable"
  74. v-loading="loading"
  75. :row-key="getRowKey"
  76. :data="userList"
  77. @selection-change="handleMultipleUserSelect"
  78. >
  79. <el-table-column
  80. type="selection"
  81. :reserve-selection="true"
  82. width="50"
  83. align="center"
  84. />
  85. <el-table-column
  86. label="用户编号"
  87. align="center"
  88. key="userId"
  89. prop="userId"
  90. v-if="columns[0].visible"
  91. />
  92. <el-table-column
  93. label="登录账号"
  94. align="center"
  95. key="userName"
  96. prop="userName"
  97. v-if="columns[1].visible"
  98. :show-overflow-tooltip="true"
  99. />
  100. <el-table-column
  101. label="用户姓名"
  102. align="center"
  103. key="nickName"
  104. prop="nickName"
  105. v-if="columns[2].visible"
  106. :show-overflow-tooltip="true"
  107. />
  108. <el-table-column
  109. label="部门"
  110. align="center"
  111. key="deptName"
  112. prop="dept.deptName"
  113. v-if="columns[3].visible"
  114. :show-overflow-tooltip="true"
  115. />
  116. <el-table-column
  117. label="手机号码"
  118. align="center"
  119. key="phonenumber"
  120. prop="phonenumber"
  121. v-if="columns[4].visible"
  122. width="120"
  123. />
  124. </el-table>
  125. <el-table
  126. v-show="checkType === 'single'"
  127. v-loading="loading"
  128. :data="userList"
  129. @current-change="handleSingleUserSelect"
  130. >
  131. <el-table-column width="55" align="center">
  132. <template slot-scope="scope">
  133. <el-radio v-model="radioSelected" :label="scope.row.userId">{{
  134. ""
  135. }}</el-radio>
  136. </template>
  137. </el-table-column>
  138. <el-table-column
  139. label="用户编号"
  140. align="center"
  141. key="userId"
  142. prop="userId"
  143. v-if="columns[0].visible"
  144. />
  145. <el-table-column
  146. label="登录账号"
  147. align="center"
  148. key="userName"
  149. prop="userName"
  150. v-if="columns[1].visible"
  151. :show-overflow-tooltip="true"
  152. />
  153. <el-table-column
  154. label="用户姓名"
  155. align="center"
  156. key="nickName"
  157. prop="nickName"
  158. v-if="columns[2].visible"
  159. :show-overflow-tooltip="true"
  160. />
  161. <el-table-column
  162. label="部门"
  163. align="center"
  164. key="deptName"
  165. prop="dept.deptName"
  166. v-if="columns[3].visible"
  167. :show-overflow-tooltip="true"
  168. />
  169. <el-table-column
  170. label="手机号码"
  171. align="center"
  172. key="phonenumber"
  173. prop="phonenumber"
  174. v-if="columns[4].visible"
  175. width="120"
  176. />
  177. </el-table>
  178. <pagination
  179. v-show="total > 0"
  180. :total="total"
  181. :page-sizes="[5, 10]"
  182. :page.sync="queryParams.pageNum"
  183. :limit.sync="queryParams.pageSize"
  184. @pagination="getList"
  185. />
  186. </el-col>
  187. </el-row>
  188. </div>
  189. </template>
  190. <script>
  191. import { listUser, deptTreeSelect } from "@/api/system/user";
  192. import Treeselect from "@riophae/vue-treeselect";
  193. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  194. import { StrUtil } from "@/utils/StrUtil";
  195. export default {
  196. name: "FlowUser",
  197. dicts: ["sys_normal_disable", "sys_user_sex"],
  198. components: { Treeselect },
  199. // 接受父组件的值
  200. props: {
  201. // 回显数据传值
  202. selectValues: {
  203. type: Number | String | Array,
  204. default: null,
  205. required: false,
  206. },
  207. // 表格类型
  208. checkType: {
  209. type: String,
  210. default: "multiple",
  211. required: true,
  212. },
  213. },
  214. data() {
  215. return {
  216. // 遮罩层
  217. loading: true,
  218. // 选中数组
  219. ids: [],
  220. // 非单个禁用
  221. single: true,
  222. // 非多个禁用
  223. multiple: true,
  224. // 显示搜索条件
  225. showSearch: true,
  226. // 总条数
  227. total: 0,
  228. // 用户表格数据
  229. userList: [],
  230. // 弹出层标题
  231. title: "",
  232. // 部门树选项
  233. deptOptions: undefined,
  234. // 是否显示弹出层
  235. open: false,
  236. // 部门名称
  237. deptName: undefined,
  238. // 表单参数
  239. form: {},
  240. defaultProps: {
  241. children: "children",
  242. label: "label",
  243. },
  244. // 查询参数
  245. queryParams: {
  246. pageNum: 1,
  247. pageSize: 10,
  248. userName: undefined,
  249. phonenumber: undefined,
  250. status: undefined,
  251. deptId: undefined,
  252. },
  253. // 列信息
  254. columns: [
  255. { key: 0, label: `用户编号`, visible: true },
  256. { key: 1, label: `用户名称`, visible: true },
  257. { key: 2, label: `用户昵称`, visible: true },
  258. { key: 3, label: `部门`, visible: true },
  259. { key: 4, label: `手机号码`, visible: true },
  260. { key: 5, label: `状态`, visible: true },
  261. { key: 6, label: `创建时间`, visible: true },
  262. ],
  263. radioSelected: null, // 单选框传值
  264. selectUserList: [], // 回显数据传值
  265. };
  266. },
  267. watch: {
  268. // 根据名称筛选部门树
  269. deptName(val) {
  270. this.$refs.tree.filter(val);
  271. },
  272. selectValues: {
  273. handler(newVal) {
  274. if (StrUtil.isNotBlank(newVal)) {
  275. if (newVal instanceof Number) {
  276. this.radioSelected = newVal;
  277. } else {
  278. this.selectUserList = newVal;
  279. if (this.userList.length > 0) {
  280. this.$nextTick(() => {
  281. this.$refs.dataTable.clearSelection();
  282. newVal?.split(",").forEach((key) => {
  283. let item = this.userList.find((item) => key == item.userId);
  284. if (item) {
  285. this.$refs.dataTable.toggleRowSelection(item, true);
  286. }
  287. });
  288. });
  289. }
  290. }
  291. } else {
  292. this.$nextTick(() => {
  293. this.$refs.dataTable.clearSelection();
  294. });
  295. }
  296. },
  297. immediate: true,
  298. },
  299. userList: {
  300. handler(newVal) {
  301. if (
  302. StrUtil.isNotBlank(newVal) &&
  303. this.selectUserList.length > 0 &&
  304. newVal.length > 0
  305. ) {
  306. this.$nextTick(() => {
  307. this.$refs.dataTable.clearSelection();
  308. this.selectUserList?.split(",").forEach((key) => {
  309. let item = newVal.find((item) => key == item.userId);
  310. if (item) {
  311. this.$refs.dataTable.toggleRowSelection(item, true);
  312. }
  313. });
  314. });
  315. }
  316. },
  317. immediate: true, // 立即生效
  318. deep: true, //监听对象或数组的时候,要用到深度监听
  319. },
  320. },
  321. created() {
  322. this.getList();
  323. this.getDeptTree();
  324. },
  325. methods: {
  326. /** 查询用户列表 */
  327. getList() {
  328. this.loading = true;
  329. listUser(this.queryParams).then((response) => {
  330. this.userList = response.rows;
  331. this.total = response.total;
  332. this.loading = false;
  333. });
  334. },
  335. /** 查询部门下拉树结构 */
  336. getDeptTree() {
  337. deptTreeSelect().then((response) => {
  338. this.deptOptions = response.data;
  339. });
  340. },
  341. // 保存选中的数据id,row-key就是要指定一个key标识这一行的数据
  342. getRowKey(row) {
  343. return row.id;
  344. },
  345. // 筛选节点
  346. filterNode(value, data) {
  347. if (!value) return true;
  348. return data.label.indexOf(value) !== -1;
  349. },
  350. // 节点单击事件
  351. handleNodeClick(data) {
  352. this.queryParams.deptId = data.id;
  353. this.handleQuery();
  354. },
  355. // 多选框选中数据
  356. handleMultipleUserSelect(selection) {
  357. this.$emit("handleUserSelect", selection);
  358. },
  359. // 单选框选中数据
  360. handleSingleUserSelect(selection) {
  361. this.radioSelected = selection.userId; //点击当前行时,radio同样有选中效果
  362. this.$emit("handleUserSelect", selection);
  363. },
  364. /** 搜索按钮操作 */
  365. handleQuery() {
  366. this.queryParams.pageNum = 1;
  367. this.getList();
  368. },
  369. /** 重置按钮操作 */
  370. resetQuery() {
  371. this.dateRange = [];
  372. this.resetForm("queryForm");
  373. this.queryParams.deptId = undefined;
  374. this.$refs.tree.setCurrentKey(null);
  375. this.handleQuery();
  376. },
  377. },
  378. };
  379. </script>
  380. <style>
  381. /*隐藏radio展示的label及本身自带的样式*/
  382. /*.el-radio__label{*/
  383. /* display:none;*/
  384. /*}*/
  385. </style>