user.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. <script setup>
  2. import { getMainList } from "@/api/system/depart.js"
  3. import { getRoleList } from "@/api/system/role"
  4. import {
  5. getUserList,
  6. addUser,
  7. modUser,
  8. byUserIdfnRole,
  9. byUserIduPRole,
  10. delUser,
  11. restPwdUser
  12. } from "@/api/system/user.js"
  13. const { proxy } = getCurrentInstance()
  14. //部门树
  15. const deptName = ref("")
  16. const deptOptions = ref([])
  17. const deptOptionsEdit = ref([])
  18. const filterNode = (value, data) => {
  19. if (!value) return true
  20. return data.name.indexOf(value) !== -1
  21. }
  22. watch(deptName, val => {
  23. proxy.$refs["deptTreeRef"].filter(val)
  24. })
  25. //查询
  26. const params = ref({
  27. deptId: null,
  28. page: 1,
  29. size: 20
  30. })
  31. const total = ref(0)
  32. const tableData = ref([])
  33. //用户列表
  34. function getUserListData() {
  35. getUserList(params.value).then(res => {
  36. tableData.value = res.data.records
  37. total.value = res.data.total
  38. })
  39. }
  40. //查询按钮
  41. function searchUserListBtn() {
  42. console.log(params.value)
  43. getUserListData()
  44. }
  45. //重置
  46. function resetParamsBtn() {
  47. params.value = {
  48. deptId: null,
  49. page: 1,
  50. size: 20
  51. }
  52. getUserListData()
  53. }
  54. function sizeChange(e) {
  55. params.value.size = e
  56. getUserListData()
  57. }
  58. function currentChange(e) {
  59. params.value.page = e
  60. getUserListData()
  61. }
  62. //部门点击
  63. function treeNodeClick(value) {
  64. params.value.deptId = value.id
  65. getUserListData()
  66. }
  67. //部门数据
  68. function getDeptTreeData() {
  69. getMainList().then(res => {
  70. deptOptions.value = res.data
  71. deptOptionsEdit.value = res.data
  72. })
  73. }
  74. //角色数据
  75. const roleData = ref([])
  76. function getRoleListData() {
  77. getRoleList({
  78. page: 1,
  79. size: 100000
  80. }).then(res => {
  81. roleData.value = res.data.records
  82. })
  83. }
  84. getDeptTreeData()
  85. getUserListData()
  86. getRoleListData()
  87. //编辑
  88. function filterMethod(value) {
  89. deptOptionsEdit.value = [...deptOptions].filter(item =>
  90. item.name.includes(value)
  91. )
  92. }
  93. const form = ref({
  94. userName: null,
  95. depId: null,
  96. roleIds: null,
  97. realName: null,
  98. phone: null,
  99. email: null
  100. })
  101. const rules = ref({
  102. depId: [{ required: true, message: "部门不能为空", trigger: "blur" }],
  103. roleIds: [{ required: true, message: "角色不能为空", trigger: "blur" }],
  104. userName: [{ required: true, message: "用户名不能为空", trigger: "blur" }]
  105. })
  106. function reset() {
  107. form.value = {
  108. userName: null,
  109. depId: null,
  110. roleIds: null,
  111. realName: null,
  112. phone: null,
  113. email: null
  114. }
  115. if (proxy.$refs["userRef"]) {
  116. proxy.$refs["userRef"].resetFields()
  117. }
  118. }
  119. const title = ref("")
  120. const open = ref(false)
  121. function submitForm() {
  122. proxy.$refs["userRef"].validate(valid => {
  123. if (valid) {
  124. if (form.value.id != undefined) {
  125. modUser(form.value).then(res => {
  126. if (res.code == 200) {
  127. byUserIduPRole(form.value.id, {
  128. roleIds: form.value.roleIds.join(",")
  129. }).then(result => {
  130. if (result.code == 200) {
  131. getUserListData()
  132. open.value = false
  133. ElMessage({
  134. message: res.msg,
  135. type: "success"
  136. })
  137. } else {
  138. ElMessage({
  139. message: res.msg,
  140. type: warning
  141. })
  142. }
  143. })
  144. } else {
  145. ElMessage({
  146. message: res.msg,
  147. type: warning
  148. })
  149. }
  150. })
  151. } else {
  152. addUser(form.value).then(res => {
  153. if (res.code == 200) {
  154. byUserIduPRole(res.data.id, {
  155. roleIds: form.value.roleIds.join(",")
  156. }).then(result => {
  157. if (result.code == 200) {
  158. getUserListData()
  159. open.value = false
  160. ElMessage({
  161. message: res.msg,
  162. type: "success"
  163. })
  164. } else {
  165. ElMessage({
  166. message: res.msg,
  167. type: warning
  168. })
  169. }
  170. })
  171. } else {
  172. ElMessage({
  173. message: res.msg,
  174. type: warning
  175. })
  176. }
  177. })
  178. }
  179. } else {
  180. console.log("检验不通过")
  181. }
  182. })
  183. }
  184. function cancel() {
  185. open.value = false
  186. reset()
  187. }
  188. function addUserBtn() {
  189. open.value = true
  190. title.value = "新增"
  191. }
  192. function modUserBtn(row) {
  193. console.log(row)
  194. reset()
  195. let { userName, deptId, name, mobile, email, id } = row
  196. form.value = {
  197. userName,
  198. depId: deptId,
  199. realName: name,
  200. phone: mobile,
  201. email,
  202. id
  203. }
  204. byUserIdfnRole(id).then(res => {
  205. form.value.roleIds = res.data.map(item => item.id)
  206. open.value = true
  207. title.value = "修改"
  208. })
  209. }
  210. function delUserBtn(row) {
  211. ElMessageBox.confirm(`是否确认删除"${row.userName}"?`, "删除警告", {
  212. confirmButtonText: "确定",
  213. cancelButtonText: "取消",
  214. type: "warning"
  215. }).then(() => {
  216. delUser({ ids: row.id }).then(res => {
  217. console.log(res)
  218. if (res.code == 200) {
  219. getUserListData()
  220. ElMessage({
  221. message: res.msg,
  222. type: "success"
  223. })
  224. } else {
  225. ElMessage({
  226. message: res.msg,
  227. type: warning
  228. })
  229. }
  230. })
  231. })
  232. }
  233. const selectionChangeData = ref([])
  234. function selectionChange(value) {
  235. selectionChangeData.value = value
  236. }
  237. function delUserMoreBtn() {
  238. if (selectionChangeData.value.length <= 0) {
  239. ElMessage({
  240. message: "请先选择要删除的数据",
  241. type: "warning"
  242. })
  243. return
  244. }
  245. ElMessageBox.confirm("是否确认删除?", "删除警告", {
  246. confirmButtonText: "确定",
  247. cancelButtonText: "取消",
  248. type: "warning"
  249. }).then(() => {
  250. let arr = []
  251. selectionChangeData.value.forEach(element => {
  252. arr.push(element.id)
  253. })
  254. delUser({ ids: arr.join(",") }).then(res => {
  255. console.log(res)
  256. if (res.code == 200) {
  257. getUserListData()
  258. ElMessage({
  259. message: res.msg,
  260. type: "success"
  261. })
  262. } else {
  263. ElMessage({
  264. message: res.msg,
  265. type: warning
  266. })
  267. }
  268. })
  269. })
  270. }
  271. function resetUserPwdBtn(row) {
  272. ElMessageBox.confirm(`是否确认重置"${row.userName}"密码?`, "删除警告", {
  273. confirmButtonText: "确定",
  274. cancelButtonText: "取消",
  275. type: "warning"
  276. }).then(() => {
  277. restPwdUser({ id: row.id }).then(res => {
  278. if (res.code == 200) {
  279. getUserListData()
  280. ElMessage({
  281. message: res.msg,
  282. type: "success"
  283. })
  284. } else {
  285. ElMessage({
  286. message: res.msg,
  287. type: warning
  288. })
  289. }
  290. })
  291. })
  292. }
  293. </script>
  294. <template>
  295. <div>
  296. <el-card class="tjm_card_style_custom">
  297. <div class="tjm_card_title">条件检索</div>
  298. <div class="tjm_card_select">
  299. <div class="tjm_card_select_left">
  300. <el-form
  301. :inline="true"
  302. :model="params"
  303. label-width="80px"
  304. :label-position="'left'"
  305. >
  306. <!-- <el-form-item label="用户编号">
  307. <el-input v-model="params.code" clearable />
  308. </el-form-item> -->
  309. <el-form-item label="用户名称">
  310. <el-input v-model="params.userName" clearable />
  311. </el-form-item>
  312. <el-form-item label="姓名">
  313. <el-input v-model="params.realName" clearable />
  314. </el-form-item>
  315. <!-- <el-form-item label="创建时间">
  316. <el-date-picker
  317. v-model="params.date"
  318. type="daterange"
  319. placeholder="Pick a date"
  320. clearable
  321. />
  322. </el-form-item>
  323. <el-form-item label="用户状态">
  324. <el-select
  325. v-model="params.status"
  326. clearable
  327. placeholder="请选择"
  328. >
  329. <el-option label="启用" value="1" />
  330. <el-option label="禁用" value="2" />
  331. </el-select>
  332. </el-form-item> -->
  333. <el-form-item>
  334. <el-button type="primary" @click="searchUserListBtn">
  335. <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>
  336. 搜索
  337. </el-button>
  338. <el-button @click="resetParamsBtn">
  339. <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-RefreshRight /></el-icon>
  340. 重置
  341. </el-button>
  342. </el-form-item>
  343. </el-form>
  344. </div>
  345. </div>
  346. <el-divider />
  347. <div class="tjm_card_tools">
  348. <div class="tjm_card_tools_left">
  349. <el-button type="primary" @click="addUserBtn">
  350. <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>
  351. 新增
  352. </el-button>
  353. <el-button type="danger" @click="delUserMoreBtn">
  354. <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-delete /></el-icon>
  355. 批量删除
  356. </el-button>
  357. </div>
  358. <!-- <div class="tjm_card_tools_right">
  359. <el-button>
  360. <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-download /></el-icon>
  361. excel导出数据
  362. </el-button>
  363. </div> -->
  364. </div>
  365. <div class="tjm_card_table">
  366. <div class="tjm_card_table_left" style="height: 450px; overflow: auto">
  367. <el-input
  368. v-model="deptName"
  369. placeholder="请输入部门名称"
  370. clearable
  371. prefix-icon="Search"
  372. />
  373. <!-- default-expand-all -->
  374. <el-tree
  375. :data="deptOptions"
  376. :props="{ label: 'name', children: 'children' }"
  377. :expand-on-click-node="false"
  378. ref="deptTreeRef"
  379. node-key="id"
  380. highlight-current
  381. @node-click="treeNodeClick"
  382. :filter-node-method="filterNode"
  383. style="margin-top: 6px"
  384. />
  385. </div>
  386. <div class="tjm_card_table_right">
  387. <el-table
  388. header-cell-class-name="tjm_cart_table_header"
  389. :data="tableData"
  390. border
  391. width="100%"
  392. @selection-change="selectionChange"
  393. >
  394. <el-table-column type="selection" width="55" />
  395. <el-table-column type="index" label="序号" width="55" />
  396. <el-table-column prop="userName" label="用户名" />
  397. <el-table-column prop="deptName" label="所属部门" width="240" />
  398. <el-table-column prop="name" label="姓名" />
  399. <el-table-column prop="mobile" label="手机号" />
  400. <el-table-column prop="email" label="电子邮箱" width="240" />
  401. <el-table-column prop="state" label="用户状态">
  402. <template #default="scope">
  403. {{ ["启用", "禁用"][scope.row.state] }}
  404. </template>
  405. </el-table-column>
  406. <el-table-column prop="ope" label="操作">
  407. <template #default="scope">
  408. <el-tooltip content="修改" placement="top">
  409. <el-button
  410. link
  411. type="primary"
  412. icon="Edit"
  413. @click="modUserBtn(scope.row)"
  414. ></el-button>
  415. </el-tooltip>
  416. <el-tooltip content="删除" placement="top">
  417. <el-button
  418. link
  419. type="primary"
  420. icon="Delete"
  421. @click="delUserBtn(scope.row)"
  422. ></el-button>
  423. </el-tooltip>
  424. <el-tooltip content="重置密码" placement="top">
  425. <el-button
  426. link
  427. type="primary"
  428. icon="Key"
  429. @click="resetUserPwdBtn(scope.row)"
  430. ></el-button>
  431. </el-tooltip>
  432. </template>
  433. </el-table-column>
  434. </el-table>
  435. </div>
  436. </div>
  437. <div class="tjm_card_pagination">
  438. <el-pagination
  439. background
  440. layout="total,sizes,prev, pager, next,"
  441. :total="total"
  442. :page-sizes="[20, 30, 100]"
  443. @size-change="sizeChange"
  444. @current-change="currentChange"
  445. />
  446. </div>
  447. </el-card>
  448. <!-- 编辑 -->
  449. <el-dialog :title="title" v-model="open" width="680px" append-to-body>
  450. <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
  451. <el-row>
  452. <el-col :span="24">
  453. <el-form-item label="用户名" prop="userName">
  454. <el-input
  455. v-model="form.userName"
  456. placeholder="请输入用户名"
  457. clearable
  458. />
  459. </el-form-item>
  460. </el-col>
  461. <el-col :span="24">
  462. <el-form-item label="所属部门" prop="depId">
  463. <el-tree-select
  464. style="width: 100%"
  465. v-model="form.depId"
  466. :data="deptOptions"
  467. filterable
  468. :props="{ value: 'id', label: 'name', children: 'children' }"
  469. value-key="id"
  470. placeholder="选择所属部门"
  471. check-strictly
  472. />
  473. </el-form-item>
  474. </el-col>
  475. <el-col :span="24">
  476. <el-form-item label="角色" prop="roleIds">
  477. <el-select
  478. v-model="form.roleIds"
  479. multiple
  480. placeholder="请选择角色"
  481. style="width: 100%"
  482. >
  483. <el-option
  484. v-for="item in roleData"
  485. :key="item.id"
  486. :label="item.name"
  487. :value="item.id"
  488. />
  489. </el-select>
  490. </el-form-item>
  491. </el-col>
  492. <el-col :span="24">
  493. <el-form-item label="姓名" prop="realName">
  494. <el-input
  495. v-model="form.realName"
  496. placeholder="请输入姓名"
  497. clearable
  498. />
  499. </el-form-item>
  500. </el-col>
  501. <el-col :span="24">
  502. <el-form-item label="手机号" prop="phone">
  503. <el-input
  504. v-model="form.phone"
  505. placeholder="请输入手机号"
  506. clearable
  507. />
  508. </el-form-item>
  509. </el-col>
  510. <el-col :span="24">
  511. <el-form-item label="邮箱" prop="email">
  512. <el-input v-model="form.email" placeholder="邮箱" clearable />
  513. </el-form-item>
  514. </el-col>
  515. </el-row>
  516. </el-form>
  517. <template #footer>
  518. <div class="dialog-footer">
  519. <el-button type="primary" @click="submitForm">确 定</el-button>
  520. <el-button @click="cancel">取 消</el-button>
  521. </div>
  522. </template>
  523. </el-dialog>
  524. </div>
  525. </template>
  526. <style lang="scss" scoped></style>