You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

525 lines
16 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. <template>
  2. <div class="mod-user">
  3. <el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
  4. <el-form-item>
  5. <el-input v-model="dataForm.userName" placeholder="用户账号" clearable></el-input>
  6. </el-form-item>
  7. <el-form-item>
  8. <el-button @click="getDataList()" type="primary">查询</el-button>
  9. <el-button v-if="isAuth('sys:user:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button>
  10. <el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary"
  11. @click="specialAuthorize()"
  12. >特殊权限
  13. </el-button>
  14. <el-button v-if="isAuth('sys:user:save')" :disabled="this.showButton" type="primary"
  15. @click="siteAuthorize()"
  16. >工厂授权
  17. </el-button>
  18. </el-form-item>
  19. </el-form>
  20. <el-table
  21. :data="dataList"
  22. border
  23. :height="height"
  24. v-loading="dataListLoading"
  25. @selection-change="selectionChangeHandle"
  26. highlight-current-row
  27. @current-change="handleCurrentChange"
  28. style="width: 100%;">
  29. <!-- <el-table-column-->
  30. <!-- type="selection"-->
  31. <!-- header-align="center"-->
  32. <!-- align="center"-->
  33. <!-- width="50">-->
  34. <!-- </el-table-column>-->
  35. <!-- <el-table-column-->
  36. <!-- prop="userId"-->
  37. <!-- header-align="center"-->
  38. <!-- align="center"-->
  39. <!-- width="80"-->
  40. <!-- label="ID">-->
  41. <!-- </el-table-column>-->
  42. <el-table-column
  43. prop="username"
  44. header-align="center"
  45. align="center"
  46. label="用户账号">
  47. </el-table-column>
  48. <el-table-column
  49. prop="userDisplay"
  50. header-align="center"
  51. align="center"
  52. label="用户名">
  53. </el-table-column>
  54. <el-table-column
  55. prop="email"
  56. header-align="center"
  57. align="center"
  58. label="邮箱">
  59. </el-table-column>
  60. <el-table-column
  61. prop="mobile"
  62. header-align="center"
  63. align="center"
  64. label="手机号">
  65. </el-table-column>
  66. <el-table-column
  67. prop="status"
  68. header-align="center"
  69. align="center"
  70. label="状态">
  71. <template slot-scope="scope">
  72. <el-link v-if="scope.row.status === 0" type="success">禁用</el-link>
  73. <el-link v-else type="danger">正常</el-link>
  74. </template>
  75. </el-table-column>
  76. <el-table-column
  77. prop="createTime"
  78. header-align="center"
  79. align="center"
  80. width="180"
  81. label="创建时间">
  82. </el-table-column>
  83. <el-table-column
  84. fixed="right"
  85. header-align="center"
  86. align="center"
  87. width="150"
  88. label="操作">
  89. <template slot-scope="scope">
  90. <a type="text" size="small" @click="generateData(scope.row)">审核</a>
  91. <a v-if="isAuth('sys:user:update')" type="text" size="small"
  92. @click="addOrUpdateHandle(scope.row.userId)">修改</a>
  93. <a v-if="isAuth('sys:user:delete')" type="text" size="small" @click="deleteHandle(scope.row.userId)">删除</a>
  94. </template>
  95. </el-table-column>
  96. </el-table>
  97. <el-pagination
  98. highlight-current-row
  99. @current-change="handleCurrentChange"
  100. :current-page="pageIndex"
  101. :page-sizes="[20, 50, 100, 200,500]"
  102. :page-size="pageSize"
  103. :total="totalPage"
  104. layout="total, sizes, prev, pager, next, jumper">
  105. </el-pagination>
  106. <!-- 弹窗, 新增 / 修改 -->
  107. <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
  108. <!-- 审核权限 -->
  109. <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" v-drag :title="inputSearch1"
  110. :visible.sync="setUp.reviewFlag" width="560px">
  111. <template>
  112. <el-transfer v-model="checked" :data="transferData" :titles="['所有权限', '当前权限']"></el-transfer>
  113. </template>
  114. <span slot="footer" class="dialog-footer">
  115. <el-button @click="setUp.reviewFlag = false">取消</el-button>
  116. <el-button type="primary" :disabled="setUp.saveButton" @click="saveUserRoleFlag()">确定</el-button>
  117. </span>
  118. </el-dialog>
  119. <!-- 特殊权限 -->
  120. <el-dialog
  121. v-drag
  122. :title="'特殊性权限'"
  123. :visible.sync="specialVisible"
  124. width="820px"
  125. :append-to-body="true">
  126. <el-table
  127. :data="securityList"
  128. border
  129. :height="securityHeight"
  130. v-loading="dataListLoading"
  131. style="width: 100%;">
  132. <el-table-column
  133. v-for="(item,index) in columnList" :key="index"
  134. :sortable="item.columnSortable"
  135. :prop="item.columnProp"
  136. :header-align="item.headerAlign"
  137. :show-overflow-tooltip="item.showOverflowTooltip"
  138. :align="item.align"
  139. :fixed="item.fixed"
  140. :min-width="item.columnWidth"
  141. :label="item.columnLabel">
  142. <template slot-scope="scope">
  143. <span v-if="!item.columnHidden"> {{ scope.row[item.columnProp] }}</span>
  144. <span v-if="item.columnHidden">
  145. <el-checkbox v-model="scope.row[item.columnProp] "></el-checkbox>
  146. </span>
  147. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
  148. style="width: 100px; height: 80px"/></span>
  149. </template>
  150. </el-table-column>
  151. </el-table>
  152. <span slot="footer" class="dialog-footer">
  153. <el-button type="primary" @click="saveUserSecurity()">确定</el-button>
  154. <el-button @click="specialVisible = false" type="primary">取消</el-button>
  155. </span>
  156. </el-dialog>
  157. <!-- 工厂授权 -->
  158. <el-dialog
  159. style="font-size: 12px"
  160. v-drag
  161. :title="'工厂授权'"
  162. :visible.sync="siteVisible"
  163. width="520px"
  164. :append-to-body="true">
  165. <el-transfer v-model="selectSitList" :data="siteList" :titles="['未授权工厂', '已授权工厂']"></el-transfer>
  166. <span slot="footer" class="dialog-footer">
  167. <el-button type="primary" @click="saveUserAssessSite()">确定</el-button>
  168. <el-button @click="siteVisible = false" type="primary">取消</el-button>
  169. </span>
  170. </el-dialog>
  171. </div>
  172. </template>
  173. <script>
  174. import {getUserAccessSiteList, saveUserAccessSiteList} from '@/api/factory/accessSite.js'
  175. import {getSiteList} from '@/api/factory/site.js'
  176. import AddOrUpdate from './user-add-or-update'
  177. import {getUserBusinessRoleList, saveUserBusinessRole,} from '@/api/auditManagement/auditType.js'
  178. import {
  179. getUserSpecialSecurity,
  180. saveUserSpecialSecurity,
  181. updateUserSpecialSecurity
  182. } from '@/api/factory/userSpecialSecurity.js'
  183. export default {
  184. data() {
  185. return {
  186. showButton: true,
  187. height: 200,
  188. securityHeight: 200,
  189. specialVisible: false,
  190. siteVisible: false,
  191. currentData: {},
  192. userId: this.$store.state.user.name,
  193. transferData: [],
  194. checked: [],
  195. inputSearch1: '审核权限',
  196. //设置
  197. setUp: {
  198. reviewFlag: false,
  199. saveButton: false,
  200. },
  201. dataForm: {
  202. userName: ''
  203. },
  204. columnList: [
  205. {
  206. userId: this.$store.state.user.name,
  207. serialNumber: 'security' + this.$route.meta.menuId + 'securitydesc',
  208. tableId: this.$route.meta.menuId + 'security',
  209. tableName: "securityTable",
  210. columnProp: "securitydesc",
  211. headerAlign: "center",
  212. align: "left",
  213. columnLabel: "参数描述",
  214. columnHidden: false,
  215. columnImage: false,
  216. columnWidth: 70,
  217. columnSortable: false,
  218. sortLv: 0,
  219. status: true,
  220. fixed: false,
  221. },
  222. {
  223. userId: this.$store.state.user.name,
  224. serialNumber: 'security' + this.$route.meta.menuId + 'securitydesc',
  225. tableId: this.$route.meta.menuId + 'security',
  226. tableName: "securityTable",
  227. columnProp: "module",
  228. headerAlign: "center",
  229. align: "left",
  230. columnLabel: "模块",
  231. columnHidden: false,
  232. columnImage: false,
  233. columnSortable: false,
  234. columnWidth: 20,
  235. sortLv: 0,
  236. status: true,
  237. fixed: false,
  238. },
  239. {
  240. userId: this.$store.state.user.name,
  241. serialNumber: 'security' + this.$route.meta.menuId + 'securitydesc',
  242. tableId: this.$route.meta.menuId + 'security',
  243. tableName: "securityTable",
  244. columnProp: "itemvalue",
  245. headerAlign: "center",
  246. align: "center",
  247. columnLabel: "参数值",
  248. columnHidden: true,
  249. columnImage: false,
  250. columnSortable: false,
  251. columnWidth: 10,
  252. sortLv: 0,
  253. status: true,
  254. fixed: false,
  255. },
  256. ],
  257. dataList: [],
  258. securityList: [],
  259. selectSpecialList: [],
  260. siteList: [],
  261. selectSitList: [],
  262. selectUser: {},
  263. pageIndex: 1,
  264. pageSize: 20,
  265. totalPage: 0,
  266. dataListLoading: false,
  267. dataListSelections: [],
  268. addOrUpdateVisible: false
  269. }
  270. },
  271. components: {
  272. AddOrUpdate
  273. },
  274. activated() {
  275. this.getDataList()
  276. },
  277. mounted() {
  278. this.$nextTick(() => {
  279. this.securityHeight = window.innerHeight - 400;
  280. this.height = window.innerHeight - 200;
  281. })
  282. },
  283. methods: {
  284. // 特殊权限
  285. specialAuthorize() {
  286. this.specialVisible = true
  287. this.searchUserSpecialSecurity()
  288. },
  289. // 获取特殊权限
  290. searchUserSpecialSecurity() {
  291. saveUserSpecialSecurity({userid: this.selectUser.username}).then(({data}) => {
  292. if (data.code === 0) {
  293. getUserSpecialSecurity(this.selectUser.username).then(({data}) => {
  294. if (data.code === 0) {
  295. this.securityList = data.dataList.map(item => {
  296. item.itemvalue = item.itemvalue == 'Y' ? true : false;
  297. return item;
  298. })
  299. }
  300. })
  301. }
  302. })
  303. },
  304. // 保存用户权限
  305. saveUserSecurity() {
  306. let securityList = JSON.parse(JSON.stringify(this.securityList)).map(item => {
  307. item.itemvalue = item.itemvalue === true ? 'Y' : 'N';
  308. return item;
  309. })
  310. updateUserSpecialSecurity(securityList).then(({data}) => {
  311. if (data.code === 0) {
  312. this.$message.success(data.msg)
  313. this.specialVisible = false
  314. }else {
  315. this.$message.success(data.msg)
  316. }
  317. })
  318. },
  319. // 授权工厂
  320. siteAuthorize() {
  321. this.siteVisible = true
  322. this.searchSiteList()
  323. },
  324. // 保存选中的授权工厂
  325. saveUserAssessSite() {
  326. let accessSiteList = this.selectSitList.map(item => {
  327. let itemSite = {
  328. userid: this.selectUser.username,
  329. site: item
  330. }
  331. return itemSite;
  332. })
  333. let accessSite = {
  334. userid: this.selectUser.username,
  335. accessSiteList: accessSiteList
  336. }
  337. saveUserAccessSiteList(accessSite).then(({data}) => {
  338. if (data.code === 0) {
  339. this.$message.success(data.msg)
  340. this.siteList = []
  341. this.selectSitList = []
  342. this.siteVisible = false
  343. } else {
  344. this.$message.warning(data.msg)
  345. }
  346. })
  347. },
  348. // 获取用户已授权的工厂列表
  349. searchUserAccessSiteList() {
  350. getUserAccessSiteList({userid: this.selectUser.username}).then(({data}) => {
  351. this.selectSitList = data.dataList
  352. })
  353. },
  354. // 获取所有可用工厂
  355. searchSiteList() {
  356. getSiteList({active: 'Y'}).then(({data}) => {
  357. this.siteList = data.dataList
  358. this.searchUserAccessSiteList()
  359. })
  360. },
  361. // 选中行
  362. handleCurrentChange(val) {
  363. this.selectUser = val
  364. this.showButton = false
  365. },
  366. saveUserRoleFlag() {
  367. let saveList = []
  368. let currentList = this.checked
  369. // 当前未选择记录
  370. if (currentList.length == 0) {
  371. this.$confirm("当前未选择记录,是否继续?", '删除提示', {
  372. confirmButtonText: '确定',
  373. cancelButtonText: '取消',
  374. }).then(() => {
  375. let data = {
  376. userId: this.currentData.userId,
  377. }
  378. saveList.push(data);
  379. this.saveUserBusinessRole(saveList)
  380. }).catch(() => {
  381. return
  382. })
  383. } else {
  384. for (let i = 0; i < currentList.length; i++) {
  385. let data = {
  386. userId: this.currentData.userId,
  387. roleItemNo: currentList[i],
  388. selectFlag: 'Y',
  389. }
  390. saveList.push(data);
  391. }
  392. this.saveUserBusinessRole(saveList)
  393. }
  394. },
  395. saveUserBusinessRole(saveList) {
  396. saveUserBusinessRole(saveList).then(({data}) => {
  397. this.$alert(data.msg, '操作提示', {
  398. confirmButtonText: '确定',
  399. callback: action => {
  400. if (data.code == 0) {
  401. this.setUp.reviewFlag = false
  402. }
  403. this.setUp.saveButton = false
  404. }
  405. });
  406. })
  407. },
  408. generateData(row) {
  409. this.currentData = row
  410. let queryData = {
  411. active: 'Y',
  412. userId: this.currentData.userId,
  413. }
  414. getUserBusinessRoleList(queryData).then(({data}) => {
  415. let rows1Data = data.map.rows1
  416. let rows2Data = data.map.rows2
  417. let forData = []
  418. let checkedList = []
  419. for (let i = 0; i < rows1Data.length; i++) {
  420. forData.push({
  421. key: rows1Data[i].roleItemNo,
  422. label: rows1Data[i].roleDesc,
  423. });
  424. }
  425. for (let j = 0; j < rows2Data.length; j++) {
  426. checkedList.push(rows2Data[j].roleItemNo)
  427. }
  428. this.transferData = forData;
  429. this.checked = checkedList
  430. this.setUp.reviewFlag = true
  431. })
  432. },
  433. // 获取数据列表
  434. getDataList() {
  435. this.dataListLoading = true
  436. this.$http({
  437. url: this.$http.adornUrl('/sys/user/list'),
  438. method: 'get',
  439. params: this.$http.adornParams({
  440. 'page': this.pageIndex,
  441. 'limit': this.pageSize,
  442. 'username': this.dataForm.userName
  443. })
  444. }).then(({data}) => {
  445. if (data && data.code === 0) {
  446. this.dataList = data.page.list
  447. this.totalPage = data.page.totalCount
  448. } else {
  449. this.dataList = []
  450. this.totalPage = 0
  451. }
  452. this.dataListLoading = false
  453. })
  454. },
  455. // 每页数
  456. sizeChangeHandle(val) {
  457. this.pageSize = val
  458. this.pageIndex = 1
  459. this.getDataList()
  460. },
  461. // 当前页
  462. currentChangeHandle(val) {
  463. this.pageIndex = val
  464. this.getDataList()
  465. },
  466. // 多选
  467. selectionChangeHandle(val) {
  468. this.dataListSelections = val
  469. },
  470. // 新增 / 修改
  471. addOrUpdateHandle(id) {
  472. this.addOrUpdateVisible = true
  473. this.$nextTick(() => {
  474. this.$refs.addOrUpdate.init(id)
  475. })
  476. },
  477. // 删除
  478. deleteHandle(id) {
  479. var userIds = id ? [id] : this.dataListSelections.map(item => {
  480. return item.userId
  481. })
  482. this.$confirm(`确定对[id=${userIds.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
  483. confirmButtonText: '确定',
  484. cancelButtonText: '取消',
  485. type: 'warning'
  486. }).then(() => {
  487. this.$http({
  488. url: this.$http.adornUrl('/sys/user/delete'),
  489. method: 'post',
  490. data: this.$http.adornData(userIds, false)
  491. }).then(({data}) => {
  492. if (data && data.code === 0) {
  493. this.$message.success('操作成功')
  494. this.getDataList()
  495. } else {
  496. this.$message.error(data.msg)
  497. }
  498. })
  499. }).catch(() => {
  500. })
  501. }
  502. }
  503. }
  504. </script>
  505. <style scoped lang="scss">
  506. /* 穿梭框外框高宽度 */
  507. /deep/ .el-transfer-panel {
  508. width: 600px;
  509. height: 400px;
  510. }
  511. /* 穿梭框内部展示列表的高宽度 */
  512. /deep/ .el-transfer-panel__list {
  513. height: 375px;
  514. }
  515. </style>