index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. <template>
  2. <div class="newUserManagement">
  3. <div class="newUserManagement-head manageTitle">用户管理</div>
  4. <div class="flex-wrap newUserManagement-content">
  5. <div class="newUserManagement-content-left" style="padding: 0;">
  6. <!-- <div class="head flex">
  7. <div class="title">账号组列表</div>
  8. <el-button @click="handleAdd" class="serButton" type="primary" plain size="small">新增</el-button>
  9. </div>
  10. <div class="contents">
  11. <el-scrollbar ref="scroll" style="height: 100%">
  12. <el-tree :data="data" :props="defaultProps" :expand-on-click-node="false" highlight-current node-key="user_group_id" default-expand-all @node-click="handleNodeClick">
  13. <span class="custom-tree-node" slot-scope="{ node, data }">
  14. <span class="customTxt">{{ node.label }}</span>
  15. <span v-show="treeCheckId == data.user_group_id" class="customBtn">
  16. <span v-if="data.user_group_id != 0" @click.stop="handleRemove(node, data)">删除</span>
  17. </span>
  18. </span>
  19. </el-tree>
  20. </el-scrollbar>
  21. </div> -->
  22. <div class="newService-content-left-top">
  23. <div class="flex head">
  24. <div class="title">账号组列表</div>
  25. <el-button @click="handleAdd" class="serButton" size="small">新增</el-button>
  26. </div>
  27. <div class="search">
  28. <el-input size="small" placeholder="请输入内容" clearable prefix-icon="el-icon-search" v-model="search">
  29. </el-input>
  30. </div>
  31. </div>
  32. <div class="newService-content-left-bottom">
  33. <template v-if="dataList.length">
  34. <el-scrollbar ref="scroll" style="height: 100%">
  35. <div v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)">
  36. <div v-for="(item,index) in dataList" :key="index" @click.stop="handleNodeClick(item,index)" :class="index == activeIndex ? 'active':''" class="contents flex">
  37. <div class="left">
  38. <span class="txt">{{ item.user_group_name }}</span>
  39. </div>
  40. <div v-show="activeIndex == index" class="right">
  41. <span @click.stop="handleRemove(item)" class="error">删除</span>
  42. </div>
  43. </div>
  44. </div>
  45. </el-scrollbar>
  46. </template>
  47. <template v-else>
  48. <el-empty description="暂无数据"></el-empty>
  49. </template>
  50. </div>
  51. </div>
  52. <div class="newUserManagement-content-right flex1">
  53. <div class="newUserManagement-content-right-top">
  54. <div class="head flex">
  55. <div class="title">账号组信息</div>
  56. <el-button @click="handleSave" type="primary" size="small">保存</el-button>
  57. </div>
  58. <div class="contents">
  59. <el-form :inline="true" :rules="rules" ref="form" :model="formInline" class="demo-form-inline">
  60. <el-form-item prop="user_group_name" label="账号组名称">
  61. <el-input style="width:260px;margin-right: 30px;" size="small" v-model="formInline.user_group_name" placeholder="请输入账号组名称"></el-input>
  62. </el-form-item>
  63. <el-form-item label="描述">
  64. <el-input style="width:773px;" size="small" v-model="formInline.user_group_comment" placeholder="请输入描述"></el-input>
  65. </el-form-item>
  66. </el-form>
  67. </div>
  68. </div>
  69. <div class="newUserManagement-content-right-bottom">
  70. <div class="head flex">
  71. <div class="title">账号列表</div>
  72. <el-button @click="handleTableAdd" type="primary" size="small">新增</el-button>
  73. </div>
  74. <div class="contents">
  75. <el-table :data="tableData" border style="width: 100%">
  76. <el-table-column prop="user_name" label="用户名">
  77. </el-table-column>
  78. <el-table-column prop="user_status" label="状态">
  79. </el-table-column>
  80. <!-- <el-table-column prop="token_valid_duration" label="令牌有效时长">
  81. </el-table-column> -->
  82. <el-table-column prop="user_comment" label="描述">
  83. </el-table-column>
  84. <el-table-column label="操作" width="325">
  85. <template slot-scope="scope">
  86. <el-button @click="handleTablepaswod(scope.row)" type="primary" plain size="small">修改密码 </el-button>
  87. <el-button @click="handleTableEdit(scope.row)" type="primary" plain size="small">编辑 </el-button>
  88. <el-button @click="handleTableAuth(scope.row)" type="primary" plain size="small">账号授权 </el-button>
  89. <el-button @click="handleTableDel(scope.row)" type="danger" size="small">删除 </el-button>
  90. </template>
  91. </el-table-column>
  92. </el-table>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. <Dialog :flag="paswordFlag">
  98. <div class="dialog-content">
  99. <div class="title">{{ dataTitle }}</div>
  100. <div class="contents">
  101. <el-form ref="ruleForm" :model="ruleForm" :rules="tableRules" label-width="100px" class="demo-ruleForm">
  102. <el-form-item label="账号密码" prop="user_pwd">
  103. <div class="flex-wrap">
  104. <el-input v-model="ruleForm.user_pwd" class="r25" size="small" placeholder="请输入密码" />
  105. <el-button size="small" @click="restPwd" style="position: relative;top: 4px;" class="r26" type="primary">生成密码</el-button>
  106. </div>
  107. </el-form-item>
  108. </el-form>
  109. </div>
  110. <div class="foot right">
  111. <el-button size="small" @click="handleOk" class="r24" type="primary">确定</el-button>
  112. <el-button @click="eledite" size="small">取消</el-button>
  113. </div>
  114. </div>
  115. </Dialog>
  116. <Dialog :flag="tableFlag">
  117. <div class="dialog-content">
  118. <div class="title">{{ dataTitle }}</div>
  119. <div class="contents">
  120. <el-form ref="ruleForm" :model="ruleForm" :rules="tableRules" label-width="100px" class="demo-ruleForm">
  121. <el-form-item label="账号组关联" prop="user_gropu_id">
  122. <el-select style="width: 100%" size="small" v-model="ruleForm.user_group_id" placeholder="请选择">
  123. <el-option v-for="item in options" :key="item.user_group_id" :label="item.user_group_name" :value="item.user_group_id"> </el-option>
  124. </el-select>
  125. </el-form-item>
  126. <el-form-item label="账号名称" prop="user_name">
  127. <el-input v-model="ruleForm.user_name" size="small" placeholder="请输入账号名称" />
  128. </el-form-item>
  129. <!-- <el-form-item label="账号密码" prop="user_pwd">
  130. <div class="flex-wrap">
  131. <el-input v-model="ruleForm.user_pwd" class="r25" size="small" placeholder="请输入密码" />
  132. <el-button size="small" @click="restPwd" style="position: relative;top: 4px;" class="r26" type="primary">生成密码</el-button>
  133. </div>
  134. </el-form-item> -->
  135. <el-form-item label="二级密码" prop="user_sec_pwd">
  136. <el-input v-model="ruleForm.user_sec_pwd" size="small" placeholder="请输入二级密码" />
  137. </el-form-item>
  138. <!-- <el-form-item label="令牌有限期" prop="token_valid_duration">
  139. <el-input v-model="ruleForm.token_valid_duration" size="small" placeholder="请输入令牌有限期(小时)" />
  140. </el-form-item> -->
  141. <el-form-item label="账号描述" prop="user_comment">
  142. <el-input v-model="ruleForm.user_comment" size="small" type="textarea" :rows="3" placeholder="请输入账号描述" />
  143. </el-form-item>
  144. <el-form-item label="是否启用" prop="user_status">
  145. <el-radio v-model="ruleForm.user_status" :label="2">是</el-radio>
  146. <el-radio v-model="ruleForm.user_status" :label="0">否</el-radio>
  147. </el-form-item>
  148. </el-form>
  149. </div>
  150. <div class="foot right">
  151. <el-button size="small" @click="handleOk" class="r24" type="primary">确定</el-button>
  152. <el-button @click="eledite" size="small">取消</el-button>
  153. </div>
  154. </div>
  155. </Dialog>
  156. <Dialog :flag="dialogFlag" class="dialog-check-group">
  157. <div class="dialog-wrapper">
  158. <div class="title">角色列表</div>
  159. <div class="content">
  160. <!-- <el-tree ref="columnSetTree" :data="tableCols" :class="colsCheckClass" show-checkbox node-key="index" :default-expand-all="true" :props="{
  161. label: 'role_name',
  162. children: 'role_ID',
  163. }" :default-checked-keys="checkedKeysTemp" @check="handleCheck" /> -->
  164. <el-checkbox v-model="item.role_status" v-for="(item, index) in tableCols" :key="index" @change="handleCheckedCitiesChange(item)">{{ item.role_name }}</el-checkbox>
  165. </div>
  166. <div class="foot right t30">
  167. <!-- <el-button size="medium" class="r24" type="primary" @click="onCheck">确定</el-button> -->
  168. <el-button size="medium" @click="hide">关闭</el-button>
  169. </div>
  170. </div>
  171. </Dialog>
  172. <Dialog :flag="rmFlag">
  173. <div class="airportInfoDialog">
  174. <div class="title del-title">删除</div>
  175. <div class="content del-content">
  176. <span class="el-icon-error error r10"></span>您是否确认删除<span class="error l10">{{ rmTitle }}</span>
  177. </div>
  178. <div class="foot right Delfoot">
  179. <el-button size="small" class="r24" @click="tableRemove" type="danger">删除</el-button>
  180. <el-button size="small" @click="rmFlag = false">取消</el-button>
  181. </div>
  182. </div>
  183. </Dialog>
  184. </div>
  185. </template>
  186. <script>
  187. import pb from '@/layout/mixin/getPublicData'
  188. import Dialog from '@/layout/components/Dialog'
  189. import pf from '@/layout/mixin/publicFunc'
  190. import MD5 from 'blueimp-md5'
  191. export default {
  192. name: 'NewManageMent',
  193. components: { Dialog },
  194. mixins: [pb,pf],
  195. data () {
  196. return {
  197. data: [
  198. {
  199. up_user_group_id: -1,
  200. user_group_comment: '',
  201. user_group_id: 0,
  202. user_group_name: '全部账号组',
  203. user_group_status: true,
  204. children: []
  205. }
  206. ],
  207. search: '',
  208. activeIndex: null,
  209. loading: false,
  210. treeCheckId: '',
  211. formInline: {
  212. user_group_name: '',
  213. user_group_comment: ''
  214. },
  215. rules: {
  216. user_group_name: [{ required: true, message: '请输入账号组名称', trigger: 'blur' }],
  217. },
  218. ruleForm: {
  219. "token_valid_time": null,
  220. "token_valid_duration": null,
  221. "user_code": null,
  222. "user_code_expire": null,
  223. "user_comment": null,
  224. "user_group_id": null,
  225. "user_id": null,
  226. "user_name": null,
  227. "user_pwd": null,
  228. "user_sec_pwd": null,
  229. "user_status": null,
  230. "user_token": null
  231. },
  232. tableRules: {
  233. user_name: [{ required: true, message: "请输入账号名称", trigger: "blur" }],
  234. user_group_id: [{ required: true, message: '请选择账号组', trigger: 'change' }],
  235. user_pwd: [{ required: true, message: "请输入密码", trigger: "blur" }],
  236. },
  237. paswordFlag: false,//修改密码
  238. tableFlag: false,
  239. title: '新增',
  240. type: 'add',
  241. dataType: 'add',
  242. dataTitle: '新增账号',
  243. dataObj: {},
  244. defaultProps: {
  245. children: 'children',
  246. label: 'user_group_name'
  247. },
  248. tableData: [],
  249. rmFlag: false,
  250. rmObj: {},
  251. rmTitle: '',
  252. options: [],
  253. rmType: '1',
  254. tableCols: [],
  255. dialogFlag: false,
  256. checkedKeysTemp: [],
  257. userId: '',
  258. arrs: []
  259. }
  260. },
  261. mounted () {
  262. this.getTreeData()
  263. },
  264. computed: {
  265. dataList () {
  266. return this.arrs.filter(data => !this.search || data.user_group_name.toLowerCase().includes(this.search.toLowerCase()))
  267. },
  268. },
  269. methods: {
  270. async getTreeData () {
  271. const result = await this.getQueryList(this.queryId)
  272. if (result && result.length) {
  273. // this.dataList = result
  274. this.arrs.push(...result)
  275. // this.options = result
  276. // this.data[0].children = result
  277. }
  278. },
  279. handleAdd () {
  280. this.type = 'add'
  281. this.treeCheckId = null
  282. this.tableData = []
  283. this.clearForm()
  284. },
  285. async handleNodeClick (data,index) {
  286. this.activeIndex = index
  287. if (data.user_group_id !== 0) {
  288. this.treeCheckId = data.user_group_id
  289. this.formInline = _.cloneDeep(data)
  290. this.type = 'edit'
  291. const result = await this.getQueryList(SERVICE_ID.getUserTableId, {
  292. user_group_id: data.user_group_id
  293. }, 'user_group_id')
  294. this.tableData = result
  295. } else {
  296. alert('不可选中')
  297. return
  298. // this.formInline.user_group_name = ''
  299. // this.formInline.user_group_comment = ''
  300. }
  301. },
  302. //清空表单
  303. clearForm () {
  304. const data = this.formInline
  305. for (const key in data) {
  306. if (Object.hasOwnProperty.call(data, key)) {
  307. data[key] = null
  308. }
  309. }
  310. this.$refs['form'].resetFields()
  311. },
  312. clearTableForm () {
  313. const data = this.ruleForm
  314. for (const key in data) {
  315. if (Object.hasOwnProperty.call(data, key)) {
  316. data[key] = null
  317. }
  318. }
  319. setTimeout(() => {
  320. this.$refs['ruleForm'].resetFields()
  321. }, 50);
  322. },
  323. restPwd () {
  324. this.ruleForm.user_pwd = '123!@#QWEqwe'
  325. },
  326. //树删除
  327. handleRemove ( data) {
  328. this.rmTitle = data.user_group_name
  329. this.rmFlag = true
  330. this.rmObj = data
  331. this.rmType = '1'
  332. },
  333. async tableRemove () {
  334. let code = null
  335. if (this.rmType == '1') {
  336. code = await this.getChangeList(this.queryId, this.rmObj, 3)
  337. if (code) {
  338. this.getTreeData()
  339. this.rmObj = {}
  340. this.clearForm()
  341. }
  342. } else {
  343. code = await this.getChangeList(SERVICE_ID.getUserTableId, this.dataObj, 3)
  344. if (code) {
  345. const result = await this.getQueryList(SERVICE_ID.getUserTableId, {
  346. user_group_id: this.dataObj.user_group_id
  347. },'user_group_id')
  348. this.tableData = result
  349. this.dataObj = {}
  350. this.clearTableForm()
  351. }
  352. }
  353. this.rmFlag = false
  354. },
  355. async handleSave () {
  356. this.$refs['form'].validate(async (valid) => {
  357. if (valid) {
  358. let code = null
  359. this.formInline.user_group_id = this.treeCheckId
  360. const data = this.formInline
  361. if (this.type == 'add') {
  362. code = await this.getChangeList(this.queryId, data, 1, 'user_group_id')
  363. } else {
  364. const id = this.formInline.user_group_id
  365. if (id) {
  366. code = await this.getChangeList(this.queryId, data, 2,'user_group_id')
  367. }
  368. }
  369. if (code) {
  370. if (this.type == 'add') {
  371. this.clearForm()
  372. }
  373. this.getTreeData()
  374. }
  375. }
  376. else {
  377. return false
  378. }
  379. })
  380. },
  381. handleTableAdd () {
  382. if (this.treeCheckId !=0) {
  383. this.tableFlag = true
  384. this.dataType = 'add'
  385. this.dataTitle = '新增账号'
  386. this.clearTableForm()
  387. this.ruleForm.user_group_id = this.treeCheckId
  388. }
  389. },
  390. handleTableEdit (row) {
  391. this.tableFlag = true
  392. this.dataType = 'edit'
  393. this.userId = row.user_id
  394. this.dataTitle = '编辑账号'
  395. this.ruleForm = _.cloneDeep(row)
  396. },
  397. async handleTableAuth (row) {
  398. this.dialogFlag = true
  399. const result = await this.getQueryList(SERVICE_ID.roleListId)
  400. const code = await this.getQueryList(SERVICE_ID.userAuthorizationId, {
  401. user_id: row.user_id
  402. }, 'user_id')
  403. this.tableCols = result
  404. this.tableCols.forEach(element => {
  405. element.user_id = row.user_id
  406. });
  407. code.forEach(element => {
  408. this.tableCols.forEach(res => {
  409. if (res.role_ID == element.role_id) {
  410. res.role_status = true
  411. }
  412. });
  413. });
  414. // console.log(this.tableCols)
  415. // console.log(code)
  416. },
  417. handleTablepaswod (row) {
  418. this.paswordFlag = true
  419. this.dataType = 'edit'
  420. this.dataTitle = '修改密码'
  421. this.userId = row.user_id
  422. this.ruleForm = _.cloneDeep(row)
  423. },
  424. async handleTableDel (row) {
  425. this.dataObj = row
  426. this.rmTitle = row.user_name
  427. this.rmFlag = true
  428. this.rmType = '2'
  429. },
  430. async handleCheckedCitiesChange (data) {
  431. let code = null
  432. let arr = {}
  433. let event = null
  434. if (data.role_status == true) {
  435. event = 1
  436. arr = {
  437. role_id: data.role_ID,
  438. user_id: data.user_id
  439. }
  440. } else if (data.role_status == false){
  441. event = 3
  442. arr = {
  443. role_id: data.role_ID,
  444. user_id: data.user_id
  445. }
  446. }
  447. code = await this.getChangeList(SERVICE_ID.userAuthorizationId,arr, event)
  448. },
  449. hide () {
  450. this.dialogFlag = false
  451. },
  452. async handleOk () {
  453. this.$refs['ruleForm'].validate(async (valid) => {
  454. if (valid) {
  455. let code = null
  456. const data = this.ruleForm
  457. this.ruleForm.user_id = this.userId
  458. this.ruleForm.user_pwd= MD5(this.ruleForm.user_pwd)
  459. if (this.dataType == 'add') {
  460. code = await this.getChangeList(SERVICE_ID.getUserTableId, data, 1,'user_id')
  461. } else {
  462. const id = this.ruleForm.user_group_id
  463. if (id) {
  464. code = await this.getChangeList(SERVICE_ID.getUserTableId, data, 2,'user_id')
  465. }
  466. }
  467. if (code) {
  468. if (this.dataType == 'add') {
  469. this.clearTableForm()
  470. }
  471. const result = await this.getQueryList(SERVICE_ID.getUserTableId, {
  472. user_group_id: this.formInline.user_group_id
  473. }, 'user_group_id')
  474. this.tableData = result
  475. }
  476. this.tableFlag = false
  477. this.paswordFlag = false
  478. }
  479. else {
  480. return false
  481. }
  482. })
  483. },
  484. eledite () {
  485. this.paswordFlag = false
  486. this.tableFlag = false
  487. this.clearTableForm()
  488. }
  489. }
  490. }
  491. </script>
  492. <style lang="scss" scoped>
  493. @import "../newRole/css/index.scss";
  494. .newUserManagement {
  495. padding: 24px;
  496. height: calc(100vh - 80px);
  497. &-content {
  498. height: calc(100% - 58px);
  499. margin-top: 30px;
  500. .title {
  501. font-size: 20px;
  502. font-family: Microsoft YaHei;
  503. font-weight: bold;
  504. color: #101116;
  505. }
  506. &-left {
  507. height: 100%;
  508. width: 440px;
  509. background: #ffffff;
  510. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
  511. border-radius: 4px;
  512. margin-right: 16px;
  513. padding: 24px;
  514. .contents {
  515. // margin-top: 24px;
  516. height: calc(100% - 56px);
  517. .custom-tree-node {
  518. flex: 1;
  519. display: flex;
  520. align-items: center;
  521. justify-content: space-between;
  522. font-size: 14px;
  523. padding-right: 8px;
  524. .customBtn {
  525. color: #dd3838;
  526. font-size: 12px;
  527. }
  528. }
  529. }
  530. }
  531. &-right {
  532. &-top {
  533. height: 136px;
  534. background: #ffffff;
  535. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
  536. border-radius: 4px;
  537. padding: 24px;
  538. .contents {
  539. .el-form-item {
  540. margin-bottom: 0;
  541. margin-top: 20px;
  542. }
  543. }
  544. }
  545. &-bottom {
  546. margin-top: 16px;
  547. height: calc(100% - 152px);
  548. background: #ffffff;
  549. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.1);
  550. border-radius: 4px;
  551. padding: 24px;
  552. .contents {
  553. margin-top: 24px;
  554. }
  555. }
  556. }
  557. }
  558. }
  559. </style>